1.9.0-release
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 `` 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
All Relations
- All Relations
- Embedded Library
- Optional Dependency
- Required Dependency
- Tool
- Incompatible
- Include

