# v12.0.21 (2026-05-01)

## Mistweaver Monk — Raid Frame Glows Expanded

Enveloping Mist now lights up raid frames the same way Renewing Mist already did. When a unit has both EM and RM applied, EM takes priority and shows its color; let EM expire and the frame falls back to RM.

| Priority | Buff | Color |
|---|---|---|
| 1 (highest) | Enveloping Mist | `#FDFFB6` (pale yellow) |
| 2 | Renewing Mist | `#00FF9C` (mint) |

The whole-frame border tells you the most-actionable state at a glance.

## Mistweaver Monk — Enveloping Mist Alert Fix

The "missing EM on Soothing Mist target" alert used to fire on every Soothing Mist tap, even half-second spot heals. In raid that was a lot of unnecessary noise.

The alert now requires the channel to be on the same target for **3 seconds** before firing. Quick spot heals stay silent; commit to a target and the alert kicks in as before. Target switches mid-channel reset the timer, so retargeting cleanly resets the gate.

## Mistweaver Monk — Performance

Several optimizations stack into a substantial reduction in Mistweaver's CPU footprint, both in and out of combat:

- **Soothing Mist target caching.** During a channel, the addon used to walk every group member on every tick to find your channel target. Now it remembers the target and validates it cheaply each tick. Self-heals via the same path. Cache clears automatically when the channel ends or you retarget mid-channel.

- **Renewing Mist coverage scan throttle bumped from 0.4s to 0.5s.** Alert latency stays well under a second (you won't notice it). Scan rate drops 20%.

- **Coalesced raid-frame refresh queue.** Previously, every single buff change on a raid member triggered an immediate raid-frame priority-chain check. During a pull where many auras transition simultaneously, this could stack 50+ priority-chain evaluations into a single render frame, producing visible CPU spikes (the "20% Peak CPU" readouts in the addon panel). Now buff changes mark the frame "dirty" and a single batched pass runs every 0.25s — multiple changes for the same frame collapse into one refresh. Worst-case glow latency: 0.25s, practically invisible for a coverage signal.

- **Out-of-combat scanning eliminated.** Sitting in the raid lobby waiting for people to join, the addon was bouncing between 0.15% and 3% CPU processing every food/flask/world buff applied across the group. None of that work is actionable pre-pull. The raid-frame glow refresh, RM tracking, RM coverage scan, and Soothing Mist channel detection are now combat-gated. On combat enter, the addon does a fresh sweep so any auras already applied in the pre-pull window light up the moment the pull starts.

**Measured impact** (524-second raid sample) from the Soothing Mist target caching and RM scan throttle alone:
- Per-tick Evaluate cost: **2.26 ms → 1.14 ms** (−50%)
- Encounter CPU panel: **11.8% → 9.7%** (−18%)

The coalesced refresh queue and combat gating stack on top of those numbers — the in-combat render-frame spikes and the raid-lobby idle cost are addressed by separate code paths and should drop substantially further.

## Mistweaver Monk — Performance Diagnostics

New `/nha perf` command for measuring Mistweaver CPU cost in real combat. Same tool that's been on Resto Druid, now on Mistweaver with extra detail.

- `/nha perf on` — start measuring
- `/nha perf` — peek at running totals mid-fight
- `/nha perf off` — stop and dump the report

The report breaks per-tick cost down by sub-section (RM coverage scan, RM tracking, Soothing Mist channel detection, Enveloping Mist check) and reports raid-frame-glow refresh rate, glow-priority attribution (EM / RM / none / disabled), `RefreshGlows` ticker stats, and the worst single render frame seen during the sample.

When perf is off, the cost is exactly zero — the instrumentation only activates while you're actively measuring.

---

# v12.0.20 (2026-04-28)

## All Specs — Buff Icon Glows Removed

Blizzard's 12.0.5 patch silently killed the ability to glow individual buff icons on default raid and party frames. Since then the per-icon glow system has only been working on Target and Focus frames — not where any healer is actually looking. This update rips out the per-icon glow path across every spec.

**What changed in the options panel:**
- The "Icon Glow" checkbox is gone, replaced by **"Glow Raid Frames"** — a clean toggle for the raid-frame border glow that actually works on default Blizzard raid frames.
- All per-spec icon-glow checkboxes are gone with the underlying feature: "Beacon Icon Glow" (Holy Paladin), "PoM Bounce Glow" (Holy Priest), "Echo Icon Glow" / "Echo Reversion Glow" (Preservation Evoker).
- If you had "Icon Glow" disabled before this update, "Glow Raid Frames" carries the off-state forward — your preference is preserved.

**Spec-specific removals:**
- **Mistweaver Monk** — Soothing Mist icon glow (cyan) is gone. The full-duration raid-frame Renewing Mist glow remains as the visible coverage signal. Enveloping Mist icon glow is gone.
- **Resto Druid** — Empowered Regrowth icon glow is gone. Detection required scanning Target/Focus buff frames, which is the path Blizzard locked down. The supporting `/nha trace` slash command is also gone.
- **Disc Priest** — Atonement and Void Shield icon glows are gone.

**What stays:** the CUF whole-frame raid-frame glows (the v12.0.19 / v12.0.20 system) are untouched and remain the only glow path going forward:
- **Resto Druid** — Lifebloom pandemic + Soul of the Forest empowered Rejuv/Germ
- **Mistweaver Monk** — Renewing Mist (full duration)

That's the path that actually shows up on default raid frames, which is where it matters.

## Restoration Druid — Bug Fix

- **Fixed a recurring Lua error in M+** — The addon would spam an error (~13,000 times) when scanning auras during a dungeon run. Caused by Blizzard's secret value restrictions on `spellId` in M+ — the value looks valid but crashes when used as a table key. Fixed with a defensive pcall around the lookup. No gameplay impact, but the error spam is gone.

## Restoration Druid — Neon Color Set

All six alert colors updated to brighter neon variants for better visibility:

| Alert | Old | New |
|---|---|---|
| Lifebloom Expiring | `#24A148` | `#00FF66` |
| Cast Lifebloom | `#24A148` | `#00FF66` |
| Soul of the Forest | `#00E5C0` | `#00FFE5` |
| Wild Growth Ready | `#A6E22E` | `#B6FF00` |
| Reforestation | `#3498DB` | `#00BFFF` |
| Abundance | `#FFD100` | `#FFF200` |

## Mistweaver Monk — Performance

Same performance pass that v19 brought to Resto Druid, now applied to Mistweaver. The Renewing Mist coverage check used to scan every group member every tick; in raid that was a lot of wasted work. After this update the scan stops as soon as it has enough RMs to clear the threshold, and the result is cached for a short interval between checks. CPU cost in raid drops significantly with no visible change to alert timing.

Other optimizations under the hood:

- **Aura helpers rewritten** to stop allocating throwaway functions on every call. Same correctness, far less work.
- **Renewing Mist tracking now uses a validation cache** so the addon doesn't re-fetch the same buff data multiple times per second when nothing has changed.

## Mistweaver Monk — Bug Fix

- **Fixed Enveloping Mist alert not firing when soothing yourself.** When you channeled Soothing Mist on yourself with no Enveloping Mist applied, the EM alert stayed silent. The detection logic required finding Soothing Mist on a group member's aura list to identify the channel target, which silently dropped self-channels in cases where the buff didn't register on the player's own aura list. Now the addon trusts the channel API as the source of truth: if it says you're channeling SM and nobody else has it, it's a self-channel — and the alert fires correctly.

- **Fixed a Lua error from soothing a target in M+.** When channeling Soothing Mist on a target in tainted execution context (M+, arena, anywhere Blizzard tightens secret values), the `UnitGUID()` call on the SM target could return a secret-tainted string. The bare equality check used to canonicalize player-equivalent tokens then threw an "attempt to compare a secret string value" error. The comparison is now wrapped in `pcall` so a thrown equality falls through to returning the unit token unchanged — same behavior as if the GUID were nil.

## Mistweaver Monk — Raid Frame Glows (new)

Renewing Mist now lights up the **entire raid/party frame** of any unit you have it on. The border stays lit for the full duration of the buff and clears when RM falls off — a clean at-a-glance view of who has your RM coverage across the whole raid.

Color is the new `#00FF9C` Renewing Mist color shared with the alert text.

### New: `/nha cufglow` (Mistweaver)

Same diagnostic as the Druid version but tailored to RM. Reports whether the raid-frame hooks installed, how many frames are tracked, and which units currently have RM glowing. Run it if a glow doesn't appear when you expected one.

## Mistweaver Monk — Color Refresh

| Alert | Old | New |
|---|---|---|
| Renewing Mist | `#00A86B` | `#00FF9C` |
| Enveloping Mist | `#FFF4AB` | `#FDFFB6` |

Existing users keep their current colors — the new defaults only apply on a fresh install. To pick up the new colors on an existing setup, reset alert colors from the options panel.

## Options Panel — Layout

- **Alert checkboxes** now start at the same left edge as the Sounds section checkboxes.
- **Sliders and sound dropdowns** shifted left to align with the right column of alert checkboxes, keeping the panel more balanced.

---

# v12.0.19 (2026-04-26)

## Restoration Druid — Raid Frame Glows

Lifebloom panic and Soul of the Forest glows now show up on **default Blizzard raid/party frames** again. Since the 12.0.5 patch the addon could only glow Target and Focus frames; the workaround in this update brings raid frames back. Two glow conditions are wired up so far:

- **Lifebloom in its pandemic window** — green glow, same color as the existing Target/Focus icon glow.
- **Rejuvenation or Germination boosted by Soul of the Forest** — cyan glow, matches the Target/Focus icon color.

If both conditions hit the same unit at once, Lifebloom wins and shows the green glow — refreshing LB on time matters more than tracking an empowered HoT.

### What it looks like

The glow is a thick segmented border that marches slowly around the entire raid frame. It's not the same as the per-icon glow on Target/Focus — that wasn't possible to recreate on default raid frames after Blizzard locked down the buff icons in 12.0.5. The whole-frame border is the next best signal: it tells you the unit needs attention, and you'll know which buff from context (LB needs the most attention is almost always the tank).

### The sister "Lifebloom Glow" addon situation

If you've been running `LifebloomGlow` to fill this gap since 12.0.5, you can drop it now — this update covers the same case and adds the SOTF-empowered detection on top.

### Compatibility note

Originally tried to add per-icon glow support for Dander's Frames so users on that addon could keep the precise icon-based highlight. Abandoned — Dander's has its own built-in glow system that already covers Lifebloom and Rejuv, so no integration was needed.

### New: `/nha cufglow`

A diagnostic command for the raid-frame glow path. Prints whether the hooks installed, how many frames are being tracked, and what auras the addon sees on each unit. Useful if a glow doesn't appear when you expected one — run the command with the buff active and send me the output.

### Bug fixes

- Fixed an issue where the **first Lifebloom cast after `/reload`** didn't glow at pandemic. Subsequent casts worked fine, but the very first one of a session would silently miss. The cause was a race between Blizzard creating the raid frames and the addon installing its tracking hook — the addon now catches up at install time.
- Fixed an issue where **Rejuvenation / Germination empowered by Soul of the Forest never glowed any raid frames**. The earlier detection path was reading the buff's icon through an API that returns a base-Rejuv icon in M+ even when the buff visually shows the empowered version. Switched to the same detection method `LifebloomGlow` uses, which sees the correct icon.
- Fixed a Lua error burst (~23 errors at once) from the Wild Growth cast handler when execution context was tainted in M+. The error didn't break gameplay — it'd just spam the error frame after a Wild Growth cast in a tainted state — but it's gone now.

---

## Restoration Druid — Performance

Big performance fixes for Resto Druid. The addon used a lot more CPU than it should have, especially in raid — bad enough to cause visible stutter on heavy pulls. After this update it uses roughly **8× less CPU** and the stutter is gone.

### Bug fixes

- Fixed a Lua error when running `/nha debug` while in a chat window, M+, or arena.
- Fixed a Lua error that could fire repeatedly while targeting a boss in raid.

### New: `/nha perf`

A new command that measures how much work the addon is doing. Mostly for me to chase down regressions, but if performance ever feels off, run `/nha perf on`, do a pull, then `/nha perf off` and send me the chat output.

---


# v12.0.18 (2026-04-25)

## Core Refactor — NHA / NPA Alignment

A structural refactor of the core engine to bring **Nem: Healer Alerts** and its sister addon **Nem: Pet Alerts** into a near-identical layout. No gameplay behavior changes — same alerts, same triggers, same sounds, same display, same proc glows.

### Why

The two addons grew side-by-side and accumulated stylistic drift — different section ordering, different spec-matching strategies, different debouncing strategies, dead code on both sides. Future bug fixes and feature work are cheaper if both cores look the same. Both files now share the same 23 sections in the same order, with feature-specific divergences (glow infrastructure, group-units cache, multi-alert OnUpdate display, timer FontStrings, frame border) confined to clearly-bounded blocks.

### Spec matching simplified

`FindActiveModule` previously did a primary check on `mod.specIndex` with `mod.specID` as a fallback. The new code uses a single check: `mod.specID == NHA.GetSpecID()`, where `GetSpecID` is the same secret-value-safe helper NPA uses. All seven healer spec files already carried `specID` and were unaffected; the now-vestigial `specIndex` field is ignored.

### Database access — `self.db` design

Every database read and write inside a `:` method now uses `self.db` instead of `NHA.db`. This is purely stylistic — `self == NHA` inside any `function NHA:foo()` — but it makes the database access pattern uniform with NPA. Affected sites: 7 `NHA.db.enabled` references in the slash command handler, plus 2 `local _db = NHA.db` captures in the Target/Focus aura hooks inside `InitGlowHooks`. The `NHA.db` form remains in non-method local functions (`CreateDisplay`, `BuildAlertRows`, `ApplyDisplaySettings`, `Evaluate`, etc.) where there is no `self` in scope.

### Helper extraction

- `ResolveRelativeFrame(db)` extracted as a shared helper. Previously the 4-line "look up `db.relativeTo` in `_G` or fall back to `UIParent`" block was inlined twice — once in `CreateDisplay`, once in `ApplyDisplaySettings`. Now both call sites use the helper.

### Panel alignment with NPA

The options panel previously used widths that drifted between the two addons. Both now use identical canonical values:

- Panel width `PW: 664 → 668`
- Content width offset `CPW: CW → CW - 4`
- Display slider X position: `340 → 358`, width `270`
- Sound dropdown anchor offset: `306 → 324`
- Drag-stop saved fields now write the full 5-tuple including `relativeTo`, matching NPA. Previously dropped that field, which prevented the frame from anchoring to a non-`UIParent` parent across reloads if a future feature needed it.
- Restore button structured as one-property-per-line column form matching NPA's style. Button positioning variables renamed (`btnSpacing`, `totalBtnW`, `btnStartX`).
- `CORE_DEFAULTS` and `coreState` `=` columns aligned to the wider canonical position so shared keys land in the same column position as NPA.

### Lock / Unlock

- `SetLockState` now adopts NPA's pattern: `coreState.unlocked` is updated unconditionally first, then the frame is touched only if it exists. Previously bailed early if no display, which meant the state flag and the chat message would silently not fire if `SetLockState` was ever called pre-display. The frame border (NHA-specific) and lock-button text update remain inside the `if f` guard.
- Lock/unlock chat message now uses colored formatting: `Frame |cff00ff00unlocked|r — drag to reposition.` / `Frame |cffff4444locked|r.`

### `f:SetSize`

- Display frame size remains `(900, 160)` (unchanged). NPA was bumped from `(900, 150)` to match this canonical value.

### New: Debug command

- `/nha debug` — prints class, active module, enabled state, group/raid status, LibCustomGlow status, glow-hook installation state, and then delegates to `mod:Debug(db)` if the active spec module provides one.
- The contract documentation now lists `Debug` as an optional module hook.

### Slash command unification

- Command order, help text, and colored status strings now match NPA's format exactly.
- The addon-compartment handler now uses the `_panelWasOpen` tracking pattern so the WoW Settings panel closes cleanly when reopened from the dropdown.
- `ToggleTest()` now respects `IsFullyImplemented()` and silently no-ops if no spec is active, instead of letting the test ticker spin against a missing module.
- Redundant `if not IsFullyImplemented() then return end` removed from the event handler — the preceding `if not mod then return end` already covers it.

### Sound fallback

- `GetSoundPath` now falls back to the bundled `RobotBlip` sound when the requested sound is missing or LibSharedMedia returns nothing. Previously it returned nil, which silently dropped the alert sound. An enabled sound now always plays something.

### Comment cleanup

- File header capabilities list collapsed to a 5-line summary pointing at the spec contract.
- 80-line spec module contract block compressed to ~25 lines documenting the table fields without prose paragraphs.
- Verbose secret-value commentary in `GetSpecID` collapsed.
- 5-line `InitGlowHooks` explanation block collapsed to 2 lines (the "compact frames inaccessible since 12.0.5" note).
- Section banners on tiny utility functions removed where redundant.
- Many redundant single-line comments above self-explanatory code dropped.
- `aoH` height calculation collapsed from a labeled stack of components into a single readable line.

### Removed

- Unused constant `MAX_ALERT_ROWS = 6` (set, never read).
- Unused upvalue `local UnitExists = UnitExists` (no caller in NHA core).
- 8 `NHA.X = X` exposures that no spec file uses: `FONTS_PATH`, `MEDIA_PATH`, `UI_FONT`, `GetSoundPath`, `SOUND_NAMES`, `MergeDefaults`, `InvalidateGroupUnitsCache`, `ApplyDisplaySettings`. Internal locals retained.
- `f:EnableMouse(false)` in `CreateDisplay` (immediately overridden by `ApplyDisplaySettings`).
- Login chat message (`"Loaded. Type /nha for options."`) — for parity with NPA, which has no login greeting. The addon still loads silently and you can check status with `/nha status`.
- Spec-switch chat messages (`"Alerts paused"` / `"Alerts active"`) — same parity reason.

### Spec module contract

- Contract comment now documents the full set of optional hooks: `NeedsTicker`, `Debug`, plus the existing `EvaluateFrameGlow`, `RefreshGlows`, `ClearAllGlows`, `OnEvent`, `BuildAlertOptions`, `noTest`, `noSound`, etc.
- Mention of `specIndex` removed — `specID` is the only required identifier.

### Section banner

- `-- Spec Helpers` matches NPA's banner.

---

# v12.0.17 (2026-04-21)

## Bug Fix — 12.0.5 Compatibility

### Root Cause

`CompactUnitFrame_UtilSetBuff` was removed by Blizzard in patch 12.0.5 as part of their compact frame API cleanup. The call to `hooksecurefunc` on this function threw a hard Lua error at `PLAYER_LOGIN`, crashing `OnLogin` before `ActivateModule` was ever called. This left the addon in a "no active module" state, which the options panel displays as **"Spec Not Supported"** — affecting all specs, not just Monk.

### Changes

**`NemHealerAlerts.lua`**
- Replaced the removed `CompactUnitFrame_UtilSetBuff` hook with a `CompactUnitFrame_UpdateAuras` hook, using the same `frame.buffFrames` iteration pattern already used by the Target and Focus frame hooks. Wrapped in an existence check so it degrades gracefully if Blizzard renames it again in a future patch.
- Moved `_glowHooksInstalled = true` to the *end* of `InitGlowHooks` so a future hook error cannot permanently disable glow hook installation.
- Added `pcall` protection to `FindActiveModule`'s spec index comparison as a secondary guard against the 12.0.5 secret-value API changes, with a `GetSpecializationInfo` spec ID fallback path.

**All spec modules** (`MonkMistweaver`, `DruidRestoration`, `PriestDiscipline`, `PriestHoly`, `ShamanRestoration`, `EvokerPreservation`, `PaladinHoly`)
- Added `specID` field to each module table. Used by the `FindActiveModule` fallback path when `GetSpecialization()` returns a secret value and direct index comparison is not possible.

---

# v12.0.16 (2026-04-19)

## Mistweaver Monk — Major Rework

### Statue Alerts Removed

After extensive in-combat testing, both **Place Jade Statue** and **Statue Idle** alerts have been removed. The root cause is Blizzard's secret-value API restrictions in M+ combat:

- `GetTotemInfo()` returns secret booleans — unreadable in M+ combat
- `UnitExists("totemN")` returns secret booleans in M+ combat
- Spell 198533 (statue's Soothing Mist) has every aura field secret in M+ combat — spellId, icon, name, and isFromPlayerOrPlayerPet are all unreadable
- Spell 115175 (player's Soothing Mist) is whitelisted and readable, but only reflects the player's own channel — the statue's independent 12-second channel is undetectable once the player stops casting

The combination of unreliable placement detection (false positives with the statue visibly present) and completely undetectable statue activity in M+ made both alerts produce more noise than signal. They have been removed in favour of the two alerts that work reliably.

### Soothing Mist Icon Glow (new)

A new icon glow fires on buff frames when your Soothing Mist (spell 115175) is active on a target. Full-duration glow for the entire channel — no pandemic window, just a clean visual indicator of your current SM target. Uses monk teal (`#00FF98`), stored in `db.alertColors.sm` for future colour customisation. Works alongside the existing Renewing Mist pandemic glow and Enveloping Mist full-duration glow.

### Renewing Mist Threshold — Options Panel (new)

Two new numeric inputs appear in the Alert Options section below the font dropdown:

- **Target Renewing Mist (Party)** — dungeon threshold, default 2, range 1–20
- **Target Renewing Mist (Raid)** — raid threshold, default 4, range 1–40

Both inputs are class-coloured and sit on the same row. Values take effect immediately without a reload.

### Code Cleanup

Removed all statue-tracking infrastructure that existed solely to support the two removed alerts (~750 lines):

- `CheckJadeStatueTalent`, `IsJadeStatuePlaced`, `TryRecoverStatueSlot`, `IsStatueInRange`, `IsStatueChannelingSoothingMist`, `FindStatueSoothingMistTarget`
- `SaveStatuePersist`, `SetStatuePlaced`, `ClearStatuePlaced`, `LoadStatuePersist`, `CombatSafeScan`
- `PLAYER_TOTEM_UPDATE` and `UNIT_SPELLCAST_SUCCEEDED` event handlers
- SavedVariables statue persistence (`statuePersistedPlaced`, `statuePersistedExpire`)
- `hasJadeStatueTalent`, `statueKnownPlaced`, `statueSlot`, `statueExpire` state fields
- `mwtrace` and `mwscan` debug slash commands (no longer needed without statue diagnostics)
- `SUMMON_JADE_STATUE_ID`, `STATUE_SOOTHING_MIST_ID`, `SM_ICON_ID`, `JADE_STATUE_NODE_ID` constants

The module now contains only what it needs: two alerts (Spread Renewing Mist, Enveloping Mist), three icon glows (RM pandemic, EM full-duration, SM active channel), and the options panel threshold inputs.

---

# v12.0.15 (2026-04-18)

## Options Panel — Alert Options Section (new)

A dedicated fourth section, **Alert Options**, now appears below the Alerts section. It is fully dynamic — its contents are driven by the active spec module, just like Sounds and Alerts.

- **Font picker** moved here from the Display section. The "Alert Font" label has been removed; the dropdown stands alone as a clean control at the top of the section.
- **Spec-specific options** (previously in the right column of Display) now live here with a proper vertical layout via a new `BuildAlertOptions` hook. The core provides a helpers API to spec modules: `MakeCheckbox`, `MakeCheckboxRow`, `MakeCheckboxWithNumeric`, `MakeNumericInput`, and `Spacer`.
- **Alert text editors** — every alert for the active spec gets a labeled two-column edit box showing the current alert text. Edits apply live on focus-lost. Clearing a box resets it to the built-in default. Saved per character in the saved variables.
- **Restore Defaults button** added as a fourth button alongside Test, Unlock Frame, and Center Position. Resets all alert colors, alert texts, font, scale, font size, and frame position back to built-in defaults.
- **Reset Position** renamed to **Center Position**.

## Options Panel — Display Section

- Checkboxes (Enable Addon, Flash Animation, Icon Glow) shifted left and spaced to match the Sounds section layout (x=8, 40px row gap).
- Display section height tightened by 20px to remove excess empty space below Icon Glow.
- Sound dropdowns shifted right to align their left edge directly under the slider tracks.
- Buttons shifted left 8px to align with the content panels.

## Restoration Druid — Alert Options

- **LB Timer** and **SOTF Timer** checkboxes now appear side-by-side on one row in the Alert Options section, with **Abundance Count** inline to the right, aligned to the same column as the Cast Lifebloom text editor below it.
- **Abundance Count** is now user-configurable (min 7, max 12, default 7). The value is saved to the database and read live by Evaluate on every tick. The edit box is class-colored.
- Alert text editors for all six Druid alerts: Lifebloom Expiring, Cast Lifebloom, Soul of the Forest, Wild Growth Ready, Tree of Life Ready, Abundance (Cast Regrowth).

## Restoration Druid — Default Sounds

- **Wild Growth Ready**: Lamp → Redfox
- **Abundance (Cast Regrowth)**: Ping → Lamp
- Lifebloom Expiring (Bell) and Soul of the Forest (Ping) unchanged.

---

# v12.0.14 (2026-04-18)

## Mistweaver Monk — Cleanup

- **Removed Zen Spheres** alert and all associated tracking code (talent check, aura scanning, state, DEFAULTS, alert definition)
- **Removed Shielun's Appeal** stack counter and all associated tracking code
- **Fixed default sounds** — Enveloping Mist changed from Redfox → Bell; Statue Idle changed from Bell → Lamp. Final defaults: Spread Renewing Mist (Ping), Enveloping Mist (Bell), Place Jade Statue (Lamp), Statue Idle (Lamp)

---

# v12.0.13 (2026-04-18)

## Mistweaver Monk — Bug Fixes

- **Fixed chat spam loop** — `IsJadeStatuePlaced()` had permanent debug `NHA.Msg("[IJP] ...")` prints baked in that fired on every evaluate tick and every `PLAYER_TOTEM_UPDATE` event. All debug output has been removed.
- **Fixed false "Place Jade Statue" alert** — In M+ combat, the icon and name matchers inside `IsJadeStatuePlaced()` silently return `false` even when the statue is present (tainted comparison results). The old code treated a clean-but-no-match scan as a confirmed absence and wiped `statueKnownPlaced`, overriding what `UNIT_SPELLCAST_SUCCEEDED` had correctly set. The function now preserves `statueKnownPlaced` if it was set by the cast event and hasn't expired, only clearing it on a confirmed expiry.

---

# v12.0.12 (2026-04-18)

## Restoration Druid — New Alerts

### Cast Lifebloom *(new)*
Fires in combat when no party or raid member has your Lifebloom active. This is the companion to the existing Lifebloom Expiring alert — Expiring tells you it's about to fall off, Cast Lifebloom tells you it's already gone. The two alerts are mutually exclusive and share the same screen position so you always know exactly what Lifebloom needs from you. Hidden during test mode to avoid overlapping with the Lifebloom Expiring preview.

### Abundance — Cast Regrowth *(new)*
Fires when you have the **Abundance** talent and your combined Rejuvenation + Germination count across the group reaches **7 or more**. At that stack count, Abundance gives Regrowth a meaningful cost reduction and critical hit bonus, making it an efficient filler cast. Each target can contribute up to 2 stacks (one Rejuv and one Germination). The alert is fully talent-gated — it won't appear if you haven't specced into Abundance.

### Wild Growth — Dynamic Cooldown Tracking *(new)*
The Wild Growth Ready alert now calculates the correct cooldown duration based on your actual build, so the alert fires at the right time regardless of how you're geared or specced:

- **Early Spring** hero talent reduces the cooldown by 1 second and is detected automatically when you switch talents
- **Sprouts of the Luminous Bloom 4pc set bonus** reduces it by 2 seconds in PvE, or 1 second in arenas (PvP scaling applied automatically)
- When the cooldown API is readable (outside M+ and rated content), the addon stores the real duration directly as ground truth, overriding the calculated values

Gear changes and talent swaps are detected in real time — no reload needed.

## Restoration Druid — Alert Text Updates

- **Reforestation** shortened from `* TREE OF LIFE NEXT SWIFTMEND *` → `* TREE: NEXT SWIFTMEND *`
- **Abundance** updated from `* ABUNDANCE - CAST REGROWTH *` → `* ABUNDANCE: CAST REGROWTH *`
- **Cast Lifebloom** — no longer plays a sound by default (sound channel removed)

## Options Panel — UI Improvements

The Settings panel has been cleaned up with a better visual flow throughout:

- Fixed right-side panels being clipped off-screen in the WoW Settings UI (panel width reduced by 15px)
- Removed redundant slider labels that were duplicating information already shown on the sliders themselves
- Dropdown controls shifted down for better visual separation from the section above
- Display section sliders shifted right for improved alignment

---

# v12.0.11 (2026-04-14)

## Mistweaver Monk — Jade Serpent Statue Alerts

Two new alerts for Mistweaver Monks who talent into Jade Serpent Statue:

- **Place Jade Statue** — fires in combat when the Jade Serpent Statue talent is selected but no statue is currently placed. Catches forgotten placements after dying, rezoning, or the 15-minute duration expiring. Uses the `GetTotemInfo` API (not affected by secret-value restrictions)
- **Statue Out of Range** — fires when you're channeling Soothing Mist on a target and the statue is placed, but the statue's copy (spell 198533) isn't healing anyone. Indicates a line-of-sight or range problem between the statue and your target. Includes a 0.5s grace period after channel start so the statue has time to begin casting

Both alerts are talent-gated via Node ID 101164 (Jade Serpent Statue / Jade Infusion choice node) and will not appear if you've selected Jade Infusion instead.

### Technical

- Added `PLAYER_TOTEM_UPDATE` event to the Mistweaver module for immediate statue placement/destruction detection
- Talent detection follows the same `C_ClassTalents` / `C_Traits` pattern used by Druid Reforestation, including `PLAYER_TALENT_UPDATE` / `TRAIT_CONFIG_UPDATED` re-checks
- Statue detection via `GetTotemInfo()` slot iteration with icon ID match (620831) and name fallback — works in M+ and rated PvP
- Debug command (`/nha debug`) now dumps totem slot info, statue placement status, statue Soothing Mist target, and talent state

## Spec Availability

Four specs have been temporarily disabled pending full customization and testing: **Holy Priest**, **Holy Paladin**, **Preservation Evoker**, and **Restoration Shaman**. These modules loaded but were not yet functional, leading to user confusion. Each spec file now exits at load time until implementation is complete. They will be re-enabled spec by spec as testing is finished.

---

# v12.0.10 (2026-04-12)

## Options Panel Improvements

- Non-healer specs now show a clean "Spec Not Supported" panel on first click — no more blank panel or flashing options
- All non-healer specs (including non-healer specs of supported classes like Windwalker Monk or Shadow Priest) now show the same unified message
- Removed the old "Class Not Supported" / "Class Support Coming Soon" distinction — everything is handled by one simple check
- Options panel uses the default cyan theme for non-healer specs instead of showing class colors

## Code Cleanup

- Removed overlay system — the unsupported-spec panel is now built directly into the UI rather than layered on top
- Standardized Mistweaver Monk module structure to match the Restoration Druid and Discipline Priest reference format
- Added debug slash command for Mistweaver (`/nha debug`)

---

# v12.0.9 (2026-04-10)

## Rebrand: Nem: HoT Alerts → Nem: Healer Alerts

The addon has been renamed from **Nem: HoT Alerts** to **Nem: Healer Alerts** to better reflect its scope — the addon tracks far more than just Heal over Time effects (beacons, procs, cooldowns, shields, etc.). This is a cosmetic rename with zero gameplay changes.

### What changed

- All user-facing text updated: title, options panel, chat messages, addon compartment, Settings category
- Internal identifiers renamed (`NemHotAlertsSV` → `NemHealerAlertsSV`, `_G.NemHotAlerts` → `_G.NemHealerAlerts`, frame names, slash command keys)
- **Existing settings migrate automatically** — your saved variables carry over on first login, no action needed
- New slash command `/healeralerts` added; `/hotalerts` kept as a legacy alias
- Addon folder renamed from `NemHotAlerts` to `NemHealerAlerts`

## All Healer Specs Now Supported

### Restoration Druid (existing)

- All existing alerts and glows carry over unchanged

### Discipline Priest (new)

- Atonement Expiring — alerts when your soonest Atonement enters its pandemic window, with countdown timer. Tracks the most urgent Atonement across your entire group
- Cast Void Shield — alerts when Master the Darkness procs, reminding you to cast an empowered Power Word: Shield
- Atonement icon glow on party/target/focus frames when inside the pandemic window
- Void Shield absorb icon glow on party frames when your Void Shield is active on a target

### Holy Priest (new)

- Prayer of Mending — alerts when you have no active Prayer of Mending bouncing on any group member
- Prayer of Mending icon glow on frames where PoM is active

### Preservation Evoker (new)

- Reversion Low — alerts when your Reversion/Echo Reversion coverage drops below threshold (configurable for dungeons vs raids)
- Echo icon glow on frames where Echo is active
- Echo Reversion synergy icon glow

### Mistweaver Monk (new)

- Renewing Mist Low — alerts when your Renewing Mist coverage drops below threshold (configurable for dungeons vs raids)
- Enveloping Mist — alerts when you're channeling Soothing Mist on a target that doesn't have Enveloping Mist yet
- Soothing Mist target icon glow

### Holy Paladin (new)

- Beacon Missing — alerts when no Beacon (Light, Faith, or Savior) is active on any group member
- Eternal Flame — optional alert when Eternal Flame coverage is low (off by default)
- Beacon icon glow on frames where any Beacon variant is active

### Restoration Shaman (new)

- Earth Shield Missing — alerts when Earth Shield isn't active on anyone (checks focus, then target, then group)
- Riptide Low — alerts when your Riptide coverage drops below threshold (configurable for dungeons vs raids)

## Architecture

The addon was completely restructured behind the scenes. Each healer spec is now a fully independent file — adding or changing one spec can never break another. Druid players will notice zero differences from v12.0.8.

---

# v12.0.8 (2026-04-06)

## Bug Fixes

- Alerts no longer fire in non-Restoration Druid specs (Balance, Feral, Guardian)
- Switching away from Restoration now immediately clears all alerts and glows
- Zone transitions in off-spec no longer cause stale alerts

## Changes

- Login message shows inactive status for Druids in non-Resto specs
- Chat feedback when switching specs in/out of Restoration

---

# v12.0.7 (2026-04-05)

## New Features

- Options panel now themes dynamically per healer class (Druid orange, Priest white, Evoker teal, Shaman blue, Monk green, Paladin pink)
- Non-healer classes see a "Class Not Supported" overlay listing supported classes
- Supported healers without a module see "Class Support Coming Soon"
- Slash commands blocked for non-implemented classes with a helpful message
- Updated subtitle to reflect multi-class scope

---

# v12.0.6 (2026-04-05)

## Bug Fixes

- Fixed a crash in M+ and rated content caused by a removed WoW API (`GetSpellCooldown` → `C_Spell.GetSpellCooldown`)

---

# v12.0.5 (2026-04-04)

## New Features

- **Wild Growth Ready** alert — shows when Wild Growth is off cooldown (combat only). Falls back to cast tracking when WoW restricts the cooldown API in M+/rated content
- **Reforestation / Tree of Life** alert — shows after your 3rd Swiftmend, reminding you the next one will proc Tree of Life. Automatically hides if you unspec the talent
- **Empowered Regrowth glow** — Regrowth icons on party frames glow when the Regrowth was cast with Soul of the Forest active. Clears when overwritten by a normal Regrowth
- Alert display order flipped: Tree of Life (top) → Wild Growth → Soul of the Forest → Lifebloom (bottom)
- SOTF alert text changed from "CAST REJUV" to "SOUL OF THE FOREST"
- Two new bundled sounds: Lamp and Redfox (15 total)
- All four alerts now have individual color swatches

## Bug Fixes

- Numerous fixes for Wild Growth cooldown tracking, Reforestation talent detection, and empowered Regrowth glow reliability in combat
- Death now properly clears all alert state
- Test mode now shows all four alerts
- Display section checkbox labels no longer invisible

---

# v12.0.4 (2026-04-02)

## Bug Fixes

- Test mode timers now display correctly alongside alert text
- Options panel spacing matches Nem: Pet Alerts layout

---

# v12.0.3 (2026-04-02)

## Performance

Major CPU optimization for raids and battlegrounds — reduced unnecessary processing from aura events, group roster changes, and glow updates. Most noticeable when joining a 40-player group.

## Bug Fixes

- SOTF alert no longer gets stuck when the proc expires without casting
- Lifebloom icon glow now fires correctly when targeting an enemy
- Ticker no longer runs indefinitely after disabling the addon
- SOTF alert state properly clears when the alert is toggled off mid-session
- Fixed a crash caused by glow cleanup running before glow tables were created
- Alerts now clear on player death and re-evaluate on resurrect
- SOTF alert clears immediately on Rejuv cast instead of waiting for the next evaluation tick
- Bell and Ping sounds now work without LibSharedMedia installed

---

# v12.0.2 (2026-04-01)

## Bug Fixes

- All alerts and sounds now work reliably in M+ and rated combat (WoW 12.0's secret-value aura restrictions)
- SOTF detection now uses spell-cast tracking as a fallback when the aura API is restricted in combat
- SOTF timer starts immediately on Swiftmend cast
- SOTF alert persists when entering combat with the proc already active

## Slash Commands

- Added `/nha on`, `/nha off`, `/nha toggle`, `/nha status`, `/nha version`, `/nha reset`, `/nha unlock`
- All commands also available via `/healeralerts` (and `/hotalerts` as legacy alias)

---

# v12.0.1 (2026-03-31)

Initial release of **Nem: Healer Alerts** (originally as Nem: HoT Alerts) — Restoration Druid alerts for Lifebloom pandemic tracking and Soul of the Forest proc consumption, with countdown timers, icon glows, configurable sounds, and full options panel. Part of the Nem addon suite.
