promotional bannermobile promotional banner

Consumable Master (Retail)

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

1.8.0-release

File nameConsumableMaster-1.8.0-release.zip
Uploaded
Oct 9, 2026
Downloads
18
Size
6.8 MB
Flavors
Retail
File ID
9110178
Type
R
Release
Supported game versions
  • 12.1.0

What's new

tag 70bcde8f6f3239171d116d2230d19735aa8335b8 1.8.0-release
Author:    Tushar Saxena <tushar.saxena@gmail.com>
Date:    Fri Oct 9 19:26:44 2026 +0530

Release 1.8.0

commit 59fcc7aeb9dfc5f2d0bd9f1e94097cb0ad16a37c
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 9 19:23:10 2026 +0530

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

    Release gate (docs/automated-tests/20261009-191755/manifest.json, run with
    --release 1.8.0 on 944e16b, clean tree, verdict green):
    - Lint: pass, 0 warnings / 0 errors in 130 files
    - Tests: pass, 1215 passed, 0 failed, 1 skipped (declared not-applicable
      diagnostics-contract branch)
    - Perf: pass, 5 scenarios measured
    - Complexity: pass, max CCN 14, 0 functions above CCN 15, blindFiles 0
    - 27450 NLOC, 3222 functions, avg CCN 2.5; 7 files in the 1000-1500 band

    Files:
    - ConsumableMaster.toc: ## Version 1.7.0 -> 1.8.0
    - core/Namespace.lua: NS.VERSION 1.7.0 -> 1.8.0
    - docs/slash-dispatch.md: help-output example header v1.8.0
    - README.md: new 1.8.0 Version History row (/cm profile, macro icons
      after a mid-key reload, macros overwritten or deleted elsewhere,
      Devourer stat priority, bag discovery on a spec change)
    - docs/automated-tests/20261009-191755/: the release bundle and its
      ANALYSIS.md
    - docs/automated-tests/RESULTS.md: the release row; MacroBar.lua,
      test_schema.lua and test_selector.lua move to release acceptance 2 of 3,
      and test_settingsui.lua and wow_mock.lua newly crossed and are accepted
      (1 of 3)

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

commit 944e16b06c342acaa1daf4b71a8f9b4f45088bd8
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 9 17:49:26 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 3bc2f7926dd27865c56448e8358043aba8502507
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:51:34 2026 +0530

    CM-STD: standards reference to v2.77.0 and docs sync

    Standards reference, checked against WowAddonStandards v2.77.0 (feature
    branch feat/2026-10-07-review-audit-remediation):
    - Three places: TOC `## X-Standard`, the README Standard badge and
      CLAUDE.md "Standards compliance (read first)" already point at the
      standard and carry no version; toc-file-§1 and documentation-§1/§6 at
      v2.77.0 require none, so none is added.
    - Citation sweep over authored files (libs/, tests/_kit/ and the frozen
      docs/audits, docs/reviews, docs/automated-tests/<run>, docs/revendor,
      docs/perf-analysis/<run> and docs/superpowers plans excluded): every
      filename-§N resolves to an existing `### N.` heading at v2.77.0; no
      retired dotted global notation; anti-pattern numbers within #1-#92.
    - Retired location: docs/ARCHITECTURE.md cited "the v2.43.0 changelog
      entry in STANDARDS.md"; v2.77.0 moved the history to
      standards/CHANGELOG.md, so the sentence names the new home.
    - .gitattributes is byte-identical to line-endings-§5's client-bound
      body at v2.77.0 (WS-03 changed only the non-client variant here); no
      edit.
    - versioning-git (WS-08): CLAUDE.md states no branch convention; nothing
      to align. toc-file-§5 whole-listing annotations landed in CM-08.

    Docs sync for CM-01..CM-09: README [Tests] badge 1215/1215 equals the
    docs/test-cases.md Total and a fresh `--list` regenerates the file
    byte-for-byte; the macro-manager, data-flow, performance, macro-bar and
    module-map paragraphs were updated by their items and still match the
    code. One drift fixed: the complexity rows in docs/testing.md and
    docs/automated-tests/README.md still said kit revision 35 while CLAUDE.md
    (rolled by RV-CM) and the vendored kit are at revision 38.

    No version bump, no CHANGELOG entry, no automated-test bundle.

    Findings: none of its own (standards roll for v2.77.0).
    Deviations: the kit-revision row fix is a sync-docs drift outside the
    item's named paragraphs.

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

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

    CM-STD: standards reference to v2.77.0 and docs sync

    Standards reference, checked against WowAddonStandards v2.77.0 (feature
    branch feat/2026-10-07-review-audit-remediation):
    - Three places: TOC `## X-Standard`, the README Standard badge and
      CLAUDE.md "Standards compliance (read first)" already point at the
      standard and carry no version; toc-file-§1 and documentation-§1/§6 at
      v2.77.0 require none, so none is added.
    - Citation sweep over authored files (libs/, tests/_kit/ and the frozen
      docs/audits, docs/reviews, docs/automated-tests/<run>, docs/revendor,
      docs/perf-analysis/<run> and docs/superpowers plans excluded): every
      filename-§N resolves to an existing `### N.` heading at v2.77.0; no
      retired dotted global notation; anti-pattern numbers within #1-#92.
    - Retired location: docs/ARCHITECTURE.md cited "the v2.43.0 changelog
      entry in STANDARDS.md"; v2.77.0 moved the history to
      standards/CHANGELOG.md, so the sentence names the new home.
    - .gitattributes is byte-identical to line-endings-§5's client-bound
      body at v2.77.0 (WS-03 changed only the non-client variant here); no
      edit.
    - versioning-git (WS-08): CLAUDE.md states no branch convention; nothing
      to align. toc-file-§5 whole-listing annotations landed in CM-08.

    Docs sync for CM-01..CM-09: README [Tests] badge 1215/1215 equals the
    docs/test-cases.md Total and a fresh `--list` regenerates the file
    byte-for-byte; the macro-manager, data-flow, performance, macro-bar and
    module-map paragraphs were updated by their items and still match the
    code. One drift fixed: the complexity rows in docs/testing.md and
    docs/automated-tests/README.md still said kit revision 35 while CLAUDE.md
    (rolled by RV-CM) and the vendored kit are at revision 38.

    No version bump, no CHANGELOG entry, no automated-test bundle.

    Findings: none of its own (standards roll for v2.77.0).
    Deviations: the kit-revision row fix is a sync-docs drift outside the
    item's named paragraphs.

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

commit 025ad9de2d8f0e1cae5655b424bfc76a8b185d93
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:46:13 2026 +0530

    CM-09: Drop the dead bare-global GetAddOnMetadata rung

    Cluster C27 parity with LK-06, MM-07 and PM-09 (no finding of its own).
    KCM.Meta's library-absent ladder kept a bare GetAddOnMetadata rung below
    C_AddOns.GetAddOnMetadata that no admitted client (## Interface 120100,
    after the 11.0 AddOns purge) can reach. Meta now answers LibKa0s-Env
    first, then C_AddOns.GetAddOnMetadata, else nil; its doc comment names
    the two rungs. No Compat shim. .luacheckrc drops GetAddOnMetadata from
    read_globals (luacheck stays 0/0, so nothing else reads it bare).

    Test first: tests/test_envsetup.lua gains "Meta never reads the bare
    GetAddOnMetadata global" (degraded load, C_AddOns absent, a recording
    _G.GetAddOnMetadata spy planted; zero spy calls and a nil answer). It
    was red against the old rung (expected 0, got 1). The Version-fallback
    case's save/restore of _G.GetAddOnMetadata was the spy-case seed; it now
    removes only C_AddOns, the one reader any admitted client has (the mock
    never defined the bare global, so the case asserts exactly what it did).

    docs/test-cases.md regenerated (1214 -> 1215) and the README [Tests]
    badge moved to match. No docs/compat-layer.md exists and no other doc
    described the ladder, so step 3 had nothing further to edit.

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

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

    CM-08: Annotate load-bearing printer consumers and conventional seeds

    Comment-only (CM-A-03, CM-A-07).

    - ConsumableMaster.toc: the CoreSetup note now names core\SlashDump.lua
      and core\SlashCommands.lua as the file-scope consumers of KCM.Say
      (each takes `local say = KCM.Say` at load), so CoreSetup must precede
      both.
    - core/SlashDump.lua: the seam comment cites core/CoreSetup.lua, which
      builds KCM.Say, instead of core/Constants.lua.
    - ConsumableMaster.toc # Defaults: a CONVENTIONAL note under the
      defaults\Profile.lua block covers Categories.lua and the Defaults_*.lua
      seed files (toc-file-§5 as revised by WS-04). Confirmed by grep that no
      seed file reads KCM.Categories at file scope.

    Deviation: the item text says each file "reaches only KCM.ID and its own
    KCM.SEED slot"; Categories.lua reaches neither (it builds KCM.Categories
    from literals and reads KCM.PREFIX only inside a function), so the note
    says that for Categories.lua and keeps the KCM.ID/KCM.SEED wording for
    the seed files. TOC CRLF endings preserved (239 CR / 239 LF).

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

commit 8b493644697331e6d9868c89cb6018a041cd1389
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:39:00 2026 +0530

    CM-07: Cite handlers by name, resolvable ids, current commands in docs

    Documentation only.

    CM-A-02: docs/ARCHITECTURE.md's Event Subscriptions table cites each
    handler by name with no line suffix; the macroState writer list
    (commitMacro, M.InvalidateState, M.MarkAllStale, the store) and the
    KCM:OnInitialize / KCM.RegisterProfileCallbacks / KCM:OnRestrictionChanged
    citations name the function and file with no :line (documentation-§6
    symbol-for-present-tense). The one other line cite into those files, the
    macro-quota refusal (MacroManager.lua:355-357), now names doEdit.
    docs/perf-analysis/README.md names /dev-copilot:wow-perf-analysis.

    CM-A-04: the compat register row cites review F-010
    (docs/reviews/2026-08-05/) and F-005 (docs/reviews/2026-09-23/) in place
    of CM-R-10/CM-R-05 (both in Why and in What differs), and dates the audit
    ids CM-63 (2026-08-05) and CM-96 (2026-09-23), which resolve. The
    options-ui-§1 row says "route (b) of options-ui-§1" and its Decided cell
    cites commit 77254dd plus the bundle by full path
    (Ka0sAddonsCommonTasks@737ca8f:docs/2026-09-23-REVIEW_AND_STANDARDS_AUDIT_REMEDIATION/items.tsv).
    Reasoning cells unchanged.

    CM-A-05: docs/testing.md and docs/automated-tests/README.md complexity
    Command cells quote `bash tests/_kit/run-automated-tests.sh --suite
    complexity`; the raw lizard -L 1500 line moves to a note naming it as
    what the runner executes inside the sighted shadow.

    Deviations:
    - Decided cell of options-ui-§1 cites commit 77254dd and the bundle path
      rather than #39 (Schema adoption, not the route ruling) or a 2026-09-23
      audit/review id (none covers the ruling); the plan item ids are not
      repeated because the item's verify grep requires CM-18/WS-02 absent.
    - ARCHITECTURE.md's "(CM-R-01)" added by CM-01 resolved to an unrelated
      2026-09-07 finding; now cites review F-001 (docs/reviews/2026-10-07/).
    - docs/ARCHITECTURE.md was bare-LF on disk on arrival; rewritten CRLF per
      .gitattributes (the eol gate test was red).
    - docs/perf-analysis/20260909-015018/ANALYSIS.md still names
      /wow-addon:bump-interface; it is a frozen capture bundle and is left.

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

commit 52eebcbf245a5003bebca8429a07e08730db87f1
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:35:03 2026 +0530

    CM-06: address review — module-map flyout signatures carry scoreCache?

    docs/module-map.md still documented MacroBarFlyout.Apply(button, cfg) and
    Candidates(catKey, cfg) after 1824054 added the shared scoreCache third
    argument. Mark it optional (scoreCache?) in the API block and the module
    table, matching the Selector/Ranker notation.

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

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

    CM-06: Share one scoreCache across a bar refresh's flyouts

    An out-of-combat MacroBar.Refresh now builds one local
    `scoreCache = { fields = {} }` and threads it through
    MacroBarFlyout.Apply(btn, cfg, scoreCache) -> FO.Candidates(catKey, cfg,
    scoreCache) -> Selector.ListAvailable(catKey, nil, scoreCache), which
    passed nil before. A candidate listed by two slots (an HP_POT potion also
    sits in the HP_AIO composite's flyout) is scored once per refresh, not
    once per slot. The cache is a local of the one refresh and is never
    stored on a module, so a later bag or spec change is never served stale
    data. In combat the refresh builds no flyout and no cache. Callers that
    pass no cache keep Ranker.itemFields' uncached path.

    Tests (red first): tests/test_macrobar_flyout.lua spies on
    KCM.Compat.GetItemInfo calls made from modules/Ranker.lua (the itemFields
    seam) across one MB.Refresh; out of combat each candidate is filled once
    (red before the change: owned potions were filled twice), and an
    in-combat refresh fills nothing. docs/test-cases.md regenerated and the
    README [Tests] badge moved to 1214/1214.

    Scope note: the review's 226 KB figure is a mock artifact
    (tests/wow_mock.lua's C_TooltipInfo.GetItemByID returns nil, so
    TooltipCache refetches on every call). The claim is one scoring pass per
    candidate per refresh; no byte figure is quoted. Recorded in
    docs/performance.md, with the per-refresh cache documented in
    docs/macro-bar.md, docs/data-flow.md, the ARCHITECTURE.md score-cache
    invariant and the Ranker.itemFields comment.

    Finding: CM-R-03.

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

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

    CM-05: Delegate Selector.compositeRefs to MacroManager.CompositeConfig

    The composite config rule (per-ref enable set plus the in-combat and
    out-of-combat orderings, each falling back to the Categories metadata)
    was written twice, in MacroManager's compositeConfig and in Selector's
    compositeRefs, and the two copies already disagreed on a missing saved
    bucket (nil vs every component). compositeRefs was also the CCN-15
    function at the threshold.

    - modules/MacroManager.lua publishes the local as
      M.CompositeConfig(cat) -> enabled, orderIn, orderOut | nil; internal
      callers keep the local alias.
    - modules/Selector.lua compositeRefs calls KCM.MacroManager.CompositeConfig
      at call time (TOC loads Selector before MacroManager; runtime lookup,
      TOC not reordered) and walks the result with the unchanged
      `enabled[ref] ~= false` default-true rule, in-combat then
      out-of-combat. With no saved bucket it now returns {} (MacroManager's
      answer) instead of every component; unreachable under AceDB defaults.
      compositeRefs drops from CCN 15 to 4; the tree's max is now 14.
    - tests/test_selector.lua: characterization cases for the default
      orderings and for saved orderings plus a disabled ref (both green
      before the change), and the missing-bucket case (red before:
      CompositeConfig was nil).
    - docs/macro-manager.md lists CompositeConfig on the public surface;
      docs/ARCHITECTURE.md CreateMacro/EditMacro/quota line cites moved by
      the three added lines; docs/test-cases.md regenerated and the README
      Tests badge bumped to 1212/1212.

    Finding: CM-R-05.

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

commit 3a68d792b74e5925a46209eba33875163d4a4d2d
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:19:19 2026 +0530

    CM-04: address review — resolveAddByID cites parsePriorityID back

    The CM-04 commit said each parser cites the other by name, but only the
    slash door's comment named resolveAddByID. Add the reciprocal one-line
    citation at resolveAddByID's digit match, naming parsePriorityID in
    core/SlashCommands.lua. Comment only; no behaviour change.

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

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

    CM-04: Accept only positive item IDs or s:<spell ID> in /cm priority

    parsePriorityID (core/SlashCommands.lua) fell through to a bare
    tonumber(token), so add/remove/up/down filed 0, 1.5, 0x10, 1e3, nan, inf
    and a bare negative (a spell sentinel without the s: prefix) into the
    persisted added/blocked lists. It now accepts only ^%d+$ or ^[sS]:%d+$ with
    a value above zero and returns nil for everything else, so each caller's
    existing usage line prints. Same digit grammar as the panel's
    resolveAddByID (settings/CategoryAddByID.lua); kept separate because the
    panel also resolves links and names, and each cites the other by name.
    No stored data shape changes.

    Tests: two new tests/test_slash.lua cases (red under the old parser: "add 0"
    was filed). The existing "up on the top entry" case passed the raw negative
    sentinel of a spell entry; it now types s:<spellID>, the user-facing form.
    docs/test-cases.md regenerated; README [Tests] badge 1207 -> 1209.

    Finding: CM-R-06.
    Deviations: no shared KCM.ID helper (the panel's resolver takes links and
    names too, so a shared digits-only parser would not simplify it); one
    existing test updated for the removed bare-negative grammar.

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

commit d25e872d5d5e7e31e0744fce69ac0a5e7b4895c1
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:09:37 2026 +0530

    CM-03: Filter groupmates' respecs and discover bags on a spec change

    KCM:OnSpecChanged now takes (event, unit) and returns early for any unit
    other than "player" (a nil unit passes), before the trace line, the
    recompute and the SPEC_CHANGED message: PLAYER_SPECIALIZATION_CHANGED
    fires for group members too, and each one cost a recompute (CM-R-07).

    It then runs runAutoDiscovery("spec_changed") before requestRecompute.
    Discovery is filed per spec, so an unseeded bag consumable first seen
    under one spec was missing from the new spec's bucket until the next bag
    change (CM-R-04).

    Tests (red first): tests/test_events.lua pins party1 -> no recompute and
    no SPEC_CHANGED, player and nil -> one each; tests/test_pipeline.lua
    discovers an unseeded flask under 7_263, switches to 7_264 and asserts it
    is discovered and picked there after OnSpecChanged. docs/test-cases.md
    regenerated (1207) and the README [Tests] badge moved to 1207/1207.

    Docs: docs/data-flow.md and docs/ARCHITECTURE.md event rows name the
    player-only filter and the discovery pass.

    Deviation: the ARCHITECTURE.md Event Subscriptions table's line cites
    were already 10 lines stale before this change; every row's cite in
    that table was refreshed to the current handler lines, not only the
    OnSpecChanged row.

    Findings: CM-R-04, CM-R-07

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

commit 68d798a1c99d7d2646591e5d01e189bdead611b6
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:04:18 2026 +0530

    CM-02: seed Devourer stat priority and test seeds per playable spec

    Devourer Demon Hunter (12_1480) had no stat-priority seed, so it fell back
    to CLASS_PRIMARY_FALLBACK[12] = "AGI" with no secondaries and every Devourer
    without an override ranked FLASK / STAT_FOOD / CMBT_POT / WPN_ENCH for
    Agility. It now has its own row with primary INT. The class fallback in
    core/SpecHelper.lua stays as it is.

    The per-class test "stat priority covers all thirteen classes" stayed green
    with Devourer missing. It is replaced by "Defaults: stat priority seeds every
    playable spec", which iterates a pinned list of the 40 playable
    classID_specID keys (Initial specs excluded) and is red under removal of
    12_1480 (confirmed red on 12_1480 only before the seed landed). The existing
    round-trip test confirms 12_1480 parses through SpecHelper.MakeKey.
    docs/test-cases.md regenerated for the rename; the case and pass counts do
    not move, so the README [Tests] badge stays at 1205/1205.

    Findings: CM-R-02, CM-R-08.

    Deviation: the Devourer secondary order is unsourced. The archon.gg
    Mythic+ overview page named by the file header's refresh procedure returned
    HTTP 403 (a Cloudflare "Just a moment..." challenge) to both WebFetch and
    curl on 2026-10-07, so per the item the row ships secondary = {} with a
    comment saying why, rather than a guessed order. The header's slug list and
    spec count (39 -> 40) are updated to include devourer.

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

commit 38326c3eb715695c02fe37d0b327ab37a56b3218
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:00:19 2026 +0530

    CM-01: trust the macro fingerprint only while the live macro holds it

    KCM_* macros are account-wide but macroState is per profile, so
    alreadyApplied's fingerprint-only check returned "unchanged" for a macro
    another character's profile had overwritten, or the player had deleted,
    and the macro was never rewritten. That contradicted docs/scope.md and
    README.md's "each character rewrites on arrival".

    modules/MacroManager.lua gains liveBody(macroName) (GetMacroIndexByName,
    then GetMacroInfo's third return; unprotected reads, safe in combat).
    alreadyApplied takes the macro name and also requires the live body to
    equal the fingerprint. A missing or differing macro falls through to the
    existing path: queued in combat, else doEdit (which creates a missing
    macro) and the macroState store. The live icon is not compared (it is a
    texture, not the stored key). macroState's shape, InvalidateState and
    MarkAllStale are unchanged.

    Tests (red first, each with a red-under note): overwritten macro is
    rewritten; deleted macro is recreated; overwritten macro in combat is
    deferred and lands on flush; matching live body with a different live
    icon stays "unchanged" with no EditMacro. docs/test-cases.md regenerated
    and the README Tests badge bumped to 1205/1205. docs/macro-manager.md
    gains the fingerprint-is-a-cache paragraph and the pseudocode reads
    liveBody; docs/ARCHITECTURE.md's macroState section names liveBody as a
    read.

    Finding: CM-R-01.
    Deviations: a fourth test (the combat-deferral case) beyond the three
    the item lists; the wow_mock already modelled GetMacroIndexByName and
    GetMacroInfo, so tests/wow_mock.lua is untouched.

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

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

    RV-CM: re-vendor LibKa0s v1.71.0; record v1.69.0-v1.70.0 span (CM-A-01)

    Replace libs/LibKa0s/ and tests/_kit/ whole from the local LibKa0s tag
    v1.71.0 (cb274a4, via git archive): Env 2, Slash key 20.2, WidgetsLineChart 3,
    WidgetsAutocomplete 2, OptionsIdList 4, kit revision 37 -> 38 (adds
    secrets.lua). The CLAUDE.md provenance line rolls v1.70.0 -> v1.71.0 in the
    same commit, and the prose naming the kit revision this repo holds moves to
    38 (CLAUDE.md Gate paragraph, docs/testing.md layout-cap stamp, tests/run.lua
    kit-wiring comment).

    Kit 38 counts only running cases in the --list Total and puts the declared
    skip on a Skipped row: docs/test-cases.md regenerated (Total 1202 -> 1201),
    README [Tests] badge 1201/1202 -> 1201/1201, and docs/testing.md's badge
    paragraph rewritten to match testing-§5.

    docs/revendor/2026-10-07-v1.71.0/ records the delta (01_DELTA, 02_CANDIDATES
    with Kit.secret, ChartMath.ClipSegment and the widget fixes "not adopted in
    this run" per OWNER_SCOPE 5, 05_SUMMARY). docs/revendor/2026-10-07-v1.69.0-
    v1.70.0/ is the span bundle for the unrecorded re-vendors f8d2f3b and 74bcda1
    (finding CM-A-01).

    Deviations: the copy turned one host test red, a mechanical consequence of
    kit 38. tests/test_runner_list.lua asserted Total equals the sum of the suite
    headings (which still count a declared skip); it now asserts Total plus
    Skipped equals that sum and is renamed to say so. The docs/testing.md badge
    paragraph was rewritten because it described the revision-37 semantics.

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

commit 9b056f659b57e785b3b2cb59693c8bdef6ff7d71
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 16:51:53 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 74bcda1c09393215c61ebf9104b908721fb5b0f3
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 74bcda1c09393215c61ebf9104b908721fb5b0f3
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 f8d2f3b20120053b56432c815ed1d0c57d58700a
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Oct 6 14:52:56 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 c50b41b0093d6cb416e3dcdbe56cabc8b31b15ac
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Oct 4 15:13:13 2026 +0530

    DC-REV-01: re-vendor LibKa0s v1.68.1 (kit revision 36; no library minor moved)

    Both payloads copied whole from the pushed annotated tag v1.68.1 (9000cbd, tag object 9fb7956)
    via git archive. libs/LibKa0s/ is byte-identical to v1.68.0's: no LibStub minor moves, no file
    added or removed, no floor rises. tests/_kit/ moves to kit revision 36 (framework.lua,
    run-automated-tests.sh, test_eol.lua): the kit names /dev-copilot:* commands where it named
    /wow-addon:*. Nothing was removed upstream, so nothing was deleted. diff -r against the tag is
    empty for both payloads, with and without --strip-trailing-cr.

    The CLAUDE.md provenance line rolls to v1.68.1 in this commit. The prose naming the kit revision
    this repo holds moves 35 -> 36: docs/testing.md's layout-cap stamp and the tests/run.lua
    kit-wiring comment (whose stale v1.66.0 stamp now reads v1.68.1). Citations of revision 35 as
    the revision that introduced the sighted complexity suite stay. No contract blocker.

    Zero adoption candidates (rename-only release), so no interview. Frozen bundle:
    docs/revendor/2026-10-04-v1.68.1/ (01_DELTA, 02_CANDIDATES, 05_SUMMARY).

    Tests: 1201 passed / 1 skipped / 1202, unchanged (including vendor-sync).
    docs/test-cases.md regenerates identical; the README badge is unchanged.
    luacheck: 0 warnings / 0 errors in 130 files.

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

commit c50b41b0093d6cb416e3dcdbe56cabc8b31b15ac
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Oct 4 15:13:13 2026 +0530

    DC-REV-01: re-vendor LibKa0s v1.68.1 (kit revision 36; no library minor moved)

    Both payloads copied whole from the pushed annotated tag v1.68.1 (9000cbd, tag object 9fb7956)
    via git archive. libs/LibKa0s/ is byte-identical to v1.68.0's: no LibStub minor moves, no file
    added or removed, no floor rises. tests/_kit/ moves to kit revision 36 (framework.lua,
    run-automated-tests.sh, test_eol.lua): the kit names /dev-copilot:* commands where it named
    /wow-addon:*. Nothing was removed upstream, so nothing was deleted. diff -r against the tag is
    empty for both payloads, with and without --strip-trailing-cr.

    The CLAUDE.md provenance line rolls to v1.68.1 in this commit. The prose naming the kit revision
    this repo holds moves 35 -> 36: docs/testing.md's layout-cap stamp and the tests/run.lua
    kit-wiring comment (whose stale v1.66.0 stamp now reads v1.68.1). Citations of revision 35 as
    the revision that introduced the sighted complexity suite stay. No contract blocker.

    Zero adoption candidates (rename-only release), so no interview. Frozen bundle:
    docs/revendor/2026-10-04-v1.68.1/ (01_DELTA, 02_CANDIDATES, 05_SUMMARY).

    Tests: 1201 passed / 1 skipped / 1202, unchanged (including vendor-sync).
    docs/test-cases.md regenerates identical; the README badge is unchanged.
    luacheck: 0 warnings / 0 errors in 130 files.

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

commit e75e475ada1ce66cbad654a1d40f6ba4a1b0b713
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Oct 4 14:32:53 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 e75e475ada1ce66cbad654a1d40f6ba4a1b0b713
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Oct 4 14:32:53 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 4ddd3f3b5b3d5eb1487439fea65de37146bb0ab0
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Oct 4 14:21:34 2026 +0530

    DC-REN-01: CLAUDE.md and 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 5eba999a6800bc354c1327202799395721a89838
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sat Oct 3 12:47:52 2026 +0530

    SD-FIN-01: sync docs (DEPENDENCIES citations and find; drifted comment line refs)

    POSIX ls citations point at tests/_kit/inventory.lua and find is listed for the vendor gate; four .luacheckrc/test comment line citations corrected; schema-stub and debug-log test seams labeled.

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

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

    TP-CM-02: the macro bar's strip tooltips open beside the strip (tooltipPlace)

    The owner asked for one placement across every Ka0s addon, which reverses TP-CM-01's decline (B1).
    The strip, ? mark and X mark tooltips now open BESIDE the strip, by the same rule as KickCD's
    NS.Util.PlaceTooltipBeside, instead of ANCHOR_TOP / ANCHOR_TOPRIGHT off the hovered frame.

    - modules/MacroBar.lua: MB.PlaceTooltipBeside(tip, frame) is the DragHandle spec's tooltipPlace.
      It anchors TOPLEFT to the strip's TOPRIGHT, or TOPRIGHT to its TOPLEFT when the right edge plus
      the gap and the tooltip's width would leave the screen. A mark resolves to its parent strip. The
      comparison is in screen pixels (times effective scale). Every read is guarded (missing, nil,
      secret via KCM.Compat.IsSecret, non-number) and a failed read returns nil with nothing anchored,
      so the widget falls back to the cursor. It returns true only once placed. The `anchor` fields on
      tooltip, helpTooltip and closeTooltip are removed, so the hook alone decides where they sit.
    - tests/test_macrobar_chrome.lua: six placement cases mirroring KickCD's (right, flip left, ? and X
      resolve to the strip, screen pixels, secret, nil); the strip, ? and X hovers assert a
      UIParent/ANCHOR_NONE owner placed beside the strip; an unreadable strip falls back to the cursor.
    - Docs: macro-bar.md (where the tooltips sit), module-map.md, smoke-tests.md BAR-9/BAR-10,
      ARCHITECTURE.md line citations shifted by the new block, and an addendum to
      docs/revendor/2026-10-02-v1.68.0/03_DECISIONS.md recording the reversal.
    - docs/test-cases.md regenerated (1202 cases); README badge 1194/1195 -> 1201/1202.

    Gates (ka0s-bounded):
    - lua5.1 tests/run.lua: 1201 passed, 0 failed, 1 skipped, 1202 total (before 1194/0/1, 1195)
    - lua5.1 tests/perf.lua: runs clean
    - luacheck .: 0 warnings / 0 errors in 130 files
    - bash tests/_kit/run-automated-tests.sh --suite complexity --no-bundle (sighted): pass,
      0 warnings, max CCN 15, 3200 functions.

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

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

    TP-CM-02: the macro bar's strip tooltips open beside the strip (tooltipPlace)

    The owner asked for one placement across every Ka0s addon, which reverses TP-CM-01's decline (B1).
    The strip, ? mark and X mark tooltips now open BESIDE the strip, by the same rule as KickCD's
    NS.Util.PlaceTooltipBeside, instead of ANCHOR_TOP / ANCHOR_TOPRIGHT off the hovered frame.

    - modules/MacroBar.lua: MB.PlaceTooltipBeside(tip, frame) is the DragHandle spec's tooltipPlace.
      It anchors TOPLEFT to the strip's TOPRIGHT, or TOPRIGHT to its TOPLEFT when the right edge plus
      the gap and the tooltip's width would leave the screen. A mark resolves to its parent strip. The
      comparison is in screen pixels (times effective scale). Every read is guarded (missing, nil,
      secret via KCM.Compat.IsSecret, non-number) and a failed read returns nil with nothing anchored,
      so the widget falls back to the cursor. It returns true only once placed. The `anchor` fields on
      tooltip, helpTooltip and closeTooltip are removed, so the hook alone decides where they sit.
    - tests/test_macrobar_chrome.lua: six placement cases mirroring KickCD's (right, flip left, ? and X
      resolve to the strip, screen pixels, secret, nil); the strip, ? and X hovers assert a
      UIParent/ANCHOR_NONE owner placed beside the strip; an unreadable strip falls back to the cursor.
    - Docs: macro-bar.md (where the tooltips sit), module-map.md, smoke-tests.md BAR-9/BAR-10,
      ARCHITECTURE.md line citations shifted by the new block, and an addendum to
      docs/revendor/2026-10-02-v1.68.0/03_DECISIONS.md recording the reversal.
    - docs/test-cases.md regenerated (1202 cases); README badge 1194/1195 -> 1201/1202.

    Gates (ka0s-bounded):
    - lua5.1 tests/run.lua: 1201 passed, 0 failed, 1 skipped, 1202 total (before 1194/0/1, 1195)
    - lua5.1 tests/perf.lua: runs clean
    - luacheck .: 0 warnings / 0 errors in 130 files
    - bash tests/_kit/run-automated-tests.sh --suite complexity --no-bundle (sighted): pass,
      0 warnings, max CCN 15, 3200 functions.

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

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

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

    Both payloads copied whole from the local annotated tag v1.68.0 (cc9f5eb, tag object 6d83731)
    via git archive. libs/LibKa0s/ moves WidgetsDragHandle.lua alone (DRAG_MINOR 3 -> 4: the optional
    tooltipPlace spec field and descriptor place, Since 4). tests/_kit/ is byte-identical (kit
    revision 35). Nothing was added or removed upstream, so nothing was deleted. diff -r against the
    tag is empty for both payloads, with and without --strip-trailing-cr.

    The CLAUDE.md provenance line rolls to v1.68.0 in this commit, and docs/testing.md's layout-cap
    "vendored from" stamp rolls with it. No contract blocker: with no hook set, minor 4 makes minor 3's
    calls in minor 3's order.

    Adoption of tooltipPlace: declined, and no issue filed because this is not a gap. The macro bar's
    strip tooltip is not cursor-owned. The spec sets no tooltipOwner, so the strip owns it and anchors
    it ANCHOR_TOP (modules/MacroBar.lua:237). The owner's complaint (AuraMaster#22) was a tooltip stuck
    at the cursor because AuraMaster's restricted anchor cannot own one. Beside the strip is also the
    worse fit here. The strip is as wide as the bar (modules/MacroBar.lua:356), so a beside placement
    lands at the bar's far end, away from the centered label under the cursor. On a wide bar it can
    leave the screen on either side. A spec-wide hook would also pull the help and close marks'
    ANCHOR_TOPRIGHT tooltips away from their marks. Reasoning in the frozen bundle
    docs/revendor/2026-10-02-v1.68.0/ (01_DELTA, 02_CANDIDATES, 03_DECISIONS, 05_SUMMARY).

    Tests: 1194 passed / 1 skipped / 1195, unchanged (including vendor-sync).
    docs/test-cases.md regenerates identical and the README badge is unchanged.
    luacheck: 0 warnings / 0 errors in 130 files.
    Sighted complexity (--suite complexity): 3167 functions, max CCN 15, 0 warnings.

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

commit a83f01c67c33d7a8afcef69f5e0c5652545f6dec
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 10:24:41 2026 +0530

    CA-FIN-02: doc sync before merge

    ARCHITECTURE layout-cap band adds tests/test_settingsui.lua (1002) and re-dates to 2026-10-02; module-map names BAR_COMMANDS.

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

commit a83f01c67c33d7a8afcef69f5e0c5652545f6dec
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 10:24:41 2026 +0530

    CA-FIN-02: doc sync before merge

    ARCHITECTURE layout-cap band adds tests/test_settingsui.lua (1002) and re-dates to 2026-10-02; module-map names BAR_COMMANDS.

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

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

    CA-CM-01: adopt Slash.SplitVerb, FindCommand and CommandRows (#44)

    settings/Slash.lua publishes the sub-command vocabulary on both arms of the
    one Slash seam as KCM.SlashCommands.SplitVerb/FindCommand/CommandRows: the
    library's functions by identity live, and on the library-absent arm a
    minimal split, an exact lookup and plain "cmd  desc" rows with no color
    escape and no FormatRow copy. degradedDispatch uses the same stub pair.

    core/SlashCommands.lua drops lowerFirst and findCommand, reads the
    vocabulary through KCM.SlashCommands at call time (settings/ loads after
    core/), and the priority/stat/aio/bar sub-help loops become CommandRows,
    so the sub levels render through the formatter /cm help uses. Live rows
    change only in hex case. core/SlashDump.lua is left alone (D3.10).

    Tests: the sub-help row case is now exact, an identity case pins the
    three live members, the degraded sub-help pins the plain row shape, and
    SLASH_SEAM grows by the three names. Docs re-cited; smoke SLASH-16 and
    DEGRADED-8 added. Gate: 1194 passed, 0 failed, 1 skipped; luacheck 0/0;
    vendor parity clean; sighted complexity max CCN 15.

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

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

    CA-CM-01: characterize the sub-command help rows, verb split and lookup (#44)

    Five cases, green on today's tree, ahead of the Slash vocabulary adoption:
    the priority/stat/aio/bar sub-help rows share lib.FormatRow's shape (case-
    insensitively, until the adoption makes it exact), sub-verbs fold case and
    tolerate extra spaces, an unknown sub-verb names itself lowercased, and on
    the library-absent arm the sub-help and sub-dispatch still answer.

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

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

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

    settings/OptionsSetup.lua keeps its first vararg as addonName and hands it to
    optionsLib:New beside parentTitle/mainPanelName, the route an IdList help mark
    has to the library's shipped info art (OptionsIdList minor 3 takes it only for
    a loaded addon). Latent here: this addon draws no IdList. The degraded arm is
    unchanged.

    Tests: a source-pattern guard on the descriptor field and the vararg (red
    before the change), and an on-disk assert that the vendored
    libs/LibKa0s/media/icons/info.tga exists. 1188/1189 (1 skip), luacheck 0/0,
    vendor parity clean, sighted max CCN 15. Smoke check PANEL-32 added, pending.

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

commit 326aa2e557984349ecf7632357daf046e3f58593
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 01:41:48 2026 +0530

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

    Both payloads copied whole from the local tag v1.67.0 (0bccf4c; ../LibKa0s checked out at the
    tag's commit, tree clean). libs/LibKa0s/ moves Core.lua (Core 9 -> 10: MakeResizable canResize,
    onResizeStop, gripParent), Options.lua (27 -> 28, docblock) and OptionsIdList.lua (2 -> 3, the
    addonName loaded-addon guard). tests/_kit/ is byte-identical (kit revision 35). Nothing added or
    removed upstream, so nothing deleted; diff -r --strip-trailing-cr against the tag is empty for
    both. CRLF on disk, LF in the index, as the v1.66.0 re-vendor (e7dd55f).

    The CLAUDE.md provenance line rolls to v1.67.0 in this commit, and docs/testing.md's layout-cap
    "vendored from" stamp with it. No consumer test needed a fix: the only red case after the copy
    was the vendor-sync gate, which the provenance roll turns green.

    Frozen bundle docs/revendor/2026-10-02-v1.67.0/ (01_DELTA, 02_CANDIDATES, 05_SUMMARY): addonName
    is taken by CA-CM-NM; the resize-grip options have no consumer here (none).

    Tests: 1186 passed / 1 skipped / 1187 before and after; docs/test-cases.md regenerates
    byte-identical, README badge unchanged at 1186/1187.
    luacheck: 0 warnings / 0 errors in 130 files.
    Sighted complexity (--suite complexity): 3156 functions, maxCcn 15, warnings 0, blindFiles 0.

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

commit c91077129030d1c56a021852d255b7fe061338d9
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 00:10:59 2026 +0530

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

    docs/smoke-tests.md: SLASH-4, SLASH-15 and BAR-27 (the host-wording parse refusals,
    GI-CM-01) signed off as passed by the owner on 2026-10-02 and removed from Pending
    sign-off; BAR-26 keeps its own row.

    Doc sync: docs/ARCHITECTURE.md's Selector writer line numbers (shifted by GI-CM-02's
    mergePins split) and two settings/Slash.lua citations; docs/slash-dispatch.md names the
    three parse refusals among SLASH_STRINGS' overrides and how they reach chat (Slash minor
    19), and the degradedDispatch line number.

    Tests: 1186 passed / 0 failed / 1 skipped. luacheck: 0 warnings / 0 errors in 130 files.

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

commit c91077129030d1c56a021852d255b7fe061338d9
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 00:10:59 2026 +0530

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

    docs/smoke-tests.md: SLASH-4, SLASH-15 and BAR-27 (the host-wording parse refusals,
    GI-CM-01) signed off as passed by the owner on 2026-10-02 and removed from Pending
    sign-off; BAR-26 keeps its own row.

    Doc sync: docs/ARCHITECTURE.md's Selector writer line numbers (shifted by GI-CM-02's
    mergePins split) and two settings/Slash.lua citations; docs/slash-dispatch.md names the
    three parse refusals among SLASH_STRINGS' overrides and how they reach chat (Slash minor
    19), and the degradedDispatch line number.

    Tests: 1186 passed / 0 failed / 1 skipped. luacheck: 0 warnings / 0 errors in 130 files.

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

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

    GI-CM-02: mergePins and renderSlotList under CCN 15, behavior identical

    The sighted complexity suite (kit revision 35) lists both above 15 after the v1.66.0
    re-vendor; raw lizard had never measured them. Split along their own steps, no behavior change
    (the characterization cases in the previous commit, and every existing case, pass unchanged):

    - modules/Selector.lua mergePins 18 -> 5: activePins (filter + stable sort, 5), unpinned (4),
      fillSlots (the slot walk, 5) and appendLeftovers (3). The walk is the same: a pin takes its
      slot only when it heads the sorted pins, the walk stops when the unpinned items run out,
      then the leftover pins and the leftover unpinned items follow, in that order.
    - settings/MacroBar.lua renderSlotList 16 -> 8: newSlotList (the ReorderList options, 4) and
      slotListDebug (the [Bar] sink while logging is on, 4).

    docs/ARCHITECTURE.md's 1000-1500 band census: settings/MacroBar.lua 1170 -> 1182.

    Tests: 1186 passed / 1 skipped / 1187 before and after (no case added or renamed;
    docs/test-cases.md unchanged).
    luacheck: 0 warnings / 0 errors in 130 files.
    Sighted complexity: maxCcn 18 -> 8 in these files; repo warnings 2 -> 0, blindFiles 0,
    3156 functions.

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

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

    GI-CM-02: the slot-sequence probe's SetHeight names its widget, not a second self (luacheck W432)

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

commit 937240b444de4b5e21b61f773056b94a2a6178e2
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 14:05:55 2026 +0530

    GI-CM-02: characterization cases for mergePins and renderSlotList before their split

    The two functions the sighted complexity suite reports above CCN 15 after the v1.66.0
    re-vendor (mergePins modules/Selector.lua 18, renderSlotList settings/MacroBar.lua 16) get
    their current behavior pinned first, green against today's code:

    - tests/test_selector_pins.lua (new suite, 9 cases; test_selector.lua is already in the
      1000-1500 band): the exact merged list for no pins, inactive pins, one mid-list pin,
      out-of-order pins, a pin on the last slot, overshooting pins and their tie order, two pins on
      one slot (the loser goes to the end), a position no slot equals (0, 1.5, -1, which holds
      every later pin back too), and one item pinned at two slots (it appears twice).
    - tests/test_macrobar_buttons.lua (6 cases): the boundary rule between the groups only when
      both are non-empty, the ReorderList options (stride 32, boundary, segment handle icon and
      tooltip, onMove, no debug sink when logging is off, the controller remembered), the [Bar]
      sink when logging is on, no icon helper, no ReorderList, and no bar config.

    Mutation-checked: dropping the rule's "#on > 0", flipping the pin tie-break, and skipping the
    leftover-rest append each turn a case red.

    docs/test-cases.md regenerated, badge 1186/1187.
    Tests: 1171 passed / 1 skipped / 1172 before; 1186 / 1 / 1187 after.
    luacheck: 0 warnings / 0 errors.

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

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

    GI-CM-01: the three Slash L overrides reach chat now that Slash minor 19 hands parse its resolver

    settings/Slash.lua's descriptor parse (parseValue) takes the instance's resolver as its third
    argument and passes it on to slashLib.ParseValue, so ERR_BOOL, ERR_ALLOWED and ERR_COLOR in
    SLASH_STRINGS are read before lib.STRINGS. Their "DEAD" comment is replaced with one saying how
    they are reached. Closes ConsumableMaster#16 once merged (LibKa0s#40's consumer half).

    Tests first (red against the re-vendored tree with the two-argument parseValue: 4 failed):
    - tests/test_slashsetup.lua: the enum case matches the shipped wording case-sensitively
      ("Allowed values: HORIZONTAL, VERTICAL"); new cases for a bad boolean (host wording, no
      library "/yes/no" tail), an out-of-enum value (capitalized, never the lowercase library line),
      and a bad color (the host's ERR_COLOR is word for word the library's, so the case also routes
      ERR_COLOR through a wrapped Sl:Text and asserts the sentinel reaches chat).
    - tests/test_locale.lua: the three strings move from DEAD to LIB DESCRIPTOR, and the DEAD class,
      now empty, is retired.

    docs/smoke-tests.md: SLASH-4 and BAR-27 expect the host wording, new SLASH-15 for the three
    refusals, both listed under Pending sign-off. docs/test-cases.md regenerated, badge 1171/1172.

    Tests: 1168 passed / 1 skipped / 1169 before; 1171 / 1 / 1172 after.
    luacheck: 0 warnings / 0 errors in 129 files.

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

commit e7dd55fc0cad3b4ffb1f7584105243263b7e73cc
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 13:54:19 2026 +0530

    GI-CM-RV: re-vendor LibKa0s v1.66.0 (kit revision 35), wire test_lizard_sighted, record sighted complexity

    Both payloads copied whole from the local tag v1.66.0 (e4c5ef7): libs/LibKa0s/ gains
    WidgetsReorder.lua, SlashParse.lua, PerfSampler.lua and PerfCommands.lua; tests/_kit/ gains
    lizard_sighted.lua and test_lizard_sighted.lua. Nothing removed upstream, so nothing deleted.
    diff -r against the tag is empty for both. The CLAUDE.md provenance line rolls to v1.66.0 in this
    commit. The TOC loads LibKa0s.xml and the harness derives its load list from it, so the new files
    need no TOC row.

    Consumer fix (never libs/): tests/test_libka0s.lua's MAJORS inventory names SlashParse,
    PerfSampler and PerfCommands with their pairing fields; the stray-file case failed on the copy
    alone, reading them as files under a major they do not belong to.

    tests/run.lua wires { name = "test_lizard_sighted", dir = "tests/_kit/" }. CLAUDE.md,
    DEPENDENCIES.md, docs/testing.md and docs/automated-tests/README.md now name the sighted
    complexity suite instead of raw lizard. docs/test-cases.md regenerated, README badge 1168/1169.

    Frozen bundle docs/revendor/2026-10-01-v1.66.0/ (candidates listed, not interviewed; GI-LK-13
    takes the census), plus the span bundle docs/revendor/2026-10-01-v1.64.0-v1.65.0/ for the two
    tags carried by sweeps with no bundle.

    Tests: 1160 passed / 1 skipped / 1161 before; 1168 / 1 / 1169 after (8 new kit cases).
    luacheck: 0 warnings / 0 errors in 129 files.
    Sighted complexity (bash tests/_kit/run-automated-tests.sh --suite complexity): 3120 functions,
    maxCcn 18, warnings 2 (mergePins modules/Selector.lua 18, renderSlotList settings/MacroBar.lua
    16), blindFiles 0.

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

commit b63453ac9cc334d4a73e6b0fc256874e4bb887dc
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 01:51:57 2026 +0530

    DG-CM-01R: band census says settings/Panel.lua is 1196 lines, as measured after round 3

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

commit b63453ac9cc334d4a73e6b0fc256874e4bb887dc
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 01:51:57 2026 +0530

    DG-CM-01R: band census says settings/Panel.lua is 1196 lines, as measured after round 3

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

commit 129bbc50ed6dd2ccb978d8b8e0b3272f02dcb22e
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 01:44:07 2026 +0530

    DG-CM-01R: a page's Defaults in combat is the library's [Cfg] line alone; drop the unreachable host guard

    Every route to a page's Defaults (the footer OnDefault, the header button,
    RestoreDefaults) is refused first by LibKa0s-Options' combat lock, so the
    host branch in settings/Panel.lua never ran. Remove it (and its residue
    entry in test_locale), and drop "a page's Defaults" from the Cmd row of
    docs/debug.md.

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

commit b1ea5f74993f24cd24383eacc6ee11a72d66a34f
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 01:36:51 2026 +0530

    DG-CM-01R: the settings panel's in-combat refusal is the library's [Cfg] line alone

    O.Open no longer writes its own `[Cmd] settings panel refused: in combat`
    after OpenOptionsPanel has already logged `[Cfg] open refused (in combat)`
    through the descriptor's debug (debug-logging-§4). docs/debug.md's Cmd row
    drops the panel open from the host refusals; a test_librarylines case pins
    one library line and no host copy (red against the old shim).

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

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

    DG-CM-01: adopt the at-enable queue: the launcher's registration state lands when logging is first turned on

    core/LauncherSetup.lua passes debugAtEnable (Launcher minor 5) onto
    KCM.DebugAtEnable, so Register's four state lines, written at OnInitialize
    while the session-only flag is off, are held on the console's queue and
    written once, after [Init], the first time logging is turned on
    (debug-logging-§8). They were gated off and never landed before. This was the
    addon's only state line written at load: the [Init] summary already carries
    the missing-library and stand-down clauses on the enable edge.

    A case in tests/test_librarylines.lua pins the line landing after [Init],
    once, and not again on the next enable (checked red without the field).
    debug.md's Launcher row, the module map and smoke DIAG-41 follow. Inventory
    and badge regenerated (1159/1160).

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

commit 16a9422ef33819b6d6f5c74cd993585bafa841e8
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 01:24:38 2026 +0530

    DG-CM-01: adopt the console's change gates: DebugOnce and DebugChanged replace KCM.DebugQuiet's copies, onClear re-arms the one kept

    core/Debug.lua publishes KCM.DebugOnce / DebugChanged / DebugForget /
    DebugAtEnable over the console instance's gates (DebugLogGates.lua), false
    with no console. The four log-once sites (a recompute, a refused write, a
    failed flush, a caught settings error) move to DebugOnce and deleted
    KCM.DebugQuiet.First; the three change-gated lines whose text is their own
    summary (the combat queue's held line, the flyout cap, the priority paint)
    move to DebugChanged.

    KCM.DebugQuiet keeps Changed/Forget/Suffix for the three lines that carry
    "(after N unchanged pass(es))" ([Scan], no-write [Calc], the oversize line):
    the console's gate compares whole lines and keeps no count, and that suffix
    is owner-checked (DIAG-34). It is re-armed by the new onClear as well as on
    enable, so a Clear no longer leaves it silent (debug-logging-§9's SHOULD for
    a kept gate). The locale scanner reads the gate wrappers as debug sinks.

    Tests pin the Clear re-arm of all three gates, the off-state memory and the
    no-console answer; the gated-line cases load the console. debug.md, the
    module map and smoke DIAG-40 follow; the band census is re-measured.
    Inventory and badge regenerated (1158/1159).

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

commit 498b0e208af56e07f860dbe62aeefc9d13230639
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 01:15:18 2026 +0530

    DG-CM-01: adopt the library's own lines: Slash, Options and Lifecycle take the gated sink as debug

    The dispatcher (Slash minor 18), the options panel's combat lock (Options
    minor 27) and the stand-down latch (Lifecycle minor 3) now write their own
    refusals and edges into this log, through a call-time KCM.Debug forwarder
    on each descriptor (debug-logging-§4 at v2.73.0). The host lines they
    replace are gone: Lifecycle's [State] stood down / stood up edge lines (the
    held-teardown line stays the host's, after the library's edge, since the
    latch cannot know it), and the /cm set thunk's own "<path> refused" line.

    tests/test_librarylines.lua reads the real console buffer of a full load and
    pins each library line landing once, and no host copy beside it; each case
    was checked red with its descriptor's debug removed. docs/debug.md Coverage
    names the library's tags; smoke DIAG-37 to DIAG-39 cover a Slash refusal, a
    Lifecycle edge and a combat-lock refusal in the console. Inventory and badge
    regenerated (1155/1156).

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

commit 21cee6831ac2b211a115e492eedc49dc6dc2402d
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 00:56:41 2026 +0530

    DG-CM-01: re-vendor LibKa0s v1.65.0 (kit revision 34), DebugLogGates joins the DebugLog major

    Both payloads copied whole from the local v1.65.0 tag and the CLAUDE.md
    provenance line rolled with them. The new secondary file DebugLogGates.lua
    (change gates and the at-enable queue) is paired on the DebugLog shell in
    tests/test_libka0s.lua's major map, so the stray-file check reads it as
    DebugLog's own. The kit is unchanged at revision 34; the two "vendored from"
    stamps in docs/testing.md and tests/run.lua follow. 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 52c68e158b02577dbfeebbd6089e67b5cb83472a
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 21:49:55 2026 +0530

    DL-CM-FIN: sync docs (1000-1500 band re-measured after the debug coverage fill)

    settings/Panel.lua is now 1199 lines and the largest authored file, settings/MacroBar.lua 1170 and
    settings/Category.lua 1152; the layout-§1 census and the two filed peels (#42, #43) quote the new counts.

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

commit 52c68e158b02577dbfeebbd6089e67b5cb83472a
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 21:49:55 2026 +0530

    DL-CM-FIN: sync docs (1000-1500 band re-measured after the debug coverage fill)

    settings/Panel.lua is now 1199 lines and the largest authored file, settings/MacroBar.lua 1170 and
    settings/Category.lua 1152; the layout-§1 census and the two filed peels (#42, #43) quote the new counts.

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

commit ba1ecf72ed1012489c7f1eae0c48c7636df3c0e2
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 21:23:04 2026 +0530

    DL-CM-04: README uses bullets, never numbered lists (standard v2.72.0 documentation-§1)

    Usage's four setup steps, How picking & ranking works' four build steps and
    Reporting a bug's three steps become '- ' bullets; both four-step intros say
    'in this order' so the words carry the order the numbers did. Reporting a
    bug's closing sentence is now the v2.72.0 fixed text, with /cm.

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

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

    DL-CM-03: re-vendor the final LibKa0s v1.64.0 (kit revision 34), diagnostics turns logging on

    The report now turns debug logging on for the session before it writes
    (debug-logging-§14 at v2.71.0). The facade test pins the new behavior.
    docs/debug.md, slash-dispatch.md, testing.md and the run.lua comment follow.
    Smoke DIAG-14 is corrected in place, DIAG-36 covers the title-bar
    Diagnostics link, and the inventory and badge are regenerated (1147/1148,
    one declared skip: the opt-out case).

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

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

    DL-CM-02R: quiet the refused-write and oversize [Macro] lines, count failed writes apart in [Calc]

    A refused write (a full account macro quota) stores no fingerprint, so every
    pass retried it and logged `<name> failed — <err>`, and runMacroPass counted
    the "error" answer as a rewrite, which bypassed the no-write [Calc] gate. The
    failure line is now once per distinct (macro, error) through
    KCM.DebugQuiet.First, and the pass tallies it as `failed F` apart from
    `rewrote`, so a pass that wrote nothing stays change-gated.

    The oversize line (`<CAT> body exceeds 255 bytes: <body>`) ran before the
    unchanged early-out and so repeated on every pass while the oversized pick
    stayed picked. It is now change-gated per category on the body, and forgotten
    once the body fits.

    Two repeat-N quiet cases in tests/test_debugcoverage.lua (both red under the
    previous commit); docs/debug.md Coverage, test-cases.md, module-map.md and the
    README test badge follow.

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

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

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

    - Quiet steady state: [Scan] and no-write [Calc] passes on repeating reasons
      (bag_update_delayed, item_info_received), [Prio] paint and [Bar] flyout cap
      are change-gated through KCM.DebugQuiet; the gate resets on debug-enable.
    - Combat holds: the per-macro "deferred <macro> (combat)" line is gone; one
      [Macro] held N write(s) line per change of the queue, [Calc] counts held
      writes apart, and the regen line reads flushed=N held=M. The macro bar logs
      its held update on the edge and its flush.
    - State edges: [State] stood down / stood up naming the holds; a mid-fight
      stand-down's held bar teardown and its finish at regen.
    - Refusals and caught errors under [Cmd], naming the guard; every slash
      command traced once; recompute and flush failures once per distinct error.
    - [Init] names a stand-down and any missing optional library.
    - tests/test_debugcoverage.lua (14 cases); docs/debug.md Coverage section;
      smoke DIAG-34/35; moved citations re-pointed.

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

commit 5100d9bc4fd0eb86471e732860112dcdc2346ebd
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 16:01:47 2026 +0530

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

    Copies libs/LibKa0s/ and tests/_kit/ whole from the local v1.64.0 tag
    (Core 9, DebugLog 15, Widgets 11, PerfPanel 6; new tests/_kit/mock_resize.lua)
    and rolls the CLAUDE.md provenance line in the same commit. The kit-revision
    comment in tests/run.lua, docs/testing.md's layout-cap note and BAR-26's
    minor note follow the tag. The three standards references carry no version
    stamp, so v2.70.0 needs no edit there.

    docs/smoke-tests.md: DIAG-28 - DIAG-33 cover the resizable console, its copy
    window and the perf panel (grip, minimum, size kept on close/reopen, default
    after /reload, another addon's console independent), indexed and listed under
    Pending sign-off.

    No kit-33 fallout: 1130 passed, 0 failed; luacheck 0/0.

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

commit 7a67b8d7581af48c0145ce7b192a38b7bc7d574b
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 08:52:07 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 7a67b8d7581af48c0145ce7b192a38b7bc7d574b
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 08:52:07 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 eff8eb9d953b56a783012c287b43f076d4da0c79
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 01:39:11 2026 +0530

    SP-FIN-01: sync docs (profile verb in scope and CLAUDE.md, kit tag, 1000-line band)

    - docs/scope.md: the AceDB profile model now names /cm profile (lists, switches
      to an existing profile, never creates one).
    - CLAUDE.md: LibKa0s supplies the profile verb beside the dispatcher and CLI.
    - docs/testing.md: the layout-cap kit (revision 31) is vendored from LibKa0s
      v1.63.0, not v1.62.0; the kit is byte-identical across the two tags.
    - docs/ARCHITECTURE.md: tests/wow_mock.lua (1012) crossed into the 1000-1500
      band with the /cm profile fakes; band re-measured 2026-09-30.

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

commit 677eeda19d2b9c6b5e8d32ddcf54be27a9a3b0c7
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 23:45:37 2026 +0530

    SP-CM-03R: list INSTALL-1 under Pending sign-off

    INSTALL-1's fresh-install step was corrected to delete the real
    SavedVariables file, ConsumableMaster.lua (the TOC's ConsumableMasterDB
    and ConsumableMasterPerfDB both save there), in place of the old
    ConsumableMasterDB.lua path that never existed. No pass is recorded
    under the corrected step, so it joins the Pending table.

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

commit 2ef3be3682445156696cb5376896de3a7c4c2541
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 23:34:57 2026 +0530

    SP-CM-03R: drop PROFILE-9's impossible confirm and name PANEL-12's No button

    AceDBOptions' Reset Profile is a plain execute with no confirm, so the
    click resets at once. KCM_CONFIRM_RESET's buttons are Yes and No (with
    hideOnEscape), so there is no Cancel button to press.

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

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

    SP-CM-03R: add the owed Session CM and 2026-09-07 checks to Pending

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

commit 664e56d04fbfc7f0306ed2e3f861c30c868684d4
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 23:00:13 2026 +0530

    SP-CM-03R: correct the in-combat and degraded /cm config lines and the rewrite button label

    - COMBAT-6 and COMBAT-7 state both lines /cm config prints in combat: the
      library's gray refusal, then the config verb's "Settings panel
      unavailable." (settings/Slash.lua:167-171). Both are now pending.
    - DEGRADED-3: the panel notice prints once during the section's /reload
      (registerPanel at PLAYER_LOGIN, said once per session); every
      /cm config then prints only "Settings panel unavailable.".
    - PANEL-6, PANEL-10 and PANEL-19 use the button's real label, "Force
      rewrite macros" (settings/General.lua:397). PANEL-6 is pending.

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

commit 7306d5894691a0ebac596177fea977224db4e9b0
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 22:32:48 2026 +0530

    SP-CM-03R: close the smoke review defects and re-check strings against the code

    Review defects: COMBAT-6 checks the in-combat /cm config refusal while
    disabled again. The SavedVariables steps (INSTALL-4, INSTALL-5, PROFILE-2,
    PROFILE-5, BAR-30) edit and read the live file after a backup, not the
    copy the client never loads. BAR-16 and PROFILE-13 drop the clauses SLASH-7
    and LAUNCH-6 own. The Index routes the profile verb's COMMANDS row, its
    LIVE_VERBS entry, the profiles thunk and a Slash re-vendor to PROFILE-15 to
    PROFILE-21. PROFILE-14 sets up the disabled Default and ends with
    /cm enable. BAR-2, LAUNCH-8 and DIAG-12 get an action and an arrow.
    PRIO-28, PRIO-4 and BAR-12 get their dropped clauses back.

    Checked against the code: an open settings page is covered in combat
    (the Options combat lock), so COMBAT-8, PANEL-17, STATE-2, COMBAT-9 and
    COMBAT-13 no longer click the panel mid-fight. /cm resync in combat
    recomputes with a notice (PANEL-9). Fixed strings: the ERR_BOOL refusal
    (SLASH-4), "Unknown command: <verb>" (SLASH-14, DIAG-17), the Reset all
    tooltip's "->" (PANEL-11), per-category empty stubs (MACRO-4), the
    unpickable-spell add (PRIO-3), unquoted border values (BAR-27), /cm list
    group order (SLASH-3), and the degraded list/get/set and /cm config lines
    (DEGRADED-1, DEGRADED-3).

    Pending sign-off now follows the clarified policy: unrun and owed carried-
    over checks, plus every check new or corrected in this run.

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

commit 5eb35eaad41eee1259933ec8da24fbdc799a7c82
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 21:28:25 2026 +0530

    SP-CM-03R: PRIO-4 names a potion you carry for the add-by-name step

    Pressing x blocks the item, and the name lookup covers the tab's candidates
    less the blocked ones, plus the bags (settings/CategoryAddByID.lua). A
    blocked potion's name therefore resolves only if it is carried. The old
    §9 step 5 said so; the rewrite dropped it, so a tester picking an uncarried
    seeded potion would get "No item matches" and a false fail. Also say
    "An item removed with x is blocked", since the block is on the item.

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

commit ebe138ae51904a909b484a217506308842ee4df2
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 21:11:34 2026 +0530

    SP-CM-03R: Restore lost smoke checks and fix wrong expectations

    The review of SP-CM-03 found checks the rewrite lost and expectations
    that do not match the code. Pending sign-off now holds only carried-over
    owner checks (D4), so the new /cm profile rows leave it. BAR-26 keeps the
    OptionsCompose /dump as an evergreen payload check, since nothing headless
    can see which payload the live client loaded. BAR-19 gets Flyout button
    size and spacing back, PRIO-4 the blocked-name refusal, PRIO-5 the redraw
    and the subtext-spell add, and STATE-5 the silent checkbox tick. STATE-6
    now hovers the help mark while unlocked and expects /cm lock, because the
    handle is hidden while locked. DIAG-1 and PRIO-12 drive logging through
    /cm debug on, because the Debug console box only shows the window.

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

commit 7516a182fb9ce6096d66b04978b419969e92ebb6
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 20:58:36 2026 +0530

    SP-CM-03: Rewrite the smoke suite as one theme-grouped, evergreen doc

    The old docs/smoke-tests.md had grown to 816 lines of section-numbered
    steps, out of order, with two "### 7b" headings, about two dozen
    duplicated checks and batch-tied "Smoke, session N" sign-offs. It now
    reads as one deduplicated suite of 233 checks under stable
    <THEME>-<n> IDs (INSTALL, SLASH, PANEL, PROFILE, STATE, MACRO, DISC,
    PRIO, BAR, LAUNCH, COMBAT, DIAG, DEGRADED, LOC), with an index that
    replaces the targeted-by-change-area table.

    Every old in-client behavior survives once. The one drop is the seam
    pass's /dump of OptionsCompose's minor, whose expected value is stale
    and whose payload identity tests/test_vendor_sync.lua already asserts.
    Never-run owner checks move to Pending sign-off with their new IDs, and
    the PROFILE theme gains checks for the /cm profile verb. The
    non-English check is LOC-1.

    Inbound references into the old numbering (docs, defaults/README.md,
    two code comments, two test comments) now name the new IDs.

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

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

    SP-CM-02: /cm profile via CliProfile

    Owner decision D1 puts the profile verb's behavior in LibKa0s (Slash
    minor 17) and has each addon register its own row. ConsumableMaster had
    AceDB profiles and a Profiles page but no way to switch from chat, and a
    hand-rolled SetProfile would have created a profile on every typo.

    - COMMANDS gains `profile` after `set`, routed to Sl:CliProfile, with the
      collection's shared description through KCM.L. The descriptor passes
      profiles = KCM.db as a call-time thunk. The switch's side effects and
      its one [Profile] line stay with KCM.RegisterProfileCallbacks.
    - `profile` joins this addon's liveVerbs: switching into an enabled
      profile is a way back on, since the profile callbacks survive the
      disabled state and re-read the latch first.
    - Library-absent, CliProfile and ProfileSwitch take route (b) (the
      library-absent line, no switch). Both are published on
      KCM.SlashCommands on both arms and pinned by the four-argument Slash
      parity case, because the live instance has both. `profile` is in
      LIB_BACKED_VERBS, so the degraded notice does not claim it works.
    - The AceDB fake gains GetProfiles in AceDB-3.0's shape; without it every
      /cm profile would answer "not available".
    - Tests first: the new test_slash_profile suite (row position, help and
      About rows, list, switch plus the handler, unknown refused and not
      created, quotes, combat, already current), Disabled 7f, the live-set
      sweep, the degraded line and the fake's GetProfiles. 1118 -> 1130.
    - Docs: verb counts (twenty-three), the slash-dispatch table and live
      set, module-map, profiles.md's new chat section, the README profiles
      row, the badge and test-cases.md; re-pointed the settings/Slash.lua
      citations the edit moved (and .luacheckrc's stale :480).

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

commit 7068c84b2e83b0fe7b2e4defe076a560dcb17f81
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 12:25:12 2026 +0530

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

    Takes both payloads whole from the local v1.63.0 tag (never a working
    tree) and rolls the CLAUDE.md provenance line in the same commit, as
    tests/test_vendor_sync.lua requires. The only moved file is Slash.lua,
    minor 16 -> 17: the shared profile verb (CliProfile, ProfileSwitch,
    ProfileNames and the profiles descriptor field) this plan's next commit
    wires up. The kit is identical at both tags (revision 31).

    The gate is green on the copy alone: this addon's Slash parity case is
    the four-argument form over its own KCM.SlashCommands table, which the
    new instance members do not reach. The docs/revendor bundle records the
    delta and that only the Slash minor 17 profile surface is adopted, by
    this item.

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

commit ab767a4cd9042ae0af7f7c54c47ce918b194a390
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 08:47:39 2026 +0530

    Docs: finish the cut-off [Event] sentence in debug.md

    The Event tag entry ended mid-sentence ("a zone-in is"). It now says a
    zone-in is traced once logging is back on.

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

commit b1dae1a2fe389ea9f9dbba51f7658373572ca0a9
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 08:42:20 2026 +0530

    Docs: sync the restriction-lift rewrite into data-flow, macro-manager and module-map

    data-flow.md's event table gains ADDON_RESTRICTION_STATE_CHANGED; macro-manager.md
    lists MarkAllStale, shows the stale bypass in the commitMacro ladder and gets a
    section on why a lift owes every macro one write; module-map.md names MarkAllStale
    and counts ten KCM.EVENTS pairs, as does the smoke test's reload step. The
    ARCHITECTURE event-table line numbers from OnRestrictionChanged down move to
    match the state-0 fix.

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

commit b1dae1a2fe389ea9f9dbba51f7658373572ca0a9
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 08:42:20 2026 +0530

    Docs: sync the restriction-lift rewrite into data-flow, macro-manager and module-map

    data-flow.md's event table gains ADDON_RESTRICTION_STATE_CHANGED; macro-manager.md
    lists MarkAllStale, shows the stale bypass in the commitMacro ladder and gets a
    section on why a lift owes every macro one write; module-map.md names MarkAllStale
    and counts ten KCM.EVENTS pairs, as does the smoke test's reload step. The
    ARCHITECTURE event-table line numbers from OnRestrictionChanged down move to
    match the state-0 fix.

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

commit 6719600dd04029e783de885dacb79dc01ab9c6c9
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 08:34:19 2026 +0530

    Fire the restriction-lift rewrite on state 0, not a falsy flag

    ADDON_RESTRICTION_STATE_CHANGED passes Enum.AddOnRestrictionState, a number
    (0 inactive, 1 active, 2 activating), not a boolean. The handler tested
    `not active`, and 0 is truthy in Lua, so no lift ever triggered the rewrite:
    the owner's key log (2026-09-29) shows `type=2 active=0 rewrite=no` at the
    key's end. The lifted edge is now `state == 0` (a boolean false still counts,
    for the headless harness). The log also recorded the types: 0 combat,
    1 encounter, 2 and 5 the keystone.

    Tests now drive the real numbers, including the activating state 2; docs say
    active=<0|1|2>.

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

commit 13010efe56391f0d60352da79a12d7fe8d5d9979
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 01:05:50 2026 +0530

    Rewrite every macro when a restriction lifts; trace state-changing events

    After a /reload or relog mid-key the action bar drew every KCM macro's
    #showtooltip icon blank, and it stayed blank until the next /reload: each
    later pass found the body unchanged against its fingerprint and wrote
    nothing, and only a write makes the client re-resolve the icon.
    /cm rewritemacros fixed it; /cm resync did not.

    ADDON_RESTRICTION_STATE_CHANGED is now registered. A non-combat restriction
    lifting calls MacroManager.MarkAllStale, which owes every macro one write that
    bypasses the "unchanged" early-out, then requests a recompute. Unlike
    InvalidateState it keeps the fingerprints, so the macro bar keeps its picks
    while a combat-deferred write waits.

    Add an [Event] debug line to ADDON_RESTRICTION_STATE_CHANGED (type, active,
    rewrite), PLAYER_ENTERING_WORLD (login, reload), PLAYER_REGEN_ENABLED
    (flushed count, replacing the old n>0-only [Macro] line),
    PLAYER_SPECIALIZATION_CHANGED and weapon-slot PLAYER_EQUIPMENT_CHANGED, and a
    [Macro] line for every write that lands (name, created/edited, pick, icon).
    docs/debug.md, ARCHITECTURE's event table and a smoke-test section follow.

    Tests 1112 -> 1118; event count 9 -> 10 in the pinned tests.

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