Ka0s Multi Meters (Damage Meter) (Retail)

One grid damage meter, one row per group member, one column per stat — read from Blizzard's built-in damage meter
Back to Files

1.2.0-release

File nameMultiMeters-1.2.0-release.zip
Uploaded
Oct 9, 2026
Downloads
52
Size
7.0 MB
Flavors
Retail
File ID
9110168
Type
R
Release
Supported game versions
  • 12.1.0

What's new

tag 76a351bbec0009e12110849483c09a195852e9ce 1.2.0-release
Author:    Tushar Saxena <tushar.saxena@gmail.com>
Date:    Fri Oct 9 19:22:55 2026 +0530

Release 1.2.0

commit bee852f530867d59fe75d2cb8df72fb0778d0afa
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 9 19:22:55 2026 +0530

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

    Bumps MultiMeters 1.1.0 -> 1.2.0 through /dev-copilot:bump-version. The
    release battery ran first (bundle docs/automated-tests/20261009-191721/,
    measured b3c8b4f, clean tree) and every gate passed, read from its
    manifest.json:

    - Lint: pass, 0 warnings / 0 errors in 146 files
    - Tests: pass, 2196 passed, 0 failed, 1 skipped (kit contract case that
      does not apply to this addon), 2197 total
    - Perf: pass, 18 scenarios measured
    - Complexity: pass, lizard 1.24.0 ran
    - CCN <= 15: 0 warnings, max CCN 15
    - Sighted: blindFiles 0 (first sighted release run)

    Files:
    - MultiMeters.toc: ## Version 1.2.0
    - core/Namespace.lua: FALLBACK_VERSION 1.2.0
    - README.md: new 1.2.0 row at the top of Version History (2026-10-09),
      five bulleted highlights, de-AI pass applied; older rows untouched
    - docs/testing.md: the release-routing note records that 1.2.0 went
      through bump-version, with its release run
    - docs/automated-tests/20261009-191721/: the release bundle, with its
      ANALYSIS.md
    - docs/automated-tests/RESULTS.md: the release row; tests/test_roster.lua
      newly entered the 1000-1500 band (1014) and has its disposition, the
      other 22 dispositions carry forward

    Left alone: the CLAUDE.md LibKa0s provenance line (v1.71.0, the
    vendored library's tag), the Interface line, the auto-derived CurseForge
    badge, the old Version History rows, and 1.1.0 mentions in frozen audit
    and automated-test bundles. Tests re-run after the edits: 2196 passed,
    1 skipped, lint 0/0. docs/test-cases.md did not change. Since
    1.1.0-release: 69 commits.

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

commit b3c8b4f8a9241f697d59ca8febe81ffedc746b6b
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 9 18:53:25 2026 +0530

    SD-FIN-03: remove dead test seam Helpers.__windowsCtx

    Zero callers anywhere; no doc or surface pin named it.

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

commit c3dd0ecfa6446987de8e092a5672a3e410c71d73
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 9 17:49:39 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 5278b795e7b9701f9a6804ac474beae093e797b8
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 21:09:40 2026 +0530

    MM-STD: Confirm the v2.77.0 standards reference; sync docs to MM-01..10

    Release-side item for the 2026-10-07 remediation (no finding of its own).

    Standards reference, checked against WowAddonStandards v2.77.0 (feature
    branch feat/2026-10-07-review-audit-remediation, WS-11):
    - The three places already carry the versionless v2.77.0 form used by the
      other addons in this run: MultiMeters.toc `## X-Standard` (:12), the
      README Standard badge (:6) and CLAUDE.md "Standards compliance (read
      first)". toc-file-§1 and documentation-§1/§6 require no version, so
      none is added. No change.
    - Citation sweep over authored files (libs/, tests/_kit/ and the frozen
      audits/reviews/automated-tests runs/revendor/perf-analysis runs/
      superpowers excluded): 940 `filename-§N` citations, every one resolves
      to a `### N.` heading at v2.77.0 (the only miss is CLAUDE.md's literal
      `filename-§N` placeholder). Bare `§N` continuations after a filename
      cite (options-ui-§15/§16/§17, debug-logging-§8/§9/§10, ...) also
      resolve; other bare `§N` refer to this addon's own design spec. No
      anti-pattern number past #92, nothing cites a STANDARDS.md changelog
      (WS-01), no cross-repo bare line citation (WS-07), CLAUDE.md restates
      no branch rule (WS-08).
    - .gitattributes is byte-identical to line-endings-§5's client-bound body
      at v2.77.0 (WS-03); no edit.

    Docs sync against MM-01..MM-10 and RV-MM:
    - module-map.md: NS.Roster's export list gains LocalGUID (Aggregator and
      Aggregator_Identity call it), NS.DrillDown's gains OnRowClick (the
      right-click way out, called from Row.lua; MM-06 left it unlisted).
      Secrets.PlainTruth and Roster.BeginPass were already documented by
      MM-02/MM-03.
    - compat-layer.md: MM-07 removed the EnvSetup.lua header text naming
      Compat.GetAddOnMetadata, so the "its header names" sentence now states
      the two-rung ladder; the Compat.OpenDeathRecap probe cite moves
      DrillDown.lua:271 -> :264 after MM-06's deletions (typo fixed).
    - performance.md and perf-analysis/README.md bucket tables: call-site line
      cites re-pointed to the current Perf.Note lines (render Window.lua:1324
      and aggregate DrillDown.lua:719/:731 moved with MM-06; Aggregator.lua
      :1264 with MM-01..03; the meterEvent/spellEvent/systemEvent, Targets and
      perf-analysis README rows had drifted before this run and are fixed in
      the same pass).
    - data-flow.md (order-independent pet fold, PlainTruth), ARCHITECTURE.md
      (MM-10), DEPENDENCIES.md and testing.md (RV-MM, MM-09) checked, no
      drift. README Tests badge 2196/2196 equals the --list Total and
      docs/test-cases.md regenerates byte-for-byte.

    No version bump, no Version History row.

    Deviations: the perf-table cites that drifted before this run are
    corrected here too, since the same rows were being re-pointed.

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

commit 5278b795e7b9701f9a6804ac474beae093e797b8
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 21:09:40 2026 +0530

    MM-STD: Confirm the v2.77.0 standards reference; sync docs to MM-01..10

    Release-side item for the 2026-10-07 remediation (no finding of its own).

    Standards reference, checked against WowAddonStandards v2.77.0 (feature
    branch feat/2026-10-07-review-audit-remediation, WS-11):
    - The three places already carry the versionless v2.77.0 form used by the
      other addons in this run: MultiMeters.toc `## X-Standard` (:12), the
      README Standard badge (:6) and CLAUDE.md "Standards compliance (read
      first)". toc-file-§1 and documentation-§1/§6 require no version, so
      none is added. No change.
    - Citation sweep over authored files (libs/, tests/_kit/ and the frozen
      audits/reviews/automated-tests runs/revendor/perf-analysis runs/
      superpowers excluded): 940 `filename-§N` citations, every one resolves
      to a `### N.` heading at v2.77.0 (the only miss is CLAUDE.md's literal
      `filename-§N` placeholder). Bare `§N` continuations after a filename
      cite (options-ui-§15/§16/§17, debug-logging-§8/§9/§10, ...) also
      resolve; other bare `§N` refer to this addon's own design spec. No
      anti-pattern number past #92, nothing cites a STANDARDS.md changelog
      (WS-01), no cross-repo bare line citation (WS-07), CLAUDE.md restates
      no branch rule (WS-08).
    - .gitattributes is byte-identical to line-endings-§5's client-bound body
      at v2.77.0 (WS-03); no edit.

    Docs sync against MM-01..MM-10 and RV-MM:
    - module-map.md: NS.Roster's export list gains LocalGUID (Aggregator and
      Aggregator_Identity call it), NS.DrillDown's gains OnRowClick (the
      right-click way out, called from Row.lua; MM-06 left it unlisted).
      Secrets.PlainTruth and Roster.BeginPass were already documented by
      MM-02/MM-03.
    - compat-layer.md: MM-07 removed the EnvSetup.lua header text naming
      Compat.GetAddOnMetadata, so the "its header names" sentence now states
      the two-rung ladder; the Compat.OpenDeathRecap probe cite moves
      DrillDown.lua:271 -> :264 after MM-06's deletions (typo fixed).
    - performance.md and perf-analysis/README.md bucket tables: call-site line
      cites re-pointed to the current Perf.Note lines (render Window.lua:1324
      and aggregate DrillDown.lua:719/:731 moved with MM-06; Aggregator.lua
      :1264 with MM-01..03; the meterEvent/spellEvent/systemEvent, Targets and
      perf-analysis README rows had drifted before this run and are fixed in
      the same pass).
    - data-flow.md (order-independent pet fold, PlainTruth), ARCHITECTURE.md
      (MM-10), DEPENDENCIES.md and testing.md (RV-MM, MM-09) checked, no
      drift. README Tests badge 2196/2196 equals the --list Total and
      docs/test-cases.md regenerates byte-for-byte.

    No version bump, no Version History row.

    Deviations: the perf-table cites that drifted before this run are
    corrected here too, since the same rows were being re-pointed.

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

commit e379f5cd2106ed523422c2d040e6a1bcb6d0a6eb
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 21:03:36 2026 +0530

    MM-10: correct hub counts and comments, slim the hub, document copy by id

    Documentation and comments only; no behaviour change.

    MM-A-04: docs/ARCHITECTURE.md drops the stale "all fifty-eight" count from
    the Module map line (the inventory line the doc-structure gate reads keeps
    the count); "three library-stack-§8 declines" becomes "two" (the register
    carries two); the two "One row is ratified." lead-ins over retired rows are
    gone, each retired row now led by "Retired on <date>". settings/Slash.lua no
    longer cites a README command table that does not exist (points at
    docs/slash-dispatch.md) and the diagnostics comment says the run turns
    logging on for the report (D:RunDiagnostics). test_doc_structure was not
    widened to police spelled-out counts (declined).

    MM-A-09: the five retired-row paragraphs in Documented deviations become
    one-line bullets pointing at the frozen record (audits/revendor bundle) that
    holds their reasoning; the Documentation map preamble and the Conditional
    table's measurement prose are trimmed to the counts. No live register row or
    required section removed. 578 -> 531 lines.

    MM-A-03: core/LifecycleSetup.lua (architecture-4) -> (architecture-§4).

    MM-R-05: docs/slash-dispatch.md, the WINDOW_USAGE locale string and the
    comment above WINDOW_VERBS.copy say the copy source may be given as its
    window id (M.Resolve falls back to tonumber after a name match), which
    covers default names with spaces such as "Multi Meters #1". No parser
    change. The usage key became "copy <source/id> <target>" in the locale
    (a "|" would split the markdown table cells).

    Deviations: the hub lands at 531 lines, clearly under 578 but above the
    ~400 target; the remaining weight is live register rows and sections the
    item did not scope for trimming. The docs note that a default name's
    number is a window count, so it equals the id only until a window is
    deleted (core/Database.lua WindowName).

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

commit e5a0cb45febaa5e04c3d7345c35cf87e29b4ca39
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:58:48 2026 +0530

    MM-09: quote the sighted complexity suite and un-pin lizard

    The complexity check was quoted as raw (blind) lizard without -L 1500
    (anti-pattern #92) at DEPENDENCIES.md "Am I set up correctly?",
    docs/automated-tests/README.md's suite table and docs/performance.md
    section 4. All three now quote the kit's sighted suite:
    `bash tests/_kit/run-automated-tests.sh --suite complexity` (with
    --no-bundle in DEPENDENCIES.md's set-up check).

    DEPENDENCIES.md pinned lizard==1.24.0, which documentation-section 7
    rejects. The toolchain row now reads "any recent (verified with
    1.24.0)", the install line is `pipx install lizard`, and the pin
    rationale is replaced by the documentation-section 7 parity sentence:
    the sighted suite checks function-count parity on every run, so a
    reader change shows up as a blind file rather than needing a pin.
    No register row (the owner has not asked to keep the pin).

    The complexity suite ran green with the installed lizard 1.24.0
    (0 warnings, max CCN 15, parity holds). The set-up block's comment
    column was realigned to the longer command.

    Finding: MM-A-07 (audit MM-A-29).

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

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

    MM-08: tell 1.1.0 players the minimap CLI path is global.minimap.shown

    launcher-§3 (launcher.md:78) makes a release-note sentence a MUST when a
    CLI path is renamed. e979ef0 renamed the minimap row's CLI path before
    1.1.0, and the 1.1.0 Version History row never said so, so an old macro
    hit "Setting not found" with no notice. The 1.1.0 row now carries one
    player-voice bullet: `/mm set minimap.hide true` is now
    `/mm set global.minimap.shown true`.

    Value mapping verified from git at 1.0.1-release: the row was
    profile-root `minimap.hide` with invert = true (settings/Schema.lua:1168),
    and both the CLI (settings/Slash.lua:194) and the panel
    (settings/OptionsSetup.lua:139) wrote through NS.SetByPath, which applies
    toStored (settings/Schema_Paths.lua:191/496). So the 1.0.1 CLI already
    took the display ("shown") sense, and true maps to true, not to <not v>.

    Finding: MM-A-06. Departure from the raw finding: the old path players
    had was `minimap.hide`, not `global.minimap.hide`. The global.* form
    existed only between released versions. No version bump, no new row.

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

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

    MM-07: drop the dead bare-global GetAddOnMetadata rung from NS.Meta

    The LibKa0s-Env-absent branch of NS.Meta (core/EnvSetup.lua) kept an
    _G.GetAddOnMetadata rung below the C_AddOns rung. No client admitted by
    ## Interface 120100 can reach it, and the standard's compat dead-rung rule
    names this exact site as its worked case. NS.Meta is now Env, then
    C_AddOns.GetAddOnMetadata, then nil. No Compat shim was added.

    - tests/test_envsetup.lua: new red-first case "EnvSetup degraded: with no
      library and no C_AddOns, the bare global is no rung either". It loads with
      libFiles = {}, plants a bare GetAddOnMetadata spy and asserts zero calls
      (load-time read included), a nil NS.Meta and NS.version ==
      FALLBACK_VERSION. Before the deletion it failed with
      "assertNil (got 9.9.9)".
    - Comments that defended the pre-11.x rung now describe the two-rung
      ladder: core/EnvSetup.lua (header, degraded-install section, NS.Meta
      doc), tests/test_envsetup.lua:4, settings/Slash.lua:62-65,
      core/PerfSetup.lua:92-95 and tests/test_perfsetup.lua:110-112.
    - docs/test-cases.md regenerated; README Tests badge 2195 -> 2196.

    Finding: MM-A-05 (audit MM-A-27).

    Deviations:
    - The item says to replace the tests/test_envsetup.lua:146-160 case. RV-MM
      had already rewritten that case to pin the library-PRESENT contract
      (LibKa0s-Env-1.0 minor 2), and its own comment says the library-absent
      branch is not exercised there. Replacing it would have dropped that
      coverage, so it stays and the library-absent case is added next to it.
      The suite count goes up by one.
    - .luacheckrc never listed GetAddOnMetadata, so it needed no edit.
    - To make the item's verify grep print nothing, the EnvSetup.lua header
      comments that named the deleted Compat.GetAddOnMetadata shim were
      reworded as well.

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

commit 39aad30bb6a5b60a4d1906e1fc4baeb3ad569362
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:45:36 2026 +0530

    MM-06: remove the retired drill-down Back button machinery and tests

    Right-click on any row (modules/Row.lua) replaced the drill-down Back
    button, but modules/DrillDown.lua still carried the backButtons table,
    BACK_BUTTON_WIDTH/HEIGHT, the button lookups in Exit/ExitAll, and
    AcquireBackButton/ReleaseBackButton (test-only, no in-addon caller), and
    Window:Render called ReleaseBackButton on every pass.

    - DrillDown.lua: all of that is deleted. Exit/ExitAll keep every other
      effect (clear the view, debug line, DRILLDOWN_CHANGED announce). Header
      and click-routing comments now name right-click as the way out.
    - Window.lua: Render no longer calls into DrillDown for a button; the
      NO BACK BUTTON note stays as history.
    - tests/test_drilldown.lua: the three back-button cases are deleted.
    - docs/module-map.md drops both functions from the DrillDown exports.
    - docs/test-cases.md regenerated; README Tests badge 2198 -> 2195.

    Finding: MM-R-08.

    Deviations: none. docs/data-flow.md and docs/smoke-tests.md mention the
    Back button only as retired history and stay as they are.

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

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

    MM-05: address review — mock_menu.lua header names both callers

    The fake's header still said it was installed only by
    tests/test_launchersetup.lua; since c531c74 tests/test_disabled.lua's
    'Disabled 8b' installs it too. Comment-only.

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

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

    MM-05: drive the launcher right-click in conformance 'Disabled 8b'

    slash-commands-§7 step 8 needs both launcher buttons. 'Disabled 8' drove
    only the left click, so the right-click menu's "wrote nothing, showed
    no frame" clause was pinned nowhere (test_launchersetup.lua grays the
    entries but never reads __svWrites or shown frames).

    New sibling case 'Disabled 8b' in tests/test_disabled.lua: disables the
    addon, installs the addon-local tests/mock_menu.lua, right-clicks the LDB
    object and asserts the menu opened (and the panel did not), Enabled is
    clickable, Locked / Test mode / Show window are grayed and refuse a
    click, zero SavedVariables writes, zero frames shown, no chat line.
    Falsification comment per testing-§12; confirmed red in a scratch copy
    whose descriptor answered isEnabled = true ("Locked is not grayed while
    disabled"). No production code change: the behaviour is library-owned.

    docs/test-cases.md regenerated (2197 -> 2198) and the README Tests badge
    moved to match.

    Finding: MM-A-08.

    Deviation: the mock_menu loader is inlined in the case (the pattern
    test_launchersetup.lua's openMenu uses) rather than lifted into a
    shared helper, which the item allowed.

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

commit 55d864ee0cd9df016c193419ca166766651e15e2
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:35:34 2026 +0530

    MM-04: keep a case-only rename of a window's own name

    uniqueName(base) asked M.Resolve, which matches names case-insensitively,
    so the window being renamed counted as its own collision: renaming "Raid"
    to "raid" stored "raid 2". uniqueName now takes an optional selfId, and a
    Resolve hit whose cfg.id equals it is not a collision, for the base and
    for every "base N" probe. M:Rename passes cfg.id; Create and Duplicate
    pass nothing and behave as before.

    tests/test_windowmanager.lua gains "Rename to a different case of its own
    name keeps that name" (Raid -> raid stores "raid"; another window's name
    in a different case still gets " 2"), red under the old uniqueName.
    docs/test-cases.md regenerated and the README Tests badge rolled to 2197.
    docs/ARCHITECTURE.md and docs/slash-dispatch.md do not describe the
    uniquing rule, so they are unchanged.

    Resolves MM-R-04 (review F-004).

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

commit 0ca2446d210d93ce8aa5bd1e9a6f779e14f08fec
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:27:46 2026 +0530

    MM-03: rebuild a partial roster at most once per aggregate pass

    modules/Roster.lua's ensure() rebuilt the map whenever cache.partial was
    set, and Get / IsGroupMember / OwnerOf / LocalGUID all go through it, so a
    short roster paid a whole unit walk per lookup: several per source per
    column, four times a second while the group stayed short (MM-R-03).

    - New Roster.BeginPass() arms one retry (cache.retryArmed). ensure()
      rebuilds when there is no cached map, or when the map is partial AND the
      retry is armed; build() disarms. A complete map is never rebuilt by
      ensure(); Refresh / Forget / the roster messages are unchanged.
    - Aggregator.Build calls Roster.BeginPass() once, before newPass and any
      lookup, so the rest of the pass and every caller outside a pass
      (tooltip, drill-down) answers from the stored map.
    - The comments at the logBuild header (~:405), in build() and on ensure()
      (~:535) now say one retry per aggregate pass; the DebugSteady partial
      line gating is unchanged.
    - tests/test_roster.lua: two new cases count builds (UnitGUID("player")
      calls) across multi-column Aggregator.Build passes over a partial roster
      -- red before the fix at 30 builds for one 7-column pass; now 1 per pass,
      and a completed roster stops retrying. The two older retry cases now arm
      the pass with BeginPass, as the per-pass contract requires.
    - Optional item done: offline rosterPartial scenario in tests/perf.lua,
      with measured figures in docs/performance.md (20 unit reads per refresh
      vs rosterRebuild's 21; 3200 before the fix).
    - Regenerated docs/test-cases.md, README badge 2194 -> 2196, and
      docs/module-map.md's Roster exports.

    Deviation: the new cases live in tests/test_roster.lua, not
    test_aggregator.lua (which is at 1437 lines, near the 1500 cap).

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

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

    MM-02: export Secrets.PlainTruth and route every boolean probe through it

    core/Secrets.lua is the only file that inspects a value, but the "is this
    possibly-secret flag plainly true?" question was answered by two drifted
    file-local plainTruth copies (modules/Aggregator.lua, modules/Tooltip.lua),
    and modules/Provider.lua's diagnostics compared isLocalPlayer unguarded.

    - core/Secrets.lua exports Secrets.PlainTruth(v): false unless CanAccess(v),
      else (v and true or false); the rationale doc comment moved with it.
    - Aggregator.lua and Tooltip.lua lose their copies; the seam re-exports
      (Aggregator._identity.plainTruth, TooltipInternals.plainTruth) are gone and
      Aggregator_Identity, Tooltip_Builders and Tooltip_Lines call
      Secrets.PlainTruth directly (the Tooltip siblings resolve NS.Secrets at call
      time, keeping their existing absent-Secrets tolerance). Tooltip.lua's
      orphaned plainTruth doc block is replaced by a pointer.
    - MM-R-07: Provider.lua's ProbeSourceLookup and gatherSamples truth-test
      isLocalPlayer through Secrets.PlainTruth; noteValue gates on IsSecret alone,
      dropping the type(value)=="boolean" short-circuit that let a secret boolean
      (whose client-side type() is "boolean") reach tostring and table keying.
    - tests/test_secrets.lua: PlainTruth over plain values, an inaccessible
      secret, a source scan for stray plainTruth definitions, and a Provider
      diagnostics case with a secret isLocalPlayer (type() shimmed the client's
      way) asserting no raise, PlainTruth asked, and no secret census key.
      Each carries a red-under note and was confirmed red first.
    - docs/data-flow.md, docs/module-map.md name Secrets.PlainTruth;
      docs/test-cases.md regenerated; README Tests badge 2194/2194.

    Findings: MM-R-06, MM-R-07.

    Deviations: the item's line cites had drifted (Aggregator's copy was at
    :480, Provider's probes at :551/:649/:676). core/Diagnostics_Identity.lua
    :159/:208 do not carry the pattern (they only call the probes); the same
    boolean-short-circuit-then-`== true` pattern was found in
    core/Diagnostics_DeathRecap.lua's fillRecapSlot and fixed alike (IsSecret
    first, then PlainTruth; a secret flag fills no slot), with a red-first case
    in tests/test_diagnostics_deathrecap.lua.

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

commit cc7dd88e6dcefc6230468a785f597b2509508294
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:01:57 2026 +0530

    MM-01: sum a pet that precedes its owner in a column into the owner

    With Merge pets on, foldPet's absent-cell branch adopted the pet's
    figures into the owner's cell, and when the owner's own source arrived
    later in the same column setCell replaced that cell outright, so the
    pet's numbers were lost whenever the pet out-ranked its owner (wrong
    total, rate, percent and /mm export).

    - foldPet marks the cell it creates as pet-seeded.
    - New mergeOwnIntoPetSeeded: the own-source write into a pet-seeded cell
      lands the owner's figures through setCell (so maxAmount, deathRecapID,
      deathTime and the row.deathRecapID promotion are the owner's, and the
      mark is cleared), then adds the pet's total and rate back under exactly
      foldPet's guards (Secrets.CanCompare2 + both type()=="number"). A
      refusal leaves the owner's own figures and is counted in pass.unfolded,
      the same per-pass tally foldPet's refusals use.
    - placeSource routes an own, non-counted source onto a pet-seeded cell to
      the helper; counted (Deaths) and owner-before-pet paths are unchanged.
      placeSource is CCN 15 (at the cap), mergeOwnIntoPetSeeded 6.
    - tests/test_aggregator.lua: two new cases next to the order-only case
      (left unchanged): PET 400 -> BETA 200 -> ALPHA 100 sums to 500 with
      rate 50; and a secret owner total after its pet shows the owner's own
      figure with unfolded=1.
    - docs/data-flow.md states the order-independence; docs/test-cases.md
      regenerated; README Tests badge 2189/2189.

    Red-first evidence: before the Aggregator change the new cases failed
    with "expected 500, got 100" and "unfolded=0" respectively.

    Findings: MM-R-01, MM-R-02.

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

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

    RV-MM: re-vendor LibKa0s v1.71.0; record the v1.69.0-v1.70.0 span

    Copy libs/LibKa0s/ and tests/_kit/ whole from the local LibKa0s tag
    v1.71.0 (git archive, not a branch tip); both are byte-identical to the
    tag's LibKa0s/ and testkit/. Minors: WidgetsLineChart 3,
    WidgetsAutocomplete 2, Slash 20 / SlashParse 2, Env 2, OptionsIdList 4;
    kit revision 38 (inventory Totals count only cases that run, Kit.secret
    in the new secrets.lua). The CLAUDE.md provenance line rolls to v1.71.0.

    MM-A-01: new span bundle docs/revendor/2026-10-07-v1.69.0-v1.70.0/
    (01_DELTA.md, 05_SUMMARY.md only) records the bare re-vendor commits
    824999b (v1.69.0, kit 37) and 1ee53cf (v1.70.0), base v1.68.1.
    New docs/revendor/2026-10-07-v1.71.0/ bundle (base v1.70.0 from the
    provenance line) with the per-file deltas, consumption, contract changes
    and a "Not adopted in this run" list; no interview, no issue filed.

    MM-A-02: the stale tag/kit stamps are removed rather than bumped:
    docs/settings-panel.md points at the CLAUDE.md provenance line;
    docs/testing.md and DEPENDENCIES.md drop "kit 36" (the lizard pin is
    left for MM-09).

    Env 2 dropped the library's bare-global GetAddOnMetadata rung, which
    turned tests/test_envsetup.lua's "the deprecated bare global is still a
    live rung" red. It is replaced by a case pinning the v1.71.0 contract:
    with the library loaded and no C_AddOns, a planted bare-global reader is
    never called, NS.Meta is nil and NS.version is FALLBACK_VERSION (red
    against the v1.70.0 payload, green now). The host's own library-absent
    rung stays for MM-07.

    docs/test-cases.md regenerated with kit 38: Total 2188 -> 2187 plus a
    "Skipped | 1" row, now equal to the README badge (2187/2187, unchanged).

    Gate: lua tests/run.lua 2187 passed, 0 failed, 1 skipped; luacheck 0/0
    in 146 files; sighted complexity pass, max CCN 15; no authored .lua
    file over 1500 lines.

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

commit 349e319ed5e286382368ae29d2bb6b32e5a87b42
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 16:51:58 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 1ee53cf426bd40d9240b2a653b0a746efc9057c8
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 11:38:42 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 1ee53cf426bd40d9240b2a653b0a746efc9057c8
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 11:38:42 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 824999bd676901966bc5f9140414c0d8bac9b5f7
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Oct 6 14:53:00 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 cd73f82b23e27168b26e828dcc8b20bb931441fb
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Oct 4 15:10:21 2026 +0530

    DC-REV-01: re-vendor LibKa0s v1.68.1 (kit 36; rename-only)

    Both payloads copied whole from the local annotated tag v1.68.1 (9000cbd).
    No LibStub minor moved; tests/_kit moves to revision 36, which names the
    dev-copilot plugin's commands where revision 35 named /wow-addon:*.
    CLAUDE.md's provenance line and docs/settings-panel.md's vendor stamp roll
    v1.68.0 -> v1.68.1, and the two "kit 35" lines of the addon's own prose
    (DEPENDENCIES.md, docs/testing.md) move to 36, in the same commit. No
    contract blocker, zero adoption candidates, no interview, no issue filed.
    Bundle: docs/revendor/2026-10-04-v1.68.1/.

    Gate: lua tests/run.lua (bounded) 2187 passed, 0 failed, 1 skipped, 2188
    total, vendor-sync green; luacheck 0/0 in 146 files; sighted lizard 0
    warnings, max CCN 15. Case count unchanged.

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

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

    DC-REV-01: re-vendor LibKa0s v1.68.1 (kit 36; rename-only)

    Both payloads copied whole from the local annotated tag v1.68.1 (9000cbd).
    No LibStub minor moved; tests/_kit moves to revision 36, which names the
    dev-copilot plugin's commands where revision 35 named /wow-addon:*.
    CLAUDE.md's provenance line and docs/settings-panel.md's vendor stamp roll
    v1.68.0 -> v1.68.1, and the two "kit 35" lines of the addon's own prose
    (DEPENDENCIES.md, docs/testing.md) move to 36, in the same commit. No
    contract blocker, zero adoption candidates, no interview, no issue filed.
    Bundle: docs/revendor/2026-10-04-v1.68.1/.

    Gate: lua tests/run.lua (bounded) 2187 passed, 0 failed, 1 skipped, 2188
    total, vendor-sync green; luacheck 0/0 in 146 files; sighted lizard 0
    warnings, max CCN 15. Case count unchanged.

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

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

    DC-REN-01: name the dev-copilot commands in live docs

    The wow-addon plugin merged into dev-copilot 2.0.0. Live docs and test
    comments now name the dev-copilot commands; frozen bundles stay as written.

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

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

    DC-REN-01: name the dev-copilot commands in live docs

    The wow-addon plugin merged into dev-copilot 2.0.0. Live docs and test
    comments now name the dev-copilot commands; frozen bundles stay as written.

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

commit 8d0938804e1b136ac66d941bbd46290430306e47
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sat Oct 3 12:48:03 2026 +0530

    SD-FIN-01: sync docs (git needed by the suite; lizard pinned 1.24.0; test-only exports labeled)

    DEPENDENCIES git row and lizard pin; the Perf note names the eight recording files; seven test-only exports carry a headless-suite note.

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

commit 8b0345c85da9346f0b3d75bf41878f533a75734e
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 23:37:41 2026 +0530

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

    Both payloads copied whole from the local annotated tag v1.68.0 (cc9f5eb);
    the only byte delta is libs/LibKa0s/WidgetsDragHandle.lua (DRAG_MINOR 3 -> 4,
    the optional tooltipPlace hook). tests/_kit is unchanged at revision 35.
    CLAUDE.md's provenance line and docs/settings-panel.md's vendor stamp roll
    v1.67.0 -> v1.68.0 in the same commit. No contract blocker.

    tooltipPlace is declined as not applicable: this addon draws no LibKa0s
    drag strip, so there is no tooltip to place. Not a gap, so no issue filed.
    Bundle: docs/revendor/2026-10-02-v1.68.0/.

    Gate: lua tests/run.lua (bounded) 2187 passed, 0 failed, 1 skipped, 2188
    total, vendor-sync green; luacheck 0/0 in 146 files; sighted lizard 0
    warnings, max CCN 15. Case count unchanged.

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

commit 8b0345c85da9346f0b3d75bf41878f533a75734e
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 23:37:41 2026 +0530

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

    Both payloads copied whole from the local annotated tag v1.68.0 (cc9f5eb);
    the only byte delta is libs/LibKa0s/WidgetsDragHandle.lua (DRAG_MINOR 3 -> 4,
    the optional tooltipPlace hook). tests/_kit is unchanged at revision 35.
    CLAUDE.md's provenance line and docs/settings-panel.md's vendor stamp roll
    v1.67.0 -> v1.68.0 in the same commit. No contract blocker.

    tooltipPlace is declined as not applicable: this addon draws no LibKa0s
    drag strip, so there is no tooltip to place. Not a gap, so no issue filed.
    Bundle: docs/revendor/2026-10-02-v1.68.0/.

    Gate: lua tests/run.lua (bounded) 2187 passed, 0 failed, 1 skipped, 2188
    total, vendor-sync green; luacheck 0/0 in 146 files; sighted lizard 0
    warnings, max CCN 15. Case count unchanged.

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

commit c2a411f1f18b23ba09abf0ddea567454d7abcb8e
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 02:06:51 2026 +0530

    CA-MM-02: adopt Core.MakeResizable with gripParent and onResizeStop (MultiMeters#58)

    The window's hand-rolled resize grip is replaced by LibKa0s-Core's
    MakeResizable (Core minor 10). It sizes the bare anchor (rule R3) and is
    drawn on the art frame through gripParent, so it keeps the window's
    strata, alpha and rule-driven visibility. SaveSize runs from onResizeStop,
    once per release (issue #49), never from the per-tick onResize. canResize
    refuses a locked window as defense in depth; ApplyLock and ApplyMinimized
    stay the grip's two visibility authors, and ApplyResizeBounds still runs
    after BuildFrame and owns the bounds. anchor:SetResizable and the host's
    onResizeStop are gone.

    core/CoreSetup.lua publishes NS.MakeResizable: the library's on Core
    minor >= 10, a nil-answering function below that (an older Core would
    ignore gripParent and onResizeStop) and in the library-absent arm (D3.3:
    no grip on a degraded install).

    Behavior changes: only the left button sizes; the grip has a pressed
    state; it is 16 px at a 1 px inset (was 12 px at 2 px); a resize alone
    no longer makes the anchor user-placed; a degraded install has no grip.

    Tests: characterization first (green on the hand-rolled grip): the grip
    sizes the anchor, is the frame's child, saves once per mouse-up and not
    on OnSizeChanged or ApplyConfig, survives a rule-driven hide/show, and
    lock and minimize hide it. Then: the grip is the library's (left button
    only, pressed art, level +10), a locked grip refuses even when shown, the
    user-placed flag is restored, the layout bounds win, degraded has no grip,
    the seam hands over the library's function on Core 10 and a nil grip on
    Core 9, and degraded parity lists MakeResizable. tests/mock_frame.lua
    models the user-placed flag.

    Docs: retired the library-stack-§8 register row and the two texture-path
    census rows for the SizeGrabber pair with the DECLINED_SITES entry;
    census counts re-measured; schema.md SaveSize wording; module-map member
    lists; performance.md Window.lua citations that moved; smoke WIN-24
    corrected, WIN-37, WIN-38 and DEGRADED-10 added (pending sign-off);
    test-cases regenerated; Tests badge.

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

commit c2a411f1f18b23ba09abf0ddea567454d7abcb8e
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 02:06:51 2026 +0530

    CA-MM-02: adopt Core.MakeResizable with gripParent and onResizeStop (MultiMeters#58)

    The window's hand-rolled resize grip is replaced by LibKa0s-Core's
    MakeResizable (Core minor 10). It sizes the bare anchor (rule R3) and is
    drawn on the art frame through gripParent, so it keeps the window's
    strata, alpha and rule-driven visibility. SaveSize runs from onResizeStop,
    once per release (issue #49), never from the per-tick onResize. canResize
    refuses a locked window as defense in depth; ApplyLock and ApplyMinimized
    stay the grip's two visibility authors, and ApplyResizeBounds still runs
    after BuildFrame and owns the bounds. anchor:SetResizable and the host's
    onResizeStop are gone.

    core/CoreSetup.lua publishes NS.MakeResizable: the library's on Core
    minor >= 10, a nil-answering function below that (an older Core would
    ignore gripParent and onResizeStop) and in the library-absent arm (D3.3:
    no grip on a degraded install).

    Behavior changes: only the left button sizes; the grip has a pressed
    state; it is 16 px at a 1 px inset (was 12 px at 2 px); a resize alone
    no longer makes the anchor user-placed; a degraded install has no grip.

    Tests: characterization first (green on the hand-rolled grip): the grip
    sizes the anchor, is the frame's child, saves once per mouse-up and not
    on OnSizeChanged or ApplyConfig, survives a rule-driven hide/show, and
    lock and minimize hide it. Then: the grip is the library's (left button
    only, pressed art, level +10), a locked grip refuses even when shown, the
    user-placed flag is restored, the layout bounds win, degraded has no grip,
    the seam hands over the library's function on Core 10 and a nil grip on
    Core 9, and degraded parity lists MakeResizable. tests/mock_frame.lua
    models the user-placed flag.

    Docs: retired the library-stack-§8 register row and the two texture-path
    census rows for the SizeGrabber pair with the DECLINED_SITES entry;
    census counts re-measured; schema.md SaveSize wording; module-map member
    lists; performance.md Window.lua citations that moved; smoke WIN-24
    corrected, WIN-37, WIN-38 and DEGRADED-10 added (pending sign-off);
    test-cases regenerated; Tests badge.

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

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

    CA-MM-01: adopt Core.SECRET; drop the zero-reader Diagnostics.SECRET (MultiMeters#58)

    core/CoreSetup.lua publishes NS.SECRET on both arms: lib.SECRET by reference
    on the live arm (Core minor 1, no fallback needed), and the one "<secret>"
    literal in the library-absent arm, which the degraded SafeToString now
    returns. core/Diagnostics.lua reads NS.SECRET instead of its own copy, and
    the Diagnostics.SECRET alias, which nothing read, is deleted (D3.8).

    Tests: NS.SECRET is the library's by reference; SafeToString's sentinel is
    NS.SECRET on both paths; a static scan allows exactly one sentinel literal,
    in CoreSetup's degraded arm; Diagnostics shown/probe render a secret as
    NS.SECRET on both paths; the alias is gone. Docs: module-map member lists,
    smoke DIAG-42 (pending sign-off), test-cases regenerated, Tests badge.

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

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

    CA-MM-NM: pass addonName on the Options descriptor (LibKa0s#42)

    settings/OptionsSetup.lua keeps its first vararg as addonName and hands it
    to the LibKa0s-Options-1.0 descriptor beside parentTitle/mainPanelName, so
    OptionsIdList's help-mark art resolves to this addon's vendored info icon
    rather than the client glyph. Latent here: no IdList on these pages carries
    help today. The library-absent arm is untouched.

    Tests: a source-pattern guard that the descriptor passes
    addonName = addonName from the first vararg, and an on-disk assert that
    libs/LibKa0s/media/icons/info.tga is vendored. Suite 2170 passed / 1 skipped,
    luacheck 0/0, vendor parity clean, sighted complexity max CCN 15.
    Docs: test-cases.md regenerated, Tests badge 2170, smoke PANEL-47 added
    and listed under Pending sign-off.

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

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

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

    Both payloads copied whole from the local tag v1.67.0 (0bccf4c) via git archive; CLAUDE.md
    provenance rolled v1.66.0 -> v1.67.0 in the same commit, with docs/settings-panel.md's vendor stamp.
    Three payload files moved (Core 9->10, Options 27->28, OptionsIdList 2->3); the kit is byte-identical
    (revision 35). No file added or deleted. Vendor parity: diff -r against the tag is empty for
    libs/LibKa0s and tests/_kit. No contract blocker: this host has no MakeResizable caller and draws no
    IdList yet.

    - Frozen bundle docs/revendor/2026-10-02-v1.67.0/ (01_DELTA, 02_CANDIDATES, 05_SUMMARY). Candidates
      are assigned, not interviewed: addonName -> CA-MM-NM, MakeResizable gripParent/onResizeStop/
      canResize -> CA-MM-02.
    - docs/test-cases.md regenerated (unchanged); README badge unchanged at 2168/2168.

    Tests: 2168 passed / 0 failed / 1 skipped / 2169 before and after. luacheck 0/0 in 146 files.
    Sighted complexity: pass, 0 warnings, max CCN 15, 4868 functions.

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

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

    GI-FIN-02: record the 2026-10-02 owner smoke passes for GRID-15 and GRID-16

    The owner ran the issue #56 checks in a client on 2026-10-02 (training
    dummy refused, Valeera admitted): both Result lines are filled and their
    Pending sign-off row is removed. Doc sync found no other drift.

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

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

    GI-FIN-02: record the 2026-10-02 owner smoke passes for GRID-15 and GRID-16

    The owner ran the issue #56 checks in a client on 2026-10-02 (training
    dummy refused, Valeera admitted): both Result lines are filled and their
    Pending sign-off row is removed. Doc sync found no other drift.

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

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

    GI-MM-02: DrillDown.BuildRows, Targets, WindowProto.Render and reportTargets below CCN 15

    Sighted CCN (lizard 1.24.0 over the kit-35 shadow), before -> after:
    - modules/DrillDown.lua DrillDown.BuildRows: 18 -> 10 (spellSource 6,
      spellRows 4). Characterization first: the spells and deaths rows lines.
    - modules/Targets.lua Targets.ForPlayer: 21 -> 5 (forPlayer 5, hoveredName 6,
      sessionMap 4, trimmedCopy 6); buildMap: 19 -> 10 (walkEnemy 6,
      enemyIdentifiers 3, orderedMap 5). Characterization first: non-positive and
      non-number caps, empty/non-string hovered names, zero totals, the 64-enemy
      walk limit. The perf bracket is noted on exactly the paths it was before.
    - modules/Window.lua WindowProto.Render: 22 -> 13 (clampScroll 4, drawSlice 5,
      showWaiting 3). Characterization first: no Waiting notice on an empty preview
      or breakdown, and the pass line's `drew D/E rows (preview)` shape.
    - core/Diagnostics.lua reportTargets: 39 -> 6 (targetsColumn 10, probeEnemy 9,
      enemyIds 7, tallySpells 1, reportTargetsVerdict 4, reportTargetNames 6).
      Characterization first: the per-enemy line, the detail-nil and
      missing-combatSpellDetails verdicts, the caster/roster names, the empty column.
      Kept under 1000 lines (995), so no file enters the 1000-1500 band.

    Sighted complexity after: warnings 0, maxCcn 15 (none above), blindFiles 0
    (4868 functions). The eight GI-MM-RV listed are all below 15: reportTargets
    39->6, WindowProto.Render 22->13, Targets.ForPlayer 21->5, buildMap 19->10,
    DrillDown.BuildRows 18->10, normalizeColumns 18->9, Export.Send 18->12, Roster
    build 16->13.

    Behaviour identical: no message, order, return or log line changed.
    Tests: 2158/0/1/2159 before; 2168/0/1/2169 after (+10 characterization).
    luacheck 0/0.

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

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

    GI-MM-02: Roster build, Export.Send and normalizeColumns below CCN 15

    Sighted CCN (lizard 1.24.0 over the kit-35 shadow), before -> after:
    - modules/Roster.lua build: 16 -> 13 (addMember 4). The per-unit member
      entry moved, unchanged, into addMember; existing test_roster cases pin every
      branch (unit absent, unsafe/secret GUID, raid duplicate, pets, partial build,
      pruning, test mode, both log lines).
    - modules/Export.lua Export.Send: 18 -> 12 (printLocally 5, sendStaggered 3).
      Characterization added first: no sender and no printer answers false and
      emits nothing; the other branches were pinned by test_export's Send cases.
    - settings/Schema_Paths.lua normalizeColumns: 18 -> 9 (partitionColumns 10,
      countKeys 2). Characterization added first: each refusal message (non-table,
      holes, a non-table column, nothing enabled, a non-string stat) and enabled's
      truthy coercion.

    Behaviour identical: no message, order, return or log line changed.
    Tests: 2156/0/1/2157 before; 2158/0/1/2159 after (+2 characterization).
    luacheck 0/0.

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

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

    GI-MM-01: a None source needs a companion identity, not only a class (#56)

    The delve-companion rule admitted any None source whose classFilename is a
    RAID_CLASS_COLORS key. The PvP Training Dummy (creature 243211) is filed under
    None with class WARRIOR, so it passed. The Enemy gate is kept.

    - core/Constants.lua: COMPANION_CREATURE_IDS = { [248567] = "Valeera Sanguinar" },
      seeded only with the measured id.
    - modules/Aggregator.lua: realClass (the old class test), companionIdentity
      (plain Player- GUID, or a plain creature id / Creature- GUID npc field in the
      allowlist; every identifier proved by Secrets.IsSafeKey before it is matched or
      indexed), companionClass = realClass AND identity, isForeignSource (Enemy, or a
      plain None real-class source whose creature id or GUID is plain and names no
      companion; undecidable sources stay admitted), admitsUnowned for diagnostics.
      All exported on Aggregator._identity; the comment blocks citing the false
      "a mob would have to report None AND carry a class" argument now cite #56.
    - modules/Aggregator_Identity.lua: the sweep and buildByIdentity refuse through
      isForeignSource, so a refused source takes no identity key.
    - core/Diagnostics.lua: the targets section prints "enemies the grid would admit
      as a row: N of M" through admitsUnowned.

    Tests first (red against the old code: 5 aggregator cases + 1 diagnostics case):
    classed None NPC refused in DamageDone (creature id, and GUID npc field);
    allowlisted companion by creature id and Player- GUID admitted (pins); the GUID
    pattern ignores Vehicle-; identity mode drops a plain unlisted classed None NPC
    and counts it, keeps an allowlisted companion, keeps an all-secret source, keeps
    an Ally pet; a refused dummy causes no collision; the diagnostics admit line.
    The existing Valeera and Enemy-with-class cases stay green unchanged.

    Docs: midnight-quirks.md (classed-NPC finding, allowlist rule), data-flow.md
    (admission rules), scope.md and ARCHITECTURE.md Known limitations (a new
    companion is off the grid until its id is added), smoke-tests.md GRID-15/16,
    test-cases.md regenerated, README badge.

    Tests: 2145/0/1/2146 before; 2156/0/1/2157 after. luacheck 0/0.

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

commit 048639e80c60594dae2ee22c7ec3c2e5c465de72
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 13:52:17 2026 +0530

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

    Both payloads copied whole from the local tag v1.66.0 (e4c5ef7) via git archive; CLAUDE.md
    provenance rolled v1.65.0 -> v1.66.0 in the same commit. Four new payload files (WidgetsReorder,
    SlashParse, PerfSampler, PerfCommands); the TOC loads LibKa0s through LibKa0s.xml, so no TOC
    change; tests/run.lua's expected load list now names the four. No file deleted. Vendor parity:
    diff -r against the tag is empty for libs/LibKa0s and tests/_kit. No contract blocker (01_DELTA 3g).

    - tests/run.lua: { name = "test_lizard_sighted", dir = "tests/_kit/" } wired.
    - docs/testing.md suite table quotes the runner's complexity suite instead of raw lizard;
      CLAUDE.md's green-gate line quotes no lizard, so it is unchanged. DEPENDENCIES.md pins
      lizard 1.24.0. docs/settings-panel.md names v1.66.0.
    - Frozen bundles docs/revendor/2026-10-01-v1.66.0/ (candidates listed, not interviewed; GI-LK-13
      takes them) and the span bundle docs/revendor/2026-10-01-v1.64.0-v1.65.0/.
    - docs/test-cases.md regenerated, README badge 2145/2145.

    Tests: 2137 passed / 0 failed / 1 skipped / 2138 before; 2145 / 0 / 1 / 2146 after (+8 is the
    kit's test_lizard_sighted). luacheck 0/0 in 146 files. No consumer test broke.

    Sighted complexity (bash tests/_kit/run-automated-tests.sh --suite complexity, lizard 1.24.0):
    status pass, warnings 8, maxCcn 39, blindFiles 0, 4815 functions. Above CCN 15 (GI-MM-02):
    reportTargets 39, WindowProto.Render 22, Targets.ForPlayer 21, buildMap 19,
    DrillDown.BuildRows 18, normalizeColumns 18, Export.Send 18, Roster build 16.

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

commit a6fe9af2ea4aea8363c21fc535cf5e0db43615ce
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 01:13:06 2026 +0530

    DG-MM-01: adopt, docs: Coverage names the library's tags, smoke rows for its slash and Lifecycle lines

    docs/debug.md Coverage gains "The library's tags": Cmd, Lifecycle, Cfg,
    Launcher and part of Set are written by LibKa0s through the gated sink
    each descriptor takes, and this addon writes no line beside them. New
    `Lifecycle` and `Cmd` rows replace the retired `[Init] stood down` row; the
    Cfg and Launcher rows name the combat-lock refusals and the state lines
    held by the at-enable queue; the `[Init] rejected events` row says it is
    held at login; the Clear sentence says Clear now re-arms NS.DebugSteady
    and why that sink is kept over the console's DebugChanged.

    docs/smoke-tests.md: DIAG-39 (a slash refusal in the console), DIAG-40 (a
    Lifecycle edge in the console), DIAG-41 (the launcher's login line at
    enable, and Clear re-arming), all under Pending sign-off; DIAG-31
    corrected (a refused event at login is written at `/mm debug on`); the
    index range reads DIAG-1 to DIAG-41. docs/scope.md's Clear note,
    docs/midnight-quirks.md's rejected-events sentence and docs/module-map.md's
    DebugLogSetup, LifecycleSetup, LauncherSetup and Slash rows match.

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

commit a6fe9af2ea4aea8363c21fc535cf5e0db43615ce
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 01:13:06 2026 +0530

    DG-MM-01: adopt, docs: Coverage names the library's tags, smoke rows for its slash and Lifecycle lines

    docs/debug.md Coverage gains "The library's tags": Cmd, Lifecycle, Cfg,
    Launcher and part of Set are written by LibKa0s through the gated sink
    each descriptor takes, and this addon writes no line beside them. New
    `Lifecycle` and `Cmd` rows replace the retired `[Init] stood down` row; the
    Cfg and Launcher rows name the combat-lock refusals and the state lines
    held by the at-enable queue; the `[Init] rejected events` row says it is
    held at login; the Clear sentence says Clear now re-arms NS.DebugSteady
    and why that sink is kept over the console's DebugChanged.

    docs/smoke-tests.md: DIAG-39 (a slash refusal in the console), DIAG-40 (a
    Lifecycle edge in the console), DIAG-41 (the launcher's login line at
    enable, and Clear re-arming), all under Pending sign-off; DIAG-31
    corrected (a refused event at login is written at `/mm debug on`); the
    index range reads DIAG-1 to DIAG-41. docs/scope.md's Clear note,
    docs/midnight-quirks.md's rejected-events sentence and docs/module-map.md's
    DebugLogSetup, LifecycleSetup, LauncherSetup and Slash rows match.

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

commit 21f775086e87e2d1696cdf17aae00a3ba3617777
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 01:08:52 2026 +0530

    DG-MM-01: adopt the library's own debug lines: debug to Slash and Lifecycle, launcher state at enable, Clear re-arms the steady sink

    LibKa0s v1.65.0 has the dispatcher, the stand-down latch, the options
    panel's combat lock and the launcher log what they decide through the
    host's gated sink (debug-logging-§4 at standard v2.73.0). Wiring:

    - settings/Slash.lua passes `debug` (Slash 18): each refusal the
      dispatcher decides is one `[Cmd] refused <verb>: <guard>` line; chat is
      unchanged and the host adds none.
    - core/LifecycleSetup.lua passes `debug` (Lifecycle 3) and drops its own
      traceEdge `[Init] stood down (holds: ...)` / `[Init] stood up` pair: the
      library's `[Lifecycle] stood down: added <key> (holds: <set>)` line
      replaces it, one per edge, never two.
    - core/LauncherSetup.lua passes `debugAtEnable` (Launcher 5) onto
      NS.DebugAtEnable, the console's at-enable queue, bound bare in
      core/DebugLogSetup.lua (the stub answers false). Register runs at
      OnInitialize with logging off, so `[Launcher] registered` now lands the
      first time logging is turned on.
    - core/MultiMeters.lua's `[Init] rejected events` state line, written at
      OnEnable, goes through the same queue.
    - core/DebugLogSetup.lua's descriptor gains `onClear` (DebugLog 18): the
      console's Clear re-arms NS.DebugSteady, as turning logging on already did.
    - settings/OptionsSetup.lua already passed `debug`, so Options 27's `[Cfg]`
      combat-lock refusal lines land with no change.

    NS.DebugSteady is kept, not swapped for the console's DebugChanged: it
    counts a run and writes `... (xN)` on the state's own line when the run
    ends, which the library gate cannot, and debug-logging-§9 names onClear
    as the route for a host that keeps its own gate.

    tests/test_library_lines.lua (11 cases) pins each line landing in this
    addon's console once, and the queue's one-shot flush; each case was
    checked red with its descriptor field removed. tests/test_disabled.lua's
    edge case moves to the library's line and asserts no second edge line.
    docs/test-cases.md regenerated (2138 cases, 1 skipped); badge 2137/2137.

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

commit 8911e526a813b44b77c843525793a1d48a2db856
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 00:56:18 2026 +0530

    DG-MM-01: re-vendor LibKa0s v1.65.0 (kit 34); degraded DebugLog stub answers the new gate members

    Both payloads copied whole from the local tag v1.65.0. New minors: Slash 18,
    DebugLog 18 plus the new secondary file DebugLogGates.lua (loaded by
    LibKa0s.xml), Options 27 and its secondaries, Launcher 5, Lifecycle 3. Kit
    revision 34 is unchanged (tests/_kit identical). CLAUDE.md provenance and
    docs/settings-panel.md's "v1.x bundled" roll to v1.65.0. The standards
    reference carries no live stamp (TOC X-Standard, README badge and CLAUDE.md
    follow the versionless templates).

    core/DebugLogSetup.lua's no-library stub gains DebugOnce, DebugChanged,
    DebugForget and DebugAtEnable, answering "did not write", so the surface-parity
    case holds against the live instance.

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

commit 12e6dfb0ef93bf4fe9b4f69c522c4f4ab13345bc
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 21:20:16 2026 +0530

    DL-MM-04: README uses bullets, never numbered lists; Reporting a bug is the v2.72.0 fixed text

    Standard v2.72.0 (documentation-§1) forbids numbered lists in README.md because
    CurseForge's description page does not render them. The four set-up steps and the
    three Reporting a bug steps become "- " bullets (the "takes four steps" lead-in and
    the imperative openings already carry the order, so no rewording). The Reporting a
    bug closing sentence is aligned to the fixed body word for word.

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

commit 12e6dfb0ef93bf4fe9b4f69c522c4f4ab13345bc
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 21:20:16 2026 +0530

    DL-MM-04: README uses bullets, never numbered lists; Reporting a bug is the v2.72.0 fixed text

    Standard v2.72.0 (documentation-§1) forbids numbered lists in README.md because
    CurseForge's description page does not render them. The four set-up steps and the
    three Reporting a bug steps become "- " bullets (the "takes four steps" lead-in and
    the imperative openings already carry the order, so no rewording). The Reporting a
    bug closing sentence is aligned to the fixed body word for word.

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

commit b38e8c7e3bd460e54e9fe0fa6722108f14694552
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 20:22:46 2026 +0530

    DL-MM-03R: keep README's Reporting a bug section as the standard fixes it (no added sentences)

    documentation-§1 item 9: nothing is added to the section. The enable and the
    link are stated in docs/debug.md and the smoke rows.

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

commit 79440af62653f9a0a29b7e0677eaf1030ebd59d6
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 20:13:03 2026 +0530

    DL-MM-03: re-vendor the final LibKa0s v1.64.0 (kit 34); diagnostics turns logging on for the session

    Both payloads copied whole from the local tag v1.64.0: DebugLog 16 -> 17
    and DebugLogDiagnostics 1 -> 2, whose RunDiagnostics() calls
    SetEnabled(true) before it writes when logging is off (standard v2.71.0,
    debug-logging-§14). The console's orange Diagnostics link runs the same
    function. Kit revision 34 rewrites the contract case to "turns it on for
    the session" and adds the opt-out case (skipped here: MultiMeters keeps the
    default) and the already-on case. CLAUDE.md provenance stays v1.64.0.

    The standards reference needs no stamp: the TOC X-Standard, README badge
    and CLAUDE.md follow the standard's versionless templates.

    tests/test_diagnostics.lua: the marker case expects the enable line ahead
    of the begin marker and the flag on afterwards; the console-routing case
    expects two chat lines (the seam's ON line, then the count line); the
    count-line case turns logging on first. A fromBegin helper in both suites
    slices the report from its begin marker, since with logging on a gated
    [Provider] meter available trace the report's reads cause can precede it.
    tests/test_diagnostics_runtime.lua: the cap case turns logging on first.

    docs/debug.md names the title-bar Diagnostics link and says a run turns
    logging on for the session (a /reload turns it off); README's Reporting a
    bug and docs/slash-dispatch.md match. docs/smoke-tests.md corrects DIAG-16
    and adds DIAG-37 (the Diagnostics link) and DIAG-38 (diagnostics turns
    logging on for the session, /reload turns it off), all under Pending
    sign-off. docs/test-cases.md regenerated (2127 cases, 1 skipped); badge
    2126/2126.

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

commit 75eaa37d4896c23f6d0c64ff95f5d47fa602a7c3
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 17:02:57 2026 +0530

    DL-MM-02R: export flush line, change-gated tooltip lines, doc blocks restored

    - modules/Export.lua: a staggered dump's hold line now pairs with a flush
      line when the last queued line goes out ("sent the queued rest of a dump
      (N-1 lines) to X"), so a hold with neither flush nor cancel stands out
      (debug-logging-§8, deferred work). A one-line dump writes "sent 1 line"
      and no longer claims a queued tail.
    - modules/Row.lua, modules/Tooltip_Builders.lua: the row, cell and name
      [Tooltip] lines go through NS.DebugSteady keyed on the hovered frame
      (debug-logging-§9, quiet steady state); leaving the cell or row calls the
      new NS.DebugSteadyForget(frame), so each hover speaks once and a held
      run's (xN) lands as it ends.
    - settings/Schema_Paths.lua, core/LifecycleSetup.lua: traceRefused and
      traceEdge moved above the doc blocks they split, so NS.SetByPath and
      standDown have their own docs again.
    - Tests for the flush, the one-line dump and the resting-cursor tooltip
      paths; the tooltip source scan matches either sink and expects three
      sites. docs/debug.md coverage, test-cases.md, badge and moved citations.

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

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

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

    Quiet steady state (§9):
    - NS.DebugSteady drops its 10 s heartbeat. An unchanged run is silent; its
      (xN) comes out once when the run ends. This was the 060 log: a folded
      [Aggregator]/[Render] pair (x41) every ~10 s through a whole key. Liveness
      is /mm diagnostics' age=.
    - [Visibility], [Roster] (partial-build retry), [Aggregator] dropped guid=,
      [DrillDown] rows and the new [Provider] meter availability line are
      change-gated through NS.DebugSteady.
    - The debug-logging-§8 deviation row is retired: its re-check trigger fired.

    Diagnosis (§8):
    - [Init] stood down (holds: ...) / stood up on the addon's own latch edge.
    - [Provider] meter available / unavailable: <reason>, on change.
    - [Export] send and queued-tail cancel lines, plus csv/chat/open refusals.
    - [Set] <path> refused: <reason> at the write seam.
    - [Test] start refused: in combat; [Window] sort by name refused: restricted.
    - [Init] summary gains the window count and whether LibSharedMedia loaded.

    Tests: 14 new or rewritten cases pin the lines and one quiet-steady-state
    case per repeating path. docs/debug.md gains the Coverage section.

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

commit 1f6c6ad22f28e7f50920c71157fcb8234606f9ee
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 16:01:26 2026 +0530

    DL-MM-01: re-vendor LibKa0s v1.64.0 (kit revision 33) and add the resize smoke checks

    Copies libs/LibKa0s/ and tests/_kit/ whole from the local v1.64.0 tag (Core 9,
    DebugLog 15.1, Widgets 11.3, PerfPanel 13.6; kit revision 33 adds
    mock_resize.lua) and rolls the CLAUDE.md provenance line and the
    settings-panel.md bundled-version note to v1.64.0. The three standards
    references are unversioned and already match v2.70.0, so nothing moves there.
    No test fallout. docs/smoke-tests.md gains DIAG-32 to DIAG-36 for the
    resizable console, copy windows (the console's and the CSV export's) and perf
    panel, listed under Pending sign-off.

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

commit 715f31fac98a29289b5b231b4d543db65f5ba945
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 08:52:20 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.

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

commit 715f31fac98a29289b5b231b4d543db65f5ba945
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 08:52:20 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.

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

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

    SP-FIN-01: the surface-parity note counts six seams not compared by name, as docs/testing.md does

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

commit 959afc5dfa03970cc8bc79cc9b79571e5278ed53
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 01:48:52 2026 +0530

    SP-FIN-01: sync docs (scope's panel/schema counts, bundled Options tag, Slash parity case)

    - docs/scope.md: the settings panel is three pages (General, Windows, Profiles) over a 169-row
      schema, not "nine pages" and 162 rows (settings/Schema.lua, matching ARCHITECTURE.md and
      settings-panel.md).
    - docs/settings-panel.md: LibKa0s-Options-1.0 is bundled at v1.63.0 (CLAUDE.md's provenance
      line), not v1.35.0.
    - docs/testing.md: the stub-parity paragraph now names the Slash dispatcher case SP-MM-02 added
      (NS.Slash.__dispatcher, live vs degraded load, two-table form).

    Gate: 2107/2107 tests, luacheck 0/0 in 145 files. Test count unchanged, so docs/test-cases.md and
    the README badge stand.

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

commit 7abe336f452eafd555b987c00fb86e49aba09188
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 01:30:10 2026 +0530

    SP-MM-03R: put DIAG-7's finish lines in chat order and stop requiring nonzero total ms

    Chat shows "perf run FINISHED — saved; …" before "addon RESUMED — restored":
    P.Announce prints at once and the RESUMED line is in the table doPerf prints
    after OnCommand returns; only the console has P.Resume's line first. The event
    rows need calls above zero and a total ms column, since %10.2f can print 0.00
    for a correct systemEvent capture (the JSON totalMs keeps the real value).

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

commit 9a718797428abc6204708f78184eec4b66d996fe
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 00:20:34 2026 +0530

    SP-MM-03R: restore DIAG-7's per-bucket counts and list the 2026-09-23 plan's owed checks

    DIAG-7 again expects meterEvent, spellEvent and systemEvent each to show
    calls and ms, as the old perf-report check did. It now says what makes
    each fire, verified against core/MultiMeters.lua, core/PerfSetup.lua and
    LibKa0s Perf: the brackets record only inside window A's combat, and an
    empty bucket prints no row. So the capture uses a raid pull and a whisper
    to a name nobody is playing, because no fight raises CHAT_MSG_SYSTEM on
    its own.

    Pending sign-off now lists every Multi Meters step that
    06_SMOKE_TESTS.md in Ka0sAddonsCommonTasks' 2026-09-23 plan owes, by new
    ID with its origin. The steps with a recorded pass are cited instead of
    listed. Owed checks the old doc never carried become INSTALL-9 (the v16
    upgrade), PANEL-45 (color drag throttle), PANEL-46 (no leak across window
    switches) and DIAG-31 (rejected events). The rest extend existing checks,
    each re-read against the code: SLASH-7, PANEL-18, PANEL-23, PANEL-30,
    STATE-9, WIN-26, EXPORT-33, EXPORT-38 and DIAG-17.

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

commit 9ebefe41f125b6eea7dffb6c201b04b8b255aaca
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 23:41:54 2026 +0530

    SP-MM-03R: fix PANEL-13's close path, WIN-16's dialog and SLASH-13's lock state

    PANEL-13 reads window.frame.closeButton, the close row's real path; there
    is no showClose. WIN-16 expects the dialog's own text and Yes / No buttons,
    with the meter-data warning on the Show reset row's tooltip, and joins
    Pending sign-off. SLASH-13 starts from /mm lock off, since SLASH-10 now
    ends locked and the menu's Locked runs a bare /mm lock.

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

commit c2bd195206fc776d440d0f7acab7831c5f6ff48e
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 23:28:22 2026 +0530

    SP-MM-03R: merge the drag checks into WIN-25 and fold GRID-6 into GRID-1

    WIN-23 and WIN-25 both checked that an unlocked window drags. Merged into
    WIN-25 and retired WIN-23. The merged check is corrected against
    modules/Window_Placement.lua ApplyLock and modules/Row.lua ApplyMouse: the
    window drags by its title bar, the lock only stops that drag, and the cells
    answer the mouse locked or unlocked. WIN-25 joins Pending sign-off.

    GRID-6 (numberFormat full via the CLI) repeated GRID-1's Full option;
    PANEL-28 covers the panel/CLI sync. GRID-6 retired, and GRID-7 now points
    at GRID-1's Number format control.

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

commit 8c4b00d0dd841aac55d4972a7ac6645edc98331f
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 23:11:14 2026 +0530

    SP-MM-03R: tick Merge pets before the pet-fold checks

    GRID-17, GRID-18 and COMBAT-27 expected the pet fold on shipped settings,
    but Merge pets into their owner ships off (defaults/Profile.lua data.mergePets,
    settings/Schema.lua) and modules/Aggregator.lua placedRow gives a pet its own
    row unless it is set. GRID-17 now checks the separate pet row first, then ticks
    the option and checks the fold; GRID-18 runs with it still ticked; COMBAT-27
    ticks it before the pull. The Blizzard comparison is restated against the
    separate figures. All three join Pending sign-off as corrected.

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

commit 3a1e73b3632b70a7afc0a3a16a65af8a6c524bcd
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 22:53:04 2026 +0530

    SP-MM-03R: restore PANEL-13's tab rows, fix STATE-11/EXPORT-48 routes, widen Pending sign-off

    PANEL-13 names each tab's rows again, checked against settings/Schema.lua:
    Frame's Size and position, Background and border and Row; the
    window.rows.* rows on Frame, not Bars; Header's Title text and Button
    style; Visibility's contexts, hide rules and Combat tab. STATE-11 drops
    the General page's Test mode box, which the combat cover makes
    unreachable. EXPORT-48 and GRID-21 get their empty segment from the
    header reset, because a fresh login keeps the old fights (INSTALL-5).
    Pending sign-off adds INSTALL-6, INSTALL-8, SLASH-9, STATE-11, GRID-21,
    EXPORT-33, EXPORT-39 and EXPORT-53.

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

commit c76ba914cccb8d6c42b58efbc2e09f4553391afd
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 22:33:55 2026 +0530

    SP-MM-03R: close the smoke suite's review defects and re-verify its strings

    Review defects closed:
    - VIS-5 ticks Visibility -> When to hide this window -> Hide in vehicles
      first; the rule ships off, so a correct build failed the old step.
    - PROFILE-6 counts only [Set] lines again: an accepted reset rebuilds the
      windows, and the rebuild logs Roster, Aggregator and Visibility lines.
      The popup is named by its real text.
    - DIAG-22 regains "no Lua error" (the probe walks a raw source row with
      pairs) and the old record list, and says when the not-measured line
      appears (before any flagged pull; a party capture runs but proves
      nothing).
    - EXPORT-29 compares its header row with LOC-1's line, so the literal
      24-column header is checked on an English client too.
    - WIN-5, GRID-12 and COMBAT-7 name the real controls; WIN-28 drops the
      per-window refresh (the interval is addon-wide).
    - GRID-13, COMBAT-14 and COMBAT-17 set the hidden sort row with
      /mm set window.data.sortMode or the Player header; EXPORT-21 is a step.

    Strings re-verified against the code (a headless probe of the real CLI):
    - SLASH-7: the ordinal path answers "Setting not found", and an
      out-of-range scale is clamped to 2.00x, not refused.
    - SLASH-11: the list line reads Enabled/Disabled with a count of every
      column; copy takes a one-word source; the CLI delete does not confirm.
    - STATE-5 and DIAG-7: the suspended arm is /mm perf measure b; finish
      prints no report, /mm perf report does.
    - DIAG-11: the slash stamps the date and time into the label, so
      "unlabeled" never shows.
    - TIP-6 needs /mm debug tooltip; PANEL-40's line order and full shapes;
      DIAG-1 reads value/provider mid-pull and folds repeats into (xN);
      DIAG-15's end marker carries its count; DIAG-23 prints its backticks;
      EXPORT-48 prints "There is nothing to export."; DEGRADED-2's first line
      ends "; running on reduced built-in fallbacks."

    Pending sign-off now follows the clarified policy: the old never-run and
    unconfirmed checks, every new check, and every check corrected in this
    rewrite.

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

commit 2771901d1b6a1f087f730fdaa5a27645db8ca1ee
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 21:45:30 2026 +0530

    SP-MM-03R: fix PANEL-20's modes, PROFILE-14's steps, pending DIAG-20, drag/resize duplicates

    The review of SP-MM-03 found four defects in the rewritten suite.

    PANEL-20 carried a stale fact from the old §4: Header -> Title text offers
    only Class / Custom (CONTROLCOLOR_VALUES), so a correct build failed the
    check and it contradicted WIN-20. It now lists each surface's own modes and
    drops the title-bar Per-statistic clause.

    PROFILE-14's first and third commands landed on the profile already
    current, because creating a profile on the Profiles page switches to it.
    Each switch now starts from /mm profile Default.

    DIAG-20's atlas rung was "still unconfirmed" in the old doc and is now on
    the Pending sign-off list, like GRID-7 and DIAG-10.

    WIN-23 and WIN-24 re-checked /reload persistence that INSTALL-4 already
    covers; they now point to INSTALL-4.

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

commit 5383ad13aae3c6e65d574c1d4a94e1bea0e95973
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 21:26:46 2026 +0530

    SP-MM-03R: fix the smoke suite's stale facts, lost mid-pull check and pending list

    The review of SP-MM-03 found checks that a correct build would fail, a
    mid-pull check that the merge lost, and new checks listed as if they were
    carried-over sign-offs.

    - PANEL-13: the Tooltip tabs are General, Bar, Bar background, Bar border,
      Text, Contents, the schema order tests/test_schema.lua pins. The check
      now names the rows on General (including Tooltip scale) and Contents.
    - PANEL-25: General and Windows each carry a Defaults button, and the
      Windows one acts on whichever entry is on screen. Only Profiles has none.
    - PANEL-22 no longer repeats the Frame Defaults behavior that PANEL-26 and
      PANEL-27 check. PANEL-26 names its six entries now that PANEL-25 no
      longer lists them.
    - COMBAT-18 repeats TIP-20 again, because the old section 10 ran the
      mouse-off check mid-pull. The TIP intro now names what COMBAT-18 repeats.
    - COMBAT-30 ticks Bars -> Border -> Bar border, which ships off. Without
      it the backdrop path never runs and the check passes on nothing.
    - TIP-26: Bar spacing ships at 1, not 0.
    - TIP-7 and EXPORT-25 now have steps and an expected result.
    - Pending sign-off lists only unsigned checks carried over from the old
      doc. The new profile, degraded and border checks keep their own
      Result lines.

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

commit b986fd6b6422fea959cf8fe6a689290eeec762ad
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 21:04:02 2026 +0530

    SP-MM-03: rewrite docs/smoke-tests.md as one evergreen, theme-grouped suite

    The suite had grown to 2285 lines across 37 numbered sections plus an
    unnumbered one. Its index was stale (a wrong anchor, three sections
    missing), batch sign-off records sat beside evergreen checks, and the same
    behavior was checked in up to five places: reset-all, the disabled
    refusals, the combat lock, Test mode, tooltip anchors. Several checks had
    also drifted from the code: the reset window's name, the default name cap,
    the removed At cursor anchor, the blank-whisper refusal, and the CSV
    header's column count.

    The new file is 1160 lines and 335 checks in 14 themes (INSTALL, SLASH,
    PANEL, PROFILE, STATE, WIN, VIS, GRID, TIP, EXPORT, COMBAT, DIAG, DEGRADED,
    LOC), each check one bullet ending in a Result line, with stable
    <THEME>-<n> IDs. Every old in-client behavior is kept once. The only drop
    is the Reset all settings tooltip wording, which
    tests/test_options_panel.lua already asserts in full. The PROFILE theme
    adds checks for the /mm profile verb: list, switch, the current name,
    unknown and did-you-mean, quotes and spaces, live while disabled, refused
    in combat, and the help row. DEGRADED-8 covers the verb on a
    library-absent load. COMBAT-30 adds the mid-pull cell-border check that
    modules/Row_Border.lua already said this suite made. Unsigned checks
    (the "not yet run" items, the MM-E event-trace rows) and the new verb
    checks are listed under Pending sign-off.

    Inbound references move to the new IDs: SM-06 becomes INSTALL-5 in
    modules/Roster.lua, tests/test_roster.lua, ARCHITECTURE, module-map and
    schema.md; the section-33 anchor becomes GRID-32 and the section-28 anchor
    becomes DIAG-25. The old-to-new coverage map is in the plan bundle
    (smoke-maps/MultiMeters.md).

    Gate: 2107/2107 tests, luacheck 0/0 in 145 files.

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

commit 34239de7c57a61424ec2d36b8838011dd6d359ad
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 12:59:30 2026 +0530

    SP-MM-02R: make the profile row's localization case observe L

    The review found that the red-under line on "Slash profile: the verb follows
    the thirteen reserved ones, with its localized description" named a mutation
    that does not make it fail. enUS L answers the key itself, so comparing the row
    against NS.L[key] cannot tell L["..."] from the bare literal; swapping in the
    literal left the suite green. testing-§12 forbids a red-under line that names a
    mutation it does not catch.

    The case now gives a fresh instance a translation that differs from its key and
    re-runs settings/Slash.lua over it, the way a later locale file would present.
    Only a row that reads through L picks the translation up. Checked in a scratch
    clone: the literal mutation now fails this case (2106 passed, 1 failed). The
    comment also drops the claim that the README reads this string, since the
    README has no command table.

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

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

    SP-MM-02: /mm profile via CliProfile

    Switching profiles took a trip to the Profiles page. `/mm profile` now lists
    the profiles with the current one marked, and `/mm profile <name>` switches
    to an existing one. The behavior is LibKa0s-Slash minor 17's shared
    CliProfile: quotes stripped, case and spaces kept, an unknown name refused
    with a did-you-mean and never created, the current name answered without a
    rebuild, and the switch refused in combat. This addon supplies the row (a
    localized description, right after the thirteen reserved verbs) and the
    store (`profiles = function() return NS.db end`, asked at call time). The
    switch goes through the ordinary SetProfile, so core/Database.lua's
    OnProfileChanged logs the one [Profile] line and every window and an open
    Profiles page follow.

    The verb is live while disabled, because a profile switch can flip
    `enabled`. The host used to pass no liveVerbs; it now passes one built from
    the library's LIVE_VERBS plus "profile", read rather than copied, so the
    reserved set can never be narrowed here.

    The degraded stub carries CliProfile and ProfileSwitch because the live
    dispatcher has both; each names /mm profile and the missing library and
    switches nothing. The dispatcher is published as the NS.Slash.__dispatcher
    debug seam, which gives this addon its first Slash parity case
    (tests/test_surface_parity.lua, two-table form, with the three live-only
    members named) and lets a case reach the stub's ProfileSwitch.

    Tests first: tests/test_slash_profile.lua (11 cases) drives the real
    dispatcher against the AceDB fake that tests/wow_mock.lua already wraps to
    dispatch the method-name callbacks, so the switch case counts
    OnProfileChanged and reads its debug line instead of dispatching by hand.
    The refusal, disabled and slash pins list `profile` as live; test_disabled
    gains a live-while-disabled case. Docs: slash-dispatch.md (table, a profile
    section, live list, degraded, refusal lines), ARCHITECTURE counts (20
    verbs), disabled-state, module-map, common-tasks, profiles, testing.
    docs/test-cases.md regenerated and the README badge moved to 2107;
    .luacheckrc's tests/run.lua citation re-pointed.

    Gate: 2107/2107 tests, luacheck 0/0 in 145 files.

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

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

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

    LibKa0s payload from the local v1.63.0 tag (dd7a774): Slash.lua moves from
    minor 16 to 17, which adds the shared profile verb (the `profiles`
    descriptor field, CliProfile, ProfileSwitch, lib.ProfileNames and nine
    PROFILE_* strings). Every other library file and the test kit (revision 31)
    are unchanged; both payloads are still copied whole so the pairing rule
    holds. The CLAUDE.md provenance line rolls to v1.63.0 in the same commit,
    which tests/test_vendor_sync.lua needs.

    No contract change: no existing Slash member moved, and this addon has no
    by-name Slash parity case, so the copy alone stays green with no stub
    change. The profile surface is adopted by the next commit of this item.
    Bundle: docs/revendor/2026-09-29-v1.63.0/.

    Gate: 2094/2094 tests, luacheck 0/0 in 144 files.

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

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

    Docs: sync to the [Event] trace channel

    ARCHITECTURE.md names the [Event] line the context, restriction and combat
    handlers now write, and counts nineteen NS.Debug channels in the debug.md row.
    performance.md's meterEvent citations point at the three DAMAGE_METER_*
    brackets again (:484, :494, :502).

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

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

    Docs: sync to the [Event] trace channel

    ARCHITECTURE.md names the [Event] line the context, restriction and combat
    handlers now write, and counts nineteen NS.Debug channels in the debug.md row.
    performance.md's meterEvent citations point at the three DAMAGE_METER_*
    brackets again (:484, :494, :502).

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

commit 713b261379850ba5f67a9749bc0fde17084bcd13
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 01:10:05 2026 +0530

    Trace state-changing events on a new [Event] debug channel

    One line per game event that changes where a window may show or what the
    meters may read: ADDON_RESTRICTION_STATE_CHANGED (raw type and state, after
    the restricted flag is refreshed), PLAYER_ENTERING_WORLD (login, reload),
    ZONE_CHANGED_NEW_AREA, GROUP_ROSTER_UPDATE and both PLAYER_REGEN edges. Each
    line carries lockdown and NS.State.restricted. Gated before anything is read
    (debug-logging-§4). The player-state block (mount, vehicle, form, gliding, pet
    battle, death) is left out by the owner's ruling; the spellcast,
    system-message and DAMAGE_METER_* traffic because it fires constantly.

    docs/debug.md describes the channel (twenty channels through the sink now);
    smoke-tests §37 MM-E1..E5. Tests 2092 -> 2094; performance.md citations
    realigned.

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

This mod has no additional files