1.5.0-release
What's new
lightweight tag 451301f004f5bc65aa3b880f0875025ded552e24 1.5.0-release
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Mon Jul 20 13:12:51 2026 +0000
commit 451301f004f5bc65aa3b880f0875025ded552e24
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Mon Jul 20 13:12:51 2026 +0000
Prep for next release
Empty marker commit to prepare the 1.5.0 release tag.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
commit d4eef3f7fa184c96d0979bf5e039ac9799653d5d
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Mon Jul 20 12:34:24 2026 +0000
Add scrollbar + line counter to the debug console
The console log was a wheel-only ScrollingMessageFrame with no way to
read scroll position or buffer fill (debug-logging-§11 / anti-pattern
#41). Add a thin right-edge Slider synced both ways to the log's scroll
offset (always shown, inert when the log fits) and a bottom "N / 500
lines" counter that updates on append and resets on Clear.
Drive the log through the Lua ScrollingMessageFrameMixin API
(GetMaxScrollRange/GetScrollOffset/SetScrollOffset), guarded for method
presence and numeric returns so the headless mock stays a no-op; run the
initial sync last in the window build so a frame-API error can't abort
the header/ESC wiring. Bump Tests badge 140->141.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
commit 616d827e89425ceed65249b0a68a12750b9ff6a0
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Mon Jul 20 12:11:10 2026 +0000
Refresh FAQ/Troubleshooting for spec-aware weapon enchant + new macros
FAQ: fold Weapon Enchant into the spec-aware category list and move
Augment Rune and Vantus into the shared-ranking list; add entries for
dual-wield weapon-enchant picking and why a reusable augment rune only
wins on a stat tie. Troubleshooting: add weapon enchant to the spec-swap
row, plus new rows for a bare weapon hand and the debug-console-vs-logging
distinction. Also give the logo and screenshots descriptive alt text.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
commit 658416784e756aa091dc4f4c556e92911570508a
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Mon Jul 20 07:48:11 2026 +0000
Refresh README screenshots; add AIO-health, flask, weapon-enchant shots
Point the README gallery at the new forgecdn attachments and document the
All-in-One Health, Flask (spec-aware), and Weapon Enchant selectors. Replace
the old ranking screenshot and re-add local media copies to match.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
commit 92dfb39186d007f1f47267ee4d69685fbe14dd61
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sun Jul 19 10:44:54 2026 +0000
Drop stale globals from .luacheckrc; dedupe read_globals
The `KCM` and `SLASH_CONSUMABLEMASTER1` entries in `globals`
advertised an exposure the code no longer has: state is threaded
through the private NS table (local KCM = NS) with no addon global
per standard §4.1, and slash globals are registered dynamically by
AceConsole rather than by literal name. Also collapse the duplicate
`Settings` and `LibStub` entries in read_globals. luacheck stays 0/0.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JrhazKMv6GZpf1NzFqqVJJ
commit ba894abc749ff4fb8917b32e5ec89399971751fa
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sun Jul 19 07:50:07 2026 +0000
Add What's-new §1.5.0 section; sync stale Version History row
The 1.5.0 Version History row omitted the three new macro
categories (weapon enchant, augment rune, Vantus rune) that
already shipped. Add a player-facing "What's new in 1.5.0"
section above Screenshots per Ka0s standard documentation-§1
item 5, and update the top history row to agree with it.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JrhazKMv6GZpf1NzFqqVJJ
commit f469433654d6affcb71414f7460ef3d475c581cd
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sat Jul 18 19:20:20 2026 +0000
Conform chat output, slash UX, and TOC to the Ka0s standard
Remediate the actionable MUST deviations from the 2026-07-18 standards
audit (bundle recorded under docs/audits/2026-07-18/):
- CM-24: KCM.SafeToString now probes table.concat, not tostring — a
combat "secret" survives tostring but raises in concat, so the old
probe waved it through.
- CM-25: KCM.Say is the single secret-safe chat seam (adds a vararg
form); routed every hand-written-tag print site (SlashCommands,
Panel, Debug, Category, General, MacroManager) through it. Only
generated macro-body /run print(...) strings still carry the tag.
- CM-26: dropped the trailing colon from every chat line.
- CM-27: coloured /cm list/get/set via a shared FormatSchemaValue +
formatKV (green header, azure [page], gold key, white value).
- CM-28: version verb reads TOC metadata with KCM.VERSION fallback and
prints the canonical [CM] v<version>.
- CM-29: both combat-open refusals emit the canonical grey notice.
- CM-31: reordered the TOC metadata block to the standard's field order.
Deferred: CM-30 (tracked English-tooltip deviation) and CM-32 (now
optional). Adds tests (140/140), bumps the Tests badge, and syncs the
docs that describe the chat seam.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8bASN94JLf4nFuuXcEouR
commit d39ab53061dab30d0f24cb76466b05caed88acc9
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Jul 17 21:04:53 2026 +0000
Sync README Debug console toggle with its window-only behavior
The General → Debug console checkbox now shows/hides the console window
only (a bare /cm debug); it no longer arms logging. Update the README's
settings reference to match so it stops claiming "Same as /cm debug on".
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8bASN94JLf4nFuuXcEouR
commit 71e2154e4bfad881d9ee1dadbf092515fc117584
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Jul 17 19:56:19 2026 +0000
Refresh scalar settings in place instead of rebuilding the page
A checkbox toggle or `/cm set` routed through SetAndRefresh, which
re-ran the visible page's full renderer — an AceGUI teardown+rebuild
for a one-value change. The per-widget refresher closures each renderer
registered were dead code. Add RefreshScalars to re-sync those closures
in place on the on-screen panel (off-screen panels stay dirty + lazy),
and route the scalar seam through it. Satisfies options-ui-§11's
scalar-in-place mandate; structural mutations keep RefreshAllPanels.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8bASN94JLf4nFuuXcEouR
commit 48bad00e712af74f08f9c7445a8619c7fb81f59f
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Jul 17 19:33:02 2026 +0000
Make Debug console checkbox toggle window visibility, not the flag
The [Debug console] panel checkbox now shows/hides the console window
only, matching a bare /cm debug (debug-logging-§5) — it no longer arms
or disarms the session debug flag. Logging stays controlled by the
in-window Debug: ON/OFF toggle and /cm debug on|off.
Add DL.IsWindowShown() to back the checkbox and refresh the panel on
window OnShow/OnHide so closing via × or Escape unchecks the box. Page
Defaults now also hides the window. New test asserts Show/Hide never
move the enabled flag (137/137); badge + test-cases + file-index synced.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8bASN94JLf4nFuuXcEouR
commit b06ab9f0209af54503965f82176aeaede1bc6deb
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Jul 17 19:00:41 2026 +0000
Add §7a smoke tests for panel-refresh perf and Defaults button styling
Capture the two options-panel fixes from ec74454 as regression checks:
no per-mutation freeze (rebuild only the on-screen panel), correct lazy
off-screen refresh, and the AceGUI dark/gold Defaults button. Add a
targeted-by-change-area row (options-ui-§5/§11, anti-pattern #39).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8bASN94JLf4nFuuXcEouR
commit ec7445491719a4e6f8b95cac22c2a640e142d5f5
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Jul 17 18:53:04 2026 +0000
Fix settings-panel freeze and red Defaults button
Two options-panel defects:
- Every settings mutation ran RefreshAllPanels, which re-ran the full
renderer for *all* rendered sub-pages (a complete AceGUI teardown +
rebuild each). With 15 sub-pages that stalled the client ~0.5s on
every checkbox toggle / button click. Now rebuild only the on-screen
panel (ctx.panel:IsShown()); flag the rest dirty and rebuild them
lazily on next OnShow.
- The top-right Defaults button was a raw UIPanelButtonTemplate frame
parented onto the Blizzard Settings canvas, which skins it red. Build
it as an AceGUI Button (created under UIParent, reparented) so it
keeps the standard dark/gold look, matching Absorb Tracker / KickCD.
Conforms to the new options-ui-§5 / §11 and anti-pattern #39
(WowAddonStandards v2.7.0).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8bASN94JLf4nFuuXcEouR
commit 1be0f902c976dc967ea040da5d7b4ee2c7669dbe
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Jul 17 17:51:47 2026 +0000
Reframe debug-console font as standard-compliant, not a deviation
The Ka0s Standard's debug-logging-§2 requires a shipped monospace font
for the debug console and names JetBrains Mono the reference font, with
a sanctioned-styling-exception rule that audits MUST NOT flag it. Retitle
the scope.md / debug.md notes and the DebugLog.lua comment from "tracked
deviation" to compliance, keeping the design rationale.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8bASN94JLf4nFuuXcEouR
commit dad29d5eaf7c79bbd4f56fbb79b33b99c9e5fb20
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Jul 17 14:42:47 2026 +0000
Fix reset mechanisms across settings, slash, and DB
Audit of every reset path surfaced UX/scope/messaging defects (no
logic bugs). Fixes:
- General "Defaults" button now resets that page only (master enable +
debug console) instead of wiping the whole DB while ignoring the one
setting on the page.
- Add §6.5 Defaults buttons to Category and Stat Priority pages, wired
to their existing per-page reset via shared helpers.
- Unify the two global-reset popups on one accurate description: macros
stay in place, bag items are re-discovered (drop the misleading
"discovered items preserved" claim).
- Global reset now restores the master enable, so a disabled addon is
re-enabled by "reset all to defaults".
- Combat handling made consistent: inline reset-all guards with a
notice; the Defaults-button guard now reports instead of silently
no-op'ing.
Sync docs/smoke-tests.md to the new behavior.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8bASN94JLf4nFuuXcEouR
commit 84230dd8afddcf5c0fb2af73da438495c44e2ea3
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Jul 16 19:54:33 2026 +0000
Add smoke tests for class-based classification (localization)
New §3c validates the de-localization: /cm dump item confirms the
Classifier / WeaponSlots key on the numeric classID/subClassID, not the
localized subType string. Covers the mechanism check, English no-regression,
weapon affinity by subclass, the classID-gate guard (a Shield must not read
as a Polearm at the shared subclass 6), and the definitive non-English-client
test. Wired into the "Targeted by change area" map.
Docs only.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8bASN94JLf4nFuuXcEouR
commit eb57403e13f78a736611dc8a5d00cf157a4074f9
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Jul 16 19:46:39 2026 +0000
Record the English-only tracked deviation; sync classification docs
docs/scope.md now records English-only as a documented, intentional
deviation from the Ka0s Standard's localization-§4 (anti-pattern #37) — a
standards audit is expected to flag it. Scopes the remaining dependency to
TooltipCache tooltip-text parsing and notes classification is already
de-localized, leaving room to localize the tooltip parsing later.
Syncs the docs that still described the removed ST_* subType-string strategy
(ARCHITECTURE, agent-context, module-map, file-index, common-tasks,
midnight-quirks, data-model, defaults/README) to the numeric
classID/subClassID keying. Notably midnight-quirks' "subtype renames"
section flips from a breakage risk to a non-issue, since keying on the
stable numbers survives display-string renames.
Docs only; no code change.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8bASN94JLf4nFuuXcEouR
commit dc8289f87ecebe53cff81a72291b681215c20939
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Jul 16 19:46:27 2026 +0000
Classify by numeric item class, not localized subType strings
The Classifier and WeaponSlots matched item/weapon subType DISPLAY strings
against English literals ("Potions", "Two-Handed Swords", …). Those strings
are localized, so classification was silently dead on every non-enUS client
(Ka0s Standard localization-§4 / anti-pattern #37).
GetItemInfoInstant already returns the locale-independent numeric
classID/subClassID alongside the display string — the code just discarded
them. Now the consumable matchers key on subClassID (Potion=1, Flask/Phial=3,
Food & Drink=5, gated on classID==Consumable) and WeaponSlots keys on the
weapon subClassID (gated on classID==Weapon, so an Armor Shield can't collide
with a Weapon Polearm at the same subclass number). Category and weapon-
affinity detection now work on every client.
The remaining English dependency is TooltipCache's tooltip-TEXT parsing
(numeric heal/mana/stat magnitudes have no stable-ID substitute) — a tracked
deviation recorded in docs/scope.md, surfaced to players in the README.
Tests: mock derives classID/subClassID from subType (real items keep them
consistent) so existing cases pass unchanged; two new cases prove
classification keys on the number, not the string. 134 -> 136.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8bASN94JLf4nFuuXcEouR
commit 25a1bbe37ff4a9ee052e866b95f548a47821866a
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Jul 16 14:28:32 2026 +0000
Remove dead exports (PrintHelp, DiscoverOne, Debug.Log)
Three functions on the KCM table had zero callers anywhere in the addon or
tests, surfaced by a doc-sync audit:
- KCM.SlashCommands.PrintHelp — a thin wrapper; the internal printHelp
local is what's actually called.
- KCM.Pipeline.DiscoverOne — the internal discoverOne local is still used
directly, so only the unused public alias is dropped.
- KCM.Debug.Log — a "retained alias" of the callable KCM.Debug(...) that
nothing (including tests) ever used.
Docs updated to match (module-map, file-index, debug, agent-context), which
also clears a pre-existing file-index claim of a KCM.Debug.Print that never
existed. No behaviour change. Tests: 134/134.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8bASN94JLf4nFuuXcEouR
commit 69a59fd3cb6c93dead430316986b30b1adc1970c
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Jul 16 12:50:41 2026 +0000
Sync docs: document WeaponSlots + the newer seed files
Eliminate documentation drift found by a full doc audit — mostly modules
that were never documented when their features landed:
- module-map + file-index: add core/WeaponSlots.lua (equipped-weapon
affinity for per-hand Weapon Enchant), missing from the module lists and
the Core load order; note KCM.SafeToString on the Constants row.
- macro-manager: add SetWeaponEnchantMacro to the public surface.
- defaults/README: add the Vantus / Weapon Enchant / Augment Rune seed-file
rows.
- data-model: add AUG_RUNE to the non-spec single-pick profile-bucket group.
Docs only; no code change. Tests: 134/134.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8bASN94JLf4nFuuXcEouR
commit f609fc37722c2019890de73c1fd47956aa9fb699
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Jul 16 12:50:32 2026 +0000
Reorder settings sub-pages: AIO pages after Healthstone, Vantus last
Move the two All-in-One composite pages (AIO Health, AIO Mana) up to
directly after Healthstone, and drop Vantus Rune to the end of the list.
Purely the settings tab display order (KCM.Settings.order) — independent of
how categories classify or rank, so no functional change. The panel/tab
order line in docs/agent-context.md and the "combo pages" note in the
README are updated to match.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8bASN94JLf4nFuuXcEouR
commit 1e98b0c12d25aeaf0aabc4036c25ddaae055b1ed
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Jul 16 12:12:04 2026 +0000
Inline vendored libraries in the TOC; drop embeds.xml
List LibStub, CallbackHandler, LibSharedMedia and the Ace3 sub-libraries
directly under the TOC's # Libraries section (same dependency order the
manifest used) and delete embeds.xml. The Ka0s standard now forbids the
embeds.xml wrapper (toc-file-§4 / anti-pattern #38): the load order belongs
in the one TOC every addon reads identically, not hidden in a second file.
This also unifies ConsumableMaster with the sibling addons, which already
list their libs directly.
tests/loader.lua's full-addon loader skipped libs by the .xml extension;
now that LibStub.lua is a direct TOC line it skips libs by path instead, so
the mock's LibStub isn't clobbered. ARCHITECTURE / file-index / module-map
updated to describe the direct listing. Tests: 134/134.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8bASN94JLf4nFuuXcEouR
commit 4d3be80d5b63a09b447d149fcba4f07bbc6f638d
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Jul 16 10:54:11 2026 +0000
Seed augment runes Legion..Midnight; expand reusable set
Widen the Augment Rune seed from 6 runes (DF/TWW/Midnight) to 12, adding
the Legion, BfA, and Shadowlands runes: Eternal (190384), Veiled (181468),
Lightning-Forged (174906), Battle-Scarred (160053), Lightforged (153023),
Defiled (140587). Newest expansion first, though ranking is by primary-stat
amount so the ancient low-stat runes just sort to the bottom. Pre-Legion
(Warlords garrison) runes are a different, obsolete mechanic and are left
out.
REUSABLE_AUG_IDS grows to the five "permanent" (not-consumed-on-use) runes
— Ethereal, Dreambound, Eternal, Lightning-Forged, Lightforged — so each
breaks a stat tie over its consumable peers. Tests: 134/134.
commit 6608c1540bd053bb9e4fe36045f5a22bda66a7dd
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Jul 16 10:53:54 2026 +0000
Fix augment-rune mis-ranking from a partial-tooltip cache race
Runes ranked reusable-first regardless of power (Ethereal 6 and Dreambound
5 above Void-Touched 25) because every rune's stat amount read as 0.
Root cause: TooltipCache.Get could parse a tooltip after the item name
resolved but before C_TooltipInfo delivered the "Use:" effect line, find no
stat buff, and cache that empty parse as final. GET_ITEM_INFO_RECEIVED does
not re-fire for an item whose basic info was already cached, so the empty
result never refreshed — leaving the Ranker to sort every rune by the
reusable bonus alone. (Force Resync / InvalidateAll was the only fix.)
Now a Consumable (classID 0) whose tooltip parses no effect is kept
pending, so a later Get() re-parses once the body arrives — it self-heals
with no resync, and the same latent race is fixed for flasks/stat food too.
Also fix auto-discovery: the "Augment Rune" marker renders inline at the end
of the Use line ("...for 1 hrs. Augment Rune."), not as its own line, so
the exact-line match never fired and runes classified as (none). Match the
marker sentence at end-of-line too, without tripping on the item name.
wow_mock.setItem gains classID/subClassID for the consumable-gate test.
Tests: 134/134.
commit 02b81da1fd64312323a4681661fe0b4c7c139fe0
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Jul 16 09:31:53 2026 +0000
Fix stale category count in Classifier header comment
The AUG_RUNE work took the classifier from 10 to 11 managed (non-composite)
categories; the file-header comment still said 10. Caught by the
whole-branch review. Comment only.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8bASN94JLf4nFuuXcEouR
commit 85d592ea61e37544ed03cfd5f36fb297ad7a9974
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Jul 16 09:26:02 2026 +0000
Document the Augment Rune category; sync counts + badge
Brings the docs in line with the 13th category:
- README: AUG_RUNE as table row 11, composites renumbered 12/13, a
ranking paragraph (amount first, reusable breaks ties only), and the
[Tests] badge bumped 125 -> 131.
- scope.md: augment runes move from the out-of-scope list into the
in-scope eleven single-pick categories.
- agent-context, ARCHITECTURE, module-map, smoke-tests: every
"ten single-pick / twelve macros" count claim updated to eleven / 13,
KCM_AUG_RUNE added to the macro list and panel/tab order.
- smoke-tests: manual Augment Rune cases (per-hand body, Ethereal-beats-
Crystallized tie-break, block-and-fall-back) and the open in-game
confirmations (exact tooltip marker; Void-Touched / Soulgorged amounts).
- test-cases.md regenerated (in sync with the 131-case suite).
Version and the [WoW]/Interface badge deliberately untouched. Tests: 131/131.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8bASN94JLf4nFuuXcEouR
commit 38dcb47d9f2f66195733cd1bcab639d733dda4b1
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Jul 16 09:18:24 2026 +0000
Guard: PRIMARY token leaves FLASK/STAT_FOOD ranking unmoved
Pins the Task-1 decision that statWeight returns 0 for the new PRIMARY
tag. A FLASK carrying both a CRIT and a PRIMARY stat buff scores purely
from CRIT — the PRIMARY entry contributes nothing — so augment-rune
parsing can never leak into spec-aware category ranking. Test-only, no
production change. Tests: 131/131.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8bASN94JLf4nFuuXcEouR
commit a98889c959770ae01d919563cd8f6151a1eb8ecc
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Jul 16 09:16:25 2026 +0000
Wire up the Augment Rune category
Registers AUG_RUNE end to end so the category resolves and displays:
- defaults/Defaults_AugRune.lua — seeds six runes across DF / TWW /
Midnight (Void-Touched, Ethereal, Soulgorged, Crystallized, Dreambound,
Draconic), newest-first.
- core/ConsumableMaster.lua — account-wide profile bucket.
- settings/Panel.lua — "aug_rune" tab after Weapon Enchant, before the
composites.
- ConsumableMaster.toc + tests/loader.lua — load the seed file (the
headless harness mirrors the TOC's load order).
Also completes the settings schema-validator whitelist (_validPanels),
which was silently missing vantus and wpn_ench since the issue-#2
category work; this change adds wpn_ench and aug_rune so every category
panel is registered. No runtime effect today (no schema row references
those panels), but the validator is now consistent.
The Categories.LIST row already landed with the classifier change, so it
is not touched here. Tests: 130/130.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8bASN94JLf4nFuuXcEouR
commit 78d399629af3bdbe33b22f472e2eeb5ea05119bb
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Jul 16 09:07:07 2026 +0000
Score augment runes by primary stat, reusable breaks ties
AUG_RUNE scorer: augAmount(tt) * 1e4 + (reusable and 1e3 or 0) + ilvl +
quality * 100. Amount dominates (a single point of primary stat, +1e4,
outweighs everything below it), so a stronger consumable rune always beats
a weaker reusable one; the 1e3 reusable bonus only breaks ties at equal
amount, where it outranks the max quality contribution (500).
augAmount takes the MAX over PRIMARY/STR/AGI/INT statBuffs — not the sum —
so a Dragonflight rune's STR+AGI+INT triplet reads as its per-stat value,
not treble it. Pending tooltips yield amount 0 and degrade to
reusable-first. statWeight is untouched (PRIMARY stays 0), so FLASK /
STAT_FOOD ranking does not move. Explain mirrors the scorer via the same
constants + helper. Tests: 129/129.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8bASN94JLf4nFuuXcEouR
commit 90ba05c9eb10c45c8a3dfdd2c2e9955985aa4342
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Jul 16 09:01:09 2026 +0000
Classify augment runes; add reusable-rune helper
AUG_RUNE joins the classifier, keyed on the tooltip's Augment Rune marker
(tt.isAugmentRune) rather than an itemID list — so it auto-discovers new
runes the way WPN_ENCH auto-discovers oils. It flows through the normal
tooltip-gated Match path (no HS/VANTUS-style early return).
Reusable ("permanent") runes aren't tooltip-distinguishable, so they're an
explicit REUSABLE_AUG_IDS set (Dreambound 211495, Ethereal 243191)
mirroring VANTUS_IDS. C.IsReusableAugRune exposes it for the Ranker's
tie-break in the next task.
The AUG_RUNE category row is added to Categories.LIST here (after
WPN_ENCH, before the composites) because MatchAny — which this task's test
exercises — enumerates that list. Tests: 128/128.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8bASN94JLf4nFuuXcEouR
commit 936bc39fa754a75fe4717235c666a51c1e25afde
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Jul 16 08:51:36 2026 +0000
Parse "Primary Stat" and flag augment-rune tooltips
Two additions to the tooltip parser, both feeding the upcoming AUG_RUNE
category:
- STAT_TOKENS gains a "Primary Stat" token (tag PRIMARY) so the modern
rune phrasing "Increases Primary Stat by N" parses at all — without it
every current augment rune reads as having no stat buff.
- parseLines sets result.isAugmentRune when a tooltip line is exactly the
"Augment Rune" category marker. The match is anchored to the full line
so an item's name line ("Ethereal Augment Rune") does not trip it.
Ranker.statWeight still returns 0 for PRIMARY, so FLASK / STAT_FOOD
ranking is unaffected. Tests: 127/127.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8bASN94JLf4nFuuXcEouR
commit 5f2a1691132a5d8b8d64ba0f645ea8386bf6f84b
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Jul 16 08:36:46 2026 +0000
Plan the Augment Rune category implementation
Six-task TDD plan derived from the approved design spec:
1. TooltipCache — "Primary Stat" token + isAugmentRune marker
2. Classifier — AUG_RUNE matcher + REUSABLE_AUG_IDS helper
3. Ranker — amount-first scorer, reusable tiebreak, Explain branch
4. Category wiring — metadata, DB bucket, tab, seed file, TOC
5. Regression guard — PRIMARY token leaves FLASK/STAT_FOOD unmoved
6. Docs, scope move, test inventory + badge
Each task carries full test + implementation code, exact file paths,
and a green-gate step. Docs only; no code or behaviour change.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8bASN94JLf4nFuuXcEouR
commit 7ad65e9734cd8fc27502f7e7a97dcd9be791fd75
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Jul 16 05:21:25 2026 +0000
Design the Augment Rune category
Brainstormed design for AUG_RUNE, the 13th category: a plain single-pick
macro for augment runes, seeded across DF / TWW / Midnight and
auto-discovering the rest via a tooltip marker.
Key decisions captured:
- "Permanent" runes (Ethereal, Dreambound) are reusable, not permanently
buffed — the buff is still 1h and still lost on death. So they rank by
primary-stat amount first, with reusable only breaking ties. An
unconditional reusable-wins rule would keep a raider on TWW's Ethereal
(733) once Midnight's Void-Touched lands with a larger number.
- Reusability has no tooltip signal, so it's an explicit ID set mirroring
VANTUS_IDS.
- STAT_TOKENS needs a "Primary Stat" token or every modern rune parses as
having no stat buff. statWeight keeps returning 0 for it so FLASK and
STAT_FOOD ranking cannot move.
Docs only; no code or behaviour change.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8bASN94JLf4nFuuXcEouR
commit 281e984c2450492925a02b65709d92bb3617b136
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Jul 16 05:19:50 2026 +0000
Fix stale scope claim that weapon oils have no managed macro
docs/scope.md still listed weapon oils under "out of scope — no managed
macro". That stopped being true in 8f7d238, which added WPN_ENCH and
manages exactly those items (oils + whetstones), matched via the
tooltip's weapon-application effect rather than by subType.
Augment runes stay listed as out of scope here — that line moves when
the category actually ships, not before.
Docs only; no code or behaviour change.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8bASN94JLf4nFuuXcEouR
commit 5212d3a7fd004024ae6bca59e991d98135e5d4f0
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Jul 16 05:02:55 2026 +0000
Track the weapon-enchant / Vantus design specs + plans
Freeze the brainstorm-and-plan artifacts behind the two shipped
category features, alongside the existing debug-logging pair:
- Vantus Rune + Weapon Enchant categories (#2) — category wiring,
classification, scoring, macro body, settings copy.
- Weapon-aware per-hand Weapon Enchant — AP/SP role scoring, weapon
affinity, per-slot picks, per-hand macro, weapon-swap recompute.
Docs only; no code or behaviour change.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G8bASN94JLf4nFuuXcEouR
commit 8df20a2347eaa670cd9d87e73c7e2bc9be0cc71b
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Jul 15 22:36:18 2026 +0000
Fix inert weapon-enchant dimming; harden per-hand feature
Whole-branch review fixes:
- Fix real bug: settings row passed 'applicable = cat.perHand and rowApplicable
or nil', which collapsed false -> nil so non-applicable enchant rows never
dimmed. Pass the boolean explicitly so incompatible enhancements dim as intended.
- Bump KCMItemRow widget Version 2 -> 3 (constructed shape gained the hand tag).
- Guard SetWeaponEnchantMacro against an uninitialised DB (mirrors SetMacro).
- Guard the WeaponSlots.SlotAffinity member in the settings render path.
- Harden PickBestForSlot tests: negative-ownership + reverse-affinity (blunt
weapon) cases; drop a redundant assertion.
Tests 123 -> 125; badge + inventory synced.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018SGoTBYV7WtMtcwBSqwjmL
commit 9eef488ee76505ee0a980c90e74d98ae20e4bcf3
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Jul 15 22:27:29 2026 +0000
Document the weapon-aware, per-hand Weapon Enchant behaviour
README (player-facing): per-hand, weapon-type-aware application + AP/SP scoring.
Contributor docs: core/WeaponSlots.lua + PLAYER_EQUIPMENT_CHANGED (ARCHITECTURE,
pipeline), the perHand pipeline branch + tt.weaponAffinity + AP/SP stats
(agent-context, data-model), and four new weapon-swap / per-hand smoke tests.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018SGoTBYV7WtMtcwBSqwjmL
commit e2d59a3ffb9d963729c9ee8dc2e592d990fa8883
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Jul 15 22:19:28 2026 +0000
Show per-hand pick markers + weapon-affinity dimming on the Weapon Enchant page
The Weapon Enchant settings page now marks each row for the hand(s) it's picked
for (MH / OH / MH+OH), dims enhancements the equipped weapons can't take, and
shows a 'Main hand / Off hand' affinity header. All new behaviour is gated behind
cat.perHand; the shared KCMItemRow widget defaults leave every other category page
rendering unchanged (star still driven by isPick, full alpha, no hand tag).
Gate green 123/123, luacheck clean.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018SGoTBYV7WtMtcwBSqwjmL
commit 037a8dc608a376132fdbed1ba4fbc7d5a6d681d5
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Jul 15 22:06:45 2026 +0000
Route WPN_ENCH through the per-hand pipeline + recompute on weapon swap
Add a perHand flag on the WPN_ENCH category; RecomputeOne branches on it (after
composite, before single-pick) to resolve PickBestForSlot(16)/(17) and build the
per-hand macro. Register PLAYER_EQUIPMENT_CHANGED and request a recompute when the
main-hand (16) or off-hand (17) weapon changes, so the enchant macro follows the
equipped weapon.
Tests 122 -> 123; badge + inventory synced.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018SGoTBYV7WtMtcwBSqwjmL
commit 17c1e15907e0f51b6b444128f391acb80b439232
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Jul 15 21:59:52 2026 +0000
Build per-hand weapon-enchant macro; factor commitMacro tail
New MacroManager.SetWeaponEnchantMacro applies the best applicable enhancement to
each equipped weapon (main-hand 16 / off-hand 17), emitting a slot's lines only
when it has a pick and falling back to the empty stub when neither does. Factored
SetMacro's write tail (oversize fallback, unchanged/pending coalescing, combat
defer, doEdit, state store) into a shared commitMacro; reverted the issue-#2
apply-to-both-slots buildActiveBody shortcut it supersedes.
Tests: 122 (macro-body test replaced); gate green, inventory in sync.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018SGoTBYV7WtMtcwBSqwjmL
commit 0d688d21d2871ad87168ed190d0d7a4b37421003
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Jul 15 21:53:49 2026 +0000
Add Selector.PickBestForSlot for per-weapon enchant picks
Returns the best-owned enhancement whose affinity matches the equipped weapon in
a slot (16 main / 17 off), or nil when the slot has no enhanceable weapon or no
owned eligible enhancement. Reuses GetEffectivePriority (spec-aware ranking);
items only (spells skipped); missing affinity treated as 'any'.
Tests 121 -> 122; badge + inventory synced.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018SGoTBYV7WtMtcwBSqwjmL
commit f95660549f40ca261502fd1108c95a34981dd52a
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Jul 15 21:47:05 2026 +0000
Add weapon-affinity detection: tooltip flag + WeaponSlots module
TooltipCache now derives tt.weaponAffinity (bladed/blunt/any) from the enchant's
'your <weapon>' effect. New core/WeaponSlots.lua maps the equipped main-hand (16)
/ off-hand (17) weapon subtype to bladed/blunt/nil (bladed: swords/axes/daggers/
polearms/fist/warglaives; blunt: maces/staves). Test mock gains GetInventoryItemID
+ setEquipped; GetInventoryItemID declared in .luacheckrc.
Tests 119 -> 121; badge + inventory synced.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018SGoTBYV7WtMtcwBSqwjmL
commit addba2f4bf66a8b4b79f78a8ec9f63f1c56d6a6f
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Jul 15 21:39:54 2026 +0000
Score weapon-enchant Attack Power / Spell Power by spec role
Parse Attack Power -> AP and Spell Power -> SP in TooltipCache; Ranker.statWeight
weights AP as primary throughput for STR/AGI specs (0 for INT) and SP as primary
for INT specs. Fixes whetstones/weightstones scoring 0 (AP was unparsed).
Tests 117 -> 119; badge + inventory synced.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018SGoTBYV7WtMtcwBSqwjmL
commit 8f7d2388a1dee7381a602ce30b4578fb8b61273b
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Jul 15 21:23:19 2026 +0000
Add Vantus Rune and Weapon Enchant macro categories (#2)
Two new auto-managed single-pick categories (8 -> 10 single-pick; 12 macros total).
VANTUS (KCM_VANTUS): non-spec raid Versatility rune. Classified by itemID
whitelist (like Healthstone), scored by ilvl/tier, plain /use body. Seeded with
Vantus Rune: Radiant (245880).
WPN_ENCH (KCM_WPN_ENCH): spec-aware weapon enhancement. Oils/whetstones/
weightstones report subType "Other", so classification keys on the tooltip's
weapon-application effect ("your <weapon>", TooltipCache.isWeaponEnhance) rather
than subtype; scored by spec stat priority (reuses the flask scorer); macro
applies to main-hand (16) and off-hand (17). Seeded with the Midnight (12.x) and
The War Within (11.x) oils, whetstones, and weightstones.
- Category rows, AceDB profile buckets, tab order, per-category settings page,
and seed files wired end-to-end; loader PURE_LAYER updated for the new seeds.
- Docs synced: README macro table + counts, scope/module-map/data-model/
smoke-tests, StatPriority copy; generated test inventory + [Tests] badge
109 -> 117.
Known follow-up (design approved, not yet built): Attack-Power parsing and
weapon-type-aware, independent main/off-hand picks for WPN_ENCH.
Tests: 117/117 headless, luacheck clean.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018SGoTBYV7WtMtcwBSqwjmL
commit 22636af7a4222ce1ec0b3bc71c0b62801e7c08a3
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Jul 15 14:22:25 2026 +0000
Make README player-facing per standard v2.1.0; add docs/testing.md
Rewrite README.md in plain, player-facing language: strip codebase jargon,
break up em-dash run-ons, simplify the slash-command/settings/FAQ/Troubleshooting
descriptions to what the player does and sees, and trim Version History
highlights to user-visible changes. Remove the ## Testing section — verify-how-to
belongs under docs/ (documentation-§1), keeping only the [tests] badge.
Add docs/testing.md — the verify-how-to doc (green gate, local toolchain,
test-cases/smoke-tests pointers) now required by standard v2.3.0 (documentation-§3).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018SGoTBYV7WtMtcwBSqwjmL
commit 6a92adc7958a82180f6b419f2ef98cf49967091a
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Jul 15 13:08:14 2026 +0000
Scrub tier references for standard v2.0.0; sync test-coverage docs
The Ka0s standard v2.0.0 removes the two-tier system — one modular layout
now applies to every addon. Drop "Tier 2"/"tiered-layout" wording from the
live docs (CLAUDE.md adherence line, ARCHITECTURE/agent-context/file-index,
two test-file comments); frozen audit/review bundles and the dated Version
History row keep their wording as historical record. This addon already uses
the modular core/ defaults/ settings/ locales/ modules/ layout, so no code
move was needed.
Also sync the test-coverage descriptions (README Testing row, smoke-tests,
file-index) to the current 17-suite / 109-case reality — the old lists
predated the SpecHelper/Compat/BagScanner/Database/pipeline/slash suites —
and point them at docs/test-cases.md as the authoritative inventory.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018SGoTBYV7WtMtcwBSqwjmL
commit 484b39bc5854ec52f6d7aafb4fb5d02ca6a12bdd
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Jul 15 12:54:21 2026 +0000
Overhaul test suite to fleet test() model + fill coverage gaps
The runner previously reported "12 tests" — an artifact of one monolithic
h.suite() per file wrapping 268 assertions, out of step with every other
Ka0s addon's granular test() model. Rework harness.lua/run.lua to the fleet
test(name, fn) model (currentSuite stamping, per-case pass/fail, LootHistory's
--list inventory format), keeping the richer t.* assertions.
Split the 11 existing suites into granular named cases with every assertion
preserved, then add coverage for six previously-untested modules: SpecHelper,
Compat, BagScanner, Database migrations, the recompute pipeline (coalescing,
auto-discovery, disabled-gate), and the /cm dispatcher + parsers via
OnSlashCommand.
Result: 12 -> 109 genuine test cases. Regenerate docs/test-cases.md and bump
the README Tests badge to 109/109 in lockstep.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018SGoTBYV7WtMtcwBSqwjmL
commit 4ae9ec2885ae8a6339a4dd8ef1aa19a117458524
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Jul 15 12:22:16 2026 +0000
Conform README badge row to standard v1.14.0 documentation-§1
Reorder and reformat the five-badge row to the v1.14.0 templates: WoW
(now purple, matching TOC Interface 120007 = Midnight_12.0.7), CurseForge
version, License (MIT, orange), a new Ka0s Standard link badge, and Tests
(12/12). Broaden the static-badge Hard rule in agent-context.md + CLAUDE.md
to cover both silently-staling badges: [Tests] moves with docs/test-cases.md
and [WoW] moves with the TOC ## Interface: on every patch bump.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018SGoTBYV7WtMtcwBSqwjmL
commit 1b2af7df4efc7c8bf4d7423afb673ead054b960e
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Jul 15 09:52:40 2026 +0000
De-drift test-count docs, add tests badge + sync Hard rule
testing-§5 sync discipline:
- Replace stale hardcoded "10 suites" counts (common-tasks.md, file-index.md)
with links to the authoritative docs/test-cases.md inventory.
- agent-context.md "Testing & lint gate": point the current status at
test-cases.md and add a "Keeping the inventory & badge in sync" section;
index the generated inventory in the doc table.
- README: static tests-12/12 badge after the version badge; Testing section
points at the inventory.
- Hard rule (agent-context.md + CLAUDE.md Gate): regenerate the inventory and
bump the README badge in the same change whenever the suite changes.
This addon has no docs/testing.md; the green-gate prose lives in the README
and agent-context.md, so the §5 de-drift was applied there.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018SGoTBYV7WtMtcwBSqwjmL
commit 42df5da86fa9575340c10ce9ff060a842fad341d
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Jul 15 09:49:24 2026 +0000
Add generated test-case inventory (docs/test-cases.md)
Produced by `lua tests/run.lua --list`; the authoritative pass count per
testing-§5. 12 cases across 11 suite files.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018SGoTBYV7WtMtcwBSqwjmL
commit 09cbce330c2b2a826df1359596d72335bb0ef7ad
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Jul 15 09:49:01 2026 +0000
Add non-executing --list inventory mode to the test runner
Split suite registration from execution in tests/harness.lua (H.suite now
registers, H.run executes) so a --list pass can enumerate every suite without
running any test body. Stamp each registered test with its origin file via
H._currentFile, and add H.formatInventory to render the docs/test-cases.md body
grouped by suite file with per-suite and grand totals.
run.lua gains `--list`: after loading all suites it prints the inventory to
stdout and exits 0 without running; default behaviour is unchanged. New
test_runner_list.lua covers the format and the non-executing contract.
Adopts Ka0s WoW Addon Standard testing-§5 (test-case inventory).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018SGoTBYV7WtMtcwBSqwjmL
commit a615cf398c9f273d7b912353d241bffd44c41896
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Jul 15 09:16:18 2026 +0000
Point X-Standard at the standard repo URL, not a version string
Conform the TOC X-Standard field to toc-file-§1 / documentation-§6: it must
reference the WowAddonStandards repo URL. Was a stale early value
("Ka0s WoW Addon Standard v1.0.0") predating the URL convention now used by
the other five collection addons.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RhFrabqG7CgctGyW1g2wzv
commit 803753eac9712294193f2b99a35b500dd329b7ff
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Jul 15 09:12:55 2026 +0000
Track debug-logging design spec + plan; gitignore .superpowers scratch
Keep the brainstorming design spec and the implementation plan behind the
debug-logging conformance work in the repo (docs/superpowers/), matching how
sibling addons track their plans. Ignore the session execution ledger under
.superpowers/, which is per-session scratch and not a project artifact.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018SGoTBYV7WtMtcwBSqwjmL
commit d817d5e094e066426b722b42f2b00a00de643bee
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Jul 15 09:11:29 2026 +0000
Conform debug logging to standard debug-logging §3–§10 + v1.12.0 §5
Rework the debug seam to match the Ka0s WoW Addon Standard debug-logging
sections so a captured log reconstructs what the addon actually did:
- Sink (§3/§4): KCM.Debug is now callable — KCM.Debug(tag, fmt, ...) —
with the enabled-gate as its first statement (zero-alloc when off) and
secret-safe via the new KCM.SafeToString (all placeholders %s). The
tagless Print is gone; Log is kept as an alias. Guards are nil-safe.
- Coverage (§8): one tagged line per flow — DB (migration, only when one
runs), Scan (discovery pass), Calc (recompute pass, rewrote/total/
skipped), Macro (exceptional events only), GC (sweep).
- Coalescing (§9): per-macro happy-path lines folded into the Calc
summary; summary string-building stays behind the debug gate.
- Settings (§10): every write logs once at Helpers.Set as [Set] path =
value; priority-list mutations and resets log [Prio].
- v1.12.0 §5: DebugLog.SetEnabled prints a colour-coded ON/OFF chat ack
(green/red, matching the title-bar toggle) and, on enable, emits an
[Init] session summary (addon + version, schema, profile) after the
logging-enabled bracket. Drops the old [Boot]-at-login line the
session-only flag never let render, plus its now-unused
BootSummary / CountDiscovered helpers.
Tests cover callable-sink gating, SafeToString, the pure Calc summary,
the [Set] seam, and the §5 colour ack + [Init] ordering.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018SGoTBYV7WtMtcwBSqwjmL
commit 7b60a7b5452a8e40a0d6a8629a122fd16c689494
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Jul 15 07:16:27 2026 +0000
Detect combined "health and mana" food/drink as both Food and Drink
Items like Chalcocite Lava Cake whose tooltip reads "Restores X health
and Y mana" only classified as Food, never Drink: the mana clause is
introduced by "and", so the "Restores"-anchored manaFlat pattern missed
it and manaValue stayed nil. Add a manaCombinedFlat pattern so the mana
side is captured and DRINK matches. New test_tooltipcache suite exercises
the real parser (existing suites inject tt tables, bypassing it).
Sync docs to match: document the combined health-and-mana quirk, bump
harness suite counts 9->10, complete the TooltipCache.Get field list, and
drop the stale AceConfig-3.0 dependency (removed in v1.5.0).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GVX7A4a2VQ5M6zaVhcFSxf
commit 013a76858a67c992973e395b12e53e2fefe0b365
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Jul 14 21:26:10 2026 +0000
Sync module-map to new DiscoverOne signature + discovery summary line
Document DiscoverOne's outNew accumulator param and that RunAutoDiscovery
emits one summary debug line per pass, matching eab4d50.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GVX7A4a2VQ5M6zaVhcFSxf
commit eab4d50c3db86a0f32865c33411c4ce093ecd7e2
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Jul 14 16:25:14 2026 +0000
Collapse per-item discovery spam into one summary line per pass
Consuming an item fired BAG_UPDATE_DELAYED and logged one "no category
match" line per bag item — dozens of lines per drink. Auto-discovery
now emits a single tagged summary ([reason] Scanned N items, M new
discovered, with the scanned + newly-discovered ID lists) and drops
the per-item zero-match trace. String building stays gated on debug-on.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GVX7A4a2VQ5M6zaVhcFSxf
commit 8df90a6402f7a2072f95de6d63ce0925aa896aa7
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Jul 14 16:07:36 2026 +0000
Sync docs to remediated debug console + toggle semantics
Reflect that `/cm debug on|off` sets logging via the single
DebugLog.SetEnabled seam while bare `/cm debug` toggles only the
window, and the new tag-first Debug.Log / tagless Debug.Print API.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GVX7A4a2VQ5M6zaVhcFSxf
commit f221c4bc00db2459733c43d9ff3420649604dfb2
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Jul 14 09:50:48 2026 +0000
Remediate debug console to standard debug-logging + fix dead toggle
The console's Toggle button was a sibling of the draggable title frame
and sat inside its rectangle, so the title swallowed every click and the
toggle did nothing. Reparent all title-bar controls onto the title bar
(a child takes mouse input above its parent) so the toggle, Copy, Clear,
and close all click while the empty bar still drags the window.
While fixing it, port the console to the standard's debug-logging
reference (matches AbsorbTracker): title bar + 1px divider, dark skin,
flat text buttons, green/red Debug: ON/OFF state toggle, a separate Copy
window, 10pt mono, the `<ts> | [tag] msg` line format in steel-blue /
tan-gold, and `[Debug] logging enabled/disabled` console lines at both
transitions. Centralize all state changes through the DL.SetEnabled seam
(flag -> header -> chat ack -> console line -> panel refresh); bare
`/cm debug` now toggles the window only, leaving the flag untouched.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KwFbt1pJWBKHtwvEv6xxEe
commit a7b3b2df2ffb09fde15abf043e09dab5981b4268
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Mon Jul 13 05:56:28 2026 +0000
Move audit/ and reviews/ bundles under docs/
Relocate audit/ -> docs/audits/ and reviews/ -> docs/reviews/ so the
frozen audit and review bundles live under docs/. Update the living
references (.luacheckrc excludes, .pkgmeta ignore, README lint note,
CLAUDE.md and agent-context standard pointers); frozen bundle content
is left as-is.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016NKwmLHY9bsEvRWV6tWioY
commit b2e1be8a9ed0ee9a5224170ca9c1904eddc41489
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Mon Jul 13 05:41:47 2026 +0000
Anchor the Ka0s WoW Addon Standard + deviation rule in instructions
Link the standard (github.com/tusharsaxena/WowAddonStandards) in
CLAUDE.md and the agent brief, and require future work to flag any
deviation for the user to rule on — tracked exception vs. a change
to the standard itself — instead of silently diverging.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016NKwmLHY9bsEvRWV6tWioY
commit 81b09df7f3a890f67860cb7b97dc712de7069bf5
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Mon Jul 13 05:08:39 2026 +0000
Sync docs to Tier-2 architecture and bump to 1.5.0
Update the topic docs (module-map, file-index, data-model, debug,
common-tasks, pipeline, and paths elsewhere) to the post-remediation
reality: core/modules layout, private NS namespace, message bus,
Compat seam, session-only debug console, and the test harness.
Bump version 1.4.0 -> 1.5.0 (TOC + KCM.VERSION) and add the 1.5.0
Version History row.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016NKwmLHY9bsEvRWV6tWioY
commit bab4319941044158550fb3137e2776cda2fec157
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sun Jul 12 21:33:00 2026 +0000
Remediate to Ka0s WoW Addon Standard v1.0.0 (Tier 2)
Close all 23 audit deviations (19 MUST + 4 SHOULD) from the
2026-07-12 standards audit. This is a mechanical re-hosting of a
sound feature layer onto the standard's shape — no gameplay logic
changed; macro output is byte-identical.
Architecture:
- Private NS namespace (local addonName, NS = ...); _G.KCM removed.
- AceAddon promotion via NewAddon(NS, addonName, ...).
- Tier-2 layout: core/ modules/ defaults/ settings/ locales/.
- Closed message bus (core/Bus.lua): RECOMPUTE, PANEL_REFRESH,
SPEC_CHANGED — each receiver on its own target.
- core/Compat.lua seam over spec/spell APIs.
Infra & compliance:
- Headless test harness (tests/): mock client + TOC-order loader
+ 9 suites; run with `lua5.1 tests/run.lua`.
- .luacheckrc (clean) and .pkgmeta.
- TOC metadata + sectioned file listing; schemaVersion -> global
with Database.RunMigrations; AceConfig pruned.
Features:
- On-screen debug console (modules/DebugLog.lua, JetBrains Mono +
LibSharedMedia); debug flag is session-only KCM.State.debug.
- Shared KCM.PREFIX/KCM.Say (all 37 inline [CM] literals removed).
- KCM.Schema:Set validate->write->onChange seam; two-column grid;
per-page Defaults button.
- locales/enUS.lua (KCM.L) with user-facing strings wrapped.
Docs: CLAUDE.md reduced to a stub (brief -> docs/agent-context.md);
ARCHITECTURE.md -> docs/ with a message-bus catalogue; README
gains a Testing section.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016NKwmLHY9bsEvRWV6tWioY
commit 5d2462887b57a56f9912d2a0a360f7ce0bbd6cb3
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sun Jul 12 20:12:18 2026 +0000
Add standards audit bundle (2026-07-12, v1.0.0)
Read-only compliance audit against the Ka0s WoW Addon Standard v1.0.0.
Five-artifact bundle under audit/2026-07-12/ with stable CM-* deviation IDs:
19 MUST + 4 SHOULD deviations. No addon source changed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012BKjiJzHhqgbG8hRwY4u4i
commit 1869ee6055f64c6326ba9eb33c73e52a9cf5cc5d
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sun Jul 12 19:45:05 2026 +0000
Bump Interface to 120007 and sync interface refs in docs
Retarget the addon to Live Servers patch 12.0.7 (previously the
multi-flavor 120000,120001,120005). Update the interface number and
WoW patch badge wherever the docs cite it: README badge, CLAUDE.md,
ARCHITECTURE.md, docs/file-index.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012BKjiJzHhqgbG8hRwY4u4i
This mod has no additional files

