1.2.0-release
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) `` 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) `` 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

