promotional bannermobile promotional banner

Ka0s Absorb Tracker

Display your total absorb shield value in a clean, customizable bar interface.
Back to Files

1.9.0-release

File nameAbsorbTracker-1.9.0-release.zip
Uploaded
Jul 20, 2026
Downloads
343
Size
2.8 MB
Flavors
Retail
File ID
8472637
Type
R
Release
Supported game versions
  • 12.0.7

What's new

lightweight tag 6023f5cf4db87bbe75f5bfd86119b71136128506 1.9.0-release
Author:    Tushar Saxena <tushar.saxena@gmail.com>
Date:    Mon Jul 20 13:12:41 2026 +0000

commit 6023f5cf4db87bbe75f5bfd86119b71136128506
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 20 13:12:41 2026 +0000

    Chore: prep for next release

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

commit db6ee29215e16dc72335b13f9117ce8dfa2ae4ab
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 20 12:34:41 2026 +0000

    Feat: add scrollbar + line counter to debug console (§11)

    The debug console's ScrollingMessageFrame was wheel-only with no way to
    read scroll position or buffer fill. Add a thin always-shown vertical
    Slider synced both ways to the log's scroll offset (inert when the log
    fits, per options-ui-§10) and a bottom status bar showing "N / 500 lines",
    updated on every append and reset on Clear. Drives the log via the Lua
    ScrollingMessageFrameMixin API (GetMaxScrollRange/GetScrollOffset/
    SetScrollOffset) with presence + numeric guards, so the headless mock
    stays a clean no-op. Initial sync runs last in the build so a frame-API
    surprise can't blank the header or drop ESC-to-close.

    Adds smoke-test 46a and updates 47 (Clear resets the counter).

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

commit 09209a6d7200690201a4a1e5ee515982d89daaf2
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 20 11:54:02 2026 +0000

    Docs: refresh README FAQ and Troubleshooting for 1.9.0 behavior

    Update the FAQ and Troubleshooting sections to match current
    behavior: add Show-only-in-combat, the Update-throttle (event-
    driven redraw), debug-window/console, /at test-when-hidden, and
    Lock-Position entries; correct the stale "bar is invisible at 0
    shield" framing (only the fill empties; background and border
    stay visible). Also fix two matching inconsistencies elsewhere —
    /at debug "toggles" (not "opens") and the General-page throttle
    description. Includes minor image alt-text/caption tidy-ups.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01Xxa49hnoJTdRC6SHx9WyTy

commit e2e9f4a6154eda06033f6fff44bb2d85c94525b4
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Jul 19 18:08:45 2026 +0000

    Docs: add high-CPU FAQ and refresh README screenshots

    Add an FAQ entry explaining that a high CPU ranking in addon
    profilers is a shared-library attribution artifact, not real
    waste, linking to the full investigation. Also swap in the new
    settings-panel screenshots and reflow the intro paragraph.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01Xxa49hnoJTdRC6SHx9WyTy

commit 42e8e461ab81a2cf93e771f0fc9e7162e9f8863a
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Jul 19 07:46:09 2026 +0000

    Docs: add "What's new in 1.9.0" section above screenshots

    Surface the latest release's top user-facing highlights above the fold
    (show-only-in-combat, event-driven bar updates, on-screen debug window,
    General-page Debug console toggle), per the new Ka0s standard MUST
    (documentation-§1 item 5, standard v2.9.0). Also bring the 1.9.0
    Version History row up to date so it agrees with the new section.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01Xxa49hnoJTdRC6SHx9WyTy

commit a341dc5944d2aaa66a11e4349f4ae496c680e5d7
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sat Jul 18 19:21:19 2026 +0000

    Fix: remediate standards MUST deviations (message bus, /at version)

    Close the four open MUST deviations from the 2026-07-18 audit (AT-05 skipped —
    no longer a MUST in the standard):

    - AT-29: adopt the closed message bus (core/Bus.lua). Cross-module signals now
      publish on NS.bus:SendMessage with per-receiver NS.NewBusTarget() targets
      (architecture-§4) instead of direct NS.X calls; Display/Timer subscribe.
    - AT-26: add the standalone /at version verb.
    - AT-27: inset paired action buttons to BUTTON_PAIR_REL 0.492 so the right
      button clears the ScrollFrame clip.
    - AT-28: reorder the TOC so Locales loads directly after Libraries.

    Upgrades the AceEvent test mock to real (message,target) dispatch and adds
    tests/test_bus.lua (81/81). Docs synced to the bus and new load order.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01QQZbrgwN88s8CWgbpwQ9Jx

commit cb7f63532f10c89dfddd6cdb2486333a45660e82
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sat Jul 18 19:21:05 2026 +0000

    Docs: add 2026-07-18 Ka0s standards audit bundle

    Frozen read-only audit against standard v2.7.0: 4 open MUST + 3 accepted
    deviations. Motivates the remediation that follows.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01QQZbrgwN88s8CWgbpwQ9Jx

commit 78d53bb031e48400064f06e641b1c76c10f20626
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Jul 17 21:06:11 2026 +0000

    Docs: note General-page Debug console checkbox in README settings table

    The General settings row listed every control except the Debug console
    checkbox added in 4595630. README now matches docs/settings-panel.md and
    docs/ARCHITECTURE.md, which already documented it.

commit 4595630ee0b21d4746047c75e92e41e5e5970c01
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Jul 17 19:35:28 2026 +0000

    Feat: add General-page Debug console checkbox (window show/hide)

    Puts a "Debug console" checkbox beside Lock Position that shows/hides the
    on-screen console window — the same as the bare /at debug. It deliberately
    does NOT change the debug logging flag (NS.State.debug); logging stays on
    /at debug on|off and the window's own header toggle.

    Not a schema row (window visibility is transient UI, never persisted). Adds
    Helpers.SessionCheckbox plus a pairWith seam on RenderSchema to inject a
    non-schema widget as a row's right partner, DebugLog:ConsoleCheckbox() +
    IsShown() for the get/set, and OnShow/OnHide panel-sync so the checkbox
    tracks the window's visibility however it changes (checkbox, /at debug,
    Close button, Esc). Mock stubFrame now tracks shown state; tests and docs
    synced (73/73).

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01QQZbrgwN88s8CWgbpwQ9Jx

commit ee1e0779f2e6b7b3ebd6d48708a38456a8372612
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Jul 17 18:57:31 2026 +0000

    Docs: add reset/media smoke tests, align resetall description

    Fold post-standardization checks into the smoke-test suite (now 60):
    the Reset All recenter regression + slash/button parity (steps 20/20a/28),
    page-Defaults position isolation (19), Blizzard-stock default media (2),
    About-logo and debug-font documented exceptions (11a/42). Also sync the
    ARCHITECTURE /at resetall row to note it recenters via the shared
    Helpers.RestoreAllDefaults, matching the panel button.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01QQZbrgwN88s8CWgbpwQ9Jx

commit 1c2e5f747ac5cbb238907eac3cbea7c792951dd6
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Jul 17 17:49:24 2026 +0000

    Docs: record fixed non-Blizzard media (debug font, logo) as accepted deviations

    Font/texture/border audit: bar-appearance media (barTexture, bgTexture,
    border, font) is Blizzard-stock by default and fully LSM-configurable.
    The only non-Blizzard media are the debug-console monospace font (§12.2)
    and the About-page logo (§1.4) — both intentionally not LSM-user-selectable.
    Recorded under Standards Deviations so a future /standards-audit re-surfaces
    them with justification instead of flagging them.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01QQZbrgwN88s8CWgbpwQ9Jx

commit ee2436d18a9a1d8880ad164ac2c9b3830eb292f3
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Jul 17 14:40:10 2026 +0000

    Fix: unify Reset All so the button and /at resetall never diverge

    The "Reset All Settings" popup button recenter-skipped: it reset every
    schema setting but left the saved bar position, while /at resetall
    cleared position and recentered. A code comment claimed the two shared
    a helper "so the popup and the slash never diverge" — they didn't; they
    were separate implementations.

    Collapse both onto Helpers.RestoreAllDefaults, which now also clears
    db.profile.position and recenters. runResetAll delegates to it. Popup
    text and button tooltip now say "and recenter the bar"; matches the
    documented /at resetall contract in ARCHITECTURE.md.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01QQZbrgwN88s8CWgbpwQ9Jx

commit fd4e5d9c94f31acfaa71f1b1bbbcb7cdf02b9a88
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Jul 16 12:50:13 2026 +0000

    Docs: sync ARCHITECTURE.md — flag NS.format dead export, Profiles no-schema

    Bring ARCHITECTURE.md's module map in line with what the code does today.
    The Namespace row listed floor/max/format as live paint-path caches, but
    NS.format has zero callers (dead-export candidate) — matching the earlier
    file-index.md/module-map.md correction. The settings row claimed all five
    sub-pages register schema rows; Profiles registers none and renders
    AceDBOptions directly.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01QQZbrgwN88s8CWgbpwQ9Jx

commit 48d066e0e325047d402f235f0dd800a9a5dfcb1c
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Jul 15 20:18:21 2026 +0000

    Docs: correct NS.format claim — dead export, not a paint-path cache

    file-index.md and module-map.md described NS.floor/max/format as
    hot-path caches used by the bar paint path. Only floor/max are pulled
    into modules/Display.lua; NS.format (core/Namespace.lua:15) has zero
    callers. Reword both to flag it as a dead-export candidate rather than
    an active cache.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01LwB5PsTqVBMMj648Le7TDs

commit 4b3a0b114ca9fd5b97e9a21841c98bc8895665c1
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Jul 15 14:22:34 2026 +0000

    README: player-facing rewrite + add How-it-works (documentation-§1)

    Bring the root README into compliance with the Ka0s WoW Addon Standard
    documentation-§1 (player-facing, plain language):

    - Remove the `## Testing` section; the verify-how-to already lives in
      docs/testing.md + docs/smoke-tests.md. Keep only the [tests] badge.
    - Rewrite the description, slash-command, settings-panel, FAQ, and
      Troubleshooting prose in plain language; strip internal jargon and
      run-on em-dash clauses.
    - Convert the settings panel to the standard Tab | Covers table; rename
      the slash header to Command | What it does.
    - Add the required `## How the bar works` section (item 7, now MUST).
    - Trim Version History Highlights to user-visible changes.

    No version bump; no code or test change.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01LwB5PsTqVBMMj648Le7TDs

commit 5aebe6a37299b3b85676fc690b60a9784544dc4b
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Jul 15 12:57:08 2026 +0000

    Docs: scrub tier language for standard v2.0.0 single layout

    The Ka0s WoW Addon Standard v2.0.0 removes the Tier 1/Tier 2 system;
    there is now one modular layout. Retire "Tier 2 (modular)", "tiered",
    and "tier" wording from the live docs (adherence line, agent brief,
    architecture map, file index, module map) so nothing implies a tier
    system still exists. Structure already conforms (core/ defaults/
    settings/ locales/ modules/) — docs-only. Immutable audit bundles and
    the dated README Version-History row are left as historical record.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01LwB5PsTqVBMMj648Le7TDs

commit 6ce5976bbe2bbe9436ed7311ae76520b6b61a9b4
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Jul 15 12:22:17 2026 +0000

    README: adopt v1.14.0 badge row (order, colours, casing)

    Reshape the README badge row to the Ka0s Standard v1.14.0 layout: WoW,
    CurseForge, License, Standard, Tests — with the new colours (WoW purple,
    License orange, Standard yellow, Tests green) and capitalized labels. The
    [WoW] badge stays in lockstep with the TOC ## Interface: (Midnight_12.0.7
    <-> 120007) and [Tests] with the generated docs/test-cases.md (70/70).

    Broaden the agent-context Hard rule to cover both static badges ([WoW] <->
    TOC Interface, [Tests] <-> test-cases.md) and update the badge-template
    example in docs/testing.md to match.

    Note: this leads the upstream standard (committed at v1.13.0) — applied
    per explicit instruction; standard repo left unchanged.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01LwB5PsTqVBMMj648Le7TDs

commit 0ad69fb1234c5a02dea3dd0e2aa8688a884ecb76
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Jul 15 11:49:05 2026 +0000

    Docs: sync doc drift with current code (schema v2, counts, API index)

    Fix stale facts found by a docs-vs-code audit:
      - profiles.md / data-flow.md: describe the shipped v2 schema migration
        (drops the dead updateInterval key, stamps schemaVersion=2) instead of
        framing it as hypothetical/v1-only
      - smoke-tests.md: fresh-DB expectation schemaVersion 1 -> 2
      - file-index.md: line counts for AbsorbTracker.lua (154) and Schema.lua (269)
      - module-map.md: complete the public-API index (NoteRepaint, OnEnterCombat/
        OnLeaveCombat, ShouldShowBar, ApplyVisibility)

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01LwB5PsTqVBMMj648Le7TDs

commit 486618b71b2533e0ab5bcdc77598f1e1a3d359e1
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Jul 15 09:53:16 2026 +0000

    Docs: add inventory/badge sync as a Hard rule (testing-§5)

    Add the "keep the test inventory & badge in lockstep" bullet to
    docs/agent-context.md ## Hard rules. The root CLAUDE.md stub carries the
    one-line sync note on its green-gate line (kept a stub per documentation-§2,
    so no ## Hard rules section is added there).

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01LwB5PsTqVBMMj648Le7TDs

commit 7b61ca7b58d42649520fb2a100cd761c60d9c826
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Jul 15 09:52:43 2026 +0000

    README: add static tests badge + de-drift ## Testing (testing-§5)

    Add `![tests](…/badge/tests-70%2F70_passing-brightgreen)` to the badge row
    (after the published-version badge, before license), per documentation-§1.
    De-hardcode the ## Testing table's "70 passed, 0 failed" — point at the
    generated docs/test-cases.md as the authoritative count and add a
    case-inventory row. Static badge, hand-maintained alongside the inventory;
    no CI, no dynamic/endpoint badge.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01LwB5PsTqVBMMj648Le7TDs

commit 0248487b5458578fa036ada2b34778ae58bc8dae
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Jul 15 09:52:18 2026 +0000

    Docs: de-drift test counts; point at generated inventory (testing-§5)

    Add docs/testing.md (green gate, the case inventory, and the
    inventory+badge sync rule). Replace hard-coded test counts across the
    living docs with pointers to the authoritative generated docs/test-cases.md:
      - CLAUDE.md green-gate line (was "63 tests" — stale)
      - README ## Testing table ("70 passed, 0 failed")
      - docs/agent-context.md, file-index.md (total + per-suite counts),
        common-tasks.md, module-map.md, smoke-tests.md
    Dated historical artifacts (Version History, docs/audits, docs/superpowers
    plans) are left as immutable snapshots. Also refresh run.lua's line count
    and description in file-index.md.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01LwB5PsTqVBMMj648Le7TDs

commit 8d35c2d7788c7b291f30901614a19f07ad8e9a66
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Jul 15 09:48:03 2026 +0000

    Docs: add generated test-case inventory (testing-§5)

    `lua tests/run.lua --list > docs/test-cases.md`. Authoritative pass count
    (70). Regenerate whenever the suite changes; do not hand-edit.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01LwB5PsTqVBMMj648Le7TDs

commit 94d3e959639608c16e06f2f3c681e9908cd91f68
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Jul 15 09:47:49 2026 +0000

    Tests: add runner --list mode + per-suite attribution (testing-§5)

    Stamp each registered test with the suite file it loaded from (a
    `currentSuite` upvalue read by `test()`), and refactor suite loading into
    an ordered `SUITES` loop (same load order). Add a non-executing `--list`
    mode that prints the `docs/test-cases.md` inventory — `# Test Cases`
    header, a generated/do-not-hand-edit note, one `### <suite>.lua (N)`
    section per suite, and a `## Totals` table ending in `| **Total** | **N** |`
    — then exits 0. Default `lua tests/run.lua` behaviour is unchanged.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01LwB5PsTqVBMMj648Le7TDs

commit 7ebb36628c59f871caecabb8246ea0e4acd45f68
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Jul 15 09:11:20 2026 +0000

    Debug-logging: conform to debug-logging §5/§8/§9/§10

    Bring the debug system in line with the new Ka0s debug-logging standard
    sections (v1.11.0 §8/§9/§10 and v1.12.0 §5). The console, formatters, and
    `<HH:MM:SS> | [tag] msg` format already conformed and are untouched.

    Sink (secret-safety): unify on one sink, NS.Debug(tag, fmt, ...), now
    secret-safe — every vararg routes through NS.SafeToString before
    fmt:format, so a combat "secret" absorb value logs as <secret> instead of
    raising. Retired the redundant NS.DebugPrint; all call sites use %s-only
    format strings.

    §8 coverage: one gated line per key flow — [Init], [World], [Combat],
    [Bar], [Absorb], [Profile], [Cfg], [Migrate], [Set] (short Titlecase tags).

    §9 coalescing: the per-event / per-repaint hot-path logs are gone.
    OnAbsorbChanged and UpdateAbsorbBar bump debug-gated counters; OnLeaveCombat
    flushes one "[Combat] left: N events, M repaints" rollup (with final= only
    when the post-combat read is non-secret). Value transitions ([Absorb]
    shield up/gone) log only when NS.IsConcatSafe(v) — out of combat; in combat
    the value is secret so the story degrades to counts. Zero-alloc when off.

    §10 settings: every mutation logs once as "[Set] <path> = <value>" at the
    single NS.SetByPath seam (formatting gated on the debug flag).

    §5 v1.12.0 (DebugLog:SetEnabled seam): the on/off chat ack now colour-codes
    the state word — ON green (40ff40) / OFF red (ff4040) — via the shared
    NS.Print, matching the title-bar toggle. On enable, an [Init] session
    summary (name+version, schema version, active profile) is appended after
    the "[Debug] logging enabled" bracket via raw DebugLog:Add. Emitted at the
    SetEnabled seam, not login, since the flag is session-only and off at
    login; removed the dead login-time [Init] line.

    Living docs synced across README + docs/. Tests: 70 pass (was 63);
    luacheck 0/0. No version bump.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01LwB5PsTqVBMMj648Le7TDs

commit 7ebb36628c59f871caecabb8246ea0e4acd45f68
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Jul 15 09:11:20 2026 +0000

    Debug-logging: conform to debug-logging §5/§8/§9/§10

    Bring the debug system in line with the new Ka0s debug-logging standard
    sections (v1.11.0 §8/§9/§10 and v1.12.0 §5). The console, formatters, and
    `<HH:MM:SS> | [tag] msg` format already conformed and are untouched.

    Sink (secret-safety): unify on one sink, NS.Debug(tag, fmt, ...), now
    secret-safe — every vararg routes through NS.SafeToString before
    fmt:format, so a combat "secret" absorb value logs as <secret> instead of
    raising. Retired the redundant NS.DebugPrint; all call sites use %s-only
    format strings.

    §8 coverage: one gated line per key flow — [Init], [World], [Combat],
    [Bar], [Absorb], [Profile], [Cfg], [Migrate], [Set] (short Titlecase tags).

    §9 coalescing: the per-event / per-repaint hot-path logs are gone.
    OnAbsorbChanged and UpdateAbsorbBar bump debug-gated counters; OnLeaveCombat
    flushes one "[Combat] left: N events, M repaints" rollup (with final= only
    when the post-combat read is non-secret). Value transitions ([Absorb]
    shield up/gone) log only when NS.IsConcatSafe(v) — out of combat; in combat
    the value is secret so the story degrades to counts. Zero-alloc when off.

    §10 settings: every mutation logs once as "[Set] <path> = <value>" at the
    single NS.SetByPath seam (formatting gated on the debug flag).

    §5 v1.12.0 (DebugLog:SetEnabled seam): the on/off chat ack now colour-codes
    the state word — ON green (40ff40) / OFF red (ff4040) — via the shared
    NS.Print, matching the title-bar toggle. On enable, an [Init] session
    summary (name+version, schema version, active profile) is appended after
    the "[Debug] logging enabled" bracket via raw DebugLog:Add. Emitted at the
    SetEnabled seam, not login, since the flag is session-only and off at
    login; removed the dead login-time [Init] line.

    Living docs synced across README + docs/. Tests: 70 pass (was 63);
    luacheck 0/0. No version bump.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01LwB5PsTqVBMMj648Le7TDs

commit f4693f285ce6413c6ef07d90f687d25cbc767274
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Jul 15 07:58:20 2026 +0000

    Docs: debug-logging overhaul implementation plan (§8/§9/§10)

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01LwB5PsTqVBMMj648Le7TDs

commit 04b41c006c462ef66d4f681913148beae56d0469
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Jul 15 07:46:21 2026 +0000

    Docs: design spec for debug-logging overhaul (debug-logging §8/§9/§10)

    Approved brainstorm design for conforming AbsorbTracker to the new
    debug-logging standard sections (v1.11.0): §8 coverage of key flows, §9
    coalescing the per-event/per-repaint hot path into a per-combat rollup +
    non-secret transitions, §10 [Set] logging at the SetByPath seam. Also
    unifies on a single secret-safe NS.Debug sink (retiring NS.DebugPrint).

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01LwB5PsTqVBMMj648Le7TDs

commit 8373c58407b2c0b86035461f5bc759a44905dcb3
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Jul 15 07:46:21 2026 +0000

    Conform to options-ui-§2: refuse /at config in combat (no defer-replay)

    The Ka0s standard reversed course in options-ui v1.10.0: under combat
    lockdown the settings-panel open MUST refuse with a grey NS.PREFIX notice,
    NOT defer-and-replay on PLAYER_REGEN_ENABLED (an auto-opening panel steals
    focus during post-pull recovery).

    - settings/Panel.lua: OpenOptionsPanel now refuses in combat — prints the
      canonical grey notice "cannot open settings during combat — Blizzard's
      category-switch is protected" and returns. Never touches the protected
      Settings.OpenToCategory under lockdown; gate stays inside the open fn so
      /run and internal callers are refused too.
    - core/AbsorbTracker.lua: OnLeaveCombat drops the panelOpenPending replay;
      it now does visibility + repaint only. panelOpenPending is gone.
    - Tests: test_slash asserts the refusal + no pending flag; test_visibility
      asserts OnLeaveCombat never auto-opens config. 63 tests still green.
    - Docs synced across README + 8 docs to describe refuse-with-notice.

    Matches the reference implementation (prettychat's OpenConfig).

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01LwB5PsTqVBMMj648Le7TDs

commit fdc5863243b28418ed200f2a661caf49fdf368d3
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Jul 14 21:26:23 2026 +0000

    Docs: fix broken /wow-addon:bump-interface link in common-tasks

    The "See also" pointer linked to ../../.claude/skills/, which resolves
    outside the repo to a path that doesn't exist — a skill is a slash
    command, not a navigable repo file. Drop the dead hyperlink and keep the
    reference as plain backticked text.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01LwB5PsTqVBMMj648Le7TDs

commit bba4ad64b81e397f316e4501dc73476239513581
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Jul 14 19:55:51 2026 +0000

    Docs: sync combat-deferred /at config wiring + test-suite list to code

    The combat-lockdown gate for /at config no longer self-registers a
    one-shot PLAYER_REGEN_ENABLED handler. OpenOptionsPanel now only sets
    NS.State.panelOpenPending; OnLeaveCombat (the single owner of
    PLAYER_REGEN_ENABLED) consumes the flag and replays the open. Update the
    stale code blocks and prose in midnight-quirks.md and settings-panel.md
    that still described the removed self-registration mechanism.

    Also add the missing tests/test_visibility.lua row to the suite table in
    common-tasks.md (was 7 rows; the harness has 8 suites / 63 tests), and
    strip stray </content> / </invoke> generation-artifact markup accidentally
    committed at the tail of schema.md.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01LwB5PsTqVBMMj648Le7TDs

commit e23c97969d20447182edf428e6fcac28de2e5aac
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Jul 14 19:55:34 2026 +0000

    Perf: reuse repaint callback + document Addon Profiler attribution finding

    modules/Timer.lua: hoist the repaint callback to module scope so
    RequestRepaint reuses one closure instead of allocating a fresh one on
    every arm (~10/s in sustained combat). Behaviour is identical; trims
    per-repaint garbage. (AceTimer still allocates its own timer table per
    schedule internally — bounded by the coalescing guard.)

    Also preserve the full CPU investigation that prompted the recent event
    fix. The addon ranked #2 in the in-game Addon Profiler, above ElvUI —
    because C_AddOnProfiler bills a shared library's dispatch frame to the
    addon that loaded it first (alphabetically), and AbsorbTracker owns the
    shared AceEvent/CallbackHandler frame, so it was blamed for every Ace
    addon's event dispatch. Proven by a disable test (blame transferred to
    AlterEgo). Not real waste, not fixable from the addon. Full analysis,
    exact numbers, and profiler screenshots live in
    docs/investigations/2026-07-14-addon-profiler-attribution/, summarised
    in docs/ARCHITECTURE.md -> Performance & Profiler Attribution.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01LwB5PsTqVBMMj648Le7TDs

commit dc2a00f1be5a9414bb2fceafa99bfad6aed7ebc0
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Jul 14 19:08:54 2026 +0000

    Perf: unit-filter UNIT_ABSORB/UNIT_MAXHEALTH via private RegisterUnitEvent frame

    UNIT_ABSORB_AMOUNT_CHANGED and UNIT_MAXHEALTH were registered globally
    through AceEvent, so they fired for every unit the client knows about
    (all raid members, pets, nameplates, target/focus) and paid a full
    C->Lua dispatch each time only to hit `if unit ~= "player" then return`.
    In a raid this was a measured CPU hotspot (peak 18ms, 27x over 1ms).

    AceEvent-3.0 shares one frame and structurally cannot RegisterUnitEvent
    (a frame unit-filters at most two units), so move just these two events
    onto a private CreateFrame frame with RegisterUnitEvent(event, "player"):
    the client filters at the C layer and the handler never runs for other
    units. In-game profiling shows total KaOs CPU drop ~89% (477ms -> 53ms
    over 30s) with spikes essentially gone.

    The private frame is a documented Ka0s-standard 9.1 deviation (events
    otherwise go through AceEvent); recorded in docs/ARCHITECTURE.md ->
    Standards Deviations with cross-refs from data-flow, module-map,
    file-index, and midnight-quirks.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01LwB5PsTqVBMMj648Le7TDs

commit 8f2f7ebc2f43dcc84539ffce924066d15f880e23
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 13 20:23:42 2026 +0000

    Fix show-only-in-combat bar never appearing in combat

    ShouldShowBar gated on InCombatLockdown(), but at PLAYER_REGEN_DISABLED
    the client fires OnEnterCombat while lockdown is still false (secure
    lockdown lags actual combat). ApplyVisibility read the stale false and
    hid the bar; the repaint path only paints the value, so nothing
    re-showed the frame once lockdown flipped true and the bar stayed hidden
    for the whole fight.

    Gate on UnitAffectingCombat("player") instead — true from the instant
    combat starts, false at PLAYER_REGEN_ENABLED — the correct predicate for
    a display gate. Add a regression test modelling the lockdown-lags-combat
    timing, declare the new global for luacheck, and sync the docs (new
    midnight-quirks entry, gate predicate, test count 60 -> 63).

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01PcWTCf2c84PTVyE37tqyfS

commit 861e7b10e65f1e4f32758804638ba465121601b3
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 13 19:55:04 2026 +0000

    Fix NS.Print clobbered by AceConsole embed; restyle /at output

    The real bug: NewAddon(NS, …, "AceConsole-3.0") embeds AceConsole's
    :Print mixin onto NS, silently overwriting the cyan-[AT] NS.Print from
    core/Util.lua. Every /at line was actually printed by AceConsole as
    "|cff33ff99<msg>|r:" — green text, trailing colon, no [AT] tag. Reclaim
    NS.Print from the pristine NS.Util.print copy right after NewAddon.

    The headless harness never reproduced the embed, so 60 green tests missed
    it — wow_mock's NewAddon now stamps the colliding :Print like the live
    client, and a regression test asserts NS.Print survives the embed. Without
    the fix, 6 print-path tests now fail; with it, all 62 pass.

    Also (same /at output pass):
    - /at list colour scheme: green header, azure [page] group headers, gold
      keys, white values (slash-commands-§5); shared FormatKV for list + get/set.
    - Remove the remaining literal trailing colons (help header, profile
      sub-headers) — no printed line ends in ':' (slash-commands-§4).
    - smoke-tests.md documents the colour scheme.

    Green gate: lua tests/run.lua 62/0, luacheck 0/0.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01PcWTCf2c84PTVyE37tqyfS

commit 0dc050a19e7b10059c7aaa0819bf8ac5d56b1d75
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 13 18:48:25 2026 +0000

    Docs: sync ARCHITECTURE.md event list + taint notes for combat visibility

    Final-review follow-up (Task 3 file list omitted ARCHITECTURE.md): add the
    PLAYER_REGEN_DISABLED/ENABLED events + OnEnterCombat/OnLeaveCombat, the
    single-owner deferred-config replay, and a note that the bar's combat-time
    Show/Hide is taint-free (non-secure frame).

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01PcWTCf2c84PTVyE37tqyfS

commit 0dc050a19e7b10059c7aaa0819bf8ac5d56b1d75
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 13 18:48:25 2026 +0000

    Docs: sync ARCHITECTURE.md event list + taint notes for combat visibility

    Final-review follow-up (Task 3 file list omitted ARCHITECTURE.md): add the
    PLAYER_REGEN_DISABLED/ENABLED events + OnEnterCombat/OnLeaveCombat, the
    single-owner deferred-config replay, and a note that the bar's combat-time
    Show/Hide is taint-free (non-secure frame).

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01PcWTCf2c84PTVyE37tqyfS

commit b8cfdaa3a1d302527fe8d1da6b8c7bb12352623b
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 13 18:44:09 2026 +0000

    Fix stale General.lua layout comment (combat toggle + throttle rename)

    The Master-controls layout diagram gained the Show-only-in-combat row and
    still said "update interval"; update it to match the current panel.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01PcWTCf2c84PTVyE37tqyfS

commit eda7a56845f5b25ad5aae3b44ddbd82c9f5fe43d
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 13 18:40:48 2026 +0000

    Docs: document the show-only-in-combat visibility toggle

    Update README General panel + FAQ, schema / settings-panel / scope /
    data-flow, and the test count and file index for the new
    tests/test_visibility.lua suite.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01PcWTCf2c84PTVyE37tqyfS

commit 21b6c5288bade40d68a2bacc5752845bb45d0c17
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 13 18:33:37 2026 +0000

    Wire combat transitions to bar visibility; centralize deferred config

    Register PLAYER_REGEN_DISABLED/ENABLED so the showOnlyInCombat gate
    re-applies on combat transitions. OnLeaveCombat is now the single owner of
    PLAYER_REGEN_ENABLED and replays a combat-deferred /at config from a flag,
    avoiding the AceEvent one-handler-per-event collision.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01PcWTCf2c84PTVyE37tqyfS

commit d005f325292ed7747ce9c56f77554b038d10f165
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 13 18:29:52 2026 +0000

    Add showOnlyInCombat setting + bar visibility resolution

    New showOnlyInCombat toggle (default off). NS.ShouldShowBar composes the
    hidden master toggle with the combat gate; NS.ApplyVisibility applies it,
    and UpdateBarAppearance / UpdateAbsorbBar now route through them.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01PcWTCf2c84PTVyE37tqyfS

commit e38585b4620c62c2c8690be0d31c53b1389fc164
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 13 18:28:26 2026 +0000

    Add implementation plan: show-only-in-combat visibility (#13)

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01PcWTCf2c84PTVyE37tqyfS

commit 37eaf15b1af529cb3d3d0cad024e4e475374f602
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 13 18:24:51 2026 +0000

    Add design spec: show-only-in-combat bar visibility (#13)

    New showOnlyInCombat toggle (default off) hides the bar out of combat.
    Centralizes PLAYER_REGEN_ENABLED ownership in OnLeaveCombat so the
    combat-deferred /at config becomes a drained flag, avoiding the AceEvent
    single-handler-per-event collision. Additive migration, no schemaVersion
    bump. No standards deviation.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01PcWTCf2c84PTVyE37tqyfS

commit e8287a5180a50ef15790c09a16a6f7da6ed7dcb3
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 13 12:40:06 2026 +0000

    Docs: sync README to the event-driven repaint state

    Rename the General-panel "update interval (0.1-10s)" control to "update
    throttle (0.05-1s)" and correct the test count 43 -> 53 (adding the
    repaint timer/throttle suite), matching the merged event-driven refactor.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01PcWTCf2c84PTVyE37tqyfS

commit bc1f98ed6787bad9cb7caebffcd0a76030139f79
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 13 12:31:35 2026 +0000

    Debug console: tag lines by source event/fn instead of a flat [AT]

    DebugPrint now takes an explicit console [tag] as its first arg, so lines
    read as `[UNIT_ABSORB_AMOUNT_CHANGED] Value: <secret>` and
    `[UpdateAbsorbBar] Absorb: <secret> | MaxHP: 734K | Timestamp: ...`
    instead of a uniform `[AT] ...`. Message fields are pipe-separated.

    Also fix the stale core/Util.lua comment (issecretvalue() is public as of
    12.0; the concat probe is kept as a version-agnostic detector) and sync the
    affected docs/line-counts.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01PcWTCf2c84PTVyE37tqyfS

commit bc1f98ed6787bad9cb7caebffcd0a76030139f79
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 13 12:31:35 2026 +0000

    Debug console: tag lines by source event/fn instead of a flat [AT]

    DebugPrint now takes an explicit console [tag] as its first arg, so lines
    read as `[UNIT_ABSORB_AMOUNT_CHANGED] Value: <secret>` and
    `[UpdateAbsorbBar] Absorb: <secret> | MaxHP: 734K | Timestamp: ...`
    instead of a uniform `[AT] ...`. Message fields are pipe-separated.

    Also fix the stale core/Util.lua comment (issecretvalue() is public as of
    12.0; the concat probe is kept as a version-agnostic detector) and sync the
    affected docs/line-counts.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01PcWTCf2c84PTVyE37tqyfS

commit 4280c1bbc998b49c4634c33761ee4ee62cdf2704
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 13 12:13:57 2026 +0000

    Add OnEnterWorld repaint test + document the pending-clear ordering

    Final-review polish:
    - tests/test_timer.lua: cover PLAYER_ENTERING_WORLD -> OnEnterWorld -> RequestRepaint
      wiring (previously the only untested event input).
    - modules/Timer.lua: comment why `pending` is cleared before the paint (error-safety —
      a throwing UpdateAbsorbBar must not freeze repaints), so it isn't "tidied" away.
    - Sync test count 52 -> 53 and Timer.lua/test_timer.lua line counts in the docs.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01PcWTCf2c84PTVyE37tqyfS

commit 4280c1bbc998b49c4634c33761ee4ee62cdf2704
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 13 12:13:57 2026 +0000

    Add OnEnterWorld repaint test + document the pending-clear ordering

    Final-review polish:
    - tests/test_timer.lua: cover PLAYER_ENTERING_WORLD -> OnEnterWorld -> RequestRepaint
      wiring (previously the only untested event input).
    - modules/Timer.lua: comment why `pending` is cleared before the paint (error-safety —
      a throwing UpdateAbsorbBar must not freeze repaints), so it isn't "tidied" away.
    - Sync test count 52 -> 53 and Timer.lua/test_timer.lua line counts in the docs.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01PcWTCf2c84PTVyE37tqyfS

commit 0b69185b06b5b2df73277804e540bd33a453ef32
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 13 12:06:47 2026 +0000

    Docs: complete the test-suite lists (add test_timer.lua, test_util.lua)

    Review fixes for Task 3:
    - module-map.md: count was updated to 52 but test_timer.lua was omitted
      from the enumerated suites, leaving the sentence internally inconsistent.
    - scope.md: suite enumeration was missing test_util.lua (pre-existing gap)
      and test_timer.lua.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01PcWTCf2c84PTVyE37tqyfS

commit d6e85727b2f17d8ef4c259151b73b9d199ecce41
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 13 12:01:59 2026 +0000

    Sync docs to the event-driven repaint model

    Update data-flow / ARCHITECTURE / schema / settings-panel and the
    Timer.lua description to the coalescing throttle; rename updateInterval
    -> throttleWindow; refresh the test count.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01PcWTCf2c84PTVyE37tqyfS

commit 0f3cb092a9f5a49677d260caffb63b1258f12ebc
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 13 11:53:08 2026 +0000

    Make absorb-bar repaint event-driven with a coalescing throttle

    Repaint on UNIT_ABSORB_AMOUNT_CHANGED + UNIT_MAXHEALTH +
    PLAYER_ENTERING_WORLD via a trailing-edge one-shot AceTimer throttle.
    Removes the fixed-interval poll ticker (RestartUpdateTicker /
    ResetTickerInterval) and all its call sites. Idle = zero repaints.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01PcWTCf2c84PTVyE37tqyfS

commit 9a04a2df4fe2886962244e4c2cc1cfebe0095f16
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 13 11:46:27 2026 +0000

    Retire updateInterval for throttleWindow (schema v2 migration)

    Adds the throttleWindow setting (default 0.1s) and a schemaVersion 1->2
    migration that drops the orphaned updateInterval key. Prep for the
    event-driven repaint path.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01PcWTCf2c84PTVyE37tqyfS

commit ef582325310bae8ff470d8dbb4e5641679eb7eae
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 13 11:44:31 2026 +0000

    Add implementation plan: event-driven coalesced repaint

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01PcWTCf2c84PTVyE37tqyfS

commit 572927a09e428191c324f1e17124e9adf18e1162
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 13 11:35:18 2026 +0000

    Add design spec: event-driven coalesced absorb-bar repaint

    Replaces the fixed-interval poll ticker with pure event-driven repaints
    (UNIT_ABSORB_AMOUNT_CHANGED + UNIT_MAXHEALTH) coalesced through a
    trailing-edge throttle. Retires updateInterval for throttleWindow via a
    schemaVersion 1->2 migration. No standards deviation.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01PcWTCf2c84PTVyE37tqyfS

commit b5ff05adb25211f994b9bdea1349a9ead64df968
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 13 11:11:29 2026 +0000

    Fix combat secret-value crash; defer settings panel; sync to standard §6.2/§9.8

    Secret-value guard — root cause of the `/at debug on` combat crash + frozen bar:
    combat-protected returns (UnitGetTotalAbsorbs / AbbreviateNumbers) are "secret"
    values that survive tostring() AND the `..` operator but RAISE in table.concat.
    An unguarded secret in a debug line killed the repeating repaint ticker, so the
    bar froze until /reload. Add NS.IsConcatSafe / NS.SafeToString (core/Util.lua) —
    the detector probes table.concat, NOT `..` (which silently propagates secrets) —
    and route NS.Print + NS.DebugPrint through it (a secret renders as "<secret>").

    Combat settings gate now DEFERS instead of refusing (Ka0s standard §6.2): /at
    config in combat queues a one-shot PLAYER_REGEN_ENABLED replay (idempotent via
    NS.State.panelOpenPending) and opens automatically when combat ends.

    Debug console: /at debug off now logs "[Debug] logging disabled" (a console line
    at both transitions), written via DebugLog:Add so it lands after the flag flips
    off (§12.5).

    Tests + docs: new tests/test_util.lua (secret-safe helpers) plus combat-defer and
    debug-message tests — 36 -> 44 tests, luacheck 0/0. Docs synced: midnight-quirks,
    settings-panel, smoke-tests, agent-context, README, module-map, file-index,
    common-tasks, CLAUDE.md.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01PcWTCf2c84PTVyE37tqyfS

commit a8224003a72e63c35c29a80e7ecbe6a90d1666c1
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 13 05:56:20 2026 +0000

    Move audit/ + reviews/ under docs/; fix refs + doc version sync

    Relocate the standards-audit and code-review bundles to docs/audits/ and
    docs/reviews/ so all archival docs live under docs/ (the /wow-addon plugin now
    writes future audits/reviews there too).

    - .pkgmeta: drop the now-redundant audit/reviews ignores (docs/ is already ignored)
    - .luacheckrc: exclude docs/ in place of the old root audit/ + reviews/ paths
    - docs/reviews/2026-05-02/03_SMOKE_TESTS.md: fix the one relative link whose
      depth changed (../../docs/smoke-tests.md -> ../../smoke-tests.md)
    - Sync docs to 1.9.0: correct NS.version and the English-only version stamp in
      module-map/file-index; point CLAUDE.md's deviation rule at docs/audits/

    Frozen prose inside the moved bundles is left as-is (historical evidence).

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01PcWTCf2c84PTVyE37tqyfS

commit cf63b2d3ec81a6c3d80260614e4cfe8e30fdd0c6
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Mon Jul 13 05:41:42 2026 +0000

    Add standards-compliance rule to project instructions

    Make conformance to the Ka0s WoW Addon Standard an explicit, always-loaded
    project rule so future work stays anchored to it. New "Standards compliance
    (read first)" section in CLAUDE.md and a matching first Hard rule in
    docs/agent-context.md: if a change would deviate from the standard, flag it
    and stop — the user decides whether it's an accepted, documented deviation
    for this addon or a change to the standard itself (updated upstream in the
    WowAddonStandards repo).

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01PcWTCf2c84PTVyE37tqyfS

commit 3611a6675980ed9a1ebd573029b4a8018dea9063
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Jul 12 21:35:56 2026 +0000

    Bump to 1.9.0; sync docs/ topic files to Tier-2 architecture

    Version 1.8.0 -> 1.9.0 (TOC, NS.version, new README Version History row):
    the Ka0s Tier-2 remediation release, whose user-visible addition is the
    on-screen debug console (/at debug, with on|off logging).

    Rewrite the nine docs/ topic files (module-map, file-index, data-flow, schema,
    settings-panel, profiles, common-tasks, midnight-quirks, scope) to match the
    new core/ modules/ settings/ layout, the AceAddon/AceEvent/AceTimer/AceConsole
    substrate, RunMigrations, the DebugLog console, and the tests/ harness. The
    earlier mechanical path-only pass left the prose describing the old flat
    design; this replaces it with accurate descriptions of the current code.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01PcWTCf2c84PTVyE37tqyfS

commit b656018e7a11c22dac76f670f80d9c2231544f10
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Jul 12 21:18:58 2026 +0000

    Remediate to Ka0s Tier-2 standard: Ace substrate, tests, docs

    Restructure the addon onto the Ka0s WoW Addon Standard Tier-2 layout while
    preserving runtime behavior. Verified: 36-test headless harness green,
    luacheck 0/0, luac -p clean, no behavioral regressions.

    - Tier-2 tree: core/ defaults/ locales/ modules/ settings/ tests/
    - Namespace AddonName/AddonTable -> addonName/NS; promoted to an AceAddon
      (AceEvent/AceTimer/AceConsole). Events, ticker, and slash re-seated onto Ace;
      OnInitialize/OnEnable reproduce the old PLAYER_LOGIN sequence exactly
    - schemaVersion + idempotent core/Database RunMigrations; ValidateSchema now
      resolves each row path against the defaults profile
    - core/Compat GetAddOnMetadata shim; shared NS.PREFIX; locales/enUS NS.L
    - On-screen debug console (core/DebugLog) with vendored JetBrains Mono; debug
      output no longer spams chat (/at debug on|off is session-only)
    - Media into media/logos + media/fonts; libs re-vendored folder-per-lib
    - TOC field order + sectioned listing (X-Standard, X-Curse-Project-ID 1450165)
    - .luacheckrc + .pkgmeta; headless tests/ harness (schema/db/compat/debug/slash)
    - Docs: CLAUDE.md stub, docs/ARCHITECTURE.md (SS15.3 order), README ## Testing
      + X-Standard badge; audit/2026-07-12/06_EXECUTION_OUTCOME.md

    Closes all 25 audit deviations (AT-05 Curse-only by decision; no Wago ID).

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01PcWTCf2c84PTVyE37tqyfS

commit dba28aabec162c52885b5a64496942119529e6d6
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Jul 12 20:12:39 2026 +0000

    Add 2026-07-12 standards audit (v1.0.0): 21 MUST, 4 SHOULD gaps

    Frozen read-only audit bundle vs Ka0s WoW Addon Standard v1.0.0.
    Stable AT- deviation IDs, file:line evidence, remediation design,
    and sprint-ordered execution plan. No addon code changed.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01W3zwaUgniMkHv22NWgXLuK

commit c151cca07cdb20a84176bc46433c3ded1fe3050a
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Jul 12 19:52:09 2026 +0000

    Bump Interface to 120007; sync docs to single-value Interface line

    TOC now targets a single retail build (was 120000,120001,120005).
    Update the Interface number and WoW-patch badge everywhere docs cite
    it, and rewrite the "append, don't replace" multi-patch guidance in
    midnight-quirks / common-tasks / smoke-tests to the single-build
    convention. Also fix a stale Panel/Helpers.lua line count.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01W3zwaUgniMkHv22NWgXLuK