Ka0s Pretty Chat (Retail)

Prettier chat messages
Back to Files

1.7.0-release

File namePrettyChat-1.7.0-release.zip
Uploaded
Oct 9, 2026
Downloads
55
Size
6.5 MB
Flavors
Retail
File ID
9110180
Type
R
Release
Supported game versions
  • 12.1.0

What's new

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

Release 1.7.0

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

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

    Version 1.6.0 -> 1.7.0. Release gate read from the release run's
    manifest.json (docs/automated-tests/20261009-191724/, at 3c40352, clean):
    - lint: pass, 0 warnings / 0 errors in 56 files
    - tests: pass, 574 passed, 0 failed, 1 skipped, 575 total (the skip is
      the kit's diagnostics-contract opt-out case, which this addon does not
      take)
    - perf: skip, performance-§12 no-combat-path exemption (no tests/perf.lua);
      passes under the automated-tests-§3 exception, stated in the release notes
    - complexity: pass, max CCN 15, 0 functions above CCN 15, blindFiles 0
      (57462 NLOC, 1319 functions, avg CCN 2.1); the first sighted release run

    Files:
    - PrettyChat.toc: ## Version 1.7.0
    - core/Namespace.lua: NS.version fallback literal 1.7.0
    - tests/wow_mock.lua: fixture Version 1.7.0
    - tests/test_envsetup.lua: comment naming the fixture version
    - README.md: new 1.7.0 row at the top of ## Version History (Profiles
      page, /pc profile, the Categories Defaults confirmation, the blank
      format refusal, the newer-profile rollback guard), plus the perf-skip
      note
    - docs/automated-tests/20261009-191724/: the release bundle and its ANALYSIS.md
    - docs/automated-tests/RESULTS.md: the run's row and the re-ruled
      settings/Schema.lua disposition (1070 -> 1113)

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

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

    SD-FIN-03: remove dead export PrettyChat.ResetCategory

    No panel button or /pc verb reached it; tests now drive Schema.ResetRows / ResetCategoriesPage with the same assertions. GENERAL_RESET_PATHS went dead with it. Two cases that covered only the deleted General arm removed; test-cases.md regenerated, badge 574.

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

commit edfc2868d1edb3cacc458c301e69271e680bdf5b
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 9 17:49:53 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 1febeb5710e3ab90cd2b2a7ea7bf8c747eb827c3
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 22:20:43 2026 +0530

    PC-STD: roll standards reference to v2.77.0; sync docs

    Release-side item for the 2026-10-07 remediation (no finding of its own).
    Checked against WowAddonStandards v2.77.0 on its feature branch (WS-11).

    Standards reference:
    - The three places (PrettyChat.toc `## X-Standard:`, the README Standard
      badge, bare image, and CLAUDE.md `## Standards compliance (read
      first)`) are already in the v2.77.0 form and carry no version;
      toc-file-§1 and documentation-§1/§6 require none, so none is added.
    - toc-file-§5's whole-listing denominator (WS-04): every listed file was
      re-read for file-scope NS / library-major reads. Three positions were
      load-bearing but described as conventional or not annotated, and now
      carry a note naming what resolves at load: modules\Override.lua
      (GetAddon("PrettyChat"), NS.Const.Color, NS.Util.note, NS.L),
      modules\Diagnostics.lua (GetAddon("PrettyChat"); its place after
      Override stays conventional) and settings\Schema.lua (GetAddon, rows
      built at load from NS.Defaults / NS.GeneralDefaults / NS.GlobalDefaults,
      sorted through Override's NS.SortedStringNames). The Settings group
      header now says every line in it is load-bearing. docs/ARCHITECTURE.md's
      Module Map and docs/module-map.md's load order (items 18-20) say the same.
    - Citation sweep over authored files (libs/, tests/_kit/ and the frozen
      audits/reviews/revendor/superpowers/automated-tests run stores excluded):
      every filename-§N resolves to a `### N.` heading at v2.77.0 except
      `packaging-§1` (three .pkgmeta comments); packaging.md is unnumbered,
      so those now cite `packaging` (comment-only).
    - line-endings (WS-03): .gitattributes is byte-identical (CR-stripped) to
      line-endings-§5's client-bound body at v2.77.0; no edit. versioning-git
      (WS-08): no doc here restates the branch rule. No register row's
      Re-check trigger names a standard change made in this run, so no row is
      re-dated.
    - Line cites into the vendored library that RV-PC's re-vendor had moved
      are now symbol-form (documentation-§6's symbol-or-heading SHOULD):
      ARCHITECTURE.md's `OptionsWidgets.lua:352` -> `landingLogo`, and
      .luacheckrc's `libs/LibKa0s/Options.lua:606` -> `buildHeader`.

    Docs sync for RV-PC..PC-07:
    - .luacheckrc's settings/Panel.lua 212/self stanza names
      PrettyChat:ConfirmResetCategories (PC-03), a new method with the same
      unread receiver as ConfirmResetAll; its Schema.lua:180/:194 and
      Slash.lua:49 cites (now :50) become symbol references. Comment only.
    - Verified unchanged: README Tests badge 576/576 equals the
      docs/test-cases.md Total (576, one declared skip on its own row) and a
      fresh `--list` matches byte-for-byte; CLAUDE.md provenance and
      ARCHITECTURE/testing/module-map stamps read LibKa0s v1.71.0 / kit 38;
      schema.md and settings-panel.md carry PC-01's blank-format refusal;
      profiles.md and ARCHITECTURE.md carry PC-02's newer-build rule;
      README, settings-panel, schema, slash-dispatch, module-map and
      ARCHITECTURE carry PC-03's Categories confirmation. README.md is not
      edited, so no de-AI pass is owed.

    No version bump, no Version History row.

    Deviations: the TOC and .luacheckrc annotations go beyond the item's
    named files but are the toc-file-§5 re-read and the sync it asks for.

    Gates: 576 passed / 0 failed / 1 skipped; luacheck 0/0 in 56 files;
    lizard 0 functions above CCN 15; largest authored .lua 1113 lines.

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

commit 1febeb5710e3ab90cd2b2a7ea7bf8c747eb827c3
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 22:20:43 2026 +0530

    PC-STD: roll standards reference to v2.77.0; sync docs

    Release-side item for the 2026-10-07 remediation (no finding of its own).
    Checked against WowAddonStandards v2.77.0 on its feature branch (WS-11).

    Standards reference:
    - The three places (PrettyChat.toc `## X-Standard:`, the README Standard
      badge, bare image, and CLAUDE.md `## Standards compliance (read
      first)`) are already in the v2.77.0 form and carry no version;
      toc-file-§1 and documentation-§1/§6 require none, so none is added.
    - toc-file-§5's whole-listing denominator (WS-04): every listed file was
      re-read for file-scope NS / library-major reads. Three positions were
      load-bearing but described as conventional or not annotated, and now
      carry a note naming what resolves at load: modules\Override.lua
      (GetAddon("PrettyChat"), NS.Const.Color, NS.Util.note, NS.L),
      modules\Diagnostics.lua (GetAddon("PrettyChat"); its place after
      Override stays conventional) and settings\Schema.lua (GetAddon, rows
      built at load from NS.Defaults / NS.GeneralDefaults / NS.GlobalDefaults,
      sorted through Override's NS.SortedStringNames). The Settings group
      header now says every line in it is load-bearing. docs/ARCHITECTURE.md's
      Module Map and docs/module-map.md's load order (items 18-20) say the same.
    - Citation sweep over authored files (libs/, tests/_kit/ and the frozen
      audits/reviews/revendor/superpowers/automated-tests run stores excluded):
      every filename-§N resolves to a `### N.` heading at v2.77.0 except
      `packaging-§1` (three .pkgmeta comments); packaging.md is unnumbered,
      so those now cite `packaging` (comment-only).
    - line-endings (WS-03): .gitattributes is byte-identical (CR-stripped) to
      line-endings-§5's client-bound body at v2.77.0; no edit. versioning-git
      (WS-08): no doc here restates the branch rule. No register row's
      Re-check trigger names a standard change made in this run, so no row is
      re-dated.
    - Line cites into the vendored library that RV-PC's re-vendor had moved
      are now symbol-form (documentation-§6's symbol-or-heading SHOULD):
      ARCHITECTURE.md's `OptionsWidgets.lua:352` -> `landingLogo`, and
      .luacheckrc's `libs/LibKa0s/Options.lua:606` -> `buildHeader`.

    Docs sync for RV-PC..PC-07:
    - .luacheckrc's settings/Panel.lua 212/self stanza names
      PrettyChat:ConfirmResetCategories (PC-03), a new method with the same
      unread receiver as ConfirmResetAll; its Schema.lua:180/:194 and
      Slash.lua:49 cites (now :50) become symbol references. Comment only.
    - Verified unchanged: README Tests badge 576/576 equals the
      docs/test-cases.md Total (576, one declared skip on its own row) and a
      fresh `--list` matches byte-for-byte; CLAUDE.md provenance and
      ARCHITECTURE/testing/module-map stamps read LibKa0s v1.71.0 / kit 38;
      schema.md and settings-panel.md carry PC-01's blank-format refusal;
      profiles.md and ARCHITECTURE.md carry PC-02's newer-build rule;
      README, settings-panel, schema, slash-dispatch, module-map and
      ARCHITECTURE carry PC-03's Categories confirmation. README.md is not
      edited, so no de-AI pass is owed.

    No version bump, no Version History row.

    Deviations: the TOC and .luacheckrc annotations go beyond the item's
    named files but are the toc-file-§5 re-read and the sync it asks for.

    Gates: 576 passed / 0 failed / 1 skipped; luacheck 0/0 in 56 files;
    lizard 0 functions above CCN 15; largest authored .lua 1113 lines.

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

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

    PC-07: spill the census exemption prose out of the hub

    docs/ARCHITECTURE.md was 434 lines against documentation-§3's ~400-line
    hub guideline (PC-A-03, audit PC-105). It is now 375.

    - The three-condition reasoning for the GlobalStrings dump's layout-§1
      exemption, its PC-83 re-check against the generator's move to tools/,
      and the account of what the kit cap gate checks and leaves to the
      auditor move verbatim to a new `## The cap exemption` section in
      docs/global-strings.md (wording adjusted only where it pointed at
      "this table"/"above" in the hub).
    - The `### Files over the 1500-line cap` heading, measurement command,
      table, verdict, drift note and 1000-1500 band note stay under
      `## Documented deviations` (test_layout_cap reads them), with a
      one-paragraph pointer to the new section; the table row's "three
      conditions below" now links there.
    - The four retired/narrowed register-row narratives shrink to one
      sentence each, keeping the PC id (PC-61, PC-52, PC-88, PC-73) and the
      standing instruction not to add X-Wago-ID or a placeholder.
    - The Documentation map row for global-strings.md names the exemption
      reasoning.

    Deviation: lands at 375 lines rather than the ~360 target; the census
    paragraphs the gate depends on and the band note stay in the hub, and no
    rule content was dropped to reach a round number.

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

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

    PC-06: sync hub, sweep page, luacheckrc and finding ids with the tree

    Docs and comments only; no behaviour change.

    - ARCHITECTURE.md External dependencies: Item/Pool/Widgets are not
      consumed by the addon's own code, but vendored LibKa0s files resolve
      them internally (v1.71.0: DebugLog.lua -> Widgets; OptionsNav,
      OptionsTabs, OptionsWidgets -> Pool; OptionsIds, OptionsIdList ->
      Item), cited by file name. The hand-kept list of vendored-but-unused
      files is gone; the folder is copied whole.
    - performance-§12: the sweep page and the register row now both name
      DG-PC-01, the commit that last re-took the result block (git log on
      performance-sweep.md); the row's history gains the 2026-10-01 entry.
      The sweep was not re-run. The prose cites the tests/test_libka0s.lua
      hits by the test's name and says the block's line numbers for it
      have moved.
    - .luacheckrc: "Seven files here DO read it" is count-free (the seven
      named as the M4c-06 set); the historical "eleven" stays. Comment only.
    - Cycle-less PRETTYCHAT-A-NN ids remapped to the 2026-09-23 audit's
      in-repo ids, each checked against that bundle: A-03 -> PC-77,
      A-07 -> PC-83, A-08 -> PC-84, A-09 -> PC-85, A-19 -> PC-94,
      A-20 -> PC-95, A-25 -> PC-99. Frozen bundles untouched.
    - ARCHITECTURE.md handoff H-1: the Known consumer sentence describes
      LootHistory after LH-01 (records the source globals and rebuilds on
      change; Util.ParseSelfLoot / ParseSelfCurrency / ParseRollWon cited
      by symbol, no line numbers); the old defect is cited once as
      LootHistory@79131e3. The general warning and OVR-9 stay.

    Findings: PC-A-02, PC-R-10.

    Deviations: core/Database.lua's id sits at :38, not :36. One more
    cycle-less id the item did not list, PRETTYCHAT-A-05 in
    docs/module-map.md, is the 2026-09-07 audit's PC-64 (MakeCloseButton
    degraded stub; it is absent from the 2026-09-23 bundle) and is cited
    as "PC-64 of the 2026-09-07 audit" so the verify grep is clean.

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

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

    PC-05: correct the taint sentence and the contradictory report-size figures

    Comment and doc changes only. No code changed.

    - docs/data-flow.md: "`_G` writes don't taint" was false. The sentence now
      says the writes DO taint the overridden globals (issecurevariable answers
      false, "PrettyChat"), but only non-protected chat formatting reads them, so
      no protected path is affected and the pipeline needs no combat guard. It is
      marked as unverified against the current client: an owner in-client
      observation, not a gate. (PC-R-05)
    - The size of the Test() report was given three different ways: "500+",
      "A 500-line preview" and "eighty-odd". Every site now says "a few hundred
      lines" and gives no exact count: settings/Panel.lua (two sites),
      modules/Override.lua, docs/settings-panel.md, docs/slash-dispatch.md,
      tests/test_panel.lua and tests/test_slash.lua. (PC-R-06)
    - settings/Schema.lua: "nine addons drawing the same tab from nine
      hand-written copies" is now count-free. The roster has eleven. (PC-R-06)

    Deviations: the cited lines had moved (Panel.lua's figures are now at :106
    and :126, not :89-90 and :109). Step 2's sweep also found stale figures
    outside the five named sites. Those were aligned the same way: the
    report-size wording in docs/settings-panel.md, docs/slash-dispatch.md and
    the two test comments, and the "nine addons" wording in core/MediaSetup.lua,
    tests/run.lua and tests/test_surface_parity.lua.

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

commit 83217b5849da01d7d812c93cdcf49dc1c1f66594
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:13:15 2026 +0530

    PC-04: address review — make the General no-preview check able to fail

    The "nothing is previewed" assertion looked for a "Category:" header, which
    Test() only prints for a category with strings; General has none, so the old
    buggy path (header + "(no matching strings)") passed it too. Assert instead
    that the console carries neither the preview header nor the empty-result
    line. Verified red against a mutation that prints the refusal and still
    previews the matched General.

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

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

    PC-04: /pc test category no longer offers General

    General is a page in Schema.CATEGORY_ORDER but owns no strings, so
    `/pc test category General` resolved and previewed nothing, and both the
    usage and the unknown-category lines advertised it in their Valid list.

    runTest now builds the Valid list through a local testCategoryList()
    helper that skips General (used by the usage and the unknown lines), and
    a ResolveCategory match of "General" takes the unknown-category path with
    the same message and the `test refused: unknown category '<name>'` debug
    line. Schema.CATEGORY_ORDER is unchanged (the panel derives its tabs from
    it). No slash help or docs/common-tasks.md text listed test categories,
    so no doc prose changed.

    Tests: a test_slash case (General and general refused, no preview; the
    Valid list omits General and keeps Loot..Misc) and a debug-coverage
    assertion for the refusal line. Inventory regenerated and the README
    Tests badge moved to 576 in the same commit (docs/testing.md).

    Resolves PC-R-11.

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

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

    PC-03: confirm the Categories header Defaults before resetting every tab

    The Categories page's header Defaults button reset the strings on all
    eight category tabs with one click and no confirmation, while General's
    equivalent asks first. It now raises a new PRETTYCHAT_RESET_CATEGORIES
    StaticPopup (new locale key "Reset the strings on every category tab to
    their defaults? Your edits in every category are discarded.", Yes/No,
    timeout 0, whileDead, hideOnEscape) through the new
    PrettyChat:ConfirmResetCategories(); Accept runs ResetCategoriesPage.

    The library routes both the header button (onClick(widget, event, ...))
    and the canvas OnDefault footer forwarder (defaultsOnClick() with no
    arguments) through panel.defaultsOnClick, so the handler tells them
    apart by argument count: the footer path has already been confirmed by
    Blizzard's own Defaults dialog and resets directly, without a second
    popup. Combat refusal stays in the library on both paths. The General
    page is unchanged.

    Tests: test_panel's Categories Defaults case now fires the header
    button, asserts the popup and that nothing changed, then runs OnAccept
    and asserts the one `[Set] reset Categories: 2 rows` line (seen red
    before the fix: no popup raised). The footer OnDefault case also asserts
    no popup is raised. Case count unchanged (575/575 badge stands);
    docs/test-cases.md regenerated for the two renamed cases.

    Docs: README troubleshooting rows say the Categories Defaults asks first;
    settings-panel.md, schema.md, slash-dispatch.md, ARCHITECTURE.md and
    module-map.md describe the popup and the footer exception; smoke rows
    RESET-3/RESET-4 reworded (pending owner sign-off).

    Finding: PC-R-03.

    Deviations: none in behaviour. The footer-path assertion was added to the
    existing footer OnDefault case rather than as a new case.

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

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

    PC-02: do not prune or restamp a profile written by a newer build

    Database.RunMigrations normalized a stored schemaVersion that was ahead
    of SCHEMA_VERSION down to it and always ran PruneOrphans, so rolling the
    addon back (CurseForge) silently and permanently deleted every
    strings[G] / disabledStrings[G] override a newer build stored for a
    global this build has no row for, and lowered the stamp so the newer
    build would re-run its own steps.

    core/Database.lua: when the stored stamp is a number greater than
    SCHEMA_VERSION, RunMigrations emits one [Migrate] debug line ("stored
    schema vN is newer than this build's vM; leaving the profile untouched")
    and returns before runSteps, the restamp and PruneOrphans. Stamps at or
    below SCHEMA_VERSION behave as before; the now-dead else-branch restamp
    collapses to `schemaVersion = reached`. The RunMigrations header comment
    and the file's contract block state the new rule instead of "normalized
    down".

    Tests (red first, both seen failing on the stamp being lowered):
    test_database's "the runner stamps the current version even with no
    steps to run" is deliberately rewritten as "a stamp ahead of the target
    is left unchanged"; a new case seeds schemaVersion 99 with overrides and
    a disabled flag under a global with no row in this build and asserts
    they and the stamp survive and exactly one newer-than-this-build line is
    logged. docs/test-cases.md regenerated, README Tests badge 575/575;
    docs/ARCHITECTURE.md (load pass) and docs/profiles.md (schemaVersion)
    describe the rollback rule.

    Finding: PC-R-04.

    Deviations: none.

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

commit 2068c10336b39ec3b08b84b1bc378356b92623f5
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 19:57:19 2026 +0530

    PC-01: refuse blank formats in the schema (panel stored "")

    The conversion-signature gate accepted an empty format, because the empty
    sequence is a prefix of every sequence. The panel's New box hands
    Schema.Set whatever the player left in it, so clearing the box and
    pressing Enter stored "" and ApplyStrings printed that message blank.

    settings/Schema.lua refusedBySignature now refuses an empty or
    whitespace-only format first, printing a new localized line
    ("Not saved — %s: a format can't be blank. Use Reset to restore the
    default.", locales/enUS.lua, the only locale file this repo keeps) and
    returning "blank format" as the reason; formatAccepted forwards that
    reason as `why` and logs a matching [Set] refused trace. Every write the
    seam runs (panel, /pc set, /pc reset, the reset walk's default check)
    crosses it; no shipped default is blank. /pc set's own blank refusal in
    the library's ParseValue is untouched.

    Tests: test_schema drives "", "   ", "\t" and mixed whitespace through
    Schema.Set (refused, nothing stored, nothing in _G, message printed) and
    a valid format still sets; test_panel_categories fires the New box's
    Enter with "" and asserts db.profile is unchanged and the box snaps back.
    Both carry red-under notes and were seen red before the fix.
    test_libka0s's format-hook case now seeds "" into the DB (the only way a
    blank can still exist) instead of writing it through Set; test_locale
    records "blank format" as residue beside "conversion signature".
    docs/test-cases.md regenerated, README Tests badge 574/574; schema.md,
    settings-panel.md and a new SLASH-11 smoke row (pending sign-off).

    Finding: PC-R-02.

    Deviations: the panel case lives in tests/test_panel_categories.lua, not
    tests/test_panel.lua, because that is the suite that builds the
    Categories page's New box. The message text names the path ("Not saved
    — %s: a format can't be blank. ...") to match the existing refusal line.

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

commit 85dcb848597fc8dae75b41142fa45948024d12b9
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 19:51:11 2026 +0530

    RV-PC: re-vendor LibKa0s v1.71.0 (kit 38); record the v1.69.0/v1.70.0 span

    Mechanical re-vendor from the LOCAL annotated tag v1.71.0 (cb274a4):
    libs/LibKa0s/ and tests/_kit/ replaced whole by the tag's LibKa0s/ and
    testkit/ trees. Env 2, OptionsIdList 4, Slash 20, SlashParse 2,
    WidgetsLineChart 3, WidgetsAutocomplete 2; kit revision 37 -> 38
    (inventory.lua Totals, secrets.lua new). No adoption interview, no issue
    filed (owner scope).

    - CLAUDE.md provenance line rolls to v1.71.0 in the same commit.
    - docs/test-cases.md regenerated: kit 38 counts the one declared skip on
      a `| Skipped | 1 |` row; Total reads 572, equal to the README badge
      572/572 (PC-R-07).
    - docs/revendor/2026-10-07-v1.71.0/ records the delta, candidates
      (Kit.secret, the LineChart/Autocomplete fixes: not adopted in this run;
      Widgets declined #11) and summary.
    - docs/revendor/2026-10-07-v1.69.0-v1.70.0/ (01_DELTA.md and 05_SUMMARY.md
      only) records the two re-vendors 136cf54 and 7a1aabf that left no
      bundle (PC-A-01). The AUDIT.md two-listing check now prints nothing.

    Findings: PC-A-01, PC-R-07.

    Deviations: besides the ARCHITECTURE.md External dependencies token, the
    other live vendor stamps roll too (ARCHITECTURE.md Slash minor note
    19 -> 20, module-map.md load order, debug.md, testing.md layout-cap
    paragraph kit 37 -> 38), as every earlier re-vendor commit did. The
    working-tree copies of four RA-00 audit/review files were LF on disk and
    failed test_eol; they were re-checked-out (no content or index change).
    An earlier-run "RV-PC:" commit (v1.56.0) exists on master; it is not
    this item.

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

commit caa366b8f0a734ae934c4017cb93e6d4a82777eb
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 16:52:02 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 7a1aabfc1b7a78f003e1f73e202132c5367f7be4
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 11:38:41 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 7a1aabfc1b7a78f003e1f73e202132c5367f7be4
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 11:38:41 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 136cf540ffae8f43702bba80028c5538f79a3acf
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Oct 6 14:53:07 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 3c2560f97009f74ada1ca9f771a7f0639f51f308
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Oct 4 15:09:26 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 (ARCHITECTURE, module-map load order, debug.md, testing.md's
    layout-cap paragraph, whose "kit revision 35" moves to 36). 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 572 passed / 0 failed / 1 skipped / 573 total; after 572 / 0 / 1 / 573
    - luacheck: 0 warnings / 0 errors in 56 files

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

commit 3c2560f97009f74ada1ca9f771a7f0639f51f308
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Oct 4 15:09:26 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 (ARCHITECTURE, module-map load order, debug.md, testing.md's
    layout-cap paragraph, whose "kit revision 35" moves to 36). 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 572 passed / 0 failed / 1 skipped / 573 total; after 572 / 0 / 1 / 573
    - luacheck: 0 warnings / 0 errors in 56 files

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

commit 5eb0c2e10880d9050f6712026ef0013baebf77d4
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Oct 4 14:33:07 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 5eb0c2e10880d9050f6712026ef0013baebf77d4
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Oct 4 14:33:07 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 8f146f3dcc47c9fef5e4a61f86b6db31c9c45d70
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Oct 4 14:21:22 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 21ffeadd5cbf46746649a0e3b7c135a3af4b42c4
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sat Oct 3 12:48:11 2026 +0530

    SD-FIN-01: sync docs (lint file count; .pkgmeta ignores; current LibKa0s API doc versions)

    Comments and docs cite Core version-10 and Schema version-2 API docs; ResetCategory labeled a test seam; module-map points at tests/_kit/README.md instead of a stale kit listing.

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

commit 3670b81b4bd4c077cbecdce88b8f4458555bc4a7
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 23:37:33 2026 +0530

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

    Whole-folder copy of libs/LibKa0s/ and tests/_kit/ from the local annotated tag v1.68.0 (cc9f5eb;
    the sibling checkout is at the tag commit and diff --quiet v1.68.0 -- LibKa0s testkit is clean),
    CLAUDE.md provenance line rolled v1.67.0 -> v1.68.0 in the same commit. Moved minors:
    WidgetsDragHandle 3 -> 4 (Widgets key 12.1.3 -> 12.1.4, the optional tooltipPlace hook). No file
    added or removed, nothing only in the addon, testkit unchanged (kit revision 35). 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.0 (ARCHITECTURE, module-map load order, debug.md, testing.md).
    docs/test-cases.md matches --list and the README badge stays 572/572: no case moved.

    Frozen bundle docs/revendor/2026-10-02-v1.68.0/ (delta, candidates, decisions, summary). No
    contract blocker: PrettyChat looks up no LibKa0s-Widgets-1.0. The one candidate, tooltipPlace, is
    declined as not applicable (no drag strip); no issue filed, since it is not a gap. Nothing adopted.

    Gates (ka0s-bounded):
    - tests: before 572 passed / 0 failed / 1 skipped / 573 total; after 572 / 0 / 1 / 573
    - luacheck: 0 warnings / 0 errors in 56 files
    - complexity (sighted suite, --no-bundle): pass, max CCN 15, 0 warnings, 1314 functions

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

commit 3670b81b4bd4c077cbecdce88b8f4458555bc4a7
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 23:37:33 2026 +0530

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

    Whole-folder copy of libs/LibKa0s/ and tests/_kit/ from the local annotated tag v1.68.0 (cc9f5eb;
    the sibling checkout is at the tag commit and diff --quiet v1.68.0 -- LibKa0s testkit is clean),
    CLAUDE.md provenance line rolled v1.67.0 -> v1.68.0 in the same commit. Moved minors:
    WidgetsDragHandle 3 -> 4 (Widgets key 12.1.3 -> 12.1.4, the optional tooltipPlace hook). No file
    added or removed, nothing only in the addon, testkit unchanged (kit revision 35). 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.0 (ARCHITECTURE, module-map load order, debug.md, testing.md).
    docs/test-cases.md matches --list and the README badge stays 572/572: no case moved.

    Frozen bundle docs/revendor/2026-10-02-v1.68.0/ (delta, candidates, decisions, summary). No
    contract blocker: PrettyChat looks up no LibKa0s-Widgets-1.0. The one candidate, tooltipPlace, is
    declined as not applicable (no drag strip); no issue filed, since it is not a gap. Nothing adopted.

    Gates (ka0s-bounded):
    - tests: before 572 passed / 0 failed / 1 skipped / 573 total; after 572 / 0 / 1 / 573
    - luacheck: 0 warnings / 0 errors in 56 files
    - complexity (sighted suite, --no-bundle): pass, max CCN 15, 0 warnings, 1314 functions

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

commit 59938e4a05f0432429f67f650a11f0fd6b6dda47
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 01:46:34 2026 +0530

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

    settings/OptionsSetup.lua keeps its first vararg as addonName (local addonName, NS = ...)
    and passes addonName = addonName on the Options lib:New descriptor beside parentTitle and
    mainPanelName, so OptionsIdList (minor 3) can draw the library's own info help-mark art
    instead of the client glyph. Latent here: PrettyChat draws no IdList today. The
    library-absent arm returns before lib:New and is unchanged.

    Test first (red on the old header): tests/test_libka0s.lua pins, comments stripped, the
    vararg rename and the descriptor field, and asserts libs/LibKa0s/media/icons/info.tga is
    on disk where Media.Icon looks.

    Docs: test inventory regenerated (573 total), README badge 572/572, ARCHITECTURE and
    module-map header counts now ten readers / twelve discarders with OptionsSetup cited,
    module-map seam row names the field, smoke PANEL-22 added (index 1 - 22, Pending sign-off).

    Gates: lua tests/run.lua 572 passed, 0 failed, 1 skipped (573); luacheck 0/0 in 56 files;
    vendor diff -r empty; sighted complexity green, max CCN 15.

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

commit 59938e4a05f0432429f67f650a11f0fd6b6dda47
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 01:46:34 2026 +0530

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

    settings/OptionsSetup.lua keeps its first vararg as addonName (local addonName, NS = ...)
    and passes addonName = addonName on the Options lib:New descriptor beside parentTitle and
    mainPanelName, so OptionsIdList (minor 3) can draw the library's own info help-mark art
    instead of the client glyph. Latent here: PrettyChat draws no IdList today. The
    library-absent arm returns before lib:New and is unchanged.

    Test first (red on the old header): tests/test_libka0s.lua pins, comments stripped, the
    vararg rename and the descriptor field, and asserts libs/LibKa0s/media/icons/info.tga is
    on disk where Media.Icon looks.

    Docs: test inventory regenerated (573 total), README badge 572/572, ARCHITECTURE and
    module-map header counts now ten readers / twelve discarders with OptionsSetup cited,
    module-map seam row names the field, smoke PANEL-22 added (index 1 - 22, Pending sign-off).

    Gates: lua tests/run.lua 572 passed, 0 failed, 1 skipped (573); luacheck 0/0 in 56 files;
    vendor diff -r empty; sighted complexity green, max CCN 15.

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

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

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

    Whole-folder copy of libs/LibKa0s/ and tests/_kit/ from the local tag v1.67.0 (0bccf4c; the
    sibling checkout's HEAD equals the tag and its tree is clean), CLAUDE.md provenance line rolled
    v1.66.0 -> v1.67.0 in the same commit. Moved minors: Core 9 -> 10, Options 27 -> 28,
    OptionsIdList 2 -> 3. No file added or removed, nothing only in the addon, testkit unchanged
    (kit revision 35). Vendor parity: diff -r of both payloads against the tag is empty.

    Live vendor stamps roll to v1.67.0 (ARCHITECTURE, module-map load order, debug.md, testing.md).
    docs/test-cases.md regenerates byte-identical and the README badge stays 571/571: no case moved.

    Frozen bundle docs/revendor/2026-10-02-v1.67.0/ (delta, candidates listed but not interviewed):
    the Options descriptor's addonName goes to CA-PC-NM; the MakeResizable fields to none (no
    host-owned resizable window). No contract blocker; no consumer test broke.

    Gates:
    - tests: before 571 passed / 0 failed / 1 skipped / 572 total; after 571 / 0 / 1 / 572
    - luacheck: 0 warnings / 0 errors in 56 files
    - complexity (sighted suite, --no-bundle): pass, max CCN 15, 0 warnings, 1313 functions

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

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

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

    Whole-folder copy of libs/LibKa0s/ and tests/_kit/ from the local tag v1.66.0 (e4c5ef7),
    CLAUDE.md provenance line rolled v1.65.0 -> v1.66.0 in the same commit. Moved minors: Widgets 12,
    DebugLog 19, Slash 19, OptionsWidgets 34, OptionsTabs 8, Perf 14; new files WidgetsReorder 1,
    SlashParse 1, PerfSampler 1, PerfCommands 1 (all loaded through LibKa0s.xml, so the TOC is
    unchanged). Nothing was only in the addon, so nothing was deleted. Vendor parity: diff -r of both
    payloads against the tag is empty.

    tests/run.lua wires { name = "test_lizard_sighted", dir = "tests/_kit/" }. docs/test-cases.md
    regenerated (+8 cases), README badge 571/571. Live vendor stamps roll to v1.66.0 (ARCHITECTURE,
    module-map load order, debug.md's DebugLog 19.2.1 link, testing.md); the raw lizard lines in
    DEPENDENCIES.md and docs/testing.md now point at the runner's sighted complexity suite. CLAUDE.md's
    green-gate line quotes no lizard, so it is unchanged.

    Frozen bundle docs/revendor/2026-10-01-v1.66.0/ (delta, candidates listed but not interviewed, per
    02_SPEC.md S4; GI-LK-13 takes them), plus the span bundle 2026-10-01-v1.64.0-v1.65.0/ for the two
    tags vendored without one. No contract blocker; no consumer test broke.

    Gates:
    - tests: before 563 passed / 0 failed / 1 skipped / 564 total; after 571 / 0 / 1 / 572
    - luacheck: 0 warnings / 0 errors in 56 files
    - complexity (bash tests/_kit/run-automated-tests.sh --suite complexity, sighted): pass,
      maxCcn 15, warnings 0, blindFiles 0, 1313 functions (raw lizard listed 1230)

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

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

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

    Whole-folder copy of libs/LibKa0s/ and tests/_kit/ from the local tag v1.66.0 (e4c5ef7),
    CLAUDE.md provenance line rolled v1.65.0 -> v1.66.0 in the same commit. Moved minors: Widgets 12,
    DebugLog 19, Slash 19, OptionsWidgets 34, OptionsTabs 8, Perf 14; new files WidgetsReorder 1,
    SlashParse 1, PerfSampler 1, PerfCommands 1 (all loaded through LibKa0s.xml, so the TOC is
    unchanged). Nothing was only in the addon, so nothing was deleted. Vendor parity: diff -r of both
    payloads against the tag is empty.

    tests/run.lua wires { name = "test_lizard_sighted", dir = "tests/_kit/" }. docs/test-cases.md
    regenerated (+8 cases), README badge 571/571. Live vendor stamps roll to v1.66.0 (ARCHITECTURE,
    module-map load order, debug.md's DebugLog 19.2.1 link, testing.md); the raw lizard lines in
    DEPENDENCIES.md and docs/testing.md now point at the runner's sighted complexity suite. CLAUDE.md's
    green-gate line quotes no lizard, so it is unchanged.

    Frozen bundle docs/revendor/2026-10-01-v1.66.0/ (delta, candidates listed but not interviewed, per
    02_SPEC.md S4; GI-LK-13 takes them), plus the span bundle 2026-10-01-v1.64.0-v1.65.0/ for the two
    tags vendored without one. No contract blocker; no consumer test broke.

    Gates:
    - tests: before 563 passed / 0 failed / 1 skipped / 564 total; after 571 / 0 / 1 / 572
    - luacheck: 0 warnings / 0 errors in 56 files
    - complexity (bash tests/_kit/run-automated-tests.sh --suite complexity, sighted): pass,
      maxCcn 15, warnings 0, blindFiles 0, 1313 functions (raw lizard listed 1230)

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

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

    DG-PC-01: adopt docs: debug.md Coverage names the library's lines, DIAG-23 to DIAG-25 smoke rows, moved citations re-pointed

    docs/debug.md's Coverage says which lines are the library's (Slash's `refused` lines,
    Lifecycle's edges, the Options combat lock's `refused (in combat)` and flush lines, the
    Launcher's state lines through the at-enable queue), that this addon writes no copy of them,
    and that the watcher and caught-error gates are the console's; the "library's own refusals
    are chat only" bullet goes, it is no longer true. docs/smoke-tests.md gains DIAG-23 (a Slash
    refusal in the console), DIAG-24 (a Lifecycle edge in the console) and DIAG-25 (the launcher's
    state line at the first enable), indexed and listed as owed. The latch's TOC, header and
    module-map lines say its edge lines go through NS.Debug; the performance sweep's result block
    is re-taken on the v1.65.0 tree (Override.lua:200/212, UnregisterAllEvents at :208) and the
    slash-dispatch and LOC-2 line citations follow the moved lines.

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

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

    DG-PC-01: adopt docs: debug.md Coverage names the library's lines, DIAG-23 to DIAG-25 smoke rows, moved citations re-pointed

    docs/debug.md's Coverage says which lines are the library's (Slash's `refused` lines,
    Lifecycle's edges, the Options combat lock's `refused (in combat)` and flush lines, the
    Launcher's state lines through the at-enable queue), that this addon writes no copy of them,
    and that the watcher and caught-error gates are the console's; the "library's own refusals
    are chat only" bullet goes, it is no longer true. docs/smoke-tests.md gains DIAG-23 (a Slash
    refusal in the console), DIAG-24 (a Lifecycle edge in the console) and DIAG-25 (the launcher's
    state line at the first enable), indexed and listed as owed. The latch's TOC, header and
    module-map lines say its edge lines go through NS.Debug; the performance sweep's result block
    is re-taken on the v1.65.0 tree (Override.lua:200/212, UnregisterAllEvents at :208) and the
    slash-dispatch and LOC-2 line citations follow the moved lines.

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

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

    DG-PC-01: adopt the at-enable queue for the launcher's state lines (Launcher 5 debugAtEnable)

    core/LauncherSetup.lua passes `debugAtEnable`, routed to `D.DebugAtEnable`, so Register's
    state lines (LibDataBroker-1.1 / LibDBIcon-1.0 absent, no minimap table, `registered`), written
    in OnEnable while the session-only flag is off, are held and land the first time the player
    turns logging on, after the [Init] summary; events stay on `debug`. The [Init] summary's two
    state tails (stood down, chat addons) stay where they are: they are read at each enable edge,
    which is the fresher answer.

    A test pins the held line landing once after [Init] and not repeating on a second enable.
    Inventory and badge regenerated (563/563).

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

commit 9e9ef82a83d4e79e06bd7e41d636ce6c524c66d4
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 01:09:17 2026 +0530

    DG-PC-01: adopt the console's change gates for the watcher trace and TraceCaught; delete the hand-rolled memos

    modules/Override.lua's `watchArmed` memo becomes `D.DebugChanged("combatWatch", ...)` and
    core/Util.lua's `seenErrors` table becomes `D.DebugOnce(site .. err, ...)` (DebugLogGates 1),
    so a Clear or the enable edge re-arms both and nothing is remembered while logging is off; the
    steady state stays one line (the rejected-name line still rides the arm line only). The locale
    scanner counts `.Debug<Word>(` calls as the debug sink, as it does NS.Debug.

    Tests pin the Clear re-arming both gates, a watcher armed with logging off being stated on the
    first pass after enable, the quiet steady state, and the library-absent stub answering false
    without raising. Inventory and badge regenerated (562/562).

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

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

    DG-PC-01: adopt Slash 18 and Lifecycle 3 debug sinks; drop the arms' own edge lines

    The Slash descriptor passes the gated sink as `debug`, so the dispatcher's refusals (the
    disabled gate, an unknown verb, get/set/reset usage and not-found, parse and write refusals,
    the profile verb's four) land as one `[Cmd] refused <verb>: <guard>` line each; the host keeps
    its own lines for the verbs it owns. The Lifecycle descriptor passes it too, and the library
    writes one `[Lifecycle]` line per edge with its holds, so modules/Override.lua's StandDown and
    StandUp write none of their own (one line per edge, not two). traceCommand's stood-down tail
    stays as context and its comment says the refusal is now the library's line.

    Tests pin both library lines landing in this log, once, beside the host's command line; a host
    verb's refusal gaining no library copy; no line for a call that fires no edge; and the Options
    combat lock's `[Cfg] tab <key> refused (in combat)` line, once per combat, with the host's
    switch not run. Inventory and badge regenerated (558/558).

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

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

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

    Whole-folder copy of libs/LibKa0s/ and tests/_kit/ from the local tag v1.65.0, the CLAUDE.md
    provenance line rolled in the same commit. The library-absent DebugLog stub gains DebugOnce,
    DebugChanged, DebugForget and DebugAtEnable (each answering false, or nothing) so the
    surface-parity case holds. Live vendor stamps (ARCHITECTURE, module-map load order with
    DebugLogGates, testing, debug.md's api link) roll to v1.65.0. Adoption follows.

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

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

    DL-PC-SYNC: smoke-tests owed table names DebugLog 17, the vendored minor

    DIAG-22's row still cited DebugLog 16 from the first v1.64.0 cut; the final
    re-vendor (DL-PC-03) carries LibKa0s-DebugLog-1.0 minor 17, as debug.md says.

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

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

    DL-PC-SYNC: smoke-tests owed table names DebugLog 17, the vendored minor

    DIAG-22's row still cited DebugLog 16 from the first v1.64.0 cut; the final
    re-vendor (DL-PC-03) carries LibKa0s-DebugLog-1.0 minor 17, as debug.md says.

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

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

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

    CurseForge's description page does not render a Markdown numbered list, so
    the Usage steps and ## Reporting a bug become `- ` bullets, markers only.
    Reporting a bug is now the v2.72.0 item 9 fixed body with /pc. The doc
    structure suite pins the bulleted body and gains a case that fails on any
    numbered README list item outside a code fence (554/554, inventory
    regenerated).

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

commit 0ebd9caeb765d9719e7e2a059f36e9285c25aeea
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 19:46:24 2026 +0530

    DL-PC-03R: assert the end marker so `debug diagnostics` is told apart from `on`

    The case's only discriminator had been replaced by the flag check, which
    `/pc debug on` also satisfies. Assert the report's end marker instead and
    credit it in the comment.

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

commit 49edc8bcfa63bda426baaacf85f55a7236801854
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 19:36:47 2026 +0530

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

    Both payloads copied whole from the local tag v1.64.0 and normalized to
    .gitattributes. DebugLog 16 draws the orange Diagnostics link in the
    console's title bar; DebugLog 17 / DebugLogDiagnostics 2 make a run turn
    debug logging on for the session through SetEnabled(true) before it
    writes (debug-logging-§14, standard v2.71.0). PrettyChat keeps the default:
    no diagnosticsEnablesLogging = false, and runDiagnostics wraps no
    SetEnabled. Kit revision 34's contract suite adds the already-on case and
    declares the opt-out case a skip. The CLAUDE.md provenance line stays
    v1.64.0, the same tag re-cut. The three-place standards reference carries
    no version, so v2.71.0 needs no stamp there.

    tests/test_diagnostics.lua: `debug diagnostics` now asserts the flag was
    off before and on after, rather than unchanged. docs/debug.md says the run
    turns logging on for the session (and a /reload turns it off), names the
    link as the one non-slash way in, and points at the DebugLog 17.2 api doc;
    slash-dispatch.md matches. testing.md: kit revision 34.

    docs/smoke-tests.md: DIAG-4 rewritten (diagnostics, by verb or link, turns
    logging on for the session; /reload turns it off) and DIAG-22 added (the
    orange Diagnostics link beside Debug On/Off, a small gap, plain text; a
    click writes the report); DIAG-19 lists the DIAGNOSTICS key; both listed as
    owed. Inventory regenerated (554 cases, one declared skip); badge 553/553.

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

commit 1d7cdb5bb6527bab20c8bd6590faf0f44d33f72a
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 16:38:49 2026 +0530

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

    - [Visibility] combat boundary line names the edge (combat entered/left).
    - [Events] combat watch armed/disarmed, change-gated; the rejected-name line now
      rides the arm line instead of repeating on every re-registration.
    - [Init] summary gains ", stood down: <holds>" and ", chat addons: <names>" tails
      (both settled at load, while the session-only flag is off).
    - [Cmd] line per slash command as typed (pipes doubled, stood-down tail), plus a
      "<verb> refused: <guard>" line at each host-owned refusal.
    - [UI] Categories tab switch and string selection; refresher pcall errors traced
      once per distinct site and error (NS.Util.TraceCaught).
    - tests/test_debug_coverage.lua (14 cases), two quiet-steady-state cases; the
      two resetall line-count cases now expect the [Cmd] line.
    - docs/debug.md Coverage section; moved citations re-pointed; inventory and
      badge at 552.

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

commit fa4f9fd5829da94a48d9d862233b1228f3bf730e
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 16:07:17 2026 +0530

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

    Copies libs/LibKa0s/ and tests/_kit/ whole from the local v1.64.0 tag
    (Core 9, DebugLog 15.1, Widgets 11.3, PerfPanel 6; kit revision 33 adds
    mock_resize.lua) and rolls the CLAUDE.md provenance line in the same
    commit. No surface is adopted: the resizable console and copy window
    arrive through the library alone.

    Live-doc stamps of the vendored release follow (ARCHITECTURE, module-map,
    testing's kit revision, and performance-sweep's re-take, whose result is
    unchanged). The three-place standards reference carries no version in
    this addon, so v2.70.0 needs no edit there.

    docs/smoke-tests.md gains DIAG-20 (console resize: grip, minimum, kept on
    close and reopen, default after /reload, another addon's console
    unaffected) and DIAG-21 (copy window resize), both listed as owed. No
    perf panel: PrettyChat ships no perf harness.

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

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

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

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

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

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

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

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

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

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

    SP-FIN-01: renumber the mock header's _G override to 17 (two items were 16)

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

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

    SP-FIN-01: sync docs (Lifecycle seam and Profiles load position mapped, stale counts and a citation fixed)

    - ARCHITECTURE.md: seven load-bearing positions (settings/Profiles.lua last,
      pinned by tests/test_profiles.lua); core/LifecycleSetup.lua row in the module
      map and NS.Lifecycle row in the namespace table.
    - module-map.md: thirteen `local _, NS` files; seven load-bearing positions;
      NS.LIBKA0S_MISSING names settings/Schema.lua; NS.Config.BuildMain and
      NS.SchemaRuntime / NS.SchemaLib rows.
    - testing.md: luacheck covers 55 files; nine seam files (Lifecycle, Schema);
      nine adopted seams plus the Profiles page; wow_mock overrides seventeen keys.
    - DEPENDENCIES.md: logo recipe citation core/LauncherSetup.lua:102-103.

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

commit 697aeedacee095c85ded7eb35678358d1d4de32a
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 22:29:31 2026 +0530

    SP-PC-03R: apply the clarified Pending sign-off policy; fix three expected strings

    Pending sign-off was written under the old wording, and an earlier review
    had the new checks taken out of it. Under the 2026-09-29 clarification it
    now lists, by new ID with origin and reason, 115 of the 128 checks: the 11
    new checks (PROFILE-1 to 10, DEGRADED-9), the 22 whose expectation this
    rework corrected against the code, the old checks an owed list names as
    never run (T-99, T-104 to T-107, T-97/T-98, T-29c, SMK-F001), and every
    other old check, since the old document carried no Result lines. The 13
    left out have a recorded owner pass and an unchanged expectation: DIAG-1,
    DIAG-3 to 8, DIAG-14, COMBAT-4 and DEGRADED-8 (the 2026-09-26 diagnostics
    run) and LAUNCH-2 to 4 (the 2026-09-25 minimap re-check). DIAG-2 stays
    pending: no recorded row covers the [Globals] line.

    Every expected chat and console string was re-checked against the code
    by driving the real dispatcher headlessly, live and library-absent. Three
    did not match:
    - SLASH-3: /pc list prints 180 lines (170 setting rows), not about 170.
    - SLASH-6: /pc get echoes `<path> = <value>`, and the format is unquoted.
    - RESET-5: the reset echo goes through the same formatter as /pc get, so
      chat shows single pipes, not doubled ones.

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

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

    SP-PC-03R: LOC-4 fails on the missing-original placeholder; PANEL-16 ticks Enable

    LOC-4 carried T-106's wording and expected no empty or nil Original line.
    The client never prints one: /pc test and the panel's Original box both
    show the gray "(original not available)" for a global the locale does not
    define (pinned by tests/test_override.lua). A first run of this owed check
    would have passed while missing the very finding it exists for. It now
    fails on that placeholder and records every global that shows it.

    The routine row sends quick-recipe step 4 to PANEL-16, but PANEL-16 only
    exercised the New box, so the toggle half was dropped: no check ticked a
    row's Enable on the panel and watched the next chat line change live.
    PANEL-16 now unticks the Enable, expects Blizzard's line at once with no
    /reload, and ticks it back.

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

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

    SP-PC-03R: restore smoke routing and correct six check texts

    The review of SP-PC-03 found checks that no longer ran when their
    trigger changed, lost arms of old checks, and expectations that do not
    match the code.

    - Which checks to run: every row now names the new ID of each check its
      old When-to-run groups held. The re-vendor and chrome rows get back
      RESET-3 to 7, RESET-10, COMBAT-1 to 2 and PANEL-14; the diagnostics
      and slash rows get COMBAT-4; the Panel.lua row gets DIAG-9 to 15; the
      launcher row gets STATE. The routine row replaces the quick recipe
      with INSTALL-2 (a plain /reload), TEST-1, the new OVR-10 (one real
      chat line, the recipe's step 3) and PANEL-16. debug.md names COMBAT-4.
    - RESET-11 carries T-57's path-reset arm and its /pc list Loot check.
    - RESET-12 includes the footer control's one [Set] line (T-26).
    - STATE-2: the panel checkbox writes through the schema and prints
      nothing to chat; only the verbs echo.
    - DEGRADED-3: the stub reports the missing window once per entry point.
    - SLASH-1: the help header ends with the /prettychat alias note.
    - Pending sign-off lists only unsigned checks carried over from the old
      doc, per S4.

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

commit a2447f5239d80bf2efa2958f215c30832f5a853e
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 21:10:49 2026 +0530

    SP-PC-03: rewrite smoke tests as one evergreen, theme-grouped suite

    The smoke document had grown to 1186 lines in 14 groups with two ID
    schemes (T-NN and SMK-F001), two formats, a duplicated T-26b, four checks
    orphaned under "Reporting a failure", and the same behavior walked in
    several places (the resets, the degraded install, the console chrome,
    enable and disable). Several expectations had gone stale: /pc test writes
    to the debug console, not chat; a dropped conversion now saves; /pc reset
    takes a path; Loot has 17 strings. Spec S4 (owner decision D4) asks for one
    deduplicated suite grouped by theme with stable IDs.

    All 83 old checks and the 4-step quick recipe map to 127 checks in 13
    themes; none dropped, stale halves corrected. The new PROFILE checks cover
    the Profiles page and the /pc profile verb (list, switch, unknown name,
    quotes, while disabled, in combat), and DEGRADED-9 its library-absent
    line. The never-run T-99 and T-104 to T-107 and the new profile checks sit
    under Pending sign-off with their origin. The Non-English client section
    keeps what tests/test_doc_structure.lua pins, and cites ConsumableMaster
    LOC-1 and KickCD LOC-1. Inbound citations in ARCHITECTURE.md, debug.md,
    common-tasks.md, testing.md and two test comments now name the new IDs.

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

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

    SP-PC-02R: name profile, liveVerbs and profiles in the Tier-1 docs

    docs/module-map.md's settings/Slash.lua row still listed the COMMANDS verbs
    without `profile` and described the descriptor only by its format/parse hooks,
    though the ARCHITECTURE module row was already updated. The row now lists
    `profile` in COMMANDS order and names the descriptor's two new fields:
    `liveVerbs` (lib.LIVE_VERBS copied at load plus `profile`) and `profiles` (a
    function returning PrettyChat.db at call time, the store CliProfile uses).

    Sweep of the other docs for verb lists or counts without `profile`: the only
    other current list was docs/scope.md's slash CLI bullet, which gains `profile`;
    its Profiles bullet now mentions the chat verb too. The README 1.3.0 history row
    is a record of that release and stays as written. The counts (ARCHITECTURE's
    "14 verbs", smoke T-03's fourteen, slash-dispatch.md's live set) already
    include it.

    Gate: tests 538/538, luacheck 0/0 in 55 files, lizard 0 functions above CCN 15.

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

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

    SP-PC-02R: dispatch every live verb in disabled/7 while actually disabled

    The `profile = true` entry in step 7's LIVE_VERBS could not fail. The loop
    walks NS.COMMANDS in order and `resetall` comes right before `profile`.
    `resetall` puts General.enabled back to its default of true, so `profile`,
    `debug`, `diagnostics` and `enable` all ran with the addon up. Those verbs
    answer then whether they are live or not. Dropping `profile` from
    settings/Slash.lua's liveVerbs left the case green, which testing-§12 forbids
    and which defeats spec S3 step 4's "test_disabled.lua pins `profile` as live".

    The loop now re-disables after `resetall` as well as after `enable`, and it
    asserts that the addon is disabled before each dispatch. That way a future
    writing verb that re-enables the addon breaks the case loudly instead of
    quietly hollowing it out. Mutation check: with `profile` commented out of
    liveVerbs, this case now goes red, alongside the test_slash.lua and
    test_profiles.lua disabled cases. The test count is unchanged (538).

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

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

    SP-PC-02R: re-take the performance sweep; make the disabled profile case catch a narrowed liveVerbs

    The result block in docs/performance-sweep.md had been hand-edited rather than
    re-taken since SP-PC-01R added a C_Timer.After to settings/Profiles.lua. The
    documented command now returns 43 lines across 12 files, and the block is
    replaced with its real output. The three missing hits were
    settings/Profiles.lua:130 (a comment), :137 and :143. The reconciliation now
    counts fifteen comments and six shipped call sites. A new section covers the
    Profiles page's next-frame redraw and why it does not touch criterion (a):
    it is a one-shot, coalesced hop off a player-made profile change, not an
    OnUpdate, a ticker or a game-event handler. The header now names the v1.63.0
    tree. performance.md's runtime table and the performance-§12 register row in
    ARCHITECTURE.md name the new consumer and the re-take.

    The falsification comment on "/pc profile answers while the addon is
    disabled" named a mutation (liveVerbs of `profile` alone) that left the case
    green, because the case sent no reserved verb while disabled. The case now
    asserts that `get General.enabled` still answers while disabled. Both named
    mutations were run and both redden it. The test count is unchanged (538).

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

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

    SP-PC-02: /pc profile via CliProfile

    Profiles became user-visible with SP-PC-01's Profiles page, but nothing reached
    them from chat. LibKa0s-Slash minor 17 ships the profile verb once for the whole
    collection (owner decision D1), so PrettyChat registers its own row and routes it
    to the library: bare `/pc profile` lists the profiles with the current one
    marked, `/pc profile <name>` switches to an existing profile (case kept, spaces
    kept, one pair of quotes stripped), an unknown name is refused with the list and
    a did-you-mean, and nothing is ever created (D3).

    - COMMANDS gains {"profile", L[...], Sl:CliProfile(rest)} after resetall, beside
      the other settings verbs; its description joins the enUS manifest.
    - The descriptor passes profiles = function() return PrettyChat.db end, asked at
      call time since this file runs before OnInitialize builds the db. The switch
      is db:SetProfile, so it runs the same OnProfileChanged adopt path and one
      [Profile] line as a switch on the page; the library logs nothing.
    - `profile` answers while disabled: PrettyChat used to pass no liveVerbs, and
      the library leaves `profile` off lib.LIVE_VERBS on purpose, so the descriptor
      now passes lib.LIVE_VERBS copied at load plus "profile". A profile holds its
      own General.enabled, so switching to one where the addon is on is a repair.
      The gate comments that said no liveVerbs is passed are rewritten.

    Tests first: tests/test_profiles.lua gains six cases (list order and mark,
    switch runs the handler once, unknown refused and nothing created, quotes,
    combat refusal, live while disabled and brings the addon back up);
    tests/test_slash.lua pins COMMANDS by value (fourteen verbs, help one row each);
    both disabled LIVE literals gain `profile`; the degraded case also drives the
    row. Docs: ARCHITECTURE Slash Commands and module row, slash-dispatch.md
    (sample, gate, reference and internals tables), profiles.md, common-tasks.md,
    the README profiles answer, smoke T-03's count; test-cases.md regenerated and
    the badge moved to 538; shifted citations re-pointed (slash-dispatch.md into
    settings/Slash.lua, performance-sweep.md into tests/test_libka0s.lua).

    Gate: tests 538/538, luacheck 0/0 in 55 files, lizard 0 functions above CCN 15.

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

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

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

    Both payloads copied whole from the local v1.63.0 tag (dd7a774), never a working
    tree. Only libs/LibKa0s/Slash.lua moved (minor 16 -> 17: the profiles descriptor
    field, CliProfile, ProfileSwitch, lib.ProfileNames and nine PROFILE_* strings);
    tests/_kit is byte-identical at kit revision 31. The CLAUDE.md provenance line
    rolls in the same commit, as the vendor-sync gate requires.

    The re-vendor alone turns the by-name Slash parity case red, because the live
    instance now has CliProfile and ProfileSwitch and the library-absent stub had
    neither. The stub gains both on the Slash version-17 route (b): each prints the
    stub's missing-library line and switches nothing, ProfileSwitch answering false.
    The degraded-Slash case in tests/test_libka0s.lua pins that (one line each, no
    switch, no profile created), as assertions in the existing case, so the count
    stays 531.

    Version-now lines roll (ARCHITECTURE library inventory and gate minor,
    module-map load order, testing.md, slash-dispatch.md), and performance-sweep.md's
    citations into tests/test_libka0s.lua move by the 24 lines the case gained.
    Bundle: docs/revendor/2026-09-29-v1.63.0/ (only the Slash minor 17 profile
    surface is adopted, by this item; no interview, no issues filed).

    Gate: tests 531/531, luacheck 0/0 in 55 files, lizard 0 functions above CCN 15.

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

commit 4f26883aad654bd4c712c362e23092687a3e561c
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 11:30:36 2026 +0530

    SP-PC-01R: redraw the shown Profiles page a frame later, never under its own control's callback

    A switch, new profile, copy or reset made with the Profiles page's own
    AceDBOptions control fires the profile event from inside AceConfigDialog's
    ActivateControl. The adopt path redrew the shown page synchronously, which
    re-opened AceConfigDialog into the page's container and released the
    activated widget; AceGUI:Release wiped its userdata table in place, and
    ActivateControl's read of user.rootframe after the callback raised
    ("attempt to index field 'rootframe'") whenever the shared pool handed the
    re-open a different widget. That is the rebuild-under-a-live-callback
    hazard options-ui-§11 names.

    RefreshProfilesPage now marks a hidden page at once (which draws nothing)
    and redraws a shown one through C_Timer.After(0), one queued pass per
    frame. The header comment and docs no longer claim a change made on the
    page needs nothing from the adopt path. A new case pins that no Open lands
    while the event is on the stack and one lands the frame after; it goes red
    under the synchronous redraw. The shown-page redraw cases flush a frame.

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

commit 5cf470299feded5216c6b2c3533c2de1bfbbd051
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 11:09:27 2026 +0530

    SP-PC-01R: pin the Profiles page's silent opt-out with a chat survey

    The degraded-install case asserted only that no Profiles page exists and
    that a switch does not raise. OptionsRegistry pcalls every builder and
    drops a page whose builder raises, printing PAGE_FAILED to the player, so
    the case passed whether Build opted out or crashed (testing-§12, §8).

    The case now asserts no printed line contains "failed to build", and
    carries a red-under line. Verified in a scratch copy: narrowing the
    four-library guard in settings/Profiles.lua aceLibs() to `libs.config`
    turns the case red with "settings page 'Profiles' failed to build:
    ./settings/Profiles.lua:86: attempt to index field 'dbOptions'". No case
    added or renamed, so docs/test-cases.md and the badge stay at 530.

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

commit e545f38e383f1c4e418b7d343d36db23aa10de9a
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 10:58:54 2026 +0530

    SP-PC-01R: regenerate docs/test-cases.md after the Defaults-button case rename

    43fc1b1 renamed the Profiles page case to "... with no Defaults button" but
    left the generated inventory reading "... with no Defaults action", so
    `lua tests/run.lua --list` no longer matched docs/test-cases.md.
    testing-§5 and docs/testing.md require the inventory to be regenerated in
    the same change as a rename. Regenerated from --list (CRLF); the count
    stays 530, so the README Tests badge is unchanged.

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

commit 43fc1b14cb4f7a949e4b19b604708367567e6910
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 10:09:31 2026 +0530

    SP-PC-01R: pin the Profiles page's missing Defaults button and the veto wiring; fix stale docs

    The review of SP-PC-01 found two cases in tests/test_profiles.lua that
    testing-§12 does not accept. The "no Defaults button" check read
    panel.defaultsOnClick, which only a host sets, so `defaultsButton = true`
    left the suite green. It now reads the library's own state: the page must
    record wantsDefaultsButton == false, and after the first show defaultsBtn
    must be nil. Each assertion was checked red under that mutation on its own.
    The reset-veto case named `skipRestoreAll` as a mutation that would turn it
    red, but dropping it changed nothing. With resetProfile supplied, the library
    already narrows its walk to sessionOnly rows, so no behavior can see the
    field. The wiring is now read off settings/OptionsSetup.lua's source with
    comments stripped, the pattern test_libka0s.lua already uses for descriptor
    fields. This was checked red under that mutation too.

    Docs had drifted from this item's changes. module-map.md still said
    AceConfig-3.0 had been removed on the same line that now lists it as loaded.
    smoke-tests.md T-21 and the LOC walk, slash-dispatch.md and settings-panel.md
    still described two sub-pages. performance-sweep.md's result block (and its
    prose citations) no longer matched the page's own sweep: test_libka0s.lua
    moved by this item, and Override.lua had been stale since before it. The
    block is now the live sweep output.

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

commit f6dcc4acdfe4066c41e692daae07c1ce3b862ac4
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 09:55:25 2026 +0530

    SP-PC-01R: name Profiles -> Reset Profile in the reset tooltip; fix shifted wow_mock citations

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

    The Options descriptor passed neither `resetProfile` nor `profilesPage`, so the
    composed Master controls "Reset all settings" tooltip kept the pre-profile
    wording, "Restore every setting in this addon to its default". Now that a
    Profiles page ships, that overstates the reset (it resets the active profile
    only) and contradicts docs/profiles.md. options-ui-§12 says the tooltip SHOULD
    name the equivalence with Profiles -> Reset Profile, and `profilesPage = true`
    with `resetProfile` is the library's documented way to say so; every other
    addon with a Profiles page passes both. `resetProfile` is PrettyChat:ResetAll,
    late-bound, so the library's RestoreAllDefaults, if ever reached, is the same
    profile reset. tests/test_profiles.lua now pins the tooltip through the real
    button's OnEnter, and the veto case asserts the library's reset runs ResetAll
    once (it previously pinned the row walk leaving profile rows alone, which is
    no longer the whole act). Both go red with either field dropped.

    SP-PC-01 inserted seven header lines into tests/wow_mock.lua, moving the
    comment docs/performance-sweep.md cites from :134/:135 to :141/:142; the
    citations are updated. README badge and docs/test-cases.md move to 530.

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

commit 644178ec956d1e50a4abf03c510952f684e4d1f4
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 09:34:30 2026 +0530

    SP-PC-01: Profiles page, profile-event redraw and docs/profiles.md

    PrettyChat already kept every setting in db.profile and already had the three
    AceDB callbacks, but no player could see or manage a profile: there was no
    Profiles page, so the addon behaved unlike the seven siblings that ship one and
    docs/ARCHITECTURE.md recorded profiles.md as Not applicable. The collection-wide
    `profile` verb (S3) also needs profiles to be a visible, documented surface.

    - Vendor AceConfig-3.0 (Registry, Cmd, Dialog) and AceDBOptions-3.0 from
      AuraMaster/libs. Same Ace3 release as the Ace libs already here (content
      identical apart from $Id$ keyword expansion; KickCD and ConsumableMaster
      copies are byte-identical to AuraMaster's). Loaded after AceGUI, in the
      AuraMaster/AbsorbTracker order, because AceConfigDialog resolves AceGUI
      non-silently at load.
    - settings/Profiles.lua: AceDBOptions in a library canvas, last in the rail,
      no Defaults button, drawn lazily into a SimpleGroup that is shown on every
      draw. It redraws once per profile event (counted), never on the library's
      structural fan-out, so an open dropdown is not torn down.
    - The shared adopt path in core/PrettyChat.lua (migrations, latch, Reapply,
      one debug line) now also redraws the Profiles page.
    - options-ui-§3/§12: the global reset's veto is named once
      (Schema.VetoedFromResetAll: the Profiles page and every profile-backed row)
      and passed as the Options descriptor's skipRestoreAll.
    - tests/test_profiles.lua (11 cases) plus the Ace fakes in tests/wow_mock.lua;
      page-count pins in test_panel/test_libka0s move from two pages to three.
    - docs/profiles.md; ARCHITECTURE (load order, module map, namespace table,
      Documentation map row now Present, dependencies, known limitation retired),
      schema, scope, settings-panel, module-map, data-flow, testing, DEPENDENCIES,
      README and the regenerated test-cases.md / badge (518 -> 529). Citations
      shifted by these edits are corrected (.luacheckrc, smoke-tests.md).

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

This mod has no additional files