File Details
v0.6.1
- R
- Apr 22, 2026
- 36.07 KB
- 1.8K
- 12.0.5
- Retail
File Name
HekiLight-v0.6.1.zip
Supported Versions
- 12.0.5
HekiLight
v0.6.1 (2026-04-22)
- chore: exclude dev-only files from release package (#11)
Adds docs/, ADR.md, .gitattributes to .pkgmeta ignore list so they are
not bundled into the CurseForge/Wago release zip.
Co-authored-by: HekiLight addon@hekilight.local
Co-authored-by: Claude Sonnet 4.6 noreply@anthropic.com - feat: EPIC-5 through EPIC-7 — correctness hardening, keybind robustness, active-bar filtering (#10)
- docs: rewrite CLAUDE.md with comprehensive architecture reference
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - feat: proc alert, edit mode, session log, keybind cache, locale system; add RAW_SUGG diagnostic logging (v0.3.0)
- Proc-alert icon: extra slot to the left showing active proc spells not in the main suggestion
- Edit Mode: /hkl edit to drag and reposition main and proc-alert frames independently
- Session log: DLog pipeline writing to HekiLightDB.sessionLog, readable with /hkl log [N]
- Keybind cache: last known good keybind survives transient FindSpellActionButtons gaps at combat start
- Locale system: Locale.lua with ptBR translation block and identity-fallback metatable
- RAW_SUGG DLog: logs raw GetNextCastSpell output (spellID + name + iconID) for icon-mismatch diagnosis
- SUGGEST DLog: enhanced with iconID field
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
- fix: resolve talent override icons (Defile etc.) and eliminate SKIPPED log spam
- GetActiveSuggestion now calls GetActionInfo(realSlotID) after resolving the spell; if the
slot returns a different spellID (talent override), that is used for icon/name display.
Fixes Blood DK seeing Death and Decay icon when Defile is suggested. - SLOT SKIPPED DLog now fires once per alert-spell activation instead of every poll tick;
lastSkippedAlertID reset on ALERT_HIDE and SUPPRESS so each new proc logs correctly.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
- perf: stop poll loop on combat-end; gate UNIT_HEALTH refresh on visibility change
- PLAYER_REGEN_ENABLED now calls StopPollLoop() before Refresh(), eliminating
continuous 50ms OnUpdate ticks during all out-of-combat gameplay. - recentlyCastSpells wiped on combat-end to prevent stale CD tracking entries
accumulating across fights. - UNIT_FLAGS/UNIT_HEALTH no longer call Refresh() unconditionally; they only
re-render when ShouldShow() result would change display visibility. Prevents
Refresh() being called on every damage/heal tick during combat.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
- docs: add ADR.md extracted from git history (12 decisions)
Architecture Decision Records covering: single-file discipline, polling vs events,
two-layer spell detection, realSlotID taint pattern, secret-number pcall trick,
defensive floater revert, visibility logic reversals, poll loop lifetime,
talent override resolution, pre-allocated queue, per-character SavedVariables,
and session log ring buffer.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - docs: add PRD, epics, and stories (retroactive EPIC-1 through EPIC-4)
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - docs: CLAUDE.md improvements from /init; add EPIC-5 epic and story files
- CLAUDE.md: add OVERRIDE DLog tag, docs/ reference, known open bugs table,
C_CooldownViewer hard ban reminder - docs/epics/EPIC-5.md: Correctness Hardening epic (3 bugs from EPIC-4 close)
- docs/stories/5.1-5.3: story files validated by @po, status Ready
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
- feat: EPIC-5 correctness hardening — override-aware dedup, secondary icons, range pcall (v0.4.0)
Story 5.1 — Override-aware secondary slot deduplication:
resolveSecondary() mirrors GetActiveSuggestion override resolution for
secondary spells; effectiveID ~= primaryID dedup now compares cast IDs
not base IDs, fixing duplicate primary spell in secondary strip for
talent overrides (e.g. Blood DK with Defile)
Story 5.2 — IsActionInRange pcall guard:
pcall wraps C_ActionBar.IsActionInRange in Refresh; taint or unexpected
slot type safely yields inRange=nil instead of crashing; DLog fires once
per unique failing slot via lastRangeFailSlot change-detect guard
Story 5.3 — GetRealSlot for secondary spells:
queueCache extended with overrideSpellID field; secondary slot icons now
use GetActionInfo(realSlotID) override resolution matching primary pipeline;
keybind lookup upgraded to GetSlotKeybind(realSlotID) with effectiveID fallback
Also: restore combat-end StopPollLoop + wipe(recentlyCastSpells) and
UNIT_FLAGS/UNIT_HEALTH visibility-change gate (both regressed in prior
uncommitted state); parent minimap button to Minimap frame
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - docs: close EPIC-5 stories and mark epic Done
All three stories (5.1, 5.2, 5.3) implemented in commit 24308cf.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - fix: gate secondary OVERRIDE DLog with change-detect guard
DLog("OVERRIDE") inside GetSuggestionQueue had no change-detection
guard, causing it to fire at 20 Hz for any persistent talent-override
spell in the secondary strip, exhausting the 500-entry ring buffer in
~25 seconds of combat.
Added lastOverrideLogID[baseSpellID] = effectiveID guard (fires once
per unique base→override mapping); wipe() on ShouldShow suppression
to re-enable logging when talent builds change.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - fix: gate RAW_SUGG DLog with change-detect guard to stop buffer flooding
RAW_SUGG was firing every poll tick (20 Hz) with no guard, consuming ~90%
of the 500-entry session log buffer in under 90 seconds of combat. Added
lastRawSuggID to suppress duplicate entries; reset on ShouldShow suppression
and PLAYER_REGEN_ENABLED, matching the pattern of all other DLog guards.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - fix: EPIC-6 story 6.1 — shapeshift-resilient keybind cache repopulation
Root cause: keybindCache was never populated by the realSlotID path in
Refresh, so wipe(keybindCache) on ACTIONBAR_SLOT_CHANGED left nothing for
the GetSpellKeybind fallback during the transient FindSpellActionButtons
nil window after shapeshifting.
Fix chain:
- Populate keybindCache[spellID] whenever realSlotID resolves a key in
the Refresh render loop (keeps cache warm continuously) - Remove wipe(keybindCache) from ACTIONBAR_SLOT_CHANGED so cached values
survive the transient window; only wipe at PLAYER_REGEN_DISABLED - Schedule C_Timer.NewTimer(0.3) deferred Refresh after ACTIONBAR_SLOT_CHANGED
to repopulate after the transient window closes; cancel on combat start - Add lastKeybindLog change-detect guard on all KEYBIND DLog paths to
prevent 20 Hz buffer flooding - Rewrite Refresh keybind block as explicit if/else to fix Lua truthiness
bug (empty string "" is truthy, silently bypassing or-fallback) - Add DLog("KEYBIND") with source=realslot/cache/miss/slot tags
- Remove diagnostic TRACE DLog
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
- docs: add EPIC-6 and story 6.1 — keybind robustness; update CLAUDE.md KEYBIND tag
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - chore: bump interface to 120005 and version to 0.2.2 for patch 12.0.5
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - fix: EPIC-7 story 7.1 — IsUsableAction guard for form-restricted secondary slots
GetSuggestionQueue pass-1 and pass-2 now includeand rslot and IsUsableAction(rslot)
so Cat Form spells (slots 73–84) are filtered from secondary suggestions when the
player is not in Cat Form. Confirmed in-game by @qa — all 6 AC passed.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - feat: EPIC-7 story 7.2 — Cat Form out-of-combat GetRotationSpells fallback
When GetNextCastSpell returns nil out of combat with an attackable target,
GetActiveSuggestion now iterates GetRotationSpells() for the first spell
where GetRealSlot returns non-nil and IsUsableAction passes. Forward
declaration added for GetRealSlot to resolve Lua 5.1 closure ordering.
PLAYER_TARGET_CHANGED was already registered; no event change needed.
Confirmed in-game by user — suggestions appear in Cat Form on target
acquisition without entering combat.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - docs: add EPIC-7 and stories 7.1–7.2; update CLAUDE.md
EPIC-7 (Secondary Slot Active-Bar Filtering) — Done. Stories 7.1 and 7.2
fully documented with AC, change logs, and QA gate results. CLAUDE.md
updated: interface version 120005, line count, resolveSecondary and
IsUsableAction documentation, EPIC status 1–7 all Done.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - chore: add .gitattributes to collapse docs in GitHub PR diffs
Story files, epic files, PRD, and ADR marked linguist-generated=true so
GitHub collapses them by default in PR review. Reviewers can expand
individually if needed.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - chore: bump version to 0.6.0
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
Co-authored-by: HekiLight addon@hekilight.local
Co-authored-by: Claude Sonnet 4.6 noreply@anthropic.com - docs: rewrite CLAUDE.md with comprehensive architecture reference