promotional bannermobile promotional banner

Ka0s Consumable Master

Auto-managed account-wide consumable macros.
Back to Files

1.5.0-release

File nameConsumableMaster-1.5.0-release.zip
Uploaded
Jul 20, 2026
Downloads
20
Size
886.3 KB
Flavors
Retail
File ID
8472638
Type
R
Release
Supported game versions
  • 12.0.7

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