Ka0s Absorb Tracker (Retail)

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

1.12.0-release

File nameAbsorbTracker-1.12.0-release.zip
Uploaded
Oct 9, 2026
Downloads
208
Size
6.6 MB
Flavors
Retail
File ID
9110166
Type
R
Release
Supported game versions
  • 12.1.0

What's new

tag ce6cc135b938ebcbb5ae2d59f1adc4d8d4b6cd1c 1.12.0-release
Author:    Tushar Saxena <tushar.saxena@gmail.com>
Date:    Fri Oct 9 19:23:47 2026 +0530

Release 1.12.0

commit 3c7e6cbd6a009dc4cbebb002af855c51c561ecf3
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 9 19:23:47 2026 +0530

    Release 1.12.0: version bump, release notes and the gated release run

    Release gate (docs/automated-tests/20261009-191726/manifest.json, run with
    --release 1.12.0 on 7c83d8c, clean tree), all six conditions PASS:
    - Lint: pass, 0 warnings / 0 errors in 70 files
    - Tests: pass, 885 passed, 0 failed, 1 skipped of 886 (the kit's
      diagnostics opt-out contract case, which this addon does not take)
    - Perf: pass, 7 scenarios from tests/perf.lua
    - Complexity: pass, 14702 NLOC / 2249 functions, avg CCN 1.8
    - CCN <= 15: 0 warnings, max CCN 14
    - Sighted: blindFiles 0 (the first sighted release run)

    Files changed:
    - AbsorbTracker.toc: ## Version 1.11.0 -> 1.12.0
    - core/Namespace.lua: NS.version "1.11.0" -> "1.12.0"
    - docs/module-map.md, docs/slash-dispatch.md: version mentions rolled to
      1.12.0
    - README.md: new 1.12.0 row at the top of ## Version History
    - docs/automated-tests/20261009-191726/: the release bundle, with its
      ANALYSIS.md
    - docs/automated-tests/RESULTS.md: the release row and refreshed watch-list
      dispositions

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01J2w6FgfFYw93meWZN9Ahn6

commit 7c83d8c8dcb2a080dc36518b36a520a26f31bce3
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 9 17:49:11 2026 +0530

    SD-FIN-02: sync docs to code (collection sync-docs pass 2026-10-09)

    Docs and comment citations reconciled against today's tree: stale counts,
    drifted file:line citations, orphan anchors and toolchain gaps, each verified
    independently before applying. Comment edits are comment-only. Dead-export
    candidates reported, not removed. Green gate run after the edits.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01J2w6FgfFYw93meWZN9Ahn6

commit 14dd7258c7e83770deb0cde1a3dd6a31ba3756d0
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:56:07 2026 +0530

    AT-STD: Sweep to standard v2.77.0; roll drifted in-repo line cites

    Standards sweep against WowAddonStandards v2.77.0 (feature branch):
    - The three-place reference (TOC `## X-Standard:`, README badge,
      CLAUDE.md "Standards compliance") stays unversioned: v2.77.0's
      toc-file-§1 and documentation-§1/§6 still prescribe the bare URL and
      the unlinked badge, so no edit was needed.
    - Every `filename-§N` citation outside libs/, tests/_kit/ and the frozen
      bundles resolves against v2.77.0's section files and their `### N.`
      headings (the one non-match is CLAUDE.md's literal `filename-§N`
      notation placeholder). No retired file name or changelog-location
      reference found; no deviation row exists for versioning-git's branch
      rule; the addon reads no C_Spell.GetSpellCooldown*. toc-file-§5's
      whole-listing annotation landed in AT-03.
    - Historical "standard vX.Y.Z" provenance notes (when a rule changed)
      are left as written; there is no "built to standard vN" stamp to roll.

    Docs sync for AT-01..AT-09:
    - docs/slash-dispatch.md: Sl:Register :818->:828, OnInitialize call
      core/AbsorbTracker.lua:56->:52, runProfile :589->:599 (twice), the
      library-absent stand-in :628->:638 (AT-06 and AT-07/08 moved them).
    - docs/smoke-tests.md LOC row: Display.lua :449->:455, Slash.lua
      :345->:355, AbsorbTracker.lua :256/:258/:344 -> :253/:255/:356.
    - docs/ARCHITECTURE.md events-frames-taint-§8 register row: the two
      UnitGetTotalAbsorbs readers :242/:340 -> :246/:353.
    - docs/module-map.md: settings/Schema.lua 551 -> 553 lines (pre-existing
      drift from SD-FIN-01, not this run).
    - Comment-only: four test comments citing core/DebugLogSetup.lua:72
      (->:123), core/PerfSetup.lua:33 (->:35) and tests/test_data.lua:192
      (->:198) pointed at the wrong lines (pre-existing drift).
    Already in sync and verified: WidgetsSetup / RelockForCombat in
    ARCHITECTURE.md and module-map.md, the perf scenario names in
    docs/performance.md, every module-map line count, README Tests badge
    885 == docs/test-cases.md Total 885 (inventory regenerates identical).

    Gates: 885 passed / 0 failed / 1 skipped; luacheck 0/0; lizard 0
    functions above CCN 15; complexity suite pass (maxCcn 14); largest
    authored file 1079 lines. No version bump, no CHANGELOG block.

    Findings: none (item carries no finding ids).

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi

commit 14dd7258c7e83770deb0cde1a3dd6a31ba3756d0
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:56:07 2026 +0530

    AT-STD: Sweep to standard v2.77.0; roll drifted in-repo line cites

    Standards sweep against WowAddonStandards v2.77.0 (feature branch):
    - The three-place reference (TOC `## X-Standard:`, README badge,
      CLAUDE.md "Standards compliance") stays unversioned: v2.77.0's
      toc-file-§1 and documentation-§1/§6 still prescribe the bare URL and
      the unlinked badge, so no edit was needed.
    - Every `filename-§N` citation outside libs/, tests/_kit/ and the frozen
      bundles resolves against v2.77.0's section files and their `### N.`
      headings (the one non-match is CLAUDE.md's literal `filename-§N`
      notation placeholder). No retired file name or changelog-location
      reference found; no deviation row exists for versioning-git's branch
      rule; the addon reads no C_Spell.GetSpellCooldown*. toc-file-§5's
      whole-listing annotation landed in AT-03.
    - Historical "standard vX.Y.Z" provenance notes (when a rule changed)
      are left as written; there is no "built to standard vN" stamp to roll.

    Docs sync for AT-01..AT-09:
    - docs/slash-dispatch.md: Sl:Register :818->:828, OnInitialize call
      core/AbsorbTracker.lua:56->:52, runProfile :589->:599 (twice), the
      library-absent stand-in :628->:638 (AT-06 and AT-07/08 moved them).
    - docs/smoke-tests.md LOC row: Display.lua :449->:455, Slash.lua
      :345->:355, AbsorbTracker.lua :256/:258/:344 -> :253/:255/:356.
    - docs/ARCHITECTURE.md events-frames-taint-§8 register row: the two
      UnitGetTotalAbsorbs readers :242/:340 -> :246/:353.
    - docs/module-map.md: settings/Schema.lua 551 -> 553 lines (pre-existing
      drift from SD-FIN-01, not this run).
    - Comment-only: four test comments citing core/DebugLogSetup.lua:72
      (->:123), core/PerfSetup.lua:33 (->:35) and tests/test_data.lua:192
      (->:198) pointed at the wrong lines (pre-existing drift).
    Already in sync and verified: WidgetsSetup / RelockForCombat in
    ARCHITECTURE.md and module-map.md, the perf scenario names in
    docs/performance.md, every module-map line count, README Tests badge
    885 == docs/test-cases.md Total 885 (inventory regenerates identical).

    Gates: 885 passed / 0 failed / 1 skipped; luacheck 0/0; lizard 0
    functions above CCN 15; complexity suite pass (maxCcn 14); largest
    authored file 1079 lines. No version bump, no CHANGELOG block.

    Findings: none (item carries no finding ids).

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi

commit abfd2cf36ada333454b75b54d4455f4aedbe6ccb
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:49:50 2026 +0530

    AT-09: Sweep doc drift against the tree; quote the runner; add BAR-18

    AT-A-02 (audit AT-80), all seven items, re-checked after AT-01..AT-08:
    - (1) The "thirty-two files" library inventory (docs/ARCHITECTURE.md,
      docs/module-map.md twice, docs/performance.md) now points at the files
      libs/LibKa0s/LibKa0s.xml lists instead of restating a count (34 today).
    - (2) Both LibKa0s.xml load-order chains in docs/module-map.md gain
      WidgetsLineChart.lua and WidgetsAutocomplete.lua in XML order; the
      Widgets major's file list names all five Widgets files.
    - (3) docs/testing.md stops naming v1.68.1 and defers to the CLAUDE.md
      provenance line.
    - (4) tests/run.lua row: 178 lines; the suite count is replaced by a
      pointer to its suites list and the generated docs/test-cases.md.
    - (5) The mock sentence describes one RegisterUnitEvent frame per unit
      (addon:SyncUnitEventFrames), not the retired two-frame split.
    - (6) The "live here at DebugLog 6 / Slash 5 / Perf 5" minors are dropped;
      the landing minors (history) stay.
    - (7) The disabled-verb refusal settles on LibKa0s v1.42.0 at both sites,
      matching the register and docs/slash-dispatch.md.
    The unrelated "thirty-two findings" in the test_lintconfig row is spelled
    "32 findings" so the inventory grep stays clean.

    AT-A-03 (audit AT-83): docs/automated-tests/README.md's complexity cell
    quotes `bash tests/_kit/run-automated-tests.sh --suite complexity`, matching
    docs/testing.md and DEPENDENCIES.md; the other cells already match the
    runner's lint/tests/perf commands.

    AT-R-05 (review F-005, optional): no code change. docs/smoke-tests.md
    ## Bars gains BAR-18 "Master scale keeps a dragged bar in place" (confirm
    or refute, review S-05), listed under ## Pending sign-off; the index range
    is BAR-1-18. docs/ARCHITECTURE.md Known Limitations gains the line that
    saved positions live in the bar's scaled space (savePosition,
    NS.RestoreBarPosition), pending BAR-18.

    Deviations: the S-05 check is numbered BAR-18 to follow the file's stable
    <THEME>-<n> scheme; the audit's line cites had shifted by about four lines
    and were located by content. core/WidgetsSetup.lua (AT-02) was already in
    both module maps. Docs-only.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi

commit 1454fbf47c7cdd9fa5935235ef96602ea824f58d
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:45:52 2026 +0530

    AT-08: address review — roll docs/module-map.md line counts for the eight files 3846e6c changed

    core/CoreSetup.lua 156->172, core/AbsorbTracker.lua 460->454,
    modules/Display.lua 485->491, tests/test_database.lua 572->574,
    tests/test_coresetup.lua 183->205, tests/test_slash.lua 408->411,
    tests/test_helpers.lua 573->576, tests/test_debugcoverage.lua 453->496.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi

commit 3846e6c7346adebce7642289bb3909662809e608
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:42:40 2026 +0530

    AT-08: Route the debug memos through DebugChanged; format the ladder line

    AT-A-09 (debug-logging-§9): traceAbsorb's readable/secret edge and
    NS.ApplyVisibility's [Bar] line now go through the console's own
    NS.DebugLog.DebugChanged gate (keys "absorb:secret" and "bar:<unit>")
    instead of the hand-rolled dbgAbsorbSecret / dbgLastShown memos, so a
    console Clear() or turning logging on re-arms them and the state is
    restated on the next pass. dbgAbsorbSecret is gone; dbgLastShown stays as
    the unconditional diagnostics record behind NS.LastAppliedVisibility. The
    [Bar] key and reason are built only inside the NS.State.debug guard.

    AT-A-08 (events-frames-taint-§8): runLadder's migration-failure line hands
    its two versions to the printer's format seam instead of joining them;
    the chat text is byte-identical, now pinned whole in test_database.lua.

    Tests: two red-first cases in test_debugcoverage.lua (Clear re-arms the
    absorb secret edge and the bar line; both went red under the old memos),
    a new NS.Format case (live and degraded) in test_coresetup.lua.
    test_slash.lua's [Set] case, test_helpers.lua's linesOf and the quiet
    steady-state case now settle the [Bar] gates with logging on first, since
    the first logged pass of an armed gate states each bar once. Inventory
    regenerated (885) and the README badge rolled to match.

    Deviations:
    - NS.Print space-joins its arguments and cannot reproduce "v5 -> v6;"
      byte for byte, so core/CoreSetup.lua now publishes NS.Format
      (LibKa0s-Core printer.Format live, a short pcall'd fallback in the
      library-absent stub, picked up by the Core surface-parity case), and the
      ladder line uses it. ARCHITECTURE, module-map, performance and
      common-tasks name the new member.
    - The absorb edge's readable text is "reads readable" (was "reads
      readable again"), per the item's call: the first readable observation of
      an armed gate now writes it, where "again" would be false.
    - The [Bar] line is gated on the whole line, so a new deciding rung for an
      unchanged shown/hidden state is a line too (documented in Display.lua
      and debug.md).
    - The events-frames-taint-§8 register row is unchanged; no register text
      names core/Database.lua.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi

commit 9c4ea2464a65f1f70710d86ab48f79bd1465579a
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:35:28 2026 +0530

    AT-07: Re-lock unlocked bars when standing up or enabling mid-combat

    Review C-5 (finding AT-R-04). The only combat re-lock lived in
    addon:OnEnterCombat, so an `/at enable` mid-fight or a /reload mid-fight on
    an unlocked profile came up after the one PLAYER_REGEN_DISABLED that would
    have re-locked, and the bars sat on the placeholder for the whole fight.

    - core/AbsorbTracker.lua: extract the re-lock into NS.RelockForCombat(reason),
      returning true when it re-locked; one chat literal per reason
      ("combat started" / "in combat"). OnEnterCombat keeps its either/or
      (VISIBILITY + REPAINT only when it did not re-lock). OnEnable's running
      path calls it after the POSITION/APPEARANCE/REPAINT publishes when
      UnitAffectingCombat("player").
    - core/Lifecycle.lua: StandUp ends with NS.RelockForCombat("in combat") when
      the player is in combat (looked up at call time; runs after the latch has
      released). No new event registration.
    - tests: +2 cases with red-under notes (test_disabled: /at enable mid-combat
      on an unlocked profile re-locks and prints once; test_events: OnEnable in
      combat on an unlocked profile re-locks). Both were red before the change.
      The existing OnEnterCombat re-lock cases stay green. The kit mock already
      answers UnitAffectingCombat, so no mock change.
    - docs: one sentence each in docs/lifecycle.md (stand-up rebuild) and
      docs/ARCHITECTURE.md (The disabled state is total); docs/module-map.md
      rows and line counts; docs/test-cases.md regenerated; README Tests badge
      rolled to 882.

    Gates: 882 passed / 0 failed / 1 skipped; luacheck 0/0; complexity suite
    green (max CCN 14).

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi

commit 3908b923b221056aaa88e0a7ed199410293da3c9
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:27:47 2026 +0530

    AT-06: Refuse /at debug hold while stood down; retarget the degraded test

    Review C-3 (AT-R-03): runHold gated only on the stored `enabled`, so during
    a perf capture's suspended arm (`/at perf measure b`, which takes the `perf`
    hold on the stand-down latch) it printed "Holding ..." and NS.HoldPreview
    armed an expiry that republished REPAINT onto a stood-down bus. runHold now
    keeps the DisabledLine refusal first, then asks NS.IsStoodDown() and refuses
    with NS.Debug("Cmd", "debug hold refused: stood down") and one chat line
    ("Bars are suspended for a perf capture; run /at perf finish (or /at perf
    measure a) first") before parsing, painting or arming anything.
    tests/test_debughold.lua gains the stood-down case (red under the removed
    gate: it printed Holding and reached NS.HoldPreview).

    Review C-4, as corrected (AT-R-06): tests/test_perf.lua's degraded-load case
    read back the stub literal `Perf.suspended == false`, which cannot fail for
    a ladder reason. It now asserts NS2.IsStoodDown() == false, what the show
    ladder's rung 0 reads; confirmed red in a scratch copy with the latch stub's
    IsDown forced true. `suspended = false` stays in core/PerfSetup.lua's
    degraded stub for the Perf host contract and test_surface_parity.

    Docs: smoke-tests.md (STATE-3 note, new DIAG-52, inventory DIAG-1-52, register
    row), debug.md, slash-dispatch.md, common-tasks.md, module-map.md (line counts
    and the test_debughold description); docs/test-cases.md regenerated and the
    README Tests badge rolled to 880.

    Deviations: the item's smoke text says `/at perf start` stands the addon
    down; in the vendored LibKa0s-Perf only `measure b` suspends, so the test
    and DIAG-52 suspend through NS.Perf.Suspend / `/at perf measure b`. The
    ShouldShowBar("player") extra assertion ("if cheap") was skipped: the
    degraded env has no database in that case, and the next degraded case
    already drives the show ladder.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi

commit e6900622d600d013ea3d16c195748cbfbfd65441
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:21:49 2026 +0530

    AT-05: Loop NS.Units.LIST in doRepaint instead of a per-pass closure

    modules/Timer.lua doRepaint handed NS.ForEachUnit a fresh function(unit)
    closure over `painted` and `parent` on every coalesced pass. That went
    against the file header's own hoisting rationale. It now walks
    NS.Units.LIST with a plain ipairs loop, the same list and order that
    NS.ForEachUnit iterates (modules/Display.lua). Behaviour is unchanged:
    same unit order, same painted/NoteRepaint/Perf.Note accounting. No suite
    stubs NS.ForEachUnit (re-grepped).

    Perf (tests/perf.lua, three runs, identical to the decimal):
      repaintPass       144.0 -> 0.0 bytes/pass
      probeOverheadOff  144.0 -> 0.0 bytes/pass
      probeOverheadOn   144.5 -> 0.5 bytes/pass
      paintBars          48.0 (unchanged; this is its own test closure)
    So the whole 144.0 that AT-01 measured was the closure and its two
    closed upvalues.

    Red first: with PROBE_OFF_BYTES_CEILING lowered below 144, perf failed
    on the old code ("a dormant pass allocated 144.0 bytes/iter, over the
    120-byte ceiling").
    The ceiling is re-derived by the documented method:
    measured 0.0, and one extra `{}` in the scenario body moves it
    0.0 -> 64.0 (re-measured in a scratch copy), so the ceiling is
    24 = 0.0 + 24, and 24 < 64. The RE-BASELINED comment block is rewritten
    to record both re-baselines.

    Docs: docs/performance.md gets the new figures. docs/module-map.md and
    docs/data-flow.md now describe the timer's loop over NS.Units.LIST
    instead of NS.ForEachUnit, and module-map's line counts for Timer.lua
    (94 -> 97) and tests/perf.lua (352 -> 355) are updated.

    Finding: AT-R-02 (review F-002, C-2).

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi

commit 86ab7cab9001c8bae7f31368baab8c80bc03ad1c
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:16:59 2026 +0530

    AT-04: Retire the savedvariables-§1 per-profile-stamp register row

    docs/ARCHITECTURE.md -> ## Documented deviations no longer carries the
    savedvariables-§1 row for the per-profile schemaVersion stamp. Since
    standard v2.65.0, §1 sanctions a per-profile stamp re-run idempotently
    from AceDB's OnProfileChanged/OnProfileCopied/OnProfileReset callbacks,
    and the addon does exactly that (NS.OnProfileChanged and the other two
    callbacks in core/AbsorbTracker.lua via adoptProfile, plus the
    migrateAllProfiles sweep at load in core/Database.lua), so the row read
    as a live deviation that is not one.

    docs/recorded-decisions.md -> ## Retired register rows gains a dated
    2026-10-07 entry: the rule the row cited, why it is retired, the
    profiles.md link, and the two residual differences, so a later audit
    does not re-raise them blind:
    - the per-profile stamp defaults to 1 (NS.defaults.profile.schemaVersion),
      a floor below the only per-profile version, which keeps §1's
      logout-strip and legacy-backfill reasons intact;
    - NS.MigrateProfileToV3 writes the per-profile stamp itself, as its last
      write after the lift completes, since the callback route has no runner.
    Both carry the re-check trigger "savedvariables-§1 ruling on per-profile
    stamp defaults/ownership". The hub's pointer paragraph names the new
    retirement.

    Pages that called the stamp a deviation now point at the retired entry:
    docs/profiles.md, docs/data-flow.md, docs/module-map.md.

    Finding: AT-A-06 (audit AT-86).

    Deviation from the item text: the item is docs-only, but two comments in
    defaults/Profile.lua still pointed at the retired register row (one
    under its old "Standards Deviations" name). They were reworded,
    comment-only, so no source comment points at a row that no longer
    exists. No code changed.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi

commit 2ace072e313304342bc092cbc63880f228caa9fa
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:12:18 2026 +0530

    AT-03: Annotate the load-bearing settings TOC lines and walk the rest

    Adds `# LOAD-BEARING:` comments above settings\Schema.lua and
    settings\OptionsSetup.lua (toc-file-§5, as WS-04 restates it: the
    denominator is every position in the listing, not only # Core), and walks
    the rest of the listing. Resolves AT-A-04 and AT-A-05.

    Readers re-verified by grep before writing:
    - Schema.lua: NS.SchemaRuntime.AllRows/BulkBegin/BulkEnd captured at file
      load by settings/OptionsSetup.lua (:98, :144-145); NS.RegisterSchemaRows
      called at file load by settings/General.lua (:254) and
      settings/Appearance.lua (:276 via addUnitRows at :279).
    - OptionsSetup.lua: NS.Helpers captured as a file-scope upvalue by
      UnitPanel.lua:17, About.lua:19, General.lua:12, Appearance.lua:74.

    Walk of the other positions:
    - locales\enUS.lua: LOAD-BEARING (NS.L read at load by DebugLogSetup's
      descriptor, modules/Bar.lua and Slash.lua's NS.COMMANDS rows).
    - defaults\Profile.lua: LOAD-BEARING (NS.unitDefaults / NS.flatDefaults
      captured at load by Bar.lua, General.lua, Appearance.lua; Bar sizes its
      frames from them at load).
    - modules Bar/Display/Timer, settings Slash, UnitPanel/About, Profiles:
      marked conventional.

    Test first: tests/test_loadorder.lua gains a case pinning both seams ahead
    of every file-load reader and requiring the `# LOAD-BEARING:` line directly
    above each TOC entry (red on the unannotated TOC, green after).
    docs/test-cases.md regenerated (879), README badge and module-map rows
    (Schema, OptionsSetup, test_loadorder) updated.

    Deviations from the item text:
    - The Schema note also names settings/Slash.lua (captures
      NS.SchemaRuntime.FindRow at load, :774) and settings/Appearance.lua
      (calls NS.RegisterSchemaRows at load); the item's text omitted both.
    - The OptionsSetup note also names NS.RegisterOptionsPage, called at file
      load behind a guard by General, Appearance and Profiles (a later
      position fails silently).
    - Line cites shifted by the existing annotations (Schema at :89-90,
      OptionsSetup at :93-94 after the edit).
    - Not changed (outside this item's walk, # Core): the existing
      "Conventional order" note above core\State.lua says Data.lua is not read
      at file load, but modules/Bar.lua calls NS.GetBorder/GetBarTexture/
      GetFont (core/Data.lua) at file load when it builds NS.bars.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi

commit cde238c23f3ff11e7a5a3a45f69b0655cc40c339
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:05:51 2026 +0530

    AT-02: address review — count core/WidgetsSetup.lua among the self-naming headers

    docs/recorded-decisions.md (documentation-§9): twenty authored files open
    `local _, NS = ...`, and eight of them, not seven, carry a self-naming
    header. core/WidgetsSetup.lua uses the `-- core/CoreSetup.lua — …` form.
    The seven older headers are grandfathered. core/WidgetsSetup.lua was
    written after the section and already places its header directly below
    the bootstrap.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi

commit d094da69bad29f3147d9105b111bd66091f85693
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:02:23 2026 +0530

    AT-02: Give LibKa0s-Widgets-1.0 a setup seam publishing NS.Widgets

    Resolves AT-A-07 (Option A; library-stack-§7, testing-§8). The Widgets
    major was resolved twice, inline, with nil-guards in modules/Bar.lua and
    modules/Display.lua, and had no setup file, stub or parity case.

    - New core/WidgetsSetup.lua resolves LibStub("LibKa0s-Widgets-1.0", true)
      once and publishes NS.Widgets: the live major, or a stub carrying exactly
      the members the addon reaches. DragHandle answers nil, so NS.CreateBar
      draws no strip, as before. DRAG_HANDLE is { HEIGHT = 0, GAP = 0 } rather
      than nil, so Display's HANDLE_ROOM is 0 with no consumer nil-guard.
    - AbsorbTracker.toc: core\WidgetsSetup.lua sits with the setup seams (after
      LauncherSetup, before modules\Bar.lua), annotated LOAD-BEARING
      (toc-file-§5). It does not use NS.LIBKA0S_MISSING.
    - modules/Bar.lua and modules/Display.lua read NS.Widgets. Bar no longer
      has the `Widgets and Widgets.DragHandle` guard, and Display derives
      HANDLE_ROOM straight from DRAG_HANDLE. Comments are rewritten to match.
    - tests/test_surface_parity.lua: new case "parity: the Widgets stub
      carries every Widgets member the addon reaches". It re-derives the
      reached set from the TOC's files with comments stripped, pins it to
      DragHandle + DRAG_HANDLE, and checks both on both arms (same type), plus
      DRAG_HANDLE.HEIGHT/GAP as numbers.
    - tests/test_draghandle.lua: a degraded-load case checking that NS.Widgets
      is the stub, DragHandle builds nothing, the sizes add to 0, no bar has a
      handle and the default stack keeps no strip room. Both new cases were
      red (NS.Widgets nil) before the seam existed.
    - Docs: the ARCHITECTURE.md module-map passage that said "no setup seam"
      is rewritten, and a table row is added. docs/module-map.md gets a row,
      the Core load order and the libs passage. The bootstrap count
      "nineteen" becomes "twenty" (the new file opens `local _, NS = ...`)
      in ARCHITECTURE.md, module-map.md and recorded-decisions.md.
      docs/test-cases.md is regenerated and the README badge rolled, 876 -> 878.

    tests/run.lua derives its file list from the TOC, as do degraded_env and
    perf.lua, so no explicit list needed an edit. No register row (Option B).
    Issue #26 gets no comment (per the verified finding).

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi

commit fde43d754db9d1aa3b4d68d55b548621ad065d31
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 19:56:09 2026 +0530

    AT-01: Measure the shipped doRepaint in the offline perf runner

    Review C-1 (finding AT-R-01). The offline "coalesced repaint" and
    "zero-overhead" scenarios wrapped NS.UpdateAbsorbBar in a test closure,
    so the outer repaintPass bracket, the `parent` derivation and doRepaint's
    own per-pass fan-out were never measured, and a regression there could
    not turn the dormant-probe gate red.

    - modules/Timer.lua: publish the file-local doRepaint as the test-only
      seam NS.Timer.__doRepaint, beside NS.Timer.__ev. No behaviour change;
      no production caller.
    - tests/perf.lua: scenario 3 paintPass is renamed paintBars and keeps its
      12-API-calls assertion; a new repaintPass scenario calls
      NS.Timer.__doRepaint() per iteration (doRepaint clears `pending` itself,
      nothing is re-armed) and asserts 12 API calls too; probeOverheadOff/On
      now run NS.Timer.__doRepaint().
    - PROBE_OFF_BYTES_CEILING re-derived by its documented method:
      measured 144.0 B/pass, identical in three runs of the dormant arm;
      one `{}` re-measured on this commit (scratch copy) at 144.0 -> 208.0,
      so 64 B; ceiling 168 = 144.0 + 24 (24 < 64). The figure includes the
      per-pass closure doRepaint hands to NS.ForEachUnit (AT-05 removes it
      and lowers the ceiling). The RE-BASELINED comment block is rewritten
      with the date and the three numbers.
    - Red proof: with probeOverheadOff/On pointed at the seam and the old
      72 B ceiling, `lua tests/perf.lua` exited 1 with "a dormant pass
      allocated 144.0 bytes/iter, over the 72-byte ceiling". The old gate
      missed the shipped path.
    - docs/performance.md: the scenario table, figures and reading guidance
      now name paintBars / repaintPass. docs/module-map.md: the Timer.lua and
      tests/perf.lua rows (line counts, seam, scenario list) follow.

    Gates: lua tests/run.lua 876 passed / 0 failed / 1 skipped; luacheck 0/0;
    lizard no function above CCN 15; complexity suite green;
    lua tests/perf.lua exits 0.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi

commit 7db2f368e9ebe6a11e1a09b1450ff2276eac05bd
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 19:50:32 2026 +0530

    RV-AT: re-vendor LibKa0s v1.71.0; span bundle v1.69.0-v1.70.0

    Copy both payloads whole from the local LibKa0s tag v1.71.0 (commit
    cb274a4): libs/LibKa0s/ (Env 2, Slash 20 / SlashParse 2,
    WidgetsLineChart 3, WidgetsAutocomplete 2, OptionsIdList 4) and
    tests/_kit/ (kit revision 38, adds secrets.lua). Roll the CLAUDE.md
    provenance line to v1.71.0 in the same commit.

    Regenerate docs/test-cases.md with kit 38: the declared diagnostics
    opt-out skip moves to a "| Skipped | 1 |" row and Total drops from 877
    to 876, equal to the README badge (876/876, unchanged). Resolves AT-R-07.

    Record the unrecorded v1.69.0 (5075fd5) and v1.70.0 (4c16982)
    re-vendors in one span bundle docs/revendor/2026-10-07-v1.69.0-v1.70.0/
    (line 1 names only the unrecorded tags, per the command spec, not the
    audit's v1.68.1-v1.70.0 shape). Resolves AT-A-01. Write the v1.71.0
    bundle docs/revendor/2026-10-07-v1.71.0/: no contract blockers; Env 2's
    dropped bare-global rung does not reach core/EnvSetup.lua, whose own
    fallback reads C_AddOns only. Candidates (Kit.secret,
    ChartMath.ClipSegment, LineChart hover re-sync, Autocomplete re-hook)
    are listed as not adopted in this run; Widgets adoption is AT-02.

    Not touched here: the stale tag in docs/testing.md:170 and the kit
    revision in docs/module-map.md row 31, both owned by AT-09's doc sweep
    (AT-80 / AT-A-02), so they are not fixed twice.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi

commit e83325bfc26aa8cd394934ea4e2695780298d71a
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 16:51:51 2026 +0530

    RA-00: record 2026-10-07 standards audit and review bundles

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi

commit 4c1698260d040c216365a27e1127476d8b5234b5
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 11:38:32 2026 +0530

    chore: re-vendor LibKa0s v1.70.0

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01L4XiFWzQrd9ee19aBpkVmt

commit 4c1698260d040c216365a27e1127476d8b5234b5
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 11:38:32 2026 +0530

    chore: re-vendor LibKa0s v1.70.0

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01L4XiFWzQrd9ee19aBpkVmt

commit 5075fd596969dc669af2cc4391e3add4e49a98f9
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Oct 6 14:52:48 2026 +0530

    chore: re-vendor LibKa0s v1.69.0 (kit 37; adds the line chart widget)

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01L4XiFWzQrd9ee19aBpkVmt

commit 8030ac1e142b69f963f369605dfd645c3abc3125
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Oct 4 15:10:50 2026 +0530

    DC-REV-01: re-vendor LibKa0s v1.68.1 (kit 36; library bytes unchanged)

    Copies libs/LibKa0s/ and tests/_kit/ whole from the local tag v1.68.1 (tag 9fb7956, commit
    9000cbd) via git archive. The library payload is byte-identical between v1.68.0 and v1.68.1, so
    all 32 minors stand; kit 35 -> 36 (framework.lua, run-automated-tests.sh, test_eol.lua: the
    dev-copilot command names, comments and one printed RESULTS.md line). Nothing added or deleted.
    Vendor parity: diff -r against the tag is empty for both payloads, both directions.

    - CLAUDE.md provenance line and docs/testing.md:170 roll to v1.68.1.
    - docs/module-map.md row 31 names the held kit as revision 36.
    - Frozen bundle docs/revendor/2026-10-04-v1.68.1/ (01, 02, 03, 05). Zero adoption candidates,
      no interview, no contract blocker, no span bundle.

    Gates (ka0s-bounded):
    - lua tests/run.lua: 876 passed, 0 failed, 1 skipped, 877 total (test_vendor_sync green)
    - luacheck .: 0 warnings / 0 errors in 69 files
    - run-automated-tests.sh --suite complexity --no-bundle: pass, max CCN 14, 0 warnings

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01MsGF7a1YxB69EsRnBC8rcE

commit 8030ac1e142b69f963f369605dfd645c3abc3125
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Oct 4 15:10:50 2026 +0530

    DC-REV-01: re-vendor LibKa0s v1.68.1 (kit 36; library bytes unchanged)

    Copies libs/LibKa0s/ and tests/_kit/ whole from the local tag v1.68.1 (tag 9fb7956, commit
    9000cbd) via git archive. The library payload is byte-identical between v1.68.0 and v1.68.1, so
    all 32 minors stand; kit 35 -> 36 (framework.lua, run-automated-tests.sh, test_eol.lua: the
    dev-copilot command names, comments and one printed RESULTS.md line). Nothing added or deleted.
    Vendor parity: diff -r against the tag is empty for both payloads, both directions.

    - CLAUDE.md provenance line and docs/testing.md:170 roll to v1.68.1.
    - docs/module-map.md row 31 names the held kit as revision 36.
    - Frozen bundle docs/revendor/2026-10-04-v1.68.1/ (01, 02, 03, 05). Zero adoption candidates,
      no interview, no contract blocker, no span bundle.

    Gates (ka0s-bounded):
    - lua tests/run.lua: 876 passed, 0 failed, 1 skipped, 877 total (test_vendor_sync green)
    - luacheck .: 0 warnings / 0 errors in 69 files
    - run-automated-tests.sh --suite complexity --no-bundle: pass, max CCN 14, 0 warnings

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01MsGF7a1YxB69EsRnBC8rcE

commit 880442d97fcc22f1bc57b5241bfafbc143289b88
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Oct 4 14:32:42 2026 +0530

    DC-REN-02: automated-tests README names /dev-copilot:bump-version as the release-gate evaluator

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01MsGF7a1YxB69EsRnBC8rcE

commit 880442d97fcc22f1bc57b5241bfafbc143289b88
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Oct 4 14:32:42 2026 +0530

    DC-REN-02: automated-tests README names /dev-copilot:bump-version as the release-gate evaluator

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01MsGF7a1YxB69EsRnBC8rcE

commit 3215549b4a5dff0b42332943b6490709f13e805c
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Oct 4 14:21:18 2026 +0530

    DC-REN-01: docs name /dev-copilot commands (wow-addon plugin merged into dev-copilot)

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01MsGF7a1YxB69EsRnBC8rcE

commit 05f1f8c1f957968c3441db78a3dd23e7765b82bf
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sat Oct 3 12:47:44 2026 +0530

    SD-FIN-01: sync docs; peel /at profile cases into tests/test_slashprofile.lua (test_slashcmds 1472 -> 1079 lines)

    File counts nineteen (Diagnostics.lua), stale line refs and cap census, lizard note in DEPENDENCIES; ProfileRowsOffDefault marked a test seam; .pkgmeta screenshot count; recorded-decisions exemption covers all seven self-naming headers.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01GBEbct8mwzFqZSG1oTkv8f

commit ac3f009c4e5a69e1e134d6351479c5c75ee43ae9
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sat Oct 3 00:03:25 2026 +0530

    TP-AT-02: strip, ? and X tooltips open beside the strip (tooltipPlace)

    Adopts LibKa0s WidgetsDragHandle minor 4's tooltipPlace on all three bars'
    drag strips. This reverses TP-AT-01's decline: the owner asked for
    consistency across all Ka0s addons. NS.Util.PlaceTooltipBeside
    (modules/Bar.lua) mirrors KickCD's core/Util.lua (TP-KC-01). It anchors the
    tooltip's TOPLEFT 4 px right of the strip's TOPRIGHT. When the strip's right
    edge plus the tooltip's width would pass the screen's right edge, it anchors
    the tooltip's TOPRIGHT 4 px left of the strip's TOPLEFT instead. The
    comparison is in screen pixels, each read times its frame's effective scale,
    because a bar carries its own scale times the master scale. A hovered ? or X
    resolves to its strip, so all three tooltips open in one place.

    Every read is guarded: a missing method, nil, a secret (NS.IsConcatSafe,
    this addon's one secret question, standing in for KickCD's
    NS.Compat.IsSecret) or a non-number. On any such read it answers nil with
    nothing anchored, and the widget falls back to the cursor. It returns true
    only once placed. The help and close descriptors' anchor =
    "ANCHOR_TOPRIGHT" fields are removed, because the widget reads no owner or
    anchor while a hook is in force.

    Test first, in tests/test_draghandle.lua. Nine cases were red before the
    code. Six cover the placement: right, left flip, the ? and the X resolving
    to the strip, a scaled strip, a secret read and a nil read. Three cover
    hovering: every strip, ? and X owned once by UIParent at ANCHOR_NONE and
    anchored beside the strip, the left flip, and the cursor fallback. The
    existing tooltip-text hover helper now gives the strip room, so the
    tooltip is drawn once.

    Docs: Bar.lua header; module-map.md (Bar row and prose, test row);
    ARCHITECTURE.md; common-tasks.md. smoke-tests.md gains BAR-17 (owner-run,
    unmarked), notes on BAR-12 (d) and BAR-13, an index range of BAR-1-17 and an
    owed-table row. The revendor bundle's 03_DECISIONS.md has the reversal
    appended, and 05_SUMMARY.md has a "Later" note.

    Gate: 876 passed / 0 failed / 1 skipped (877); before this change it was
    867 / 0 / 1 (868). docs/test-cases.md regenerated, README badge 876.
    luacheck 0/0 in 68 files. Sighted complexity: pass, 0 warnings, max CCN 14
    (PlaceTooltipBeside CCN 10). Every file is under 1500 lines. No version
    bump.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8

commit ac3f009c4e5a69e1e134d6351479c5c75ee43ae9
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sat Oct 3 00:03:25 2026 +0530

    TP-AT-02: strip, ? and X tooltips open beside the strip (tooltipPlace)

    Adopts LibKa0s WidgetsDragHandle minor 4's tooltipPlace on all three bars'
    drag strips. This reverses TP-AT-01's decline: the owner asked for
    consistency across all Ka0s addons. NS.Util.PlaceTooltipBeside
    (modules/Bar.lua) mirrors KickCD's core/Util.lua (TP-KC-01). It anchors the
    tooltip's TOPLEFT 4 px right of the strip's TOPRIGHT. When the strip's right
    edge plus the tooltip's width would pass the screen's right edge, it anchors
    the tooltip's TOPRIGHT 4 px left of the strip's TOPLEFT instead. The
    comparison is in screen pixels, each read times its frame's effective scale,
    because a bar carries its own scale times the master scale. A hovered ? or X
    resolves to its strip, so all three tooltips open in one place.

    Every read is guarded: a missing method, nil, a secret (NS.IsConcatSafe,
    this addon's one secret question, standing in for KickCD's
    NS.Compat.IsSecret) or a non-number. On any such read it answers nil with
    nothing anchored, and the widget falls back to the cursor. It returns true
    only once placed. The help and close descriptors' anchor =
    "ANCHOR_TOPRIGHT" fields are removed, because the widget reads no owner or
    anchor while a hook is in force.

    Test first, in tests/test_draghandle.lua. Nine cases were red before the
    code. Six cover the placement: right, left flip, the ? and the X resolving
    to the strip, a scaled strip, a secret read and a nil read. Three cover
    hovering: every strip, ? and X owned once by UIParent at ANCHOR_NONE and
    anchored beside the strip, the left flip, and the cursor fallback. The
    existing tooltip-text hover helper now gives the strip room, so the
    tooltip is drawn once.

    Docs: Bar.lua header; module-map.md (Bar row and prose, test row);
    ARCHITECTURE.md; common-tasks.md. smoke-tests.md gains BAR-17 (owner-run,
    unmarked), notes on BAR-12 (d) and BAR-13, an index range of BAR-1-17 and an
    owed-table row. The revendor bundle's 03_DECISIONS.md has the reversal
    appended, and 05_SUMMARY.md has a "Later" note.

    Gate: 876 passed / 0 failed / 1 skipped (877); before this change it was
    867 / 0 / 1 (868). docs/test-cases.md regenerated, README badge 876.
    luacheck 0/0 in 68 files. Sighted complexity: pass, 0 warnings, max CCN 14
    (PlaceTooltipBeside CCN 10). Every file is under 1500 lines. No version
    bump.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8

commit 63b0795bdcf608f5ba09a1b7e18101406577e159
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 23:39:02 2026 +0530

    TP-AT-01: re-vendor LibKa0s v1.68.0 (WidgetsDragHandle 4; kit 35 unchanged)

    Payloads copied whole from the LOCAL tag v1.68.0 (tag object 6d83731 -> commit cc9f5eb) via git
    archive. One file moves a minor (WidgetsDragHandle 3 -> 4, Widgets key 12.1.3 -> 12.1.4); none is
    added or deleted. The kit stays at revision 35, byte-identical to v1.67.0's. Vendor parity: diff -r
    against the tag is empty for both payloads.

    - CLAUDE.md provenance line and docs/testing.md:170 roll to v1.68.0.
    - docs/test-cases.md in sync (868 cases); README badge stays 867/867.
    - Frozen bundle docs/revendor/2026-10-02-v1.68.0/ (01, 02, 03, 05). No contract blocker: the host
      sets no hook, so every hover keeps minor 3's calls in minor 3's order.

    tooltipPlace NOT adopted, by decision. The owner wants the strip tooltip beside the strip instead
    of at the cursor. Here it is already owned by the strip: modules/Bar.lua passes no tooltipOwner,
    so the widget owns by the strip at ANCHOR_TOP (the ? and X by their marks at ANCHOR_TOPRIGHT).
    The tooltip already sits on the strip, which is what the request fixes elsewhere. The client
    clamps a frame-owned tooltip to the screen, so the right-edge flip has no case to solve. A
    spec-level hook would also take over the ? and X tooltips, and a strip-only place would split one
    strip into two placement styles. Either way the host would gain guarded rect reads and a fallback
    path to reproduce an attachment it already has. That matches the plan's rule for frame-owned
    strips. This is not a real gap, so no issue was filed (03_DECISIONS.md).

    Gates (ka0s-bounded):
    - lua tests/run.lua: 867 passed, 0 failed, 1 skipped, 868 total (before 867/0/1, 868)
    - luacheck .: 0 warnings / 0 errors in 68 files
    - bash tests/_kit/run-automated-tests.sh --suite complexity --no-bundle (sighted): pass,
      max CCN 14, 0 warnings, 2181 functions.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8

commit 1120ccaa4814dce06c4e7a366e499c7145a2a6ab
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 02:00:22 2026 +0530

    CA-AT-01: adopt Slash.SplitVerb, Slash.ProfileNames and Core.SECRET (#33)

    - runDebug, runProfile, runToggle and the stub's OnSlash split through
      SlashLib.SplitVerb. The library-absent arm defines the file's one
      minimal SplitVerb (slash-commands-§1), published as Sl.__SplitVerb and
      pinned against the library's over a corpus.
    - /at profile list reads SlashLib.ProfileNames(db): sorted ignoring case,
      current always listed, the bare form's order. The "Available profiles"
      header and " (current)" marker are kept; the degraded arm prints the
      store's own GetProfiles() list.
    - core/CoreSetup.lua publishes NS.SECRET on both arms (lib.SECRET live, the
      one "<secret>" literal in the stub, which its SafeToString returns);
      modules/Diagnostics.lua's secretSafe returns NS.SECRET.
    - Docs: profiles, slash-dispatch (stale line cites refreshed), module-map,
      common-tasks, midnight-quirks; smoke PROFILE-16 and DEGRADED-5 with
      Pending sign-off rows; test-cases.md regenerated; badge 867/867.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8

commit 1120ccaa4814dce06c4e7a366e499c7145a2a6ab
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 02:00:22 2026 +0530

    CA-AT-01: adopt Slash.SplitVerb, Slash.ProfileNames and Core.SECRET (#33)

    - runDebug, runProfile, runToggle and the stub's OnSlash split through
      SlashLib.SplitVerb. The library-absent arm defines the file's one
      minimal SplitVerb (slash-commands-§1), published as Sl.__SplitVerb and
      pinned against the library's over a corpus.
    - /at profile list reads SlashLib.ProfileNames(db): sorted ignoring case,
      current always listed, the bare form's order. The "Available profiles"
      header and " (current)" marker are kept; the degraded arm prints the
      store's own GetProfiles() list.
    - core/CoreSetup.lua publishes NS.SECRET on both arms (lib.SECRET live, the
      one "<secret>" literal in the stub, which its SafeToString returns);
      modules/Diagnostics.lua's secretSafe returns NS.SECRET.
    - Docs: profiles, slash-dispatch (stale line cites refreshed), module-map,
      common-tasks, midnight-quirks; smoke PROFILE-16 and DEGRADED-5 with
      Pending sign-off rows; test-cases.md regenerated; badge 867/867.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8

commit 3f6df555182830d363ac493b89bd0df8761cbe41
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 01:55:07 2026 +0530

    CA-AT-01: characterize the /at sub-verb split and the degraded profile list

    Pins, green on today's code, what the SplitVerb / ProfileNames adoption
    must not change: /at debug EVENTS and HOLD fold the sub-verb and keep the
    remainder, /at profile NEW CasePin folds only the verb, the stub dispatcher
    routes a corpus exactly as the live one, and on a degraded load debug
    events, profile current and profile list still answer from the store.
    New cases go in tests/test_slash.lua (test_slashcmds.lua is at the cap).

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8

commit d2d9df8157e19a0ab4683f070b84795d33dba793
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 01:49:56 2026 +0530

    CA-AT-NM: the Options descriptor passes addonName (LibKa0s#42)

    settings/OptionsSetup.lua binds the first vararg as `addonName` and hands it
    to LibKa0s-Options-1.0 as `descriptor.addonName`, so the library can build its
    IdList help-mark art path from the folder name (Options 28 / OptionsIdList 3
    check it against the loaded-addon list). Latent here: no page draws an id list.

    Tests (red-first): a spy on a second full load asserts the descriptor lib:New
    received carries addonName = "AbsorbTracker"; a source guard asserts the
    vararg binding and `addonName = addonName,` inside the descriptor table with no
    literal; libs/LibKa0s/media/icons/info.tga is on disk. Degraded path unchanged.

    Docs: test inventory and badge (858/858), PANEL-10 smoke check with its
    Pending sign-off row, the descriptor tables, and the vararg counts (ten bind
    addonName, eighteen open `local _, NS`).

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8

commit 7ed3af6fe1a392ec5e7c951e1def2bddbd1de42a
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 01:40:48 2026 +0530

    CA-AT-RV: re-vendor LibKa0s v1.67.0 (Core 10, Options 28, OptionsIdList 3; kit 35 unchanged)

    Copies libs/LibKa0s/ and tests/_kit/ whole from the local tag v1.67.0 (tag 749c42e, commit
    0bccf4c) via git archive. Three files move a minor (Core 9 -> 10, Options 27 -> 28,
    OptionsIdList 2 -> 3); none is added or deleted. The kit stays at revision 35 and is
    byte-identical to v1.66.0's. Vendor parity: diff -r against the tag is empty for both payloads.

    - CLAUDE.md provenance line and docs/testing.md:170 roll to v1.67.0.
    - docs/test-cases.md regenerates byte-identical (856 cases); README badge stays 855/855.
    - Frozen bundle docs/revendor/2026-10-02-v1.67.0/ (01, 02, 05). Candidates assigned, not
      interviewed: the Options descriptor addonName goes to CA-AT-NM; the MakeResizable opts to none
      (no host grip here).

    No consumer test broke on the library change; no contract blocker. No host code calls
    MakeResizable or draws an O.IdList.

    Gates (ka0s-bounded):
    - lua tests/run.lua: 855 passed, 0 failed, 1 skipped, 856 total (before 855/0/1, 856)
    - luacheck .: 0 warnings / 0 errors in 68 files
    - bash tests/_kit/run-automated-tests.sh --suite complexity --no-bundle (sighted): pass,
      max CCN 14, 0 warnings, 2144 functions.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8

commit f921770d89eb230de601cff43cac173fb6849988
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 00:13:30 2026 +0530

    GI-FIN-02: record the 2026-10-02 smoke passes; doc sync

    LOOK-15, LOOK-17 and DIAG-26..39 passed in the owner's 2026-10-02 client run and leave Pending
    sign-off. module-map: tests/test_docs.lua is 310 lines.

    Gate: 855 pass / 0 fail / 1 skip; luacheck 0/0 in 68 files; vendor diff empty.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8

commit f921770d89eb230de601cff43cac173fb6849988
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 00:13:30 2026 +0530

    GI-FIN-02: record the 2026-10-02 smoke passes; doc sync

    LOOK-15, LOOK-17 and DIAG-26..39 passed in the owner's 2026-10-02 client run and leave Pending
    sign-off. module-map: tests/test_docs.lua is 310 lines.

    Gate: 855 pass / 0 fail / 1 skip; luacheck 0/0 in 68 files; vendor diff empty.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8

commit eccf7665b1ce71b628b75bbce1a5de36007ca129
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 14:23:46 2026 +0530

    GI-AT-02R: point the #20 citation at test_panelmirror and list it in scope.md

    cc72830 moved the AbsorbTracker#20 refresher case to tests/test_panelmirror.lua,
    but settings/UnitPanel.lua's comment still cited test_panelpages, and
    docs/scope.md's headless-suite list omitted test_panelmirror. Comment and doc
    only; suite 855 passed / 0 failed / 1 skipped before and after.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01Ng9STmzmM1JYwT2WWSakpL

commit e284e8f91edfd84339658d11cb404af987a3f438
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 14:23:06 2026 +0530

    GI-AT-RVR: DEPENDENCIES.md names the sighted complexity suite, not raw lizard

    The lizard section and the "Am I set up correctly?" block still called the
    raw `lizard -l lua -x ...` command the runner's `complexity` suite. Under kit
    revision 35 the suite is `bash tests/_kit/run-automated-tests.sh --suite
    complexity`, which runs `lizard -l lua -L 1500 ...` over the sighted shadow
    with function-count parity. Raw lizard is blind in Lua (WowAddonStandards#6),
    so it stays only as the tool install check. Docs only; suite 855/0/1 skipped.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01Ng9STmzmM1JYwT2WWSakpL

commit cc728302a364add8e354a8451c3c6d093041b04f
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 14:18:14 2026 +0530

    GI-AT-02R: peel the Appearance mirror half out to tests/test_panelmirror.lua

    tests/test_panelpages.lua grew from 894 lines on master to 1019 with the
    #20/#32 cases, entering the layout-§1 1000-1500 band, which this cycle's
    M1 addendum (A2) says gains no file. Its "chrome block registers a
    refresher" section moves verbatim and in order to the new
    tests/test_panelmirror.lua (10 cases: the refresher re-sync pair, the
    re-entrancy and failure-report cases, the two-tier refresher pair, the
    tab-click refresher, the Link group and the hidden-page rebuild, with
    mirrorHeaderState and scrollContent). barPanel, chromeWidget/chromeLabel
    and tabButtons are repeated there. The runner loads it straight after
    test_panelpages; the one case that followed the section
    (/at resetposition without the helpers) touches no page state, so it now
    runs before the moved cases.

    test_panelpages.lua: 1019 -> 676 lines (34 -> 24 cases);
    test_panelmirror.lua: 388 lines (10 cases).
    Suite totals identical: 855 passed, 0 failed, 1 skipped (856) before
    and after. luacheck 0/0 over 68 files (was 67); lizard no function
    above CCN 15.

    Docs moved with it: docs/test-cases.md regenerated, docs/module-map.md
    rows 44a/44b plus the suite list and the run.lua/test_widgets line
    counts, docs/common-tasks.md suite table, docs/settings-panel.md (two
    pins now in test_panelmirror), docs/testing.md (68 luacheck files),
    docs/ARCHITECTURE.md cap census.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01Ng9STmzmM1JYwT2WWSakpL

commit ef895a4c6b6b386b1b03c34f3cbd1899626d1691
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 14:17:57 2026 +0530

    GI-AT-02R: docs and the AT-15 comment name untabbedSkipRender, not the deleted partitionTabs

    docs/module-map.md row 26 and docs/schema.md (the counts note and the
    `mirror` row) still credited `partitionTabs` / `Helpers.__partitionTabs`
    with keeping the mirror row off the strip. Since the RenderTabbedSchema
    adoption it is OptionsTabs minor 8's `untabbedSkipRender` that keeps the
    all-skipRender Link group off the strip. The AT-15 case comment in
    tests/test_widgets.lua is reworded the same way; the case body is
    untouched. Suite totals unchanged: 855 passed, 0 failed, 1 skipped
    before and after.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01Ng9STmzmM1JYwT2WWSakpL

commit ff226dbd508fb8bbecf1ccf7f46f3904991d6a6b
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 14:17:32 2026 +0530

    GI-AT-RVR: ARCHITECTURE counts the thirty-two files LibKa0s v1.66.0 vendors

    docs/ARCHITECTURE.md:49 still said "twenty-eight files" after the v1.66.0
    re-vendor; `ls libs/LibKa0s/*.lua | wc -l` is 32. Doc only; suite totals
    unchanged (855 passed, 0 failed, 1 skipped).

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01Ng9STmzmM1JYwT2WWSakpL

commit ac2ff82e68ee2af590ac0d4c86169a95a481f493
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 14:07:52 2026 +0530

    GI-AT-02: the Appearance strip renders through RenderTabbedSchema with OptionsTabs minor 8 (#32)

    settings/UnitPanel.lua's renderUnitPanelBody hands the strip and the tab body to
    Helpers.RenderTabbedSchema with the three opt-in fields LibKa0s v1.66.0 added for this page:

    - untabbedSkipRender = true: the Link group (the mirror row alone, skipRender) is no tab.
    - disabledReplaces = true with disabledFor (the mirror state this render captured, the value the
      block refresher compares against) and disabledNotice: a mirrored unit's hint replaces its rows.
    - rerender = RenderUnitPanel: a tab click re-runs the whole page render, so the chrome block and
      the block refresher registered after the body survive it.

    The PageHeader chrome block stays before the call, the refresher registration after it, and the
    ctx.__rendering guard is unchanged. Deleted: partitionTabs, Helpers.__partitionTabs,
    renderMirroredHint and the Helpers.TabStrip composition; the doc block that explained why the
    library strip was not used now describes the opts.

    Each opt is load-bearing, checked by removing it: without rerender, "after a tab click the
    two-tier refresher is still registered" goes red; without untabbedSkipRender, four strip cases
    (both AT-15 cases among them) go red; without disabledReplaces, seven mirror cases go red.

    The two AT-15 characterization cases in tests/test_widgets.lua stay green with their bodies
    untouched (their header comment is rewritten). One existing case changes with the layout: "the
    mirrored hint is a laid-out row followed by a ROW_VSPACER" becomes "...a full-width line followed
    by a ROW_VSPACER": the hint is now the library's TextRow Label rather than a Label inside a
    RenderGrid Flow row, still followed by ROW_VSPACER, and nothing under it. disabledNoticeFont is not
    passed: the library's default, GameFontHighlightSmall, is AceGUI Label's own default font
    (libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua:136), so the hint's font does not change.

    Comments: settings/Appearance.lua (the mirror row), settings/OptionsSetup.lua (stub list note),
    tests/test_schema.lua, tests/test_panelpages.lua.
    Docs: docs/settings-panel.md (RenderUnitPanel section: the opts table replaces the TabStrip-direct
    paragraph), docs/module-map.md rows 21/26/44a/46 and the page-builder paragraph, plus the
    LibKa0s file list and load order the GI-AT-RV commit left at twenty-eight files,
    docs/ARCHITECTURE.md module-map row, docs/smoke-tests.md (LOOK-17 new, LOOK-15/17 and the
    v1.66.0 perf-run checks DIAG-26-39 in Pending sign-off), docs/test-cases.md regenerated.

    Gates (ka0s-bounded): lua tests/run.lua 855 passed, 0 failed, 1 skipped (856, totals unchanged
    from the characterization commit); luacheck . 0/0 in 67 files; sighted complexity pass, maxCcn 14,
    warnings 0, blindFiles 0, 2139 functions.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01Ng9STmzmM1JYwT2WWSakpL

commit c1d8492855d869c85b0faba03cbb056856b90f07
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 13:59:41 2026 +0530

    GI-AT-02: characterization cases for the Appearance strip before RenderTabbedSchema adoption

    Written first, green against today's host composition (partitionTabs + Helpers.TabStrip), so the
    adoption that follows has to keep them green:

    - "after a tab click the two-tier refresher is still registered": focus unmirrored, click tab 2,
      RestoreDefaults (which runs only the refreshers) re-mirrors the unit; the checkbox follows, the
      rows go and the hint replaces them. Red under RenderTabbedSchema's default tab click
      (ClearScroll + a rows-only redraw resets ctx.refreshers).
    - "the Link group never becomes a tab, mirrored or not": target and focus, both mirror states,
      the strip's keys are exactly Size,Bar,Background,Border,Text. Red under a partition that keeps
      the all-skipRender Link group.
    - tests/test_panelpages.lua's tabNames derives the expected strip from the schema itself instead
      of calling the page's own Helpers.__partitionTabs, which the adoption deletes.

    docs/test-cases.md regenerated; README badge 855/855.

    Gates (ka0s-bounded): lua tests/run.lua 855 passed, 0 failed, 1 skipped (856); luacheck . 0/0.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01Ng9STmzmM1JYwT2WWSakpL

commit 45cf8ccc68609693ccf1f098cb748072f8caa8c3
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 13:56:03 2026 +0530

    GI-AT-01: pin the hidden Appearance page's lazy rebuild (#20)

    AbsorbTracker#20 (review F-008) was delivered by 156077c (one Appearance page) and 5c03fb8 (the
    page adopts SetRenderer, whose refresh gate marks a hidden ctx dirty instead of running its
    refreshers). Nothing asserted the hidden half, so a refactor dropping SetRenderer would bring the
    off-screen rebuild back silently.

    - tests/test_panelpages.lua: "a hidden Appearance page is not rebuilt by a mirror flip; its next
      OnShow rebuilds it". No behaviour change, so it is green on arrival; checked that it bites by
      temporarily replacing the page's SetRenderer with a hand-wired OnShow: the case goes red
      ("expected 507, got 513" widgets), then restored.
    - settings/UnitPanel.lua refresher comment and docs/settings-panel.md (Appearance section): the
      refresher runs only while the page is shown (options-ui-§11, anti-pattern #39).
    - docs/module-map.md rows 21 and 44a, docs/test-cases.md regenerated, README badge 853/853.

    Gates (ka0s-bounded): lua tests/run.lua 853 passed, 0 failed, 1 skipped (854); luacheck . 0/0
    in 67 files.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01Ng9STmzmM1JYwT2WWSakpL

commit 79f83d6a552fc65135fa042e93598de0096de963
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 13:51:48 2026 +0530

    GI-AT-RV: re-vendor LibKa0s v1.66.0 (kit 35), wire test_lizard_sighted, sighted complexity recorded

    Copies libs/LibKa0s/ and tests/_kit/ whole from the local tag v1.66.0 (tag 178ee0b, commit
    e4c5ef7) via git archive. Six files move a minor (Widgets 12, DebugLog 19, Slash 19,
    OptionsWidgets 34, OptionsTabs 8, Perf 14), four are added (WidgetsReorder, SlashParse,
    PerfSampler, PerfCommands); kit 34 -> 35 (lizard_sighted.lua, test_lizard_sighted.lua). Nothing
    deleted. The TOC loads the library through LibKa0s.xml and tests/run.lua derives its list from
    the same XML, so no load-list row is needed. Vendor parity: diff -r against the tag is empty for
    both payloads.

    - tests/run.lua declares { name = "test_lizard_sighted", dir = "tests/_kit/" }.
    - CLAUDE.md provenance line and docs/testing.md:170 roll to v1.66.0. CLAUDE.md's green-gate line
      quotes no raw lizard; docs/testing.md's suite table now names the runner's complexity suite.
    - docs/performance.md, docs/scope.md, docs/module-map.md: thirty-two library files, the kit's
      fifth suite, revision 35 and its line counts.
    - docs/test-cases.md regenerated; README badge 844/844 -> 852/852.
    - Frozen bundles docs/revendor/2026-10-01-v1.66.0/ (01, 02, 03, 05; adoption candidates listed,
      not interviewed, per spec S4) and the span docs/revendor/2026-10-01-v1.64.0-v1.65.0/ for the
      two tags vendored without a bundle.

    No consumer test broke on a library change; no contract blocker.

    Gates (ka0s-bounded):
    - lua tests/run.lua: 852 passed, 0 failed, 1 skipped, 853 total (before 844/0/1, 845)
    - luacheck .: 0 warnings / 0 errors in 67 files
    - bash tests/_kit/run-automated-tests.sh --suite complexity --no-bundle (sighted): pass,
      maxCcn 14, warnings 0, blindFiles 0, 2134 functions. No newly revealed function above CCN 15.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01Ng9STmzmM1JYwT2WWSakpL

commit 0fb7c79521bed149803448aeafe27e6e4095c6c7
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 02:14:47 2026 +0530

    DG-AT-01S: sync-docs: docs/testing.md lint-gate row counts the 67 files luacheck checks

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit 0fb7c79521bed149803448aeafe27e6e4095c6c7
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 02:14:47 2026 +0530

    DG-AT-01S: sync-docs: docs/testing.md lint-gate row counts the 67 files luacheck checks

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit fb069bc78c249013f45d2333d8c60174b2e43684
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 01:27:29 2026 +0530

    DG-AT-01R: pin the Options combat lock's [Cfg] refusal line, re-point the stale render-gate comment

    tests/test_debugcoverage.lua gains a case that turns the combat lock on (InCombatLockdown mocked,
    the library's combat hook run as the edge that re-arms it), makes a Defaults click through
    NS.Helpers.RestoreDefaults, and asserts exactly one `[Cfg] defaults appearance refused (in combat)`
    line, no host copy of it, and nothing more from repeats in the same combat. Red under dropping
    `debug` from the Options descriptor (checked by mutation).

    The unit-panel case's red-under comment now names NS.DebugLog.DebugChanged keyed by
    RENDER_ERROR_KEY, not the deleted lastRenderError upvalue.

    docs/debug.md no longer claims every library line is pinned here: the register parked / flushed
    pair needs a first registration inside combat, which the shared harness cannot replay, and rests
    on the library's own suite. test-cases.md regenerated, badge 844/844, module-map and
    common-tasks rows updated.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit 23de7ee0793d4c09dd4eae2d44cbe75dd02afa4e
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 01:12:22 2026 +0530

    DG-AT-01: adopt the console's change gates and at-enable queue (refused events, unit panel render errors, launcher state lines)

    core/AbsorbTracker.lua's noteRejected drops its loggedRejected table for
    NS.DebugLog.DebugOnce("rejected:<event>", ...), and settings/UnitPanel.lua
    drops its lastRenderError upvalue for NS.DebugLog.DebugChanged; both keep
    their behaviour (once per name, once per distinct error, nothing
    remembered while logging is off) and are now re-armed by the console's
    Clear and by turning logging on, which the hand-rolled copies never were.
    The render gate compares the whole line, so the same error on a different
    page is a new line.

    core/LauncherSetup.lua passes debugAtEnable to the Launcher descriptor
    (Launcher minor 5) through NS.DebugLog.DebugAtEnable, so Register's state
    lines (a broker library absent, no minimap table, "registered"), written
    at OnInitialize with logging off, land once after [Init] the first time
    logging is turned on.

    Tests pin both gates re-arming on Clear and spending nothing with logging
    off, and the launcher's state line held, landing once after [Init], not
    again on a second enable, and written at once (and once) with logging
    already on. debug.md Coverage gains "Which lines are the library's" and
    names the Options [Cfg] and Launcher lines as the library's; smoke DIAG-51
    is new. The payload stamps roll to twenty-eight files with
    DebugLogGates.lua in the load order, and the module-map line counts
    follow. Inventory and badge 843/843.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit 7d43b9c5d7cad8a1aae4045c5df0431a7fcd7900
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 01:05:03 2026 +0530

    DG-AT-01: adopt the library's Slash refusal and Lifecycle edge lines (pass debug, drop the DisabledLine match and the host edge lines)

    settings/Slash.lua passes the gated sink as the Slash descriptor's debug
    (Slash minor 18), so every refusal the dispatcher decides is the library's
    one "[Cmd] refused <verb>: <guard>" line. The dispatchPrint wrapper that
    matched each printed line against DisabledLine() to log the gate's refusal
    is deleted with its dispatchVerb bookkeeping; the refusals of the host's
    own verbs (/at debug hold, /at toggle <unknown unit>) stay this file's.

    core/Lifecycle.lua passes debug to the Lifecycle descriptor (minor 3), so
    each edge is the library's "[Lifecycle] stood down: added <key> (holds:
    ...)" / "stood up: released <key> (holds: none)" line. StandDown and
    StandUp no longer name the edge or the holds: they keep one [Life] line
    each for what only they know ("teardown: pending repaint dropped=...",
    "rebuild from current state: N bus subscription(s) replayed").

    Tests pin the library lines landing in this addon's log, one line per
    refusal and per edge, the dispatched (aliased) verb, an unknown verb and
    get usage / not-found, silence with logging off, and no line for a hold
    that moves no edge; the profile already-current case now expects the
    library's one refusal line. debug.md Coverage names [Lifecycle] and the
    dispatcher's [Cmd] lines as the library's; smoke DIAG-49 and DIAG-50 are
    new and STATE-4 reads the new lines. Inventory and badge 838/838.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit 1469a8b107fdddb4cc3afd3a0fc2f4208c42f6ef
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 00:55:42 2026 +0530

    DG-AT-01: re-vendor LibKa0s v1.65.0 (Slash 18, DebugLog 18 + DebugLogGates 1, Options 27, Launcher 5, Lifecycle 3; kit 34)

    Both payloads copied whole from the local tag v1.65.0 (git archive of
    LibKa0s/ and testkit/); tests/_kit/ is byte-identical to revision 34 and
    held no addon-owned file. The CLAUDE.md provenance line rolls to v1.65.0 in
    the same commit, and docs/testing.md's "CLAUDE.md names" sentence with it.

    The DebugLog degradation stub in core/DebugLogSetup.lua gains DebugOnce,
    DebugChanged, DebugForget and DebugAtEnable (each answering false or
    nothing), which the by-name surface-parity case requires on the copy alone.

    The standards reference is unchanged: the TOC X-Standard, README badge and
    CLAUDE.md "Standards compliance" follow the standard's versionless
    templates, so v2.73.0 stamps nothing here. Adoption follows in its own
    commits.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit 7e1e3b0b312322eba0ab923262210b1f8553d806
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 21:25:29 2026 +0530

    DL-AT-04: README uses bullets, never numbered lists (standard v2.72.0)

    README.md's two numbered lists (the four setup steps under Usage and the How the bar works
    pipeline) become `- ` bullets, markers only: no item cites another by number, and the lead
    sentence and top-down reading carry the order. ## Reporting a bug is the v2.72.0 fixed body
    (three bullets, /at). tests/test_docs.lua pins the bulleted section text and gains a case that
    README.md carries no numbered list outside a fenced block; docs/test-cases.md regenerated and the
    Tests badge moves to 835/835. No live standards-version stamp to refresh.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit 7e1e3b0b312322eba0ab923262210b1f8553d806
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 21:25:29 2026 +0530

    DL-AT-04: README uses bullets, never numbered lists (standard v2.72.0)

    README.md's two numbered lists (the four setup steps under Usage and the How the bar works
    pipeline) become `- ` bullets, markers only: no item cites another by number, and the lead
    sentence and top-down reading carry the order. ## Reporting a bug is the v2.72.0 fixed body
    (three bullets, /at). tests/test_docs.lua pins the bulleted section text and gains a case that
    README.md carries no numbered list outside a fenced block; docs/test-cases.md regenerated and the
    Tests badge moves to 835/835. No live standards-version stamp to refresh.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit e89cb7db729bb125b888b3b7b40c61162e9d57a4
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 19:51:35 2026 +0530

    DL-AT-03R: module-map row 55a says a diagnostics run turns session logging on, and counts 330 lines

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit a0a84a95803bfb071133d41d17b4261671271614
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 19:44:38 2026 +0530

    DL-AT-03R: rename the diagnostics no-change case, and say a run turns logging on in common-tasks, scope and slash-dispatch

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit 39c86f93bf986ab2186c9f00ad6c38c18445c350
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 19:37:20 2026 +0530

    DL-AT-03: re-vendor the final LibKa0s v1.64.0 (DebugLog 17, DebugLogDiagnostics 2, kit 34); diagnostics turns logging on

    Both payloads copied whole from the moved local tag v1.64.0 (1cb69a7).
    DebugLog 15 -> 17 draws the orange Diagnostics link in the console's title
    bar, a small gap right of the Debug On/Off label, whose click runs
    D:RunDiagnostics(); DebugLogDiagnostics 1 -> 2 turns debug logging on for
    the session through SetEnabled(true) before the report writes, when it is
    off (debug-logging-14 at v2.71.0). This addon keeps that default: its
    descriptor does not set diagnosticsEnablesLogging = false. tests/_kit/ moves
    to revision 34: the contract's "leaves it off" case becomes "turns it on for
    the session", plus an already-on case and an opt-out case that is a declared
    skip here. tests/_kit held no addon-owned file. The CLAUDE.md provenance line
    stays v1.64.0, the same tag re-cut.

    The standards reference is unchanged: the TOC X-Standard, README badge and
    CLAUDE.md "Standards compliance" follow the standard's versionless canonical
    templates, so v2.71.0 stamps nothing here.

    tests/test_diagnostics.lua: "the report reads state and changes none of it"
    no longer holds the flag as it was; it starts from logging off and asserts
    the run leaves it on. docs/debug.md says the report (either form or the
    link) turns logging on for the session, and names the link.
    docs/smoke-tests.md: DIAG-21 rewritten (the report turns logging on, a
    /reload turns it off), new DIAG-48 (the orange link: look, hover, click,
    the gap across On/Off, the minimum width), DIAG-2/4/45 name the link; index
    and Pending sign-off updated. docs/module-map.md's kit row moves to
    revision 34 (10419 lines).

    Gate: 834 passed / 0 failed / 1 skipped (835 cases); README badge 834/834
    (a skip counts in neither figure, testing-5); docs/test-cases.md
    regenerated; luacheck 0/0 in 67 files; lizard 0 over CCN 15 on the touched
    test file.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit 7f4ed1eb9db65d0f93869a6d9e35817ab86ba0aa
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 16:42:04 2026 +0530

    DL-AT-02: debug coverage audit and fill (debug-logging-§8 diagnosis, §9 quiet steady state)

    Inventory of every event, state edge, deferral, refusal, caught error and
    repeating path against debug-logging v2.70.0 §8/§9, and the lines a
    support read of a pasted log was missing:

    - [Life] stand-down (holds, pending repaint dropped) and stand-up edges
    - [World] names the loading screen's kind (login, reload, zone change)
    - [Combat] entered says when it re-locked unlocked bars
    - [Absorb] readable/secret edge of the player read, one line per edge
    - [Bar] a /at debug hold held, expired or cleared early
    - [Cmd] refusals naming the guard: the disabled gate's refused verb
      (read off the gate's own line), /at debug hold, /at toggle <bad unit>
    - [Set] locked: unlock refused (in combat)
    - [Init] adds the stood-down holds and missing libraries when present
    - [Events] a refused name once per session; [Cfg] a unit panel render
      error once per distinct error; [Bus] list joined behind the gate

    Every repeating path (absorb/max-health events, repaint pass, swaps,
    visibility pass) was already quiet or change-gated; tests now hold it.
    New suite tests/test_debugcoverage.lua (14 cases); docs/debug.md gains
    the Coverage section; moved citations re-pointed; counts regenerated.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit 9cabbb57a775df4e30a0a8227a2a18d23260b542
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 16:08:37 2026 +0530

    DL-AT-01: re-vendor LibKa0s v1.64.0 (kit revision 33), resize smoke checks

    Both payloads copied whole from the local tag v1.64.0 (Core 9, DebugLog 15,
    Widgets 11, PerfPanel 6; kit revision 33 adds mock_resize.lua). tests/_kit held
    no addon-owned file. CLAUDE.md provenance and docs/testing.md's live-state
    sentence roll to v1.64.0; docs/module-map.md's kit row moves to revision 33
    (10353 lines, mock_resize.lua listed).

    The standards reference is unchanged: the TOC X-Standard, README badge and
    CLAUDE.md "Standards compliance" follow the standard's versionless canonical
    templates (documentation-6), so v2.70.0 stamps nothing here.

    No fallout: the Core stub parity case derives NS names from CoreSetup.lua
    rather than reading the live Core table, so MakeResizable owes no stub entry,
    and no host suite reads IsResizable/IsUserPlaced/GetResizeBounds.

    docs/smoke-tests.md gains a Resizing subsection under Diagnostics, DIAG-45 to
    DIAG-47 (console, Copy window, perf panel), indexed and listed under Pending
    sign-off; the theme's Code line names Core's MakeResizable.

    Gate: 819 passed / 0 failed / 0 skipped; luacheck 0/0 in 66 files; lizard 0
    over CCN 15.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit c111a2077fa486fb4b1d54927dd849b4fa6ba832
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 08:51:52 2026 +0530

    SP-FIN-01: re-vendor the test kit at revision 32 (LibKa0s v1.63.0, re-cut)

    LibKa0s folded kit revision 32 into the unpublished v1.63.0: tests/_kit/README.md now counts eleven
    consumers and thirteen copies, and Kit.VERSION is 32. Prose and the revision integer only; no code,
    case or mock changes. tests/_kit/ is byte-identical to the tag again (diff -r empty), so the
    vendor-sync case stays green. Its own revision-31 citations move to 32.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit c111a2077fa486fb4b1d54927dd849b4fa6ba832
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 08:51:52 2026 +0530

    SP-FIN-01: re-vendor the test kit at revision 32 (LibKa0s v1.63.0, re-cut)

    LibKa0s folded kit revision 32 into the unpublished v1.63.0: tests/_kit/README.md now counts eleven
    consumers and thirteen copies, and Kit.VERSION is 32. Prose and the revision integer only; no code,
    case or mock changes. tests/_kit/ is byte-identical to the tag again (diff -r empty), so the
    vendor-sync case stays green. Its own revision-31 citations move to 32.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit f11a3d78a8bd72d30746f10036b40a1988d04ddc
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 08:12:26 2026 +0530

    SP-FIN-01: say tests/prose_waivers.lua is optional and absent today

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit 144204ecb28e3e0c3c805117344c09249ca9ccc2
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 01:39:51 2026 +0530

    SP-FIN-01: sync docs (re-point two stale core/AbsorbTracker.lua line citations)

    - docs/ARCHITECTURE.md, events-frames-taint-§8 row: the two sites that
      read UnitGetTotalAbsorbs are core/AbsorbTracker.lua:233 and :313, not
      :225 (a comment) and :305 (the combat-entered debug line).
    - docs/slash-dispatch.md: the guarded NS.Slash:Register() call in
      OnInitialize is core/AbsorbTracker.lua:52, not :44 (a blank line).

    Everything else checked in sync: 819/819 badge and test-cases.md, the
    19-verb COMMANDS table against every doc count, the documentation map
    against docs/, module-map line counts, and the Slash.lua citations.

    Gate: 819/0/0, luacheck 0/0 in 66 files.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit 9931e6bf6d444cb6b65b4c6309a9ec2a13cf6acd
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 23:23:06 2026 +0530

    SP-AT-03R: match LOOK-1 and LOOK-5 to the Appearance labels in the code

    LOOK-1 and LOOK-5 now name the Background tab's dropdown "Background
    Texture", as settings/Appearance.lua:184 declares it. LOOK-1's Size tab
    now names "Bar Width (in px)" and "Bar Height (in px)" (Appearance.lua:130,
    :142) in place of the shortened Width and Height.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit f59026e13ed1d46053274f275593c905278f3627
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 23:08:26 2026 +0530

    SP-AT-03R: drop COMBAT-6's impossible in-combat Lock frame untick

    A settings page on screen in combat sits under the LibKa0s combat cover,
    which takes every click, so the Lock frame box cannot be unticked there.
    COMBAT-6 now checks the refusal through /at unlock only and points at the
    cover (COMBAT-4) and the launcher menu (LAUNCH-4); its Pending row records
    the correction.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit b2f9e6d33f56f06e663e74b5d12dc1f82692abad
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 22:54:36 2026 +0530

    SP-AT-03R: list the checks the 2026-09-24 remediation rewrote as pending

    Pending sign-off missed the old steps that the 2026-09-23 remediation
    rewrote on 2026-09-24. Their owed client sessions (AT.1, AT.2, AT.6,
    AT.7, AT.8, X2.3, X2.6) have no recorded result, so by the clarified
    S4 rule they are pending: SLASH-4, PROFILE-9, PROFILE-14, PROFILE-15,
    STATE-3, COMBAT-5, COMBAT-6, BAR-11, MIGRATE-2, LAUNCH-5, LAUNCH-7,
    DIAG-16, DIAG-17 and DEGRADED-1. DEGRADED-2's row now also names the
    unrun AT-09 stub-shape session.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit 36a63fec2a3ca207bf3afd6aa9a8e8096b289235
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 22:35:42 2026 +0530

    SP-AT-03R: check that an inactive pre-v3 profile's color and position are lifted and used

    MIGRATE-6's hand-made block now carries a flat barColor and position beside
    barWidth, and the check confirms after the switch that the bar sits at the
    saved anchor with the saved fill, restoring old K.66's position coverage.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit 2417eabd820e14b1b5ef9980c58ba61f91e8434c
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 22:22:42 2026 +0530

    SP-AT-03R: fix the combat code pointer, correct perf and migrate checks, widen Pending

    The Combat section's Code line put the combat re-lock in the `locked` row.
    The re-lock and its `Bars locked — combat started` line are
    addon:OnEnterCombat in core/AbsorbTracker.lua. Only the unlock refusal is
    the row's onChange in settings/General.lua.

    Re-checking every expected string against the code found these wrong:

    - DIAG-4, DIAG-35, DIAG-37, DIAG-43: the perf panel has six rows
      (PerfPanel.lua STEPS) and no JSON Dump row. `report` prints the summary
      and then the JSON line (Perf.lua SUBS.report). The JSON keys are sorted,
      so the line starts {"addon":"AbsorbTracker","buckets": and the nesting
      pair has no space after the colon.
    - DIAG-30: the report pads the label (`%-10s (not sampled)`).
    - MIGRATE-6: the v3 sweep runs in OnInitialize while debug logging is
      still off, so the `[Migrate] lifted N` line never reaches the console.
      The check now reads the inactive block in the SavedVariables file, and
      tests/test_database.lua already pins the count.
    - PANEL-8: the tooltip reads `Profiles -> Reset Profile`, not an arrow.
    - PANEL-7: `/at resetall` prints its line without the button's period.
    - PANEL-3: the row label is `Update throttle (in sec)`.
    - BAR-12: a bar's width floors at 50 px, so 40 px could not be set.

    Pending sign-off now follows the clarified S4 policy. It lists the old
    unrun checks, every check new with the `profile` verb (including PROFILE-5
    and PROFILE-13, which now switch through it, SLASH-3's new help row and
    DEGRADED-2's new stub step), and every check corrected against the code
    in this run. The new PROFILE checks stay listed: the review asked to drop
    them, but under the clarified policy a new check is pending.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit 189151700123617afcd30c4bcf4c8a79b56dca97
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 21:37:52 2026 +0530

    SP-AT-03R: correct DIAG-40's perf strings and list the unrun O/P/C checks as pending

    DIAG-40 carried old P.106's mistake: it expected `unlabeled` on the start
    line, the report header and the cancel line after an unlabeled start. The
    library always passes P.Start a `YYYY-MM-DD HH:MM` stamp (Perf.lua
    SUBS.start), so the start line and header show the timestamp, and the
    cancel line is `perf run CANCELED — nothing saved` with no label. A tester
    on a correct build would have recorded a failure. The check now quotes
    what the client prints and keeps the doubled-L rule without spelling the
    British forms, which the prose lint would flag.

    Pending sign-off also missed checks the 2026-09-07 cycle's checklist
    lists and that no later run records: old § O 103-104 (LOOK-5, LOOK-6),
    § P 105 and 106 (PANEL-4, DIAG-40; the same session 3 as the unrun
    § S 109) and § C 13a (COMBAT-4, rewritten for the v1.46.1 cover). The old
    doc never stamped O and P NOT YET RUN, which is the only reason they read
    as signed. Each row now names the old step it came from, per S4 and D4.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit c15abe6acfc86a58a4518546c09dc43a46bdaf9f
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 21:15:54 2026 +0530

    SP-AT-03R: restore lock-refuses-drag, fix perf strings and a code pointer

    The review of SP-AT-03 found the rewrite had dropped or garbled five things:

    - BAR-11 now checks that a locked bar (by /at lock or Lock frame) cannot be
      dragged by its body, the negative half of old D.14 and F.30 that the merge
      lost (Display.lua gates SetMovable/EnableMouse on `locked`).
    - LOOK-5 now opens the Background texture dropdown too, so old D.15's "every
      LSM dropdown has entries" is covered in full (Appearance.lua bgTexture row
      is an LSM30_Statusbar).
    - DIAG-28 no longer expects "next steps" after /at perf start; SUBS.start
      prints only the STARTED line and the context lines, as DIAG-37 says.
    - DIAG-34 quotes the real chat line `addon RESUMED — restored` (and the
      console's `events and frames restored`) instead of the stale
      `bars restored`.
    - The Appearance Code line names the color getters that exist
      (NS.GetBarColor/GetBgColor/GetBorderColor/GetFontColor, resolveBgColor)
      instead of a nonexistent resolveColor.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit 2a16960e3d728ac304c9cbbacdb167036cf6d043
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 21:00:20 2026 +0530

    SP-AT-03: rewrite the smoke suite as one evergreen, theme-grouped doc

    docs/smoke-tests.md had grown into 22 lettered sections, several of them
    release or session batches that re-walked what A-L already covered, with
    colliding step numbers (94/95 twice, U and V restarting at 1) and a stale
    "121 checks" count. Spec S4 asks for one deduplicated suite grouped by
    theme, with stable IDs, so every Ka0s addon's smoke doc reads the same way.

    The 168 old checks now live in 150 checks across 13 themes (INSTALL,
    SLASH, PANEL, PROFILE, STATE, COMBAT, BAR, LOOK, MIGRATE, LAUNCH, DIAG,
    DEGRADED, LOC). Duplicates were merged, and no check was dropped. Seven
    PROFILE checks are new, for the `profile <name>` verb SP-AT-02 shipped:
    list, already current, unknown name refused with nothing created, quotes
    and spaces, `use` for a profile named like a sub-verb, combat refusal, and
    the disabled path. The checks never run in a client (old Q, R, S, 86a and
    T, plus the new verb checks) are listed under Pending sign-off. The General
    layout now lists the Minimap button row, which the old step 14 had left out.

    Inbound references follow the new IDs: code and test comments, debug.md,
    settings-panel.md, and the ConsumableMaster / KickCD locale citations,
    which now point at LOC-1. The prose waiver only covered the two British
    perf-string spellings that old step 106 quoted, and the new DIAG-40 does
    not quote them, so tests/prose_waivers.lua and its module-map row are
    removed.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit 7508ff0f3a7e5dfec1d18ce53e168c05b0b845e9
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 12:57:45 2026 +0530

    SP-AT-02R: name every NS.L-routed string in the localization-§1 row

    The review of SP-AT-02 found that the Documented deviations register's
    localization-§1 row still listed the routed strings as only the drag
    handle's and the library-absent line, and said their keys were the only
    ones enUS.lua lists. SP-AT-02 routed the profile row's COMMANDS
    description, and the diagnostics report's two keys were already missing
    from the row. CLAUDE.md makes that register the single home that
    ratifies a deviation, so a row with the wrong scope misstates what was
    accepted (documentation-§5, localization-§3).

    The row now names all of them: the drag handle's strings (its three
    tooltips and the close mark's chat line as well as the unit labels), the
    library-absent line (both the Slash stub and the DebugLog stub print it),
    the diagnostics row's help text and DIAG_WRITTEN line, and the profile
    row's help text. The three older "nothing is wrapped" claims in
    ARCHITECTURE.md's file table, module-map.md's Locale section and
    scope.md now say the same thing. Each edit replaces one line with one
    line, so no file:line citation moves. The test count is unchanged (819).

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit dcbaebb8211b96d0560d016174cbbb4b45cdaccf
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 12:43:02 2026 +0530

    SP-AT-02: /at profile via CliProfile

    Route the existing /at profile tree through LibKa0s-Slash minor 17 so
    this addon answers `profile <name>` the way every Ka0s addon now does
    (owner decisions D1, D3; spec S3).

    - Bare /at profile prints the library's list (current marked, hint row)
      and then the sub-help. A first word matching a sub-verb, in any case,
      runs that sub-verb; anything else goes to CliProfile with the whole
      remainder, so case, inner spaces and one pair of quotes are kept.
    - `use <name>` goes to ProfileSwitch. It used to hand any name to
      AceDB's SetProfile, which creates a missing profile, so a typo became
      a profile. Unknown names are now refused with the list; the old
      "Unknown profile subcommand" line is gone.
    - The descriptor passes `profiles = function() return NS.db end`.
      `profile` was already on liveVerbs, so it answers while disabled.
    - The COMMANDS row keeps its place and takes the collection's
      description through NS.L (new enUS key); the sub-help gains a
      `<name>` row.

    Tests first: bare list then sub-help, switch of an existing profile
    with the handler's one [Profile] line, quotes/case/spaces, unknown name
    and `use` of one refused with nothing created, did-you-mean, already
    current, combat, live while disabled, the degraded stub, and `use`
    reaching a profile named like a sub-verb. Three older cases that relied
    on the silent create now make their profile first.

    Docs: slash-dispatch.md (verb row, sub-verb tree, liveVerbs row, and
    every shifted or stale Slash.lua citation), profiles.md, ARCHITECTURE
    (Slash Commands and the events-frames-taint-§8 row, re-measured 19 ->
    17 pre-formatted sites), module-map.md, README FAQ and badge,
    test-cases.md regenerated, smoke-tests.md citation re-pointed.

    Gate: 819/0/0 (was 810), luacheck 0/0 in 67 files.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

commit 7f49f77990617ab216a735e4315cc25c91fc4692
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 12:27:12 2026 +0530

    SP-AT-02: re-vendor LibKa0s v1.63.0

    Take LibKa0s v1.63.0 from the local tag (git archive, never a working
    tree) so the addon carries Slash minor 17, the shared profile verb
    (CliProfile, ProfileSwitch, ProfileNames). Slash.lua is the only file
    that moved; the test kit is unchanged at revision 31. The CLAUDE.md
    provenance line rolls with the payload, as the vendor-sync case needs.

    The by-name Slash parity case went red on the copy alone: the live
    instance now has CliProfile and ProfileSwitch and the library-absent
    stub had neither. Both join the stub on route (b), printing the
    library-absent line for /at profile and switching nothing, so the gate
    is green in this commit.

    The revendor bundle docs/revendor/2026-09-29-v1.63.0 records the delta
    and that only the Slash minor 17 profile surface is adopted, by the
    next SP-AT-02 commit. Shifted citations re-pointed (slash-dispatch.md
    Register, module-map.md line count, testing.md tag).

    Gate: 810/0/0, luacheck 0/0 in 67 files.

    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH

This mod has no additional files