promotional bannermobile promotional banner

What Group? (Retail)

Notifies you of group details after joining via Premade Group Finder
Back to Files

1.6.0-release

File nameWhatGroup-1.6.0-release.zip
Uploaded
Oct 9, 2026
Downloads
29
Size
6.5 MB
Flavors
Retail
File ID
9110171
Type
R
Release
Supported game versions
  • 12.1.0

What's new

tag 60f9ede2d8a0741ec9c62033cd99ad051802edea 1.6.0-release
Author:    Tushar Saxena <tushar.saxena@gmail.com>
Date:    Fri Oct 9 19:24:46 2026 +0530

Release 1.6.0

commit be920e343feec7e33b1d7633befd9b77d6b30a1e
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 9 19:24:46 2026 +0530

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

    Release gate (docs/automated-tests/20261009-191829/manifest.json, run at
    22838c3 with --release 1.6.0): PASSED on all six conditions.
    - Lint: pass, 0 warnings / 0 errors in 59 files
    - Tests: pass, 933 passed, 0 failed, 1 skipped (kit diagnostics opt-out
      arm, not applicable), 934 total
    - Perf: pass, 8 scenarios measured (tests/perf.lua ships, so no skip)
    - Complexity: pass, lizard 1.24.0; 13733 NLOC, 1829 functions, avg CCN 1.9
    - CCN <= 15: 0 warnings, max CCN 15 (encode in tests/perf.lua, newly
      measured)
    - Sighted: blindFiles 0 (the first sighted run in this record)

    Version 1.5.0 -> 1.6.0 in WhatGroup.toc (## Version), core/WhatGroup.lua
    (WhatGroup.VERSION), the pinned tests (tests/test_envsetup.lua,
    tests/test_launcher.lua, tests/wow_mock.lua) and the sample output in
    docs/slash-dispatch.md. README.md gains the 1.6.0 Version History row
    (2026-10-09): the signed-up role in the popup and chat (with the 260 ->
    280 default height), the Profiles page, /wg profile, the secret teleport
    cooldown fix and the test-preview fixes.

    The release bundle docs/automated-tests/20261009-191829/ carries its
    ANALYSIS.md, and docs/automated-tests/RESULTS.md has the run's row and
    refreshed band dispositions: core/WhatGroup.lua (1340) and
    modules/Frame.lua (1384) are now 2 of 3 Accepted release runs, and
    tests/test_libka0s.lua (1037) newly crossed into the band.
    docs/performance.md's measurement notes and the CLAUDE.md LibKa0s
    provenance line are left as they are.

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

commit 22838c3953e18a64f2389b71d26ad2db1ef689af
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 9 17:49:57 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 fe6eaa3f81eeb7bb75a30b0088c73ea685a512df
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:47:39 2026 +0530

    WG-STD: Re-read the standard at v2.77.0; sync docs with WG-01..WG-07

    Standards reference: WowAddonStandards' feature branch is at v2.77.0.
    documentation-§6 still gives the three-place reference as the bare repo
    URL (TOC X-Standard, README badge, CLAUDE.md Standards compliance), so
    all three stay version-free and unchanged. Every filename-§N citation in
    the live tree (frozen audits/reviews/automated-tests/revendor bundles,
    libs/ and tests/_kit/ excluded) resolves to an existing ### N. heading
    in ../WowAddonStandards/standards/standards/ (877 checked; the one miss
    is CLAUDE.md's literal `filename-§N` placeholder). No retired notation
    found.

    v2.77.0 re-check, events-frames-taint-§8: the named trigger set now
    includes C_Spell.GetSpellCooldown, which this addon reads. The register
    row said a sweep found zero trigger-set APIs; it is re-swept against the
    v2.77.0 list and rewritten: one trigger-set API, read only through
    LibKa0s-Compat-1.0 in core/Compat.lua, and every site its startTime /
    duration reach meets the MUST (IsSecret before any compare, nil on a
    secret pair; the raw pair only to Cooldown:SetCooldown and to the
    diagnostics seam behind out:readable). Trigger (1) restated as a value
    reaching a line or string builder without passing Compat.IsSecret. The
    row's stale core/WhatGroup.lua:896/:904/:912 cites become symbol cites
    (WhatGroup:ShowNotification, NOTIFY_ROWS). Cites F-001 and F-008 of
    docs/reviews/2026-10-07/.

    toc-file-§5 whole-listing re-read: every group is annotated; two TOC
    comment cites had drifted one line (core/WhatGroup.lua:108, :220) and
    now cite ADDON_LINK_TYPE and the file-scope NS.FONT_MONO assignment.

    Docs sync of WG-01..WG-07:
    - docs/ARCHITECTURE.md: taint-notes bullet for the secret teleport
      cooldown pair; the Compat major's description names IsSecret; the
      1500-line census re-measured 2026-10-07 (Frame.lua 1384,
      WhatGroup.lua 1340).
    - tests/test_surface_parity.lua: IsSecret leaves the Compat ignore list
      (WG-01 wired it, so parity now pins it on the library-absent load)
      and the comment no longer says nothing here is combat-protected.
    - docs/testing.md: the --list Totals counts only cases that run, a
      declared skip on its own Skipped row (kit revision 38).
    - README.md: the preview FAQ says a test preview leaves the real group
      info for /wg show (WG-02's one-shot preview).
    - CLAUDE.md: the newest audit snapshot is docs/audits/2026-10-07/.
    - .luacheckrc and docs/slash-dispatch.md: drifted core/WhatGroup.lua
      line cites (:1100, :353) become symbol cites.
    DEPENDENCIES.md needed no change (WG-06/WG-07 already synced it). Test
    count unchanged (933 passed, 1 skipped); docs/test-cases.md in lockstep
    with --list and equal to the badge. No version bump, no CHANGELOG.

    Deviations: the parity ignore-list edit is a test change in a docs item,
    made because WG-01 left IsSecret ignored with a now-false comment.

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

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

    WG-STD: Re-read the standard at v2.77.0; sync docs with WG-01..WG-07

    Standards reference: WowAddonStandards' feature branch is at v2.77.0.
    documentation-§6 still gives the three-place reference as the bare repo
    URL (TOC X-Standard, README badge, CLAUDE.md Standards compliance), so
    all three stay version-free and unchanged. Every filename-§N citation in
    the live tree (frozen audits/reviews/automated-tests/revendor bundles,
    libs/ and tests/_kit/ excluded) resolves to an existing ### N. heading
    in ../WowAddonStandards/standards/standards/ (877 checked; the one miss
    is CLAUDE.md's literal `filename-§N` placeholder). No retired notation
    found.

    v2.77.0 re-check, events-frames-taint-§8: the named trigger set now
    includes C_Spell.GetSpellCooldown, which this addon reads. The register
    row said a sweep found zero trigger-set APIs; it is re-swept against the
    v2.77.0 list and rewritten: one trigger-set API, read only through
    LibKa0s-Compat-1.0 in core/Compat.lua, and every site its startTime /
    duration reach meets the MUST (IsSecret before any compare, nil on a
    secret pair; the raw pair only to Cooldown:SetCooldown and to the
    diagnostics seam behind out:readable). Trigger (1) restated as a value
    reaching a line or string builder without passing Compat.IsSecret. The
    row's stale core/WhatGroup.lua:896/:904/:912 cites become symbol cites
    (WhatGroup:ShowNotification, NOTIFY_ROWS). Cites F-001 and F-008 of
    docs/reviews/2026-10-07/.

    toc-file-§5 whole-listing re-read: every group is annotated; two TOC
    comment cites had drifted one line (core/WhatGroup.lua:108, :220) and
    now cite ADDON_LINK_TYPE and the file-scope NS.FONT_MONO assignment.

    Docs sync of WG-01..WG-07:
    - docs/ARCHITECTURE.md: taint-notes bullet for the secret teleport
      cooldown pair; the Compat major's description names IsSecret; the
      1500-line census re-measured 2026-10-07 (Frame.lua 1384,
      WhatGroup.lua 1340).
    - tests/test_surface_parity.lua: IsSecret leaves the Compat ignore list
      (WG-01 wired it, so parity now pins it on the library-absent load)
      and the comment no longer says nothing here is combat-protected.
    - docs/testing.md: the --list Totals counts only cases that run, a
      declared skip on its own Skipped row (kit revision 38).
    - README.md: the preview FAQ says a test preview leaves the real group
      info for /wg show (WG-02's one-shot preview).
    - CLAUDE.md: the newest audit snapshot is docs/audits/2026-10-07/.
    - .luacheckrc and docs/slash-dispatch.md: drifted core/WhatGroup.lua
      line cites (:1100, :353) become symbol cites.
    DEPENDENCIES.md needed no change (WG-06/WG-07 already synced it). Test
    count unchanged (933 passed, 1 skipped); docs/test-cases.md in lockstep
    with --list and equal to the badge. No version bump, no CHANGELOG.

    Deviations: the parity ignore-list edit is a test change in a docs item,
    made because WG-01 left IsSecret ignored with a now-false comment.

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

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

    WG-07: Drop the dead bare-global GetAddOnMetadata rung from NS.Meta

    Cluster C27 parity with LK-06, MM-07 and PM-09 (no finding id of its
    own). The library-absent branch of core/EnvSetup.lua NS.Meta kept a
    `type(GetAddOnMetadata) == "function"` rung below C_AddOns that no
    admitted client (## Interface 120100, after the 11.0 AddOns purge) can
    reach. Meta now answers Env first, then C_AddOns.GetAddOnMetadata, else
    nil; its doc comment describes the two-rung ladder. No Compat shim.

    - tests/test_envsetup.lua: new "Meta never reads the bare
      GetAddOnMetadata global" (Env and C_AddOns absent, a recording spy
      planted as the global; asserts zero calls and nil; red under the
      bare-global rung) and a source-shape probe that core/EnvSetup.lua
      carries no bare-global rung. Both were red before the deletion.
    - .luacheckrc: GetAddOnMetadata leaves read_globals (nothing reads it
      bare any more; luacheck 0/0).
    - docs/module-map.md: the two ladder descriptions name two rungs.
    - docs/test-cases.md regenerated, README badge 931 -> 933.

    Deviations: the item cites the :109-:110 probe for updating; that probe
    scans settings/Slash.lua and settings/Panel.lua for inline copies and
    stays valid as is, so the rung-gone assertion is a separate case over
    core/EnvSetup.lua. docs/compat-layer.md does not describe the rungs, so
    the ladder wording was updated in docs/module-map.md instead.
    tests/wow_mock.lua keeps its C_AddOns member, untouched.

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

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

    WG-06: Sync docs and comments with the tree; count-free, durable cites

    One comment/doc-only sync pass (finding WG-A-03, audit WG-77, reopened):

    - core/Compat.lua header and docs/compat-layer.md state the real TOC slot
      (after CoreSetup, MediaSetup and Util, before core/WhatGroup.lua)
      instead of "loaded first".
    - docs/compat-layer.md quotes the standard's documentation-§3 grep
      (grep -cE '^\s*function\s+[A-Za-z_][A-Za-z0-9_]*\.' core/Compat.lua),
      which answers 9, the three role shims included; the shim table gains
      RoleToken, AssignedRole and RoleIconMarkup. docs/ARCHITECTURE.md's
      documentation-map row says nine and cites the same grep.
    - docs/module-map.md drops the expired performance-§12 exemption wording
      for performance.md (the exemption ended 2026-08-06).
    - Settings row counts (19/16/11/8, Master/Chat/Popup) become count-free
      in docs/ARCHITECTURE.md (## Settings Schema, schema CLI row) and in the
      module-map Schema.lua row.
    - .luacheckrc and DEPENDENCIES.md cite loader functions by name (build
      in tests/loader.lua; Loader.load / Loader.loadSource in the kit loader)
      and WhatGroup:OnCombatStateChanged instead of ':707'.
    - .pkgmeta screenshot note is count/size-free and says the media/logos
      lines also shape the download.

    Deviations: also fixed the same drift class outside the cited sites,
    because it was false against the tree: docs/profiles.md and
    docs/schema.md said "sixteen" profile rows (now 17) and "six
    notify.show*" (now 7), made count-free; modules/Frame.lua:589 (now the
    cooldownTimer arm in applyTeleportNote) in ARCHITECTURE.md,
    module-map.md and frame.md, core/WhatGroup.lua:381 (registerFeatureEvents)
    and core/Compat.lua:79-84 (Compat.GetSpellLink) in ARCHITECTURE.md were
    converted to symbol citations (documentation-§6). DEPENDENCIES.md's
    tests/_kit/loader.lua line cites were correct but converted too, so the
    item's 'loader.lua:[0-9]' verify grep is empty. docs/performance.md's
    generated sweep table still carries line numbers; left to its own
    regeneration.

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

commit d65f65ab12d1f8afcadcefd2dad2865923ea1313
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:29:08 2026 +0530

    WG-05: Re-measure perf rows; record the bisected showFrameRepeat move

    tests/perf.lua re-run on the remediation branch after WG-01/WG-02 (WG-R-06).
    docs/performance.md now carries today's figures, dated "Re-measured 2026-10-07":
    - combatGateFlipping bytes/iter 1064.1 -> 960.0
    - showFrameRepeat api/iter 18.0 -> 19.0 (bytes/iter 1744.5 -> 1744.2, same row)

    The 18.0 -> 19.0 api/iter move was bisected before being explained: git bisect
    run over tests/perf.lua between 62ff31e (the 2026-09-24 measurement commit) and
    HEAD, in a throwaway detached worktree under /tmp (removed and pruned after).
    First bad commit: WhatGroup@2ed2aa5 (GI-WG-01, WhatGroup#1), whose popup Role
    row adds one fields.role:SetText to every PopulateFields. The cause sentence
    sits beside the row. The combatGateFlipping byte drop was not bisected (the
    item asks only for the api move) and is recorded as a re-measure only.

    The intro paragraph gains one sentence saying rows marked Re-measured replace
    their earlier figures. No code change.

    Deviations: the showFrameRepeat bytes/iter cell was also refreshed (1744.5 ->
    1744.2) so the whole row matches today's run.

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

commit bd0807f632292d608455bdd2667ee83acb7e9188
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:25:32 2026 +0530

    WG-04: Size tooltips and Frame.lua comment stop restating defaults

    The Popup > Layout Height tooltip said "The default 260 is the size the
    popup shipped at" while defaults/Profile.lua ships 280. Both size
    tooltips now read "<Width|Height> of the group-info popup, in pixels."
    with no figure (the slider already shows the value), and the
    modules/Frame.lua size comment now says the shipped defaults live in
    defaults/Profile.lua (C.frame.width / C.frame.height) instead of
    claiming they ARE 420 / 260.

    New test pins that neither size tooltip states a number (red before,
    green after). docs/test-cases.md regenerated; README badge 931/931.
    No locale tables carry the string; no behaviour change.

    Finding: WG-R-05 (review F-005).
    Deviations: the Width tooltip restated 420 the same way and is fixed
    identically, as the item allows.

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

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

    WG-03: Route the stand-down's owed-Hide registration through the helper

    NS.StandDown's transient PLAYER_REGEN_ENABLED registration (owed a
    protected Hide when the addon is switched off in combat) was the one bare
    self:RegisterEvent left in the addon. It now goes through
    NS.SafeRegisterEvent(self, "PLAYER_REGEN_ENABLED", "OnDisabledCombatEnded",
    NS.RejectedEvents), so every registration is pcalled
    (events-frames-taint-§1) and docs/ARCHITECTURE.md's "never a bare
    self:RegisterEvent" claim is true.

    tests/test_disabled.lua gains a pin using the kit mock's __badEvents: with
    PLAYER_REGEN_ENABLED refused after enable, Set('enabled', false) in combat
    with an owed Hide completes the stand-down without raising, leaves nothing
    registered, keeps the popup at alpha 0, and records the name once in
    NS.RejectedEvents. Red first against the bare call
    ("core/WhatGroup.lua:437: Attempt to register unknown event").

    Ripples: the NS.RejectedEvents and CoreSetup comments that named
    registerFeatureEvents as the sole caller now name both callers;
    ARCHITECTURE.md's event paragraph covers the transient registration;
    docs/test-cases.md regenerated and README badge 929 -> 930.

    Finding: WG-A-01.

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

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

    WG-02: address review — a preview the gate hides is dropped, not withheld

    applyVisibility's gate-hide branch set gateWithheld for a one-shot preview
    just as for a real show. In a fight the soft hide fires no OnHide; the real
    Hide that settles it at PLAYER_REGEN_ENABLED ran endPreview (refilling the
    fields from pendingInfo) and the restored gateWithheld then let the re-show
    arm open the REAL capture the player never asked to see. The branch now
    captures previewInfo before the hide and, when the hide took a one-shot
    preview down, ends the preview instead of withholding it, matching
    declineShow. Test mode keeps its bypass.

    Tests: two test_testmode cases (outOfCombat + pending capture: RunTest,
    REGEN_DISABLED, REGEN_ENABLED leaves the popup down and nothing withheld;
    the same with no capture leaves gateWithheld false), both red before the
    fix. docs/frame.md One-shot preview names the combat-edge hide too;
    docs/test-cases.md regenerated; badge 929/929.

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

commit 5f5f617cc3d794e75f406bffad3c4a3f88030cea
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:13:47 2026 +0530

    WG-02: RunTest previews without clobbering pendingInfo or building stood-down

    RunTest (/wg test notify and the panel's Test button) no longer writes
    self.pendingInfo. It hands the sample to ShowNotification(info) (new
    optional argument, defaulting to pendingInfo) and to ShowFrame(preview)
    (new optional argument), which holds it in modules/Frame.lua's existing
    previewInfo and renders it through shownInfo() as a one-shot preview.
    endPreview() ends it on every real hide (OnHide), on the player's dismissal
    (dismissPopup, covering the combat soft hide), on the next ShowFrame and
    at stand-down, refilling the fields from the real capture out of combat.
    So /wg show, the chat details link and the launcher's Show window open the
    real capture (or nothing) afterwards. A preview asked for in combat is
    replayed as the preview at combat end; one the visibility gate declines is
    dropped, never withheld for the re-show arm (the decline branch moved into
    declineShow to keep ShowFrame inside CCN 15). The gate's test-mode bypass
    and FrameSnapshot.testMode now read NS.State.testMode, since previewInfo
    is no longer test mode's alone. Test mode's own record is untouched.

    While stood down RunTest prints the chat preview only and calls no
    ShowFrame: no popup, secure button or UISpecialFrames proxy is built and
    nothing is gate-withheld, so re-enabling no longer shows the sample unasked.

    core/WhatGroup.lua reloadProfile: comment-only rewording (idempotent,
    normally a no-op once the account-wide stamp is current; profile-scoped
    steps walk every stored profile). Database.lua unchanged.

    Tests: three new test_testmode cases (preview keeps the real capture and
    /wg show reopens it; ESC + launcher Show window; combat defer replays the
    preview), the stood-down lifecycle case rewritten (chat preview, no frame,
    pendingInfo nil, nothing shown after re-enable), and the lifecycle, panel,
    testmode and debuglog assertions that read the sample from pendingInfo
    updated. Docs: common-tasks, slash-dispatch, frame (new One-shot preview
    section), data-flow, ARCHITECTURE, scope and debug.md (the [Test] line
    now reads "synthetic capture previewed"). module-map.md makes no injection
    claim and is unchanged. docs/test-cases.md regenerated; badge 927/927.

    Findings: WG-R-03, WG-R-04, WG-R-07.
    Deviation: the [Test] debug line was reworded from "injected" to
    "previewed" (and its pin test renamed) because nothing is injected now.

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

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

    WG-01: survive secret teleport cooldowns: unknown, not a raise

    Compat.GetSpellCooldownRemaining compared and subtracted startTime and
    duration, which LibKa0s-Compat-1.0 documents as possibly secret in
    combat. A raise there killed the popup's repeating ticker (AceTimer
    re-arms only after the callback returns) and aborted ShowNotification
    before ShowFrame on a join in combat.

    - core/Compat.lua: add Compat.IsSecret (the library's IsSecret, else
      the three-line issecretvalue stub per anti-patterns #47). The reader
      now answers `remaining, isActive`; a secret start or duration returns
      nil, isActive (unknown) with no compare or arithmetic, never 0 (0
      would report an on-cooldown teleport as READY). Plain readings keep
      the old contract (number >= 0, GCD floor). GetSpellCooldownTimes'
      comment records that a secret pair goes to Cooldown:SetCooldown as-is.
    - core/WhatGroup.lua teleportValue: '(on cooldown)' when remaining > 0,
      or remaining is nil and isActive; no tag when unknown and inactive.
    - modules/Frame.lua: resolveTeleportState derives onCooldown the same
      way; the button, swipe, note and debug line read it. An unknown
      active cooldown renders "On cooldown" with no figure; the ticker
      keeps its last text and stays armed on a nil tick.
    - modules/Diagnostics.lua: header comment names the new guard.
    - .luacheckrc: grant issecretvalue (read only by the stub).
    - Tests on the kit's secret simulator (kit revision 38):
      mock.secretCooldown seeds a cooldown table whose startTime/duration
      are Kit.secret wrappers and isActive is plain; T.installSecretValue /
      T.isSecret exposed from tests/run.lua; every case restores
      issecretvalue. Ten new cases (compat x5, frame x3, notify x2); the
      seven that touch the reader were confirmed red against the unguarded
      compare.
    - Docs: secret-arm notes in compat-layer.md and module-map.md, plus
      frame.md and data-flow.md where they stated the old contract. Rolled
      line cites the edits moved (Frame.lua:587->589, WhatGroup.lua
      887/895/903/1018/1091 -> +9, Compat.lua:68-73 -> 79-84).
      docs/test-cases.md regenerated; README badge 914 -> 924.

    Findings: WG-R-01 (verified remediation: nil+isActive, not 0,false),
    WG-R-02 (built on the kit simulator, no local mock.secret).

    Deviation: the GetSpellCooldown mock already returns any seeded table,
    so it gained a helper (mock.secretCooldown) rather than a new mode.

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

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

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

    Copy libs/LibKa0s/ and tests/_kit/ whole from the local annotated tag
    v1.71.0 (cb274a4) and roll the CLAUDE.md provenance line to v1.71.0 in
    the same commit. Minors: Env 2, Slash 20, SlashParse 2, OptionsIdList 4,
    WidgetsLineChart 3, WidgetsAutocomplete 2; kit revision 37 -> 38
    (inventory.lua, new secrets.lua).

    Kit 38's --list Totals count only the cases that run: docs/test-cases.md
    is regenerated (diagnostics contract 9 -> 8, a Skipped row, Total 914).
    The README badge already read 914, so it equals the new Total and does
    not change.

    Write docs/revendor/2026-10-07-v1.71.0/ (delta, candidates, decisions,
    summary; Kit.secret recorded as adopted in this run by WG-01, Widgets
    surfaces not adopted, Env/Slash/OptionsIdList carried with no code
    change) and the span bundle docs/revendor/2026-10-07-v1.69.0-v1.70.0/
    for the sweep re-vendors 9677d99 and 3fd8a2f (base v1.68.1). The
    AUDIT.md tag-vs-recorded loop now prints nothing.

    De-tag the stale v1.68.1 stamps: docs/testing.md's "as this is written"
    paragraph, docs/debug.md and docs/debug-content.md now point at the
    CLAUDE.md provenance line and keep only the DebugLog minors.

    Finding: WG-A-02 (audit WG-71).

    Deviations: none in substance. The README badge needed no edit (already
    914). The span bundle's line 1 uses the verified remediation's form
    ('Delta: LibKa0s v1.69.0 -> v1.70.0 (span: v1.69.0 v1.70.0)'), not the
    raw audit's v1.68.1 base form; the base is stated in the body.

    Gates: lua tests/run.lua 914 passed / 0 failed / 1 skipped (vendor gate
    green); luacheck 0/0 in 59 files; lizard no function above CCN 15;
    largest authored file 1319 lines; diff -r of both payloads vs the tag
    empty.

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

commit 0f7afcbabb84b21818b5469e43e6f8eb331f336a
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 16:52:03 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 3fd8a2f356f4fde6fdfbe174fe4c24bdbc57901b
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 11:39:17 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 3fd8a2f356f4fde6fdfbe174fe4c24bdbc57901b
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 11:39:17 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 9677d990f98cfe618afbef61c21de1267ad95dd9
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Oct 6 14:53:44 2026 +0530

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

    Also lists WidgetsLineChart.lua in tests/loader.lua to match LibKa0s.xml.

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

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

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

    Whole-folder copy of libs/LibKa0s/ and tests/_kit/ from the annotated tag v1.68.1 (9000cbd) via
    git archive, CLAUDE.md provenance line rolled v1.68.0 -> v1.68.1 in the same commit. No LibStub
    minor moves in any of the 32 library files; the library payload was already byte-identical to the
    tag. Kit revision 35 -> 36: framework.lua (Kit.VERSION), run-automated-tests.sh and test_eol.lua
    name the /dev-copilot:* commands where they named /wow-addon:*. Nothing added, nothing deleted.
    Vendor parity: diff -r of both payloads against the tag is empty, with and without
    --strip-trailing-cr.

    Live vendor stamps roll to v1.68.1 (debug.md, debug-content.md, testing.md's "the two agree"
    paragraph). No live prose named the vendored kit as revision 35; the three "kit revision 35"
    mentions cite where the sighted complexity shadow arrived and stay. docs/test-cases.md matches
    --list: no case moved.

    Frozen bundle docs/revendor/2026-10-04-v1.68.1/ (delta, candidates, decisions, summary). No
    contract blocker (no major moved). Zero adoption candidates, so no interview; nothing adopted,
    nothing declined, no issue filed.

    Gates (ka0s-bounded):
    - tests: before 914 passed / 0 failed / 1 skipped / 915 total; after 914 / 0 / 1 / 915
    - luacheck: 0 warnings / 0 errors in 59 files

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

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

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

    Whole-folder copy of libs/LibKa0s/ and tests/_kit/ from the annotated tag v1.68.1 (9000cbd) via
    git archive, CLAUDE.md provenance line rolled v1.68.0 -> v1.68.1 in the same commit. No LibStub
    minor moves in any of the 32 library files; the library payload was already byte-identical to the
    tag. Kit revision 35 -> 36: framework.lua (Kit.VERSION), run-automated-tests.sh and test_eol.lua
    name the /dev-copilot:* commands where they named /wow-addon:*. Nothing added, nothing deleted.
    Vendor parity: diff -r of both payloads against the tag is empty, with and without
    --strip-trailing-cr.

    Live vendor stamps roll to v1.68.1 (debug.md, debug-content.md, testing.md's "the two agree"
    paragraph). No live prose named the vendored kit as revision 35; the three "kit revision 35"
    mentions cite where the sighted complexity shadow arrived and stay. docs/test-cases.md matches
    --list: no case moved.

    Frozen bundle docs/revendor/2026-10-04-v1.68.1/ (delta, candidates, decisions, summary). No
    contract blocker (no major moved). Zero adoption candidates, so no interview; nothing adopted,
    nothing declined, no issue filed.

    Gates (ka0s-bounded):
    - tests: before 914 passed / 0 failed / 1 skipped / 915 total; after 914 / 0 / 1 / 915
    - luacheck: 0 warnings / 0 errors in 59 files

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

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

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

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

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

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

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

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

    DC-REN-01: point slash-command references at the dev-copilot plugin

    The wow-addon plugin merged into dev-copilot (v2.0.0). Live docs and
    test comments now name /dev-copilot:* (wow-* for the addon-only
    commands). No assertion changed.

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

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

    SD-FIN-01: sync docs; CLAUDE.md back to the documentation-§2 stub

    CLAUDE.md 115 -> 46 lines, pointing at the 2026-09-23 audit; kit suite count five; badge rule wording; slash-dispatch citations past EOF fixed; cap census; MASTER_GROUP cited by name.

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

commit ea4bff6dae18e42a389d3aa7e564d09a9ff3a3f7
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 23:38:29 2026 +0530

    TP-WG-01: re-vendor LibKa0s v1.68.0 (WidgetsDragHandle minor 4)

    Both payloads copied whole from the local tag v1.68.0 (cc9f5eb); only
    libs/LibKa0s/WidgetsDragHandle.lua moves (DRAG_MINOR 3 -> 4, Widgets key
    12.1.4), kit revision 35 unchanged. The provenance line rolls to v1.68.0
    in the same commit, with the "as vendored from" stamps in docs/debug.md,
    docs/debug-content.md and docs/testing.md.

    The new optional tooltipPlace hook is declined as not applicable:
    WhatGroup draws no 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: 914 passed / 1 skipped / 915 (vendor-sync green, inventory and
    badge unchanged), luacheck 0/0 in 59 files, sighted lizard max CCN 15.

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

commit ea4bff6dae18e42a389d3aa7e564d09a9ff3a3f7
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 23:38:29 2026 +0530

    TP-WG-01: re-vendor LibKa0s v1.68.0 (WidgetsDragHandle minor 4)

    Both payloads copied whole from the local tag v1.68.0 (cc9f5eb); only
    libs/LibKa0s/WidgetsDragHandle.lua moves (DRAG_MINOR 3 -> 4, Widgets key
    12.1.4), kit revision 35 unchanged. The provenance line rolls to v1.68.0
    in the same commit, with the "as vendored from" stamps in docs/debug.md,
    docs/debug-content.md and docs/testing.md.

    The new optional tooltipPlace hook is declined as not applicable:
    WhatGroup draws no 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: 914 passed / 1 skipped / 915 (vendor-sync green, inventory and
    badge unchanged), luacheck 0/0 in 59 files, sighted lizard max CCN 15.

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

commit be87bc9f1e249c19af58d3c70ede2664cffcb2f6
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 10:25:09 2026 +0530

    CA-FIN-02: doc sync before merge

    module-map.md: OptionsSetup descriptor lists addonName; addonName header count now nine/twelve. testing.md: test_libka0s pins three folder-name arguments, not two.

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

commit be87bc9f1e249c19af58d3c70ede2664cffcb2f6
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 10:25:09 2026 +0530

    CA-FIN-02: doc sync before merge

    module-map.md: OptionsSetup descriptor lists addonName; addonName header count now nine/twelve. testing.md: test_libka0s pins three folder-name arguments, not two.

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

commit 1b1b67e3b128804e41d66b83ed81e86cc7c7d1e9
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 01:47:13 2026 +0530

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

    settings/OptionsSetup.lua keeps its first vararg as `addonName` and hands
    it to lib:New beside parentTitle/mainPanelName, so the IdList help-mark art
    resolves to this addon's vendored info glyph instead of the client disc.
    Latent here: no list in this addon carries help yet. The degraded
    (library-absent) branch is untouched.

    Test first: tests/test_libka0s.lua source guard on the vararg and the
    descriptor field, plus an on-disk assert for libs/LibKa0s/media/icons/info.tga.
    Docs: test-cases.md regenerated (915), README badge 914/914, PANEL-20 smoke
    check with its index range and Pending sign-off row, and the three
    OptionsSetup.lua citations that moved by three lines (TOC, performance.md,
    slash-dispatch.md).

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

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

    CA-WG-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 (git archive, 0bccf4c; ../LibKa0s HEAD is
    the tag's commit, tree clean); CLAUDE.md provenance rolls v1.66.0 -> v1.67.0 in the same commit.
    Three library files move: Core 9 -> 10 (MakeResizable canResize / onResizeStop / gripParent),
    Options 27 -> 28 (addonName docblock), OptionsIdList 2 -> 3 (loaded-addon guard on the help art).
    The kit is byte-identical (revision 35). Nothing added or removed upstream, nothing to delete.
    Vendor parity: diff -r against the tag archive and diff -r --strip-trailing-cr against
    ../LibKa0s/LibKa0s are empty.

    No consumer test broke: WhatGroup calls neither MakeResizable nor O.IdList. Live stamps rolled:
    docs/testing.md's provenance tag and the "as vendored from" lines in docs/debug.md and
    docs/debug-content.md. Frozen bundle docs/revendor/2026-10-02-v1.67.0/ (01_DELTA, 02_CANDIDATES,
    05_SUMMARY): addonName goes to CA-WG-NM; Core 10's grip fields have no consumer here.

    Gate: tests 913 passed / 1 skipped / 914 before and after (docs/test-cases.md regenerated, no
    diff; README badge unchanged); luacheck 0/0 in 59 files; sighted complexity pass, maxCcn 15,
    blindFiles 0, 1791 functions (run bundle not kept).

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

commit c3f0fa3e49e9211735b7057897fd013d487bc944
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 00:40:58 2026 +0530

    Re-point 11 stale line citations in comments

    Five moved with the Role row (GI-WG-01): the TOC's core/WhatGroup.lua:108 and :220 and
    settings/Schema.lua:418, .luacheckrc's Schema.lua:275, DebugLogSetup's WhatGroup.lua:190. Six were
    already stale: WhatGroup.lua:1091, DebugLogSetup.lua:142 (twice), OptionsSetup.lua:187,
    tests/run.lua:97 and tests/loader.lua:129. Each now lands on the line it describes. Comment only.

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

commit c3f0fa3e49e9211735b7057897fd013d487bc944
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 00:40:58 2026 +0530

    Re-point 11 stale line citations in comments

    Five moved with the Role row (GI-WG-01): the TOC's core/WhatGroup.lua:108 and :220 and
    settings/Schema.lua:418, .luacheckrc's Schema.lua:275, DebugLogSetup's WhatGroup.lua:190. Six were
    already stale: WhatGroup.lua:1091, DebugLogSetup.lua:142 (twice), OptionsSetup.lua:187,
    tests/run.lua:97 and tests/loader.lua:129. Each now lands on the line it describes. Comment only.

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

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

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

    POPUP-9, TEST-12 and LFG-5..8 (WhatGroup#1, the Role row) passed in the owner's 2026-10-02
    client run and leave Pending sign-off; PANEL-7/8 now expect the 280px default height. Doc sync
    re-points core/WhatGroup.lua and core/Compat.lua line citations in performance.md,
    ARCHITECTURE.md and slash-dispatch.md.

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

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

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

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

    POPUP-9, TEST-12 and LFG-5..8 (WhatGroup#1, the Role row) passed in the owner's 2026-10-02
    client run and leave Pending sign-off; PANEL-7/8 now expect the 280px default height. Doc sync
    re-points core/WhatGroup.lua and core/Compat.lua line citations in performance.md,
    ARCHITECTURE.md and slash-dispatch.md.

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

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

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

    GI-WG-01R: move dropApplication's header comment back above dropApplication

    The stampInviteRole and carryRole helpers were inserted between
    dropApplication's "Clear BOTH sides" comment and the function, so the
    comment described stampInviteRole. Comment-only move, CRLF kept.
    Suite totals unchanged: 913 passed / 0 failed / 1 skipped before and after.

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

commit 2c0fecb325198f3a202180efd828d732b4ad54a1
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 14:10:44 2026 +0530

    GI-WG-RVR: point the release complexity step at the kit runner, not raw lizard

    docs/common-tasks.md's release step and docs/automated-tests/README.md's
    gate table still named the raw `lizard -l lua ...` command, which is blind
    in Lua and not the gate. Both now name
    `bash tests/_kit/run-automated-tests.sh --suite complexity` (sighted shadow,
    -L 1500, function-count parity) and the tag condition blindFiles 0, matching
    docs/testing.md and DEPENDENCIES.md. Docs only; suite totals unchanged
    (913 passed, 0 failed, 1 skipped, 914 total).

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

commit 2ed2aa573faa909d4b63375030f3b0d3029f65ac
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 14:05:42 2026 +0530

    GI-WG-01: show the signed-up role in the popup and (toggle) chat (#1)

    Role capture, most authoritative first (Labels.GetRoleLabel): the leader-assigned role
    (NS.Compat.AssignedRole, UnitGroupRolesAssigned("player"), nil for NONE), then the role the
    application carries (GetApplicationInfo's 5th return or res.role; ResolveSearchResultID now
    returns (resultID, role); stamped onto the paired capture at "invited" and read again on the
    fresh capture at "inviteaccepted", where the fresh role wins only when it has one), then the
    roles offered at apply time (the ApplyToGroup hook now reads tankOK/healerOK/damageOK into
    captured.appliedRoles, joined " / "). Each token renders as Blizzard's TANK/HEALER/DAMAGER with
    the tiny role icon (NS.Compat.RoleIconMarkup over CreateAtlasMarkup). Secret-safe: client values
    only reach type() and NS.SafeToString (NS.Compat.RoleToken) before any comparison or lookup.

    Popup: a Role row after Leader, always drawn, dim em-dash when unknown or with no capture;
    Playstyle re-anchors to it, the teleport label and button follow. Chat: a Role row after Leader
    behind notify.showRole (default on, omitWhenNil). Schema row notify.showRole (Chat > Text, last
    so the six toggles keep their pairs), NS.C default, "Role:" locale string, SampleInfo role
    DAMAGER for test mode. /wg diagnostics prints role=<5th return> per client application so the
    undocumented position can be checked in game. The "invited" arm is no longer empty, so its
    `luacheck: ignore 542` pragma is gone (.luacheckrc, test_lintconfig and testing.md comments).

    Deviation from 02a: popup height default 260 -> 280, not 278: frame.height's slider has step 10,
    and 278 would be a default the slider cannot reach. Clamp range unchanged.

    Tests first (red against the previous code: 34 failures incl. the re-indexed popup fields):
    test_capture (+8), test_labels (+6), test_notify (+5), test_frame (+4; fields helper re-indexed
    for the new row; default height 280), test_settings (+2; Chat tab 8 -> 9 rows; default height
    280), test_diagnostics (+1). Mock: UnitGroupRolesAssigned, CreateAtlasMarkup, TANK/HEALER/DAMAGER,
    mock.applicationRoles as GetApplicationInfo's 5th return.

    Docs: data-flow.md (role section, hook signature, captured fields, flow), frame.md (row table,
    420x280), compat-layer.md (three role shims), module-map.md, schema.md, settings-panel.md,
    ARCHITECTURE.md, debug.md, scope.md, common-tasks.md, README (feature line, FAQ size, badge),
    smoke-tests.md (LFG-5..LFG-8, TEST-12, POPUP-9; POPUP-1, PANEL and COMBAT expectations updated).

    Tests: 887 passed / 1 skipped / 888 -> 913 / 1 / 914. luacheck 0/0. Sighted complexity: pass,
    maxCcn 15, warnings 0, blindFiles 0 (LFG_LIST_APPLICATION_STATUS_UPDATED CCN 13,
    ResolveSearchResultID 7, carryRole 7). core/WhatGroup.lua 1313 lines, modules/Frame.lua 1319.

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

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

    GI-WG-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 (git archive, e4c5ef7); CLAUDE.md
    provenance rolls v1.65.0 -> v1.66.0 in the same commit. New files: WidgetsReorder.lua,
    SlashParse.lua, PerfSampler.lua, PerfCommands.lua, tests/_kit/lizard_sighted.lua and
    test_lizard_sighted.lua; nothing removed upstream. Minors: Widgets 12, DebugLog 19, Slash 19,
    OptionsWidgets 34, OptionsTabs 8, Perf 14; kit revision 35. Vendor parity: diff -r against the
    tag is empty for both payloads (bytes and --strip-trailing-cr).

    tests/loader.lua names every LibKa0s file, so it gains the four new library files in XML order.
    tests/run.lua declares { name = "test_lizard_sighted", dir = "tests/_kit/" }. No consumer test
    broke; the host parse adapter's two-argument lib.ParseValue call is unchanged by Slash 19.

    CLAUDE.md quotes no raw lizard command; docs/testing.md's suite table and DEPENDENCIES.md's
    evidence line and command block now name `bash tests/_kit/run-automated-tests.sh --suite
    complexity`. docs/debug.md and docs/debug-content.md cite DebugLog minor 19 / version 19.2.1.
    Frozen bundle docs/revendor/2026-10-01-v1.66.0/ (candidates listed, not interviewed: GI-LK-13),
    plus the span bundle 2026-10-01-v1.64.0-v1.65.0/ for the two tags vendored without one.

    Sighted complexity suite: pass, maxCcn 15, warnings 0, blindFiles 0 (1750 functions listed;
    raw lizard listed 1693), bandFiles 3, overCapFiles 0. No newly revealed function above CCN 15.
    The suite's one-suite run bundle was not kept (release bundles are full four-suite runs).

    Tests: 879 passed / 1 skipped / 880 before -> 887 / 1 / 888 after (+8 test_lizard_sighted).
    docs/test-cases.md regenerated; README badge 887/887. luacheck 0/0 in 59 files.

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

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

    DG-WG-01: adopt: docs say which debug lines are the library's; smoke DIAG-31 to DIAG-33

    - docs/debug.md Coverage: a "whose line it is" rule (Debug, Init, Cmd, Lifecycle, the library half
      of Cfg, Launcher and [Set] <path> = <value> are the library's); the [State] row becomes the
      library's [Lifecycle] row; new [Cmd] row; Cfg gains the combat lock's refusals and the park's
      flush line; Launcher's state lines go through the at-enable queue; Migrate lands on the first
      enable; the change-gated lines name the console's gate. DebugLog contract cites 18.2.1 (v1.65.0).
    - docs/debug-content.md tag vocabulary and the library-lines list, docs/common-tasks.md's reading
      guide and docs/module-map.md's DebugErrorOnce and Lifecycle descriptor entries follow.
    - docs/smoke-tests.md: DIAG-31 (a Slash refusal in the console), DIAG-32 (a Lifecycle edge,
      once each, no [State] line), DIAG-33 (the launcher's registration on the first enable), in the
      index, the re-vendor occasion row and Pending sign-off.

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

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

    DG-WG-01: adopt: docs say which debug lines are the library's; smoke DIAG-31 to DIAG-33

    - docs/debug.md Coverage: a "whose line it is" rule (Debug, Init, Cmd, Lifecycle, the library half
      of Cfg, Launcher and [Set] <path> = <value> are the library's); the [State] row becomes the
      library's [Lifecycle] row; new [Cmd] row; Cfg gains the combat lock's refusals and the park's
      flush line; Launcher's state lines go through the at-enable queue; Migrate lands on the first
      enable; the change-gated lines name the console's gate. DebugLog contract cites 18.2.1 (v1.65.0).
    - docs/debug-content.md tag vocabulary and the library-lines list, docs/common-tasks.md's reading
      guide and docs/module-map.md's DebugErrorOnce and Lifecycle descriptor entries follow.
    - docs/smoke-tests.md: DIAG-31 (a Slash refusal in the console), DIAG-32 (a Lifecycle edge,
      once each, no [State] line), DIAG-33 (the launcher's registration on the first enable), in the
      index, the re-vendor occasion row and Pending sign-off.

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

commit 0428c13aeb02958a5546630a074f5b3bb6bce8d6
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 01:07:00 2026 +0530

    DG-WG-01: adopt the library's debug lines: Slash and Lifecycle take the sink, the console's change gate and at-enable queue replace the host's own

    - settings/Slash.lua and core/LifecycleSetup.lua pass `debug` (Slash minor 18, Lifecycle minor 3);
      Options and Launcher already did. core/LauncherSetup.lua passes `debugAtEnable`, so Register's
      state lines land the first time logging is turned on.
    - core/WhatGroup.lua drops its own [State] stand-down / stand-up lines: the library's
      [Lifecycle] line is the edge now, one line, not two.
    - NS.DebugErrorOnce keeps its call sites and its key but its memory is D.DebugOnce's; the
      teleport state line in modules/Frame.lua is D.DebugChanged under one key, re-armed per show by
      D.DebugForget (the gated line gains an " on cooldown" suffix, since the gate compares the line
      it writes). Both are re-armed by Clear and by turning logging on, which the copies never were.
    - core/Database.lua's [Migrate] line goes through D.DebugAtEnable: the login run is at
      OnInitialize with the flag off, so it never landed before.
    - tests/test_library_lines.lua (8 cases) pins each library-owned line landing here once; the
      Lifecycle pins in test_debuglog re-pin to the library's line with no host copy; the two [Init]
      cases find the summary after the bracket (the held lines follow it). 879/879.

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

commit fff8fb8fbc8d65fd9b0da6c2384c437326f77f55
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 00:54:45 2026 +0530

    DG-WG-01: re-vendor LibKa0s v1.65.0 (kit 34 unchanged); loader and DebugLog stub carry DebugLogGates

    Whole-folder copy of libs/LibKa0s/ from the local tag v1.65.0 (tests/_kit/ is byte-identical at
    revision 34). CLAUDE.md provenance rolls to v1.65.0 in the same commit. tests/loader.lua loads the
    new DebugLogGates.lua after DebugLogDiagnostics.lua, as LibKa0s.xml does, and the library-absent
    DebugLog stub gains DebugOnce / DebugChanged / DebugForget / DebugAtEnable as no-ops so the
    surface-parity case holds. docs/testing.md's vendor-gate note names v1.65.0.

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

commit a680bcd6d9680be64f6ddb220db01bb695d18c1b
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 21:51:32 2026 +0530

    DL-FIN-01: sync docs (module map names NS.DebugErrorOnce, SchemaSetup in the Settings load order, ten wiring files)

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

commit a680bcd6d9680be64f6ddb220db01bb695d18c1b
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 21:51:32 2026 +0530

    DL-FIN-01: sync docs (module map names NS.DebugErrorOnce, SchemaSetup in the Settings load order, ten wiring files)

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

commit 002e470de9a340f58b878a3a8321a6992e0c9a02
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 21:21:48 2026 +0530

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

    README.md's two numbered lists (the four Group Finder steps under Usage and the Reporting a bug
    steps) become "- " bullets, markers only: the step names (Apply, Join, Teleport, Close it) and the
    "takes four steps" lead-in already carry the order, and nothing cites a step by number. Reporting a
    bug is now exactly documentation-§1 item 9's v2.72.0 fixed body with /wg. tests/test_doc_structure.lua
    pins the bulleted text. No live standards-version stamp to refresh; test count unchanged (871).

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

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

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

    Both payloads copied whole from the moved local tag v1.64.0 (5745222) and
    normalized to .gitattributes: DebugLog 15 -> 17 (the orange Diagnostics link
    in the console's title bar, beside the Debug On/Off toggle) and
    DebugLogDiagnostics 1 -> 2, whose RunDiagnostics() calls SetEnabled(true)
    before it writes when logging is off (standard v2.71.0, debug-logging-§14).
    Kit revision 34 rewrites the contract case to "turns it on for the session"
    and adds the opt-out case (skipped here: WhatGroup 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 are
    versionless by rule.

    tests/test_diagnostics.lua: the chat-line case splits in two, logging off
    (the seam's ON ack, then the report line, flag on afterwards) and logging
    already on (exactly one line).

    docs/debug.md names the link and says a run turns logging on for the
    session (a /reload turns it off); its DebugLog citation moves to version
    17.2, as does debug-content.md's. ARCHITECTURE.md, slash-dispatch.md,
    testing.md and the modules/Diagnostics.lua header comment match. The
    README's Reporting a bug text is the standard's fixed text and is unchanged.
    docs/smoke-tests.md corrects DIAG-19 (was "Ungated, flag untouched", now
    diagnostics turns logging on for the session and /reload turns it off) and
    adds DIAG-30 (the Diagnostics link), both under Pending sign-off.
    docs/test-cases.md regenerated (872 cases, 1 skipped); badge 871/871.

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

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

    DL-WG-02: debug coverage audit and fill against debug-logging v2.70.0 §8/§9

    Diagnosis checklist fills: [State] stand-down/stand-up edges naming the holds; the
    combat-end queue's hold, flush and stand-down drop lines; a change-gated
    [Frame] popup transition line (gate on a combat edge or setting, dismissal,
    stand-down, owed Hide settling); refusals that were silent or chat-only
    (apply/invite/chat link while stood down, notify.enabled off, already notified,
    not in a group yet, autoShow off, /wg show, test mode in combat, size/scale and
    re-anchor in combat, enabled refused); the degraded chat-link route on [Init];
    caught pcall errors once per distinct message through NS.DebugErrorOnce.

    Quiet steady state: the teleport state line is change-gated per show request
    (one open no longer logs it twice); combat edges that change nothing and the
    cooldown ticker are pinned quiet.

    23 new cases in tests/test_debuglog.lua; docs/debug.md gains a Coverage section;
    moved line citations re-pointed; test-cases.md regenerated, badge 869.

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

commit ad86cc45c795d15c1b77edd6ac8b9bc880ea11e1
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 16:02:28 2026 +0530

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

    Both payloads copied whole from the local tag v1.64.0 (git archive), CLAUDE.md
    provenance rolled in the same commit. The new minors (Core 9, DebugLog 15,
    Widgets 11, PerfPanel 6) make the console and copy windows resizable; nothing is
    adopted and no test fallout arose (846/846, luacheck 0/0). The three-place
    standards reference is unversioned by rule, so it needs no v2.70.0 edit.

    Docs: DebugLog citations move to minor 15 / version 15.1, testing.md names
    v1.64.0, and smoke-tests.md gains DIAG-25 to DIAG-29 (console grip, minimum,
    session-only size, copy window, another addon's console) in the debug-console
    theme; no perf panel check, as Perf is declined here.

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

commit f29a1d553c6109c64293bdf9623a4f7d23acfcbd
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 08:52:40 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 f29a1d553c6109c64293bdf9623a4f7d23acfcbd
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 08:52:40 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 a65e4de495657206f6c8a558e66024fc23f7c27d
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 08:12:19 2026 +0530

    SP-FIN-01: refresh four stale line citations in the TOC's load-order notes

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

commit 5b62a2f8e3ffaa14294d4e5cbbcc211a823b30ea
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 01:42:17 2026 +0530

    SP-FIN-01: sync docs (re-point stale line citations, recount the perf sweep, widen the shell-out list)

    - performance.md: the call-site sweep now returns 24 lines across five files (10 prose, 3 the
      SafeRegisterEvent seam, 11 call sites in 10 rows); ApplyToGroup/SetItemRef/EventRegistry rows
      re-pointed to core/WhatGroup.lua:69/:128/:119.
    - modules/Frame.lua:524 -> :515 (the teleport countdown timer) in ARCHITECTURE, frame, module-map
      and performance.
    - DEPENDENCIES.md: tests/loader.lua setfenv at :120, docs/testing.md ranges re-pointed, the
      ls -A listing now cited in tests/_kit/inventory.lua, and every other git/sh shell-out named.
    - slash-dispatch.md: OptionsSetup RestoreAllDefaults override span is :308-324.
    - debug.md / debug-content.md: DebugLog minor 14 is unchanged in the vendored v1.63.0.
    - CLAUDE.md: the topic list names profiles, stand-down, compat layer, diagnostics and performance.

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

commit ce1ba1100fdd0702944daa703da20da8c53f57c8
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 22:39:25 2026 +0530

    SP-WG-03R: put COMBAT-10 and COMBAT-11 back in the release pass

    The old pre-release checklist ran section 3.8 "in both directions".
    The rewrite mapped that item to COMBAT-9 only, dropping the Only in
    combat direction (COMBAT-10) and the no-capture combat edge
    (COMBAT-11) from the release pass. List COMBAT-9 to COMBAT-11.

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

commit 07597828f750f886f18b0ac86bdd7154a198f4c1
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 22:25:37 2026 +0530

    SP-WG-03R: correct six expectations against the code; pending lists every unsigned check

    Review defects:
    - PROFILE-1 and docs/profiles.md named scope dropdowns AceDBOptions does
      not have; they now name the controls it draws.
    - COMBAT-12: `/wg test notify` in combat prints the join summary before
      ShowFrame's deferred line (WhatGroup:RunTest).

    Re-verified against the code and libs/LibKa0s:
    - STATE-3, STATE-5: a disabled `/wg help` (and the typo's index) prints
      the refusal line under its header (Sl:PrintHelp).
    - DEGRADED setup disables every other Ka0s addon, since LibStub hands
      WhatGroup their LibKa0s copy.
    - DEGRADED-1: the degraded `/wg list` prints the settings-CLI line, not a
      listing. DEGRADED-2 adds the launcher's login notice. DEGRADED-4 names
      the verb each line prints. DEGRADED-5: no console opens without the
      library; the footer Close half stays.

    Pending sign-off follows the clarified S4 rule: every carried-over check
    with no recorded pass, every new PROFILE check and every corrected check.
    DIAG-5 and DIAG-17 to DIAG-24 stay out: the owner passed them on
    2026-09-26 (diagnostics rollout 99_REPORT section 6).

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

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

    SP-WG-03R: restore the in-combat /wg show step and the verbs' [Set] lines

    The review found two old behaviors the rewrite had lost. Old 3.7h ran
    `/wg show` in combat with Only in combat set; COMBAT-10 had dropped that
    step, so the deferral line and the nothing-at-combat-end outcome went
    unchecked (the headless visibility test covers neither). Old 2.19's
    library-present half asked for one [Set] line per `/wg disable`,
    `/wg enable` and `/wg test on` write; DIAG-6 now asks for each.

    LAUNCH-11 switched to `Alt` without saying where it comes from, so on a
    fresh install the switch leg never ran; it now points at the Profiles
    setup.

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

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

    SP-WG-03R: make the combat and reset checks runnable; restore the old run lists

    The review of SP-WG-03 found checks that could not be run or could not pass
    on a correct build. The library's combat cover sits over the whole settings
    canvas, so COMBAT-1, COMBAT-5 and PANEL-10 now make their in-combat change
    through the CLI: `/wg resetall` from a fresh /reload, so the reset popup's
    first StaticPopupDialogs write still happens in combat, then `/wg set scale`
    and `/wg set alpha`. STATE-6 changed Notification Delay, which the test flow
    never reads, so it now changes Popup Width. The `/wg get notify.delay`
    expectations print the row's `%.1fs` format.

    The occasion rows had narrowed. The Interface-bump row, the LibKa0s re-vendor
    row and LOC-6 again cover every check the old sections 1, 4, 11 and 12
    scheduled, and the release pass names the tab strip and non-English checks by
    ID so signing them off does not remove them. The library-absent intro lists
    the ten seam files CLAUDE.md names.

    The Profiles page renders through H.SetRenderer so it carries the combat lock
    when the AddOns sidebar reaches it mid-fight. PROFILE-14 checks that in the
    client and a new tests/test_profiles.lua case pins it (846 cases). COMBAT-2
    now expects the Profiles subcategory after a combat /reload.

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

commit 4c66753bc8e51fe47143a555ec254e1e3274eb39
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 20:56:30 2026 +0530

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

    The old file had grown to 1070 lines of numbered sections, table rows and
    step lists, with the same check restated up to six times (the GameMenu
    Logout run, the reset-all popup, the visibility gate across combat) and
    several expectations that contradicted the code: a bare /wg reset raising
    the confirm, the debug console keeping its position, Only in combat opening
    a hidden popup on the pull. It is now 663 lines: an index, one setup
    section with the when-to-run table and the release pass, fourteen themes
    with stable <THEME>-<n> IDs and a Result line per check, and a Pending
    sign-off table for the never-run 7a/12a/12b checks. Every in-client
    behavior is kept once; only 2.14 is dropped, since test_slash's unknown-verb
    case asserts all of it. The PROFILE theme adds the /wg profile verb and the
    Profiles page checks.

    The Non-English client section keeps deDE/frFR, the failure wording and
    the literal C_SpellBook.IsSpellKnown that test_doc_structure pins; LOC-5
    is the old 7a. Inbound references (midnight-quirks, common-tasks, debug,
    debug-content, compat-layer, testing, the ARCHITECTURE map row, and the
    test_compat / test_doc_structure comments) now cite the new IDs, and the
    KickCD and ConsumableMaster locale citations read LOC-1.

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

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

    SP-WG-02: /wg profile via CliProfile

    Adds the `profile` verb (spec S3, owner decisions D1/D3). The behavior is
    LibKa0s-Slash-1.0 minor 17's CliProfile, shared across the collection; this
    addon owns only the wiring:

    - COMMANDS row `profile`, after the schema CLI, with its NS.L description.
    - Descriptor `profiles = function() return WhatGroup.db end`, asked at call
      time because the db is built in OnInitialize, after this file loads.
    - Descriptor `liveVerbs` = lib.LIVE_VERBS plus "profile" (read, not
      hand-copied). WhatGroup passed no liveVerbs before; `profile` is a host
      verb, so the default would refuse it while disabled, and `enabled` is
      profile-scoped, so switching to an enabled profile is a way back.
    - The switch fires OnProfileChanged, so the one [Profile] log line and the
      re-apply stay the host handler's (debug-logging-§10); the verb logs
      nothing. The popup's Hide is protected in combat, and the library already
      refuses a switch in combat.
    - The degraded stub's row reaches the stand-in CliProfile, which prints the
      library-absent line and switches nothing.

    Tests first (red before the wiring): tests/test_profiles.lua covers the
    list, a switch that runs the handler, an unknown name refused with nothing
    created (and the did-you-mean), quotes/case/spaces and the combat refusal;
    tests/test_disabled.lua pins `profile` as live while disabled and a switch
    back out; tests/test_slash.lua gains the COMMANDS order pin and `profile` in
    LIVE_VERBS (allowed == #LIVE_VERBS); the degraded case in
    tests/test_libka0s.lua drives `/wg profile` through OnSlashCommand.

    Docs: ARCHITECTURE Slash Commands table and the 15-verb count,
    slash-dispatch.md (row, behavior table, the liveVerbs note, the absent
    path), profiles.md "From chat", module-map.md, the README FAQ. Re-pointed
    the citations the edits shifted (WhatGroup.toc -> settings/Slash.lua:132,
    OnSlashCommand :518, lib:New :249). docs/test-cases.md regenerated and the
    badge rolled, 838 -> 845.

    Gate: tests 845 passed, 0 failed; luacheck 0/0 in 58 files; vendor diff
    gate clean.

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

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

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

    LibKa0s payload from the local v1.63.0 tag (dd7a774), copied whole from a
    git archive of the tag, never a working tree. Only Slash.lua moves: minor
    16 -> 17, the shared profile verb (descriptor field `profiles`,
    Sl:CliProfile, Sl:ProfileSwitch, lib.ProfileNames, nine PROFILE_* strings).
    tests/_kit is unchanged at kit revision 31. CLAUDE.md provenance and
    docs/testing.md roll to v1.63.0 in the same commit, as the vendor-sync gate
    requires.

    The copy alone turned the by-name Slash surface-parity case red, because the
    live dispatcher instance now carries CliProfile and ProfileSwitch. The
    library-absent stub gains both, each printing the library-absent line for
    `/wg profile` and switching nothing (options-ui-§1 route (b), the stub shape
    version-17-docs.md gives), pinned by a new degraded case in
    tests/test_libka0s.lua (tests first: it was red before the members).

    Re-pointed citations the library's line shifts moved (DISABLED_LINE_FORMAT
    :84 -> :94, the dispatcher split -> :949-951) and two stale host ones
    (OnSlashCommand :496, lib:New :233). docs/test-cases.md regenerated and the
    README badge rolled, 837 -> 838. Bundle: docs/revendor/2026-09-29-v1.63.0/,
    recording that only Slash minor 17's profile surface is adopted, by SP-WG-02.

    Gate: tests 838 passed, 0 failed; luacheck 0/0 in 58 files; vendor diff
    gate clean against the tag and the sibling.

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

commit ca1923578f05bbad48ce9a41a984c403fe722fd6
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 11:15:25 2026 +0530

    SP-WG-01R: make the shown-container case able to fail; cover the visibility re-apply on a profile event

    The review found two tests that could not go red under the regression they
    were written for.

    The "dialog fills a SHOWN container" case asserted IsShown on a group the kit's
    AceGUI had just created, and the kit never pools and starts every frame shown,
    so deleting the renderer's container.frame:Show() left the suite green. The
    case now registers a SimpleGroup constructor that hands the group out hidden,
    the way AceGUI:Release leaves a pooled one, and hides the same group again
    before a profile switch re-renders the open page. Deleting the Show() now
    turns it red.

    reloadProfile's ApplyFrameVisibility call had no covering case: the re-apply
    test only checked size, scale and alpha. A new case shows the popup under an
    'always' profile, switches to one whose visibility is 'never', and asserts the
    popup is off screen. Deleting the call turns it red.

    The suite runs 837 cases; docs/test-cases.md is regenerated from --list, the
    README badge follows, and docs/profiles.md's Tests paragraph names both.

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

commit dc5a9d6b7a2dd723047b4eaedd0c2b9325c0e737
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 10:59:25 2026 +0530

    SP-WG-01R: regenerate the inventory and badge at 836; re-point the TOC libs span; retire the smoke doc's single-profile claim

    9e62990 added the /wg resetall blast-radius case, so the suite runs 836 cases,
    but docs/test-cases.md and the README badge still said 835. Both are
    regenerated from `lua tests/run.lua --list`.

    The same commit grew the AceConfig comment block in WhatGroup.toc by three
    lines, so DEPENDENCIES.md's `WhatGroup.toc:16-36` stopped at a comment and left
    out LibDataBroker, LibDBIcon and LibKa0s. It now cites 16-39.

    docs/smoke-tests.md section 6 still said WhatGroup uses a single
    account-shared profile, which the Profiles page made false and which the
    item's doc sweep had already retired everywhere else. The step's expectation
    now holds only while the second character is on Default, and says so.

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

commit 9e629900cfd50949e2eb9c9623e99f54abb8d942
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 10:06:42 2026 +0530

    SP-WG-01R: test the global reset's blast radius; mark the AceConfig TOC slot load-bearing

    The review of SP-WG-01 found two defects.

    options-ui-§12's testing MUST asks the suite to prove the blast radius of
    Reset all settings, not its mechanism, and docs/profiles.md claims the reset
    never touches another profile or the profile list. The only reset case
    checked the veto predicate. The new case runs /wg resetall through the
    popup's OnAccept with two profiles and asserts the active profile is still
    "Alt", the list is still "Alt,Default", the active profile is back to its
    defaults and the other profile kept its value. It goes red when the reset
    also wipes the other profile.

    The TOC comment above AceConfig-3.0.xml called the slot conventional. It is
    load-bearing: AceConfigDialog-3.0.lua:7 resolves AceGUI-3.0 with a
    non-silent LibStub at file load, so the line raises if it moves above
    AceGUI-3.0.xml (toc-file-§5). The comment now says so and names what
    resolves at load; AceDBOptions' slot stays conventional, since it resolves
    nothing at load beyond LibStub.

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

commit 02b224727604436e85306433b18aec501d9a112f
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 09:53:29 2026 +0530

    SP-WG-01R: make the disabled-profile test switch into a disabled profile; re-point .luacheckrc citations

    The review found that "switching to a disabled profile stands the addon down"
    never did that. It switched to a fresh, enabled profile and unticked
    `enabled`, so the stand-down it asserted came from the row's onChange rather
    than from the profile callback. A reloadProfile that only ever released
    HOLD_DISABLED left the whole suite green (testing-§12). The case now leaves
    "off" once it is disabled and switches back into it, then asserts the
    stand-down, then switches out again and asserts the stand-up. It carries a
    `-- red under:` comment. Checked by mutation in a scratch copy: the case now
    fails under the reviewer's one-way latch.

    .luacheckrc cited core/WhatGroup.lua:924 for the ApplyFrameVisibility probe.
    This item moved that line to :984, and the lint config was not re-pointed
    with the other citations. The settings/Schema.lua:263 citation in the same
    comment was already stale on master (the probe is at :265), so it is
    corrected too.

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

commit 4f9d7916d144e53b83a112f683644d87fd53de1a
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 09:39:12 2026 +0530

    SP-WG-01: Profiles page, profile callbacks and docs/profiles.md

    WhatGroup already kept its settings in db.profile, but nothing let a player
    see or change profiles, so an AceDB switch could only be reached with /run.
    Owner decision D2 (2026-09-29) brings it in line with the seven addons that
    ship profiles, ahead of the collection-wide `profile` verb.

    - Vendor AceConfig-3.0 (Registry, Cmd, Dialog) and AceDBOptions-3.0,
      byte-identical to the collection's copies (AuraMaster, KickCD and the
      other five diff clean), loaded after AceGUI as the siblings do.
    - settings/Profiles.lua: AceDBOptions drawn by AceConfigDialog into a
      LibKa0s canvas, registered last in the Settings tree, no Defaults button,
      built on first show through SetRenderer, opting out without the libs.
    - OnProfileChanged now logs one `[Profile] switched to '<name>'` line
      (debug-logging-§10). All three events share reloadProfile, which now also
      re-draws the Profiles page and re-applies the popup's size, scale, alpha
      and visibility from the incoming profile (those reach a built popup only
      through row onChange, which a profile event never runs).
    - Options descriptor: resetProfile + profilesPage, so the Reset all
      settings tooltip names Profiles -> Reset Profile (options-ui-§12), and
      skipRestoreAll = Settings.VetoedFromResetAll, one named veto shared with
      the host's session sweep (options-ui-§3).
    - docs/profiles.md added and registered Present in the Tier 2 map; scope,
      module map, settings panel, debug tags, dependencies, README FAQ and the
      CLAUDE.md summary updated. Line citations into core/WhatGroup.lua and
      settings/OptionsSetup.lua re-pointed at their current lines.
    - tests/test_profiles.lua (11 cases); inventory and badge now 835.

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

This mod has no additional files