promotional bannermobile promotional banner

Ka0s Party Frame Enhanced (Retail)

Adds party cast bars, party target frames and party pet frames to Blizzard or EllesmereUI party frames.
Back to Files

1.2.0-release

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

What's new

tag 24c37861911f8563d7ddf256381b526846b368f8 1.2.0-release
Author:    Tushar Saxena <tushar.saxena@gmail.com>
Date:    Fri Oct 9 19:21:57 2026 +0530

Release 1.2.0

commit 0fc379ce8acb6350f84a878029e804bcafb1f0b1
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 9 19:21:56 2026 +0530

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

    Release gate (docs/automated-tests/20261009-191745/manifest.json, measured
    5ef0164, clean, --release 1.2.0), all six conditions PASS:
    - Lint: pass, 0 warnings / 0 errors in 79 files
    - Tests: pass, 463 passed / 0 failed / 1 skipped of 464 (the kit's
      diagnostics opt-out case; this addon keeps the default)
    - Perf: pass, 10 scenarios
    - Complexity: pass (lizard 1.24.0), 11581 NLOC, 1639 functions, avg CCN 2.1
    - CCN <= 15: 0 warnings, max CCN 14; 0 files in the 1000-1500 band
    - Sighted: blindFiles 0

    Version 1.1.0 -> 1.2.0 in PartyFrameEnhanced.toc, core/Namespace.lua,
    the pinned version tests (tests/test_envsetup.lua, tests/test_slash.lua),
    docs/smoke-tests.md, docs/testing.md, docs/automated-tests/README.md and
    docs/scope.md. docs/ARCHITECTURE.md build status names 1.2.0 as the latest
    release and what it adds over 1.1.0.

    README Version History gains the 1.2.0 row (target and pet frames follow
    an in-combat re-sort, /pfe profile list and switch, /pfe diagnostics
    turning logging on with the console's Diagnostics link, the in-combat
    unlocked-profile copy fix, the single unlocked flag in /pfe status).
    Older rows untouched.

    Release bundle docs/automated-tests/20261009-191745/ with its ANALYSIS.md,
    and the RESULTS.md row. The watch list is empty (no function over CCN 15,
    no file in either layout band), so no disposition was owed.

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

commit 5ef0164a2c4b5d02292b9d4a266c4632f73f40f8
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 9 17:49:47 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 4abf2e5a4abd7984974dd6662724487741d319ef
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:31:17 2026 +0530

    PF-STD: roll to standard v2.77.0; annotate the settings page block

    Standards reference rolled to WowAddonStandards v2.77.0 (feature branch,
    WS-01..WS-11), and a docs sync after RV-PF and PF-01..PF-06. No finding
    ids of its own.

    Three-place reference: confirmed current, unchanged. documentation-§6
    and toc-file-§1 prescribe the version-free form: TOC
    `## X-Standard: https://github.com/tusharsaxena/WowAddonStandards`, the
    bare (unlinked) `![Standard](...Ka0s-WoW_Addon_Standard-yellow)` badge,
    and CLAUDE.md `## Standards compliance (read first)` with the
    stop-and-flag directive. None carries a version, so none is added.

    Citation sweep (tracked .md/.lua/.toc outside libs/, tests/_kit/ and
    the frozen stores; docs/automated-tests/README.md, RESULTS.md and
    docs/perf-analysis/README.md included as live): all 349+ `<file>-§N`
    citations resolve to a `### N.` heading in the v2.77.0 section files;
    no malformed `§` and no `§N.N` notation; every anti-pattern number
    cited (#8, #32, #36, #65, #80-#82, #84, #85, #89) still names the same
    pattern. .gitattributes still equals line-endings-§5's client fence
    byte-for-byte. No retired file names or branch wording found.

    toc-file-§5 whole-listing re-read (what v2.77.0 licenses addon-side):
    every listed file's file-scope NS/library reads checked. Every
    within-group constraint was already annotated or pinned by an annotated
    line, with one gap: settings\General.lua and every page below it call
    NS.RegisterOptionsPage at file load, and LibKa0s-Options builds its
    pending pages in registration order, so the block's order is the
    settings sidebar's. The TOC now says so above settings\General.lua;
    docs/module-map.md rows 35 and 37-40 and the ARCHITECTURE Module Map
    sentence say the same. Comment and docs only; no load order moved.

    Docs sync: README Tests badge 463/463 equals docs/test-cases.md Total
    (regenerated listing is byte-identical); slash-dispatch (18 commands),
    compat-layer (14 shims), message bus (4), the Event Subscriptions
    table (PF-03's own-target listener row), profiles.md (PF-01/PF-02),
    /pfe status (PF-04) and the EnvSetup ladder (PF-06) already match the
    code; module-map lists every TOC file and the TOC lists every source
    file. No version bump, no changelog heading.

    Deviation from the item text: no change to the three reference places,
    because the standard prescribes no version in them; the commit carries
    the TOC annotation found by the v2.77.0 re-read instead.

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

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

    PF-STD: roll to standard v2.77.0; annotate the settings page block

    Standards reference rolled to WowAddonStandards v2.77.0 (feature branch,
    WS-01..WS-11), and a docs sync after RV-PF and PF-01..PF-06. No finding
    ids of its own.

    Three-place reference: confirmed current, unchanged. documentation-§6
    and toc-file-§1 prescribe the version-free form: TOC
    `## X-Standard: https://github.com/tusharsaxena/WowAddonStandards`, the
    bare (unlinked) `![Standard](...Ka0s-WoW_Addon_Standard-yellow)` badge,
    and CLAUDE.md `## Standards compliance (read first)` with the
    stop-and-flag directive. None carries a version, so none is added.

    Citation sweep (tracked .md/.lua/.toc outside libs/, tests/_kit/ and
    the frozen stores; docs/automated-tests/README.md, RESULTS.md and
    docs/perf-analysis/README.md included as live): all 349+ `<file>-§N`
    citations resolve to a `### N.` heading in the v2.77.0 section files;
    no malformed `§` and no `§N.N` notation; every anti-pattern number
    cited (#8, #32, #36, #65, #80-#82, #84, #85, #89) still names the same
    pattern. .gitattributes still equals line-endings-§5's client fence
    byte-for-byte. No retired file names or branch wording found.

    toc-file-§5 whole-listing re-read (what v2.77.0 licenses addon-side):
    every listed file's file-scope NS/library reads checked. Every
    within-group constraint was already annotated or pinned by an annotated
    line, with one gap: settings\General.lua and every page below it call
    NS.RegisterOptionsPage at file load, and LibKa0s-Options builds its
    pending pages in registration order, so the block's order is the
    settings sidebar's. The TOC now says so above settings\General.lua;
    docs/module-map.md rows 35 and 37-40 and the ARCHITECTURE Module Map
    sentence say the same. Comment and docs only; no load order moved.

    Docs sync: README Tests badge 463/463 equals docs/test-cases.md Total
    (regenerated listing is byte-identical); slash-dispatch (18 commands),
    compat-layer (14 shims), message bus (4), the Event Subscriptions
    table (PF-03's own-target listener row), profiles.md (PF-01/PF-02),
    /pfe status (PF-04) and the EnvSetup ladder (PF-06) already match the
    code; module-map lists every TOC file and the TOC lists every source
    file. No version bump, no changelog heading.

    Deviation from the item text: no change to the three reference places,
    because the standard prescribes no version in them; the commit carries
    the TOC annotation found by the v2.77.0 re-read instead.

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

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

    PF-06: drop the dead bare-global GetAddOnMetadata rung

    Cluster C27 parity with LK-06, MM-07 and PM-09 (no finding of its own).
    NS.Meta's library-absent arm (core/EnvSetup.lua) kept a bare
    GetAddOnMetadata rung below C_AddOns.GetAddOnMetadata that no admitted
    client (## Interface 120100, after the 11.0 AddOns purge) can reach.
    Meta now answers Env first, then C_AddOns.GetAddOnMetadata, else nil;
    the file header and doc comment describe the two-rung ladder.

    - tests/test_envsetup.lua: new case "Meta never reads the bare
      GetAddOnMetadata global" (Env and C_AddOns absent, a recording spy on
      the bare global, asserts zero calls and a nil answer). Red before the
      fix ("got bare"), green after.
    - .luacheckrc: GetAddOnMetadata leaves read_globals.
    - docs/test-cases.md regenerated (462 -> 463); README Tests badge 463/463.

    Deviations from the item text:
    - IsAddOnLoaded stays in read_globals. The item assumed
      Compat.IsAddOnLoaded goes through C_AddOns only, but in this repo
      core/Compat.lua:28 still falls back to the bare IsAddOnLoaded global,
      so luacheck has a bare reader. Changing Compat is outside this item.
    - No test-mock edit: tests/wow_mock.lua plants no bare GetAddOnMetadata.
    - No docs/compat-layer.md edit: no doc besides the source comment
      describes the Meta ladder.

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

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

    PF-05: Fix doc-set drift; restore the fourth map table; reshape settings

    Docs only.

    PFE-A-03: docs/automated-tests/README.md no longer states a kit revision
    (it said kit 35) and defers to CLAUDE.md's LibKa0s provenance line;
    docs/perf-analysis/README.md names /dev-copilot:wow-perf-analysis instead
    of the retired /wow-addon:perf-analysis; the Documentation map's
    compat-layer.md row says 14 shims by the standard's grep over
    core/Compat.lua (re-run: 14), plus IsSecret routed from
    LibKa0s-Compat-1.0 and not counted; docs/compat-layer.md drops the
    IsSecret shim row for a one-line pointer to the library.
    docs/automated-tests/RESULTS.md is runner-generated and untouched.

    PFE-A-04: restore '### Addon-specific (documentation-§3, Tier 3)' after
    '### Verification and record', with a '| Doc | Covers |' header and
    'None.'. Every docs/*.md is still registered in exactly one table.

    PFE-A-07: docs/settings-panel.md becomes a Page | Covers table with one
    row per subcategory page (General, Cast Bars, Target Frames, Pet Frames,
    Profiles), then one '## <Page>' heading per page with '### <Tab>'
    sub-headings in group declaration order (checked against
    settings/CastBars.lua, TargetFrames.lua, PetFrames.lua). Content is
    unchanged; the landing page moves into the intro prose, the Resets notes
    become '#### Resets' under General's Master controls tab (whose rows they
    explain) so the page count of '## ' headings is five, and a short
    '## Profiles' section is added. The map's settings-panel.md row now says
    'Page | Covers'.

    PFE-A-06: the library-stack-§6 register row's Why cell cites the
    2026-09-23 audit PFE-15 and commit 79cd225 (PF-22). Row 1
    (slash-commands-§7) keeps 'pending the owner's ratification': the owner
    has not confirmed default D9, so that stays an open question for the
    bundle's execution record.

    Deviations: line cites moved (doc-map compat row :399, register rows
    :422/:423, not :404/:427/:428).

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

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

    PF-04: print one unlocked flag in /pfe status

    statusFlags added the preview branch's 'unlocked (stand-in)' / 'unlocked
    (your party frames)' and then a bare 'unlocked' whenever
    NS.Anchor.IsUnlocked(); applyLock sets both together, so the Note line
    read 'unlocked (your party frames), unlocked'. The bare flag is now added
    only when the anchor is unlocked AND NS.State.preview is false, which is
    the case where setPreview refused and nothing else reports the unlock.
    No locale key changes.

    Tests (tests/test_slash.lua): '/pfe unlock' then status has exactly one
    unlocked flag and it names the view (red on the parent: "expected 1, got
    2"); anchor unlocked with preview off still prints the bare 'unlocked'.
    docs/test-cases.md regenerated; README badge 460 -> 462.

    Finding: PFE-R-04.

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

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

    PF-03: Move the pending-secure listener onto its own AceEvent target

    The post-combat secure-write watcher was a private CreateFrame("Frame")
    registering PLAYER_REGEN_ENABLED, in an addon that embeds AceEvent-3.0;
    events-frames-taint-§1 removes the boundary-watcher carve-out in that
    case. It is now a dedicated AceEvent target (a table embedded with
    AceEvent-3.0 once at load), which is neither the addon object (whose
    PLAYER_REGEN_ENABLED is OnLeaveCombat, and AceEvent keys by (event,
    target)) nor a bus target (the bus stands its targets down, and this is
    the one registration a stood-down addon keeps, slash-commands-§7).

    armPendingRegen registers through NS.SafeRegisterEvent with a function
    handler and sets a local regenArmed only on success; the handler
    unregisters, clears the flag, then flushes; disarmPendingRegen
    unregisters by name. NS.PendingRegenArmed answers the flag, so the
    diagnostics report stays truthful.

    Characterization case first in tests/test_disabled.lua: stood down in
    combat with writes queued there is exactly one PLAYER_REGEN_ENABLED
    registration, an AceEvent one on a target that is not the addon, not
    the bus and not a frame; firing it runs the queue and leaves nothing
    registered; standing up in combat disarms the watcher and the addon's
    own OnLeaveCombat registration flushes. Red on the old code at "an
    AceEvent registration, not a frame's".

    Docs: block comment rewritten; docs/ARCHITECTURE.md Event
    Subscriptions row and the stand-down paragraph say "its own AceEvent
    target" (the cited :199/:269 had moved to :187/:259).
    docs/test-cases.md regenerated; README test badge 460/460.

    Finding: PFE-A-01.

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

commit 0dfdeb815fbc01e868419a12e466742b5fe71671
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:04:54 2026 +0530

    PF-02: relock a profile adopted unlocked in combat instead of previewing

    Preview's PROFILE receiver applied the incoming profile's lock state with
    no combat check, so '/pfe profile copy <name>' mid-fight (no combat gate:
    CopyProfile -> OnProfileCopied -> adoptProfile -> PROFILE) or a third-party
    SetProfile to a profile stored unlocked turned preview on for the rest of
    the fight, after PLAYER_REGEN_DISABLED's re-lock had already fired.

    When enabled, stored locked == false and InCombatLockdown(), the receiver
    now writes NS.SetByPath("locked", true), calls applyLock(false) (the row's
    onChange already does; a hollow library-less load stores raw and does
    not) and prints the existing L["Locked - combat started"] line. Every
    other path is unchanged. No new locale key.

    Tests: two cases in tests/test_profile_switch.lua drive the receiver
    through a real CopyProfile in combat: an unlocked source (preview stays
    off, stored lock relocked, line printed, no cast-bar placeholder) and a
    locked source (nothing changes, no line). docs/test-cases.md regenerated,
    README badge 457 -> 459. Comment updated in modules/Preview.lua;
    docs/ARCHITECTURE.md (PROFILE message row) and docs/profiles.md describe
    the guard.

    Finding: PFE-R-01 (review F-001).

    Deviation: only the unlocked-source case is red on the parent; the
    locked-source case pins unchanged behaviour (it guards against an
    over-broad combat branch) and passes on the parent by construction.

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

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

    PF-01: isolate deferred secure writes; guard the unwrap re-wrap

    flushSecure (core/PartyFrameEnhanced.lua) now takes the whole queue and
    replaces both `pending` and `pendingOrder` with fresh tables before running
    anything, then runs each write through xpcall(fn, geterrorhandler()). A
    raising write still reaches BugSack/the default handler, the writes after it
    still land, the queue ends empty, the raising key can queue again (the
    `if not pending[key]` guard sees it gone), and OnLeaveCombat / StandUp still
    reach PublishVisibility. The debug line now reads
    "flushed %d deferred write(s), %d raised". (PFE-R-02)

    modules/SecureFollow.lua unwrapFrame: the restoring SecureHandlerWrapScript
    of another addon's outer wrap runs through xpcall(..., geterrorhandler()),
    consistent with Wrap's own guard, so the unwrap pass continues and the error
    is reported, not discarded; it returns false either way. (PFE-R-03)

    settings/Slash.lua `profile new`: drop NS.ResetProfileCounted(db) after
    SetProfile. The exists() refusal already guarantees a default-only profile,
    so the reset only re-ran adoptProfile (a second PROFILE broadcast and a
    no-op "[Set] reset profile ... (0 rows)" line). Comment rewritten; the
    refusal and the "Created and switched" line are kept. (PFE-R-05)

    Tests (each red on the unfixed code, green after):
    - test_lifecycle: a raising queued write followed by a normal one.
    - test_securefollow: a foreign outer wrap whose re-wrap raises.
    - test_slash: `profile new` publishes PROFILE once, no reset line.
    tests/wow_mock.lua gains a recording geterrorhandler (echoes to stderr);
    .luacheckrc read_globals gains geterrorhandler.

    Docs: ARCHITECTURE (secure queue and stand-down unwrap), debug.md (Secure
    tag), profiles.md and slash-dispatch.md (`new` has no reset);
    docs/test-cases.md regenerated (457) and the README badge to match.

    Deviations: unwrapFrame's xpcall uses a closure because Lua 5.1's xpcall
    takes no call arguments. The securefollow case asserts every recorded frame
    is visited (>= 2) since earlier cases leave frames recorded. docs/profiles.md
    and docs/slash-dispatch.md did not describe a reset step; a note that `new`
    has none was added instead.

    Findings: PFE-R-02, PFE-R-03, PFE-R-05

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

commit 01f06800b6b78ea7e6f69c73d62dc565f1bb4a7e
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 19:52:42 2026 +0530

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

    Re-vendor LibKa0s from the local annotated tag v1.71.0 (3bf1b97, commit
    cb274a4): libs/LibKa0s and tests/_kit removed and copied whole from
    `git archive v1.71.0 LibKa0s testkit`; diff -r against the tag is empty
    for both payloads. Minors: Env 2, OptionsIdList 4, Slash 20, SlashParse 2,
    WidgetsLineChart 3, WidgetsAutocomplete 2. Kit revision 37 -> 38 (new
    tests/_kit/secrets.lua; --list Totals count only cases that run). The
    CLAUDE.md provenance line rolls v1.70.0 -> v1.71.0 in the same commit.

    - docs/test-cases.md regenerated under kit 38 (Total 454, Skipped 1);
      README Tests badge 454/455 -> 454/454.
    - PFE-A-02: span bundle docs/revendor/2026-10-07-v1.69.0-v1.70.0/
      (01_DELTA.md, 05_SUMMARY.md) for the plain chore re-vendors 547ac68
      and 735a111, base v1.68.1; nothing adopted.
    - docs/revendor/2026-10-07-v1.71.0/ (01_DELTA, 02_CANDIDATES,
      03_DECISIONS, 05_SUMMARY): base v1.70.0 from the provenance line,
      per-file minors, kit pairing, consumed majors, contract changes (no
      blockers); Kit.secret, WidgetsLineChart and WidgetsAutocomplete listed
      as not adopted in this run (OWNER_SCOPE, no interview, no issue).
    - PFE-A-11: docs/ARCHITECTURE.md:23, DEPENDENCIES.md:32 and
      docs/debug.md:16 stop naming a tag/kit revision and point at the
      CLAUDE.md provenance line; docs/smoke-tests.md INSTALL-4 step text
      only (Result and the :645 owner row untouched).
    - PFE-A-05: the docs/ARCHITECTURE.md Overview re-vendor narrative
      (former :43-:57) cut to one sentence pointing at docs/revendor/; hub
      435 -> 423 lines. The disabled-state section is not moved.

    Deviations: beyond the four named sites, docs/testing.md:93 ("kit 37")
    and the comment at tests/test_surface_parity.lua:200 ("kit 36") are
    de-tagged the same way, as the re-vendor's kit-revision ripple. The
    INSTALL-4 step also names the item's smoke (/pfe status, /pfe unlock).
    docs/automated-tests/README.md:29 ("kit 35") is left to PF-05.

    Gate (ka0s-bounded): lua tests/run.lua 454 passed, 0 failed, 1 skipped;
    luacheck . 0/0 in 79 files; lizard 0 warnings, max CCN 14.

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

commit 1b9f196f1c421262eabb412421a9b634964692d8
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 16:52:00 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 735a1112a613fb7613253574118ae12849e880bf
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 11:38:21 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 735a1112a613fb7613253574118ae12849e880bf
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 11:38:21 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 547ac6897543aa95582627fe339f9df33f4a1d30
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Oct 6 14:52:45 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 02b82549d72626e1fc7f42022ef98c8f690aae7e
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Oct 4 15:16:54 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 (git archive,
    commit 9000cbd; the sibling checkout sits one merge past it with no payload
    diff against the tag). No LibStub minor moved and LibKa0s.xml is unchanged,
    so no TOC or tests/run.lua row. tests/_kit moves to revision 36, which names
    the dev-copilot plugin's commands where revision 35 named /wow-addon:*.
    CLAUDE.md provenance rolled to v1.68.1.

    - docs/revendor/2026-10-04-v1.68.1/ (delta, candidates, decisions, summary).
      Zero adoption candidates, no interview, no issue filed. No contract
      blockers, and no span bundle needed.
    - Docs: ARCHITECTURE.md's two version-now lines and debug.md's
      vendored-release citation rolled to v1.68.1, plus one ARCHITECTURE sentence
      on v1.68.1. smoke-tests.md INSTALL-4 names v1.68.1, and its Pending
      sign-off row is restated.
    - "kit 35" -> 36 in DEPENDENCIES.md, docs/testing.md and one
      test_surface_parity.lua comment.
    - Test totals unchanged, so test-cases.md and the README badge stay at 454/455.

    Gate: tests 454 passed, 0 failed, 1 skipped (455), with test_vendor_sync
    green; luacheck 0 warnings / 0 errors in 79 files; sighted complexity pass,
    max CCN 14, 0 warnings; diff -r of both payloads against the tag export is
    empty.

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

commit 02b82549d72626e1fc7f42022ef98c8f690aae7e
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Oct 4 15:16:54 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 (git archive,
    commit 9000cbd; the sibling checkout sits one merge past it with no payload
    diff against the tag). No LibStub minor moved and LibKa0s.xml is unchanged,
    so no TOC or tests/run.lua row. tests/_kit moves to revision 36, which names
    the dev-copilot plugin's commands where revision 35 named /wow-addon:*.
    CLAUDE.md provenance rolled to v1.68.1.

    - docs/revendor/2026-10-04-v1.68.1/ (delta, candidates, decisions, summary).
      Zero adoption candidates, no interview, no issue filed. No contract
      blockers, and no span bundle needed.
    - Docs: ARCHITECTURE.md's two version-now lines and debug.md's
      vendored-release citation rolled to v1.68.1, plus one ARCHITECTURE sentence
      on v1.68.1. smoke-tests.md INSTALL-4 names v1.68.1, and its Pending
      sign-off row is restated.
    - "kit 35" -> 36 in DEPENDENCIES.md, docs/testing.md and one
      test_surface_parity.lua comment.
    - Test totals unchanged, so test-cases.md and the README badge stay at 454/455.

    Gate: tests 454 passed, 0 failed, 1 skipped (455), with test_vendor_sync
    green; luacheck 0 warnings / 0 errors in 79 files; sighted complexity pass,
    max CCN 14, 0 warnings; diff -r of both payloads against the tag export is
    empty.

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

commit 5a29a5c847d66c1e2566b3409a1b63fc2dd573f1
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Oct 4 14:33:02 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 5a29a5c847d66c1e2566b3409a1b63fc2dd573f1
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Oct 4 14:33:02 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 c4161f0742df12d84722e340b6242301e757c177
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Oct 4 14:21:18 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 24ab500a329f395669c91814147bee599acab48e
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sat Oct 3 13:29:02 2026 +0530

    SD-FIN-02: #15 parked with the WoW:F support work (LibKa0s#44); cause named

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

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

    SD-FIN-01: sync docs (logo limitation gone; lint stanza counts; settings tabs; Pillow install)

    Known Limitations drops the closed #10 placeholder logo and notes #15; luacheckrc stanza counts; target/pet General tabs; superpowers/ named with the frozen directories; ticker and profile-row test seams labeled.

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

commit 21021e2df507624feb9a6b4ba50a8524121d612a
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 23:37:25 2026 +0530

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

    Both payloads copied whole from the local annotated tag v1.68.0 (git archive,
    commit cc9f5eb; the sibling checkout sat at that commit with no payload diff
    against the tag). The only payload delta is WidgetsDragHandle 3 -> 4, the
    optional tooltipPlace hook (Widgets key 12.1.3 -> 12.1.4). The testkit is
    byte-identical, kit 35. Nothing was removed upstream and LibKa0s.xml is
    unchanged, so no TOC or tests/run.lua row. CLAUDE.md provenance rolled to
    v1.68.0.

    - docs/revendor/2026-10-02-v1.68.0/ (delta, candidates, decisions, summary).
      tooltipPlace declined as not applicable: this addon builds no drag strip
      and looks up no Widgets major. No issue filed, because it is not a gap.
      No contract blockers, and no span bundle needed.
    - Docs: ARCHITECTURE.md's two version-now lines and debug.md's vendored-release
      citation rolled to v1.68.0, plus one ARCHITECTURE sentence on v1.68.0.
      smoke-tests.md INSTALL-4 names v1.68.0, and its Pending sign-off row is
      restated.
    - Test totals unchanged, so test-cases.md and the README badge stay at 454/455.

    Gate: tests 454 passed, 0 failed, 1 skipped (455) before and after, with
    test_vendor_sync green; luacheck 0 warnings / 0 errors in 79 files; sighted
    complexity pass, max CCN 14, 0 warnings; diff -r of both payloads against the
    tag export is empty.

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

commit 21021e2df507624feb9a6b4ba50a8524121d612a
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 23:37:25 2026 +0530

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

    Both payloads copied whole from the local annotated tag v1.68.0 (git archive,
    commit cc9f5eb; the sibling checkout sat at that commit with no payload diff
    against the tag). The only payload delta is WidgetsDragHandle 3 -> 4, the
    optional tooltipPlace hook (Widgets key 12.1.3 -> 12.1.4). The testkit is
    byte-identical, kit 35. Nothing was removed upstream and LibKa0s.xml is
    unchanged, so no TOC or tests/run.lua row. CLAUDE.md provenance rolled to
    v1.68.0.

    - docs/revendor/2026-10-02-v1.68.0/ (delta, candidates, decisions, summary).
      tooltipPlace declined as not applicable: this addon builds no drag strip
      and looks up no Widgets major. No issue filed, because it is not a gap.
      No contract blockers, and no span bundle needed.
    - Docs: ARCHITECTURE.md's two version-now lines and debug.md's vendored-release
      citation rolled to v1.68.0, plus one ARCHITECTURE sentence on v1.68.0.
      smoke-tests.md INSTALL-4 names v1.68.0, and its Pending sign-off row is
      restated.
    - Test totals unchanged, so test-cases.md and the README badge stay at 454/455.

    Gate: tests 454 passed, 0 failed, 1 skipped (455) before and after, with
    test_vendor_sync green; luacheck 0 warnings / 0 errors in 79 files; sighted
    complexity pass, max CCN 14, 0 warnings; diff -r of both payloads against the
    tag export is empty.

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

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

    CA-FIN-02: doc sync before merge

    ARCHITECTURE.md's re-vendor narrative gains v1.67.0's addonName descriptor field (latent here).

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

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

    CA-FIN-02: doc sync before merge

    ARCHITECTURE.md's re-vendor narrative gains v1.67.0's addonName descriptor field (latent here).

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

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

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

    settings/OptionsSetup.lua keeps vararg 1 as addonName and hands it to the
    Options descriptor beside parentTitle/mainPanelName, so OptionsIdList's
    help-mark art resolves through Media.Icon(addonName, "info") instead of the
    client glyph. Latent here: this addon draws no IdList help marks today.

    Red-first guard in tests/test_optionssetup.lua: the vararg rename, the
    descriptor row, and libs/LibKa0s/media/icons/info.tga on disk. 454/455
    (1 skipped), luacheck 0/0, vendor parity clean, complexity max CCN 14.
    Docs: test-cases.md regenerated, README badge, smoke PANEL-7 (pending).

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

commit 1a8723c67e008be783d8a8351ca0e89fd691fe1d
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 01:42:37 2026 +0530

    CA-PF-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, commit
    0bccf4c; the sibling checkout sat at that commit, clean). Core 9 -> 10
    (MakeResizable canResize / onResizeStop / gripParent), Options 27 -> 28
    (docblock only) and OptionsIdList 2 -> 3 (the addonName loaded-addon guard and
    its one Cfg line). The testkit is byte-identical, kit 35. Nothing was removed
    upstream, LibKa0s.xml is unchanged, so no TOC or tests/run.lua row. CLAUDE.md
    provenance rolled to v1.67.0.

    - docs/revendor/2026-10-02-v1.67.0/ (delta, candidates mapped to the census
      adoption bundle and not interviewed: addonName -> CA-PF-NM, the
      MakeResizable fields -> none, the addon builds no resizable window of its
      own; summary).
    - Docs: ARCHITECTURE.md's two version-now lines and debug.md's vendored
      release citation rolled; smoke-tests.md gains INSTALL-4 (a clean load on
      the vendored library, index INSTALL-1 - 4) and its Pending sign-off row,
      which also points at DIAG-10 to DIAG-12 for the Core 10 grip.
    - No consumer fix: no library change broke a consumer test. test-cases.md
      regenerates unchanged and the README badge stays 453/454.

    Gate: tests 453 passed, 0 failed, 1 skipped (454) before and after; luacheck
    0 warnings / 0 errors in 79 files; sighted complexity pass, maxCcn 14,
    0 warnings; diff -r of libs/LibKa0s against ../LibKa0s/LibKa0s empty.

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

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

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

    smoke-tests.md: COMBAT-6 and COMBAT-9 to COMBAT-12 (GI-PF-02, #3) passed in
    the client, owner, 2026-10-02 - Result lines filled, rows removed from Pending
    sign-off, and the passes-on-record sentence names them. ARCHITECTURE.md (taint
    notes, Known Limitations) and midnight-quirks.md no longer call the in-combat
    follow unproven in the client.

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

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

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

    smoke-tests.md: COMBAT-6 and COMBAT-9 to COMBAT-12 (GI-PF-02, #3) passed in
    the client, owner, 2026-10-02 - Result lines filled, rows removed from Pending
    sign-off, and the passes-on-record sentence names them. ARCHITECTURE.md (taint
    notes, Known Limitations) and midnight-quirks.md no longer call the in-combat
    follow unproven in the client.

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

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

    GI-PF-02: SecureFollow — target and pet frames follow an in-combat re-sort via SecureHandlerWrapScript (#3)

    modules/SecureFollow.lua (new, TOC after PetFrames, load-bearing and pinned by
    tests/test_loadorder.lua): one SecureHandlerBaseTemplate header built at
    OnEnable (hidden, single template), a frame ref per target/pet button, and the
    attributes the restricted snippet reads (pfe-provider, <f>-live, -point/-rel/
    -x/-y, -match and the match-width edges from Anchor.__LEFT_OF/__RIGHT_OF).
    Sync writes only changed attributes (scalar memo), out of combat only, through
    NS.RunSecure("follow:sync", Sync) with the prebuilt function. Wraps are lazy,
    out of combat only (RunSecure("follow:wrap")), once per frame, only for the
    re-sorting providers (resorts = true on ellesmere and blizzard-raid) and only on
    protected frames; a refused wrap is caught, counted in NS.State.followRefused,
    never retried, and that frame keeps the fade.

    Restricted snippets are string constants, one per re-sorting provider id with
    the id embedded literally; the pre-body never answers false. Stand-down gates
    every follow off (live false, provider "none") and unwraps where ours is the
    outermost wrap; where another header wrapped after ours, that wrap is restored
    exactly and ours stays attached, gated off. That residue is the new
    slash-commands-§7 row under docs/ARCHITECTURE.md -> Documented deviations
    (owner default D9, pending ratification).

    Anchor: deferSecure asks SecureFollow.Covers before fading; a covered element
    is not faded, its memo is invalidated (A->B->A safe) and the regen pass is still
    queued. Debug line counts "followed". Anchor.PlacementOf exported. Providers:
    resorts flags and the read-only Providers.ForEachActiveFrame accessor; its
    header comment says the wrap lives in SecureFollow. Diagnostics' secure section
    gains "follow: header= wrapped= refused=" (SecureFollow.Status).

    Tests first (red against the tree without the module, and by mutation: Covers
    check dropped, blind unwrap): tests/test_securefollow.lua (22 cases) runs the
    snippets in tests/wow_mock.lua's new restricted environment (handles only, no
    table constructor, short global list, template-gated SecureHandler header that
    raises on SetAttribute/SetFrameRef in combat, a wrap/unwrap recorder that
    raises in combat, __changeAttribute dispatching pre-bodies outermost first).
    Plus test_disabled (header gates off on stand-down), test_diagnostics (the
    follow line), test_loadorder (TOC position), and tests/perf.lua scenario
    followSyncUnchanged (0 attribute writes, 0 B/iter, ceiling 24).
    tests/test_rangefade.lua: collectgarbage before reading the weak-keyed
    HookedCount, a pre-existing GC-timing fragility the new suite's garbage exposed.

    Docs: ARCHITECTURE (forty files, bus Consumers, stand-down step, taint-notes
    paragraph, Known Limitations #3 row, Documented-deviations row), module-map,
    data-flow, midnight-quirks, scope, common-tasks, debug (Follow tag, Anchor
    followed, diagnostics line), performance (new scenario row), smoke-tests
    (COMBAT-6 rewritten, COMBAT-9/10 added per the bundle's 04_SMOKE_TESTS.md, plus
    COMBAT-11 disabled-then-reshuffle and COMBAT-12 placement-set-in-combat; all in
    Pending sign-off), test-cases.md regenerated, README badge and troubleshooting
    row. Not proven in the client: #3 stays open until COMBAT-6/9/10 pass.

    Gate: tests 428 passed / 0 failed / 1 skipped (429) before -> 453 / 0 / 1
    (454) after; luacheck 0 warnings / 0 errors in 79 files; sighted complexity
    pass, max CCN 14 across 1601 functions (Anchor.Apply 11, SecureFollow max 8);
    tests/perf.lua green.

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

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

    GI-PF-01: attribute castStartStop's residue to first-cast warm-up, re-derive its ceiling to 24 (#12)

    tests/perf.lua (outside the green gate): the cast start/stop body becomes a
    local castCycle() closing over CASTS and bars, run once untimed as a warm-up
    and then measured, so the two cannot drift. The ceiling comment block and
    CEILINGS row are rewritten: castStartStop 41 (16.6 + 24) -> 24 (0 + 24).
    Addon fields are not pre-seeded in CastBars (02a default).

    Attribution, reproduced in a scratch copy with the collector stopped: the
    first five-unit cycle allocates and retains 3560 bytes, every later cycle
    (n = 10, 100, 1000, 5000) 0; 3560 / 1000 = the reported 3.6. It is one-time
    table-shape growth per bar (element: tick, __ticking, __manualFill, fade;
    mock recorders: __scripts.OnUpdate, __color/__min/__max, __text, __texture,
    __alpha). docs/performance.md replaces the "interpreter's memory layout"
    paragraph with the n-sweep table and the key list, sets the row to 0 bytes,
    <= 24, and refreshes the figures date.

    Test-first note: no assertion here can go red against the old code, because
    3.6 already sits under the new 24-byte ceiling. The evidence is the figure:
    castStartStop 3.6 bytes/iter before, 0.0 after, three identical runs; every
    other scenario unchanged (targetTickUnchanged 0.1, probeOverheadOn 0.5,
    settingsDrag 925.9, the rest 0). perf.lua exits 0.

    Gate: tests 428 passed, 0 failed, 1 skipped (429), unchanged; luacheck
    0 warnings / 0 errors in 77 files; sighted complexity pass, maxCcn 14,
    warnings 0, blindFiles 0.

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

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

    GI-PF-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, commit
    e4c5ef7): Widgets 12, DebugLog 19, Slash 19, OptionsWidgets 34, OptionsTabs 8,
    Perf 14, plus WidgetsReorder, SlashParse, PerfSampler and PerfCommands (minor 1
    each). Nothing was removed upstream. The TOC loads the library through
    LibKa0s.xml and tests/run.lua derives its list from the same XML, so no load
    row is added. CLAUDE.md provenance rolled to v1.66.0.

    - tests/run.lua wires { name = "test_lizard_sighted", dir = "tests/_kit/" }.
    - docs/revendor/2026-10-01-v1.66.0/ (delta, candidates listed and not
      interviewed per spec S4 -> GI-LK-13, decisions, summary) and the Step 3h
      span bundle docs/revendor/2026-10-01-v1.64.0-v1.65.0/ for the two tags the
      DL-PF and DG-PF runs vendored without a bundle.
    - Consumer fix: tests/test_surface_parity.lua built its CliProfile /
      ProfileSwitch call list inside a `for ... in` header, a lizard blind spot
      the sighted suite reported (28 of 29 functions listed). Hoisted into a
      local; the case is unchanged. No library change broke a consumer test.
    - Docs: test-cases.md regenerated, README badge 428/429, ARCHITECTURE.md
      version lines, debug.md cites DebugLog 19.2.1; the raw lizard command in
      testing.md, automated-tests/README.md and DEPENDENCIES.md now points at
      the runner's sighted complexity suite. CLAUDE.md's green-gate line quotes
      no lizard command and is unchanged.

    Gate: tests 420/421 (1 skip) before -> 428 passed, 0 failed, 1 skipped (429)
    after; luacheck 0 warnings / 0 errors in 77 files.
    Sighted complexity (bash tests/_kit/run-automated-tests.sh --suite complexity):
    before the hoist fail, blindFiles 1; after: pass, maxCcn 14, warnings 0,
    blindFiles 0, 1509 functions.
    Vendor parity: diff -r of libs/LibKa0s and tests/_kit against the tag is empty.

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

commit 3b2ff014c738196748da8caabaaddc21f1a74e3f
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 02:10:58 2026 +0530

    DG-PF-01S: doc sync — module-map's DebugLogSetup row names the change gates and at-enable queue it publishes

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

commit 3b2ff014c738196748da8caabaaddc21f1a74e3f
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 02:10:58 2026 +0530

    DG-PF-01S: doc sync — module-map's DebugLogSetup row names the change gates and at-enable queue it publishes

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

commit 69449513262654929de219ff98196fcfa071f137
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 01:21:26 2026 +0530

    DG-PF-01R: docs/debug.md's DebugLog citation link opens the 18.2.1 contract its text names

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

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

    DG-PF-01: adopt pin for the combat lock's [Cfg] refusal, and the doc sync

    - tests/test_library_lines.lua: a page Defaults the combat lock refuses is one
      `[Cfg] defaults general refused (in combat)` line in this addon's console,
      once per combat (Options minor 27, through the `debug` OptionsSetup.lua
      already passed).
    - docs/ARCHITECTURE.md build-status paragraph names what v1.65.0 wired.
    - docs/test-cases.md regenerated (421 cases, 1 skip); README badge 420/421.

    Gate: 420 passed, 1 skipped, 0 failed; luacheck 0/0; lizard 0 over CCN 15
    on core/, modules/ and settings/.

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

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

    DG-PF-01: adopt the at-enable queue for the launcher's login state lines

    - core/LauncherSetup.lua passes `debugAtEnable` (Launcher minor 5) through
      NS.DebugAtEnable, so Register's state lines (a broker library absent, no
      minimap table, `registered`), written at OnEnable with the session-only flag
      off, are held and land the first time logging is turned on, after [Init].
      The one optional dependency stays in the [Init] summary, which already lands.
    - tests/test_library_lines.lua: the line is held while logging is off (nothing
      written, a retried Register held once) and lands once after [Init] on
      enable; with logging already on it is written at once, once. Red with the
      descriptor field removed.
    - docs/debug.md Launcher row; smoke-tests.md DIAG-17 (the login line lands),
      index and pending rows.
    - docs/test-cases.md regenerated (420 cases, 1 skip); README badge 419/420.

    Gate: 419 passed, 1 skipped, 0 failed; luacheck 0/0.

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

commit 8ce451384c997c0461aa3a4922b1046261c44ced
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 01:08:45 2026 +0530

    DG-PF-01: adopt the console's change gates in place of six hand-rolled memos

    - core/DebugLogSetup.lua binds NS.DebugOnce, NS.DebugChanged, NS.DebugForget
      and NS.DebugAtEnable bare from the console (DebugLogGates 1), in both arms.
    - The memos go, behaviour kept: TargetFrames `__loggedTarget` and PetFrames
      `__loggedPet` (per-button DebugChanged), Preview `dressedAs` (DebugChanged,
      forgotten on lower so the next raise says itself), RangeFade `loggedMode`
      (DebugChanged), Providers `editModeErrors` (DebugOnce per distinct error),
      CastBars' hidden-reason gate (DebugChanged per unit, forgotten when the bar
      shows; `__hiddenWhy` stays as the diagnostics report's state). Clear and
      turning logging on now re-arm every one of them, which no memo did.
    - tests/test_debug_coverage.lua's trace also captures the console's Add, where
      the gates write. tests/test_library_lines.lua: a Clear re-arms the target
      gate, turning logging on re-arms it and nothing is remembered while off, and
      none of the five memo names is left in the addon's files.
    - docs/debug.md Coverage: the gate is the console's and what re-arms it, which
      tags are the library's, the Cast row change-gated, the stand-in's forget.
    - docs/test-cases.md regenerated (418 cases, 1 skip); README badge 417/418.

    Gate: 417 passed, 1 skipped, 0 failed; luacheck 0/0.

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

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

    DG-PF-01: adopt the library's Slash refusal and Lifecycle edge lines

    - settings/Slash.lua and core/LifecycleSetup.lua pass the gated sink as
      `debug` (Slash minor 18, Lifecycle minor 3), so every refusal the
      dispatcher decides writes one `[Cmd] refused <verb>: <guard>` line and each
      stand-down / stand-up edge one `[Lifecycle]` line in this addon's console.
    - core/PartyFrameEnhanced.lua drops its own `[State] stood down (holds: ...)`
      and `stood up` edge lines, now the library's; what only the host knows, the
      secure writes an edge leaves held, is one `[Secure] N write(s) held at the
      stand-down|stand-up` line, written only when there are any.
    - tests/test_library_lines.lua (7 cases) reads the real console: an unknown
      verb, the disabled gate (chat unchanged, no second line), a parse refusal,
      a host-decided refusal with no [Cmd] copy, one line per Lifecycle edge, no
      line for a hold that changes nothing, and a second hold named in the set.
      tests/test_debug_coverage.lua re-pins the two stand-down cases on the
      library's line and the new Secure line.
    - docs/debug.md Coverage: `Lifecycle` and `Cmd` rows (the library's), the
      `State`, `Secure` and `Cfg` rows (the combat lock's refusals and the park's
      flush), and the "slash gate not logged" bullet removed; slash-dispatch.md
      says the refusals reach the console. smoke-tests.md DIAG-15 (a slash
      refusal) and DIAG-16 (a stand-down edge), index and pending rows.
    - docs/test-cases.md regenerated (415 cases, 1 skip); README badge 414/415.

    Gate: 414 passed, 1 skipped, 0 failed; luacheck 0/0.

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

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

    DG-PF-01: re-vendor LibKa0s v1.65.0 (kit 34)

    - libs/LibKa0s/ and tests/_kit/ replaced whole from the local tag v1.65.0
      (Slash 18, DebugLog 18 with the new DebugLogGates 1, Options 27 and six
      secondaries, Launcher 5, Lifecycle 3; kit stays at revision 34). CRLF per
      .gitattributes, the runner stays LF.
    - core/DebugLogSetup.lua: the degradation stub gains DebugOnce, DebugChanged,
      DebugForget and DebugAtEnable as no-ops, so the surface-parity case holds
      against the live instance.
    - CLAUDE.md provenance line, ARCHITECTURE.md substrate line and debug.md's
      DebugLog api citation (version-18.2.1) roll to v1.65.0.

    Gate: 407 passed, 1 skipped, 0 failed; luacheck 0/0.

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

commit 9ce87ea2fc49413f018dffdca5b1b51871471dbc
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 21:53:39 2026 +0530

    DL-PF-05: doc sync — Tests badge reads 407/408, debug.md cites DebugLog 17.2 (v1.64.0)

    The kit-34 opt-out case skips here by design, so the suite is 407 passed of 408; the badge now says
    so. debug.md still pointed at DebugLog 14.1 from v1.60.0; the vendored minor is 17.2 from v1.64.0.
    ARCHITECTURE's v1.64.0 lineage names the Diagnostics link and the logging-on report run too.

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

commit 9ce87ea2fc49413f018dffdca5b1b51871471dbc
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 21:53:39 2026 +0530

    DL-PF-05: doc sync — Tests badge reads 407/408, debug.md cites DebugLog 17.2 (v1.64.0)

    The kit-34 opt-out case skips here by design, so the suite is 407 passed of 408; the badge now says
    so. debug.md still pointed at DebugLog 14.1 from v1.60.0; the vendored minor is 17.2 from v1.64.0.
    ARCHITECTURE's v1.64.0 lineage names the Diagnostics link and the logging-on report run too.

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

commit 92b93454f5dbc19d9a714e241b16cf05e772454f
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 21:20:29 2026 +0530

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

    The setup steps, the How it works pipeline and Reporting a bug become "- "
    bullets; continuation indent follows. Reporting a bug is now exactly the
    v2.72.0 fixed body with /pfe, which also restores the standard's closing
    sentence (it had been reworded). No test pins the README's shape; the
    standards reference carries no version stamp.

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

commit 7120cd962f41272e5f41dbc8d0840ec1f2ceef0f
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 19:33:36 2026 +0530

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

    - libs/LibKa0s/ and tests/_kit/ replaced whole from the local tag v1.64.0
      (DebugLog 17 with the orange Diagnostics title-bar link, DebugLogDiagnostics
      2: a run turns debug logging on through SetEnabled when it is off; kit
      revision 34). CRLF per .gitattributes. This addon keeps the default (no
      diagnosticsEnablesLogging = false), so the kit's opt-out case skips.
    - tests/test_diagnostics.lua: the chat-line case now expects the logging ack
      before the report's line with logging off, one line with it already on,
      and the flag left on; it restores the flag like the other cases.
    - docs/debug.md: the Diagnostics link, and the run turning logging on for
      the session (a /reload turns it off); slash-dispatch.md row to match.
    - docs/smoke-tests.md: DIAG-13 (the orange Diagnostics link) and DIAG-14
      (diagnostics turns logging on, /reload turns it off); DIAG-5's second run
      no longer expects logging to stay off; index range and pending rows.
    - docs/test-cases.md regenerated (408 cases, 1 skip); README badge 407/407.
    - Standards reference v2.71.0: the TOC X-Standard, README badge and
      CLAUDE.md carry no version number, so nothing to roll.

    Gate: 407 passed, 1 skipped, 0 failed; luacheck 0/0; lizard 0 over CCN 15
    on the touched Lua.

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

commit e971f63529e85852e96c311aae4162bad244df1b
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 16:40:19 2026 +0530

    DL-PF-02R: red-under comment on the late EllesmereUI load coverage case

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

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

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

    Fill: [State] stand-down (holds, secure writes left queued), stand-up and
    entering-world edges; [Combat] entered; [Profile] deleted (OnProfileDeleted
    registered); [Anchor] drag drop and position reset; [Preview] unlock and
    lock-toggle refusals naming the guard; [Provider] EllesmereUI loading late
    and the EditMode.Exit pcall's error, once per distinct message; [Fade] mode,
    change-gated; the [Init] summary says whether EllesmereUI's raid frames are
    loaded (the flag is off at login, so it is the at-enable line).

    Quiet steady state: the secure queue logs a key once when first held, not on
    every replacing write; the Target and Pet lines are change-gated per button on
    the stringified name; the stand-in line is change-gated per raise. targetEvents
    joins the [Combat] rollup.

    Tests: tests/test_debug_coverage.lua (13 cases, one quiet test per repeating
    path fixed). docs/debug.md gains the Coverage section; DIAG-2, the test-case
    list and the badge follow.

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

commit 9de887e270f0bd993e3c3327c272e217198e0160
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 15:59:52 2026 +0530

    DL-PF-01: re-vendor LibKa0s v1.64.0 and test kit revision 33; resize smoke checks

    - libs/LibKa0s/ and tests/_kit/ replaced whole from the local tag v1.64.0
      (Core 9, DebugLog 15.1, Widgets 11.3, PerfPanel 6; kit revision 33 adds
      mock_resize.lua). CRLF per .gitattributes. Nothing adopted.
    - CLAUDE.md provenance line and docs/ARCHITECTURE.md vendored-version
      mentions rolled to v1.64.0.
    - Standards reference: the TOC X-Standard, README badge and CLAUDE.md
      "Standards compliance" carry no version number (documentation-§6
      template), so v2.70.0 needs no edit there.
    - docs/smoke-tests.md: DIAG-10 to DIAG-12 (console, copy window, perf panel
      width-only resize), index range and pending sign-off rows.

    Gate: 393/393 tests, luacheck 0/0, lizard 0 functions over CCN 15.

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

commit 9d3166e052c42907a15350e8c713076fbf2b07dd
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 08:52:30 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 9d3166e052c42907a15350e8c713076fbf2b07dd
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 08:52:30 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 e1086cbc3e0d92d1e0a8879ea252e44961cc3afd
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 01:34:54 2026 +0530

    SP-FIN-01: sync docs (v1.63.0 profile verb in build status and module map; kit line refs)

    - docs/ARCHITECTURE.md: v1.1.0 shipped LibKa0s v1.62.0, now at v1.63.0; name v1.63.0's Slash
      minor 17 profile verb and its revendor bundle; reviews/ exists, so drop "when it exists".
    - docs/module-map.md: settings/Slash.lua row names `profile` and its CliProfile / ProfileSwitch route.
    - DEPENDENCIES.md: tests/_kit/framework.lua evidence lines 123/127 -> 122/126.

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

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

    SP-PF-03R: PF.10's page Defaults, set/reset, Lock frame and color picker checks pending

    PF.10 (never run) owes the PF-11 Schema adoption's live half, and four
    of its clauses sat on no Pending sign-off row: PANEL-5 (page Defaults,
    whose [Set] reset general: 2 rows line is now the library's), SLASH-6
    (/pfe set and /pfe reset through the adopted seam), PREV-1 (the Lock
    frame untick, now on writeThrough) and CAST-7 (the color picker).
    SLASH-6 now quotes the reset echo and the Invalid value / expected a
    number refusal, and PREV-1 the Elements locked line, all checked
    against libs/LibKa0s/Slash.lua and settings/Slash.lua.

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

commit b6235a9ca3a9f90264505d9af24d5f6a1788b9b0
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 22:24:58 2026 +0530

    SP-PF-03R: Pending sign-off rebuilt to the clarified policy; three strings fixed

    Pending sign-off now lists every check with no recorded pass for what it
    now expects (29 rows, was 21). Added: SLASH-1 (the diagnostics verb
    arrived after the v0.1.0 pass), PANEL-2 and PANEL-3 (corrected tabs and
    the fade row), PROFILE-2 (newly quoted line), PROFILE-10 (tooltip arrow),
    STATE-9 (new clause), LAUNCH-7 (switch through the new verb), LAUNCH-8
    whole (owed as PF.10 after PF-11) and COMBAT-3 (owed as Q.10 after PF-09).

    Re-verified the expected strings against the code and LibKa0s. Fixed
    PROFILE-10's tooltip (`Profiles -> Reset Profile`, an ASCII arrow),
    LAUNCH-6's get/set echo and `Setting not found: global.minimap.hide`
    line, and its SavedVariables shape. LAUNCH-7 no longer tells a player
    already on Test to switch to Test.

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

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

    SP-PF-03R: PANEL-2 names three General tabs; COMBAT-1 and COMBAT-4 pending

    PANEL-2 carried old C 12's "two-tab strip", but the General page
    registers a third tab, Health updates (settings/General.lua HEALTH_GROUP),
    as docs/settings-panel.md and the doc's own UNIT-10 already say. A tester
    following the old text would fail a correct build.

    The in-combat launcher left-click (COMBAT-1, from K 54) and the options
    menu's Locked entry in combat (COMBAT-4, from K 55) both changed in M6
    (8263238, 2026-09-25). The 2026-09-25 X1.4 re-run ran every click out of
    combat, so neither clause has a recorded result; both now sit in the
    Pending sign-off table.

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

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

    SP-PF-03R: combat checks use /pfe set; pending table names every unsigned clause

    The review of SP-PF-03 found two problems.

    COMBAT-5 and COMBAT-7 told the tester to change panel settings in combat.
    The combat lock (996570f) covers every page and refuses those writes, so
    the steps could not be carried out. Both now go through the command:
    `/pfe set visibility` and `/pfe set target.clickToTarget`. COMBAT-5 sets
    Only out of combat before the pull, so the state driver's [combat] clause
    is what hides the frames. A visibility change made in combat queues the
    driver write until combat ends, so the frames cannot "hide at once" as
    the old step said; the in-combat half now expects the queued write.
    The old step's "moving a frame is refused" named no action, because
    combat re-locks and unlock is refused. It is now COMBAT-8, with a named
    drag on a target frame in free placement.

    The Pending sign-off table missed clauses that moved into other checks
    after the v0.1.0 sign-off: COMBAT-6 (old 47d's reshuffle sentence),
    LAUNCH-8 (the PF-13 reset of global.minimap.shown), LAUNCH-5 (the broker
    right-click menu from M6; the 2026-09-25 re-run names only the minimap
    button) and UNIT-10 (the unresolved-target repaint allowance, b6eb1dd).
    It also adds COMBAT-5 and COMBAT-8, whose steps are new.

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

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

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

    The old suite ran sections A-K and T with one global step sequence and 27 lettered steps added by
    later batches. The same behavior was checked in several places: the disabled launcher (10d, 54, 55),
    unlock refused in combat (44, 52, 55), the panel's combat refusal (4, 15, 54), re-sort in combat
    (30, 38, 47d), health updates off (35b, 42a), click to target (36, 42) and class color (34, 41). Its
    only sign-off was the v0.1.0 completion record. Per spec S4 and owner decision D4, it is now one
    evergreen suite.

    - 13 themes with stable prefixes: INSTALL, SLASH, PANEL, PROFILE, STATE, PREV, CAST, UNIT, FADE,
      LAUNCH, COMBAT, DIAG, and LOC under `## Non-English client`. Each check has one `Result:` line.
    - 90 old checks become 93. The duplicates are merged and nothing is dropped. The version checks
      expect "the TOC version" instead of a hard-coded v1.1.0.
    - Four new PROFILE checks cover the `profile <name>` verb from SP-PF-02: in combat, while disabled,
      quotes and spaces, and an unknown name. The old step 20 becomes the create, list and switch
      checks.
    - The v0.1.0 completion record is dropped (git keeps it). Checks whose behavior arrived after the
      last recorded passes (v0.1.0; the launcher re-check on 2026-09-25; the diagnostics pass on
      2026-09-26) are listed under `## Pending sign-off` with their origin.
    - Inbound references follow the new IDs. docs/debug.md now says DIAG-1 to DIAG-9;
      docs/ARCHITECTURE.md and docs/midnight-quirks.md say FADE-2 instead of step 47b; the
      ARCHITECTURE doc table names the `## Non-English client` section.

    The file is 509 lines, up from 448. The additions are the PROFILE checks, the setup list, the
    `Result:` lines and the pending table, and the spec puts coverage ahead of length. No test reads the
    file, and the test count does not change.

    Gate: 393 passed, 0 failed, 0 skipped; luacheck 0/0 in 75 files.

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

commit 09b8665abba51de17f2a8a962d74ccd9a4666126
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 12:38:42 2026 +0530

    SP-PF-02: /pfe profile via CliProfile

    PartyFrameEnhanced already had a hand-written profile sub-tree. It refused an unknown `use` name, but
    it had no `profile <name>` form, and a bare `profile` printed only the sub-verb help. Per owner
    decisions D1 and D3 (spec S3), the list and every switch now go through LibKa0s-Slash-1.0 minor 17,
    so they behave the same in every Ka0s addon:

    - the descriptor passes `profiles = function() return NS.db end`, asked at call time;
    - bare `profile` prints cli:CliProfile("") (the profiles, the current one marked, the hint) and then
      the sub-verb help;
    - a first word that is a sub-verb, in any case, runs it; anything else is a profile name and goes
      whole to cli:CliProfile, which strips one pair of quotes and keeps case and inner spaces;
    - `list` is cli:CliProfile(""), and `use <name>` is cli:ProfileSwitch(name), so an unknown name is
      refused with a did-you-mean and the list and never created, the current profile says so, and a
      switch in combat is refused;
    - with no profile store the verb gives the library's one answer (the stub's library-absent line
      when LibKa0s is missing) instead of the old "requires AceDB" string.

    The row count stays eighteen: `profile <name>` is part of the existing `profile` verb, not a new
    verb. `profile` was already in LIVE_WHILE_DISABLED. Five enUS keys the old list, switch and
    error lines used are removed.

    Tests first: a COMMANDS order pin; bare list-then-help; switch (the host's PROFILE publish ran once);
    `use` through the same path; unknown refused with nothing created; wrong case refused with a
    did-you-mean; quotes and spaces; case-insensitive sub-verbs and already-current; the combat refusal
    for both forms; `profile` live while disabled, both listing and switching. Two existing cases were
    updated on purpose. `profile use Typo` now answers with the library's refusal followed by the list,
    where it used to print one line. The degraded bare `profile` is now 9 lines (the library-absent
    line, the help header and seven rows) where it used to be 8, and with no store it prints the
    library-absent line.

    Docs: slash-dispatch.md (the row, the live set, the degraded paragraph), ARCHITECTURE.md Slash
    Commands, profiles.md (a new section on the verb), smoke step 20's expectation. docs/test-cases.md
    and the README badge are regenerated (384 -> 393).

    Gate: 393 passed, 0 failed, 0 skipped; luacheck 0/0 in 75 files; lizard 0 over CCN 15.

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

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

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

    Both payloads copied whole from the local v1.63.0 tag (dd7a774), never a working tree. The only
    library change is Slash 16 -> 17, the shared profile verb (CliProfile, ProfileSwitch, the profiles
    descriptor field, ProfileNames and nine PROFILE_* strings); tests/_kit is byte-identical at kit
    revision 31. CLAUDE.md provenance and docs/ARCHITECTURE.md's two version-now lines roll to v1.63.0.

    The copy alone turns the by-name Slash parity case red, as the version 17 document predicts: the
    live instance now has CliProfile and ProfileSwitch and the library-absent stub had neither. The stub
    gains both on route (b), each printing the one library-absent line for /pfe profile and switching
    nothing, and a new parity case pins that, so the gate is green at this commit. Wiring /pfe profile
    onto the library is the item's second commit.

    Bundle in docs/revendor/2026-09-29-v1.63.0/: only the Slash minor 17 profile surface is adopted, by
    this item, with no adoption interview. docs/test-cases.md and the README badge regenerated (383 ->
    384).

    Gate: 384 passed, 0 failed, 0 skipped; luacheck 0/0 in 75 files; lizard 0 over CCN 15.

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

This mod has no additional files