1.12.0-release
What's new
tag ce6cc135b938ebcbb5ae2d59f1adc4d8d4b6cd1c 1.12.0-release
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 9 19:23:47 2026 +0530
Release 1.12.0
commit 3c7e6cbd6a009dc4cbebb002af855c51c561ecf3
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 9 19:23:47 2026 +0530
Release 1.12.0: version bump, release notes and the gated release run
Release gate (docs/automated-tests/20261009-191726/manifest.json, run with
--release 1.12.0 on 7c83d8c, clean tree), all six conditions PASS:
- Lint: pass, 0 warnings / 0 errors in 70 files
- Tests: pass, 885 passed, 0 failed, 1 skipped of 886 (the kit's
diagnostics opt-out contract case, which this addon does not take)
- Perf: pass, 7 scenarios from tests/perf.lua
- Complexity: pass, 14702 NLOC / 2249 functions, avg CCN 1.8
- CCN <= 15: 0 warnings, max CCN 14
- Sighted: blindFiles 0 (the first sighted release run)
Files changed:
- AbsorbTracker.toc: ## Version 1.11.0 -> 1.12.0
- core/Namespace.lua: NS.version "1.11.0" -> "1.12.0"
- docs/module-map.md, docs/slash-dispatch.md: version mentions rolled to
1.12.0
- README.md: new 1.12.0 row at the top of ## Version History
- docs/automated-tests/20261009-191726/: the release bundle, with its
ANALYSIS.md
- docs/automated-tests/RESULTS.md: the release row and refreshed watch-list
dispositions
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J2w6FgfFYw93meWZN9Ahn6
commit 7c83d8c8dcb2a080dc36518b36a520a26f31bce3
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 9 17:49:11 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 14dd7258c7e83770deb0cde1a3dd6a31ba3756d0
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:56:07 2026 +0530
AT-STD: Sweep to standard v2.77.0; roll drifted in-repo line cites
Standards sweep against WowAddonStandards v2.77.0 (feature branch):
- The three-place reference (TOC `## X-Standard:`, README badge,
CLAUDE.md "Standards compliance") stays unversioned: v2.77.0's
toc-file-§1 and documentation-§1/§6 still prescribe the bare URL and
the unlinked badge, so no edit was needed.
- Every `filename-§N` citation outside libs/, tests/_kit/ and the frozen
bundles resolves against v2.77.0's section files and their `### N.`
headings (the one non-match is CLAUDE.md's literal `filename-§N`
notation placeholder). No retired file name or changelog-location
reference found; no deviation row exists for versioning-git's branch
rule; the addon reads no C_Spell.GetSpellCooldown*. toc-file-§5's
whole-listing annotation landed in AT-03.
- Historical "standard vX.Y.Z" provenance notes (when a rule changed)
are left as written; there is no "built to standard vN" stamp to roll.
Docs sync for AT-01..AT-09:
- docs/slash-dispatch.md: Sl:Register :818->:828, OnInitialize call
core/AbsorbTracker.lua:56->:52, runProfile :589->:599 (twice), the
library-absent stand-in :628->:638 (AT-06 and AT-07/08 moved them).
- docs/smoke-tests.md LOC row: Display.lua :449->:455, Slash.lua
:345->:355, AbsorbTracker.lua :256/:258/:344 -> :253/:255/:356.
- docs/ARCHITECTURE.md events-frames-taint-§8 register row: the two
UnitGetTotalAbsorbs readers :242/:340 -> :246/:353.
- docs/module-map.md: settings/Schema.lua 551 -> 553 lines (pre-existing
drift from SD-FIN-01, not this run).
- Comment-only: four test comments citing core/DebugLogSetup.lua:72
(->:123), core/PerfSetup.lua:33 (->:35) and tests/test_data.lua:192
(->:198) pointed at the wrong lines (pre-existing drift).
Already in sync and verified: WidgetsSetup / RelockForCombat in
ARCHITECTURE.md and module-map.md, the perf scenario names in
docs/performance.md, every module-map line count, README Tests badge
885 == docs/test-cases.md Total 885 (inventory regenerates identical).
Gates: 885 passed / 0 failed / 1 skipped; luacheck 0/0; lizard 0
functions above CCN 15; complexity suite pass (maxCcn 14); largest
authored file 1079 lines. No version bump, no CHANGELOG block.
Findings: none (item carries no finding ids).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit 14dd7258c7e83770deb0cde1a3dd6a31ba3756d0
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:56:07 2026 +0530
AT-STD: Sweep to standard v2.77.0; roll drifted in-repo line cites
Standards sweep against WowAddonStandards v2.77.0 (feature branch):
- The three-place reference (TOC `## X-Standard:`, README badge,
CLAUDE.md "Standards compliance") stays unversioned: v2.77.0's
toc-file-§1 and documentation-§1/§6 still prescribe the bare URL and
the unlinked badge, so no edit was needed.
- Every `filename-§N` citation outside libs/, tests/_kit/ and the frozen
bundles resolves against v2.77.0's section files and their `### N.`
headings (the one non-match is CLAUDE.md's literal `filename-§N`
notation placeholder). No retired file name or changelog-location
reference found; no deviation row exists for versioning-git's branch
rule; the addon reads no C_Spell.GetSpellCooldown*. toc-file-§5's
whole-listing annotation landed in AT-03.
- Historical "standard vX.Y.Z" provenance notes (when a rule changed)
are left as written; there is no "built to standard vN" stamp to roll.
Docs sync for AT-01..AT-09:
- docs/slash-dispatch.md: Sl:Register :818->:828, OnInitialize call
core/AbsorbTracker.lua:56->:52, runProfile :589->:599 (twice), the
library-absent stand-in :628->:638 (AT-06 and AT-07/08 moved them).
- docs/smoke-tests.md LOC row: Display.lua :449->:455, Slash.lua
:345->:355, AbsorbTracker.lua :256/:258/:344 -> :253/:255/:356.
- docs/ARCHITECTURE.md events-frames-taint-§8 register row: the two
UnitGetTotalAbsorbs readers :242/:340 -> :246/:353.
- docs/module-map.md: settings/Schema.lua 551 -> 553 lines (pre-existing
drift from SD-FIN-01, not this run).
- Comment-only: four test comments citing core/DebugLogSetup.lua:72
(->:123), core/PerfSetup.lua:33 (->:35) and tests/test_data.lua:192
(->:198) pointed at the wrong lines (pre-existing drift).
Already in sync and verified: WidgetsSetup / RelockForCombat in
ARCHITECTURE.md and module-map.md, the perf scenario names in
docs/performance.md, every module-map line count, README Tests badge
885 == docs/test-cases.md Total 885 (inventory regenerates identical).
Gates: 885 passed / 0 failed / 1 skipped; luacheck 0/0; lizard 0
functions above CCN 15; complexity suite pass (maxCcn 14); largest
authored file 1079 lines. No version bump, no CHANGELOG block.
Findings: none (item carries no finding ids).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit abfd2cf36ada333454b75b54d4455f4aedbe6ccb
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:49:50 2026 +0530
AT-09: Sweep doc drift against the tree; quote the runner; add BAR-18
AT-A-02 (audit AT-80), all seven items, re-checked after AT-01..AT-08:
- (1) The "thirty-two files" library inventory (docs/ARCHITECTURE.md,
docs/module-map.md twice, docs/performance.md) now points at the files
libs/LibKa0s/LibKa0s.xml lists instead of restating a count (34 today).
- (2) Both LibKa0s.xml load-order chains in docs/module-map.md gain
WidgetsLineChart.lua and WidgetsAutocomplete.lua in XML order; the
Widgets major's file list names all five Widgets files.
- (3) docs/testing.md stops naming v1.68.1 and defers to the CLAUDE.md
provenance line.
- (4) tests/run.lua row: 178 lines; the suite count is replaced by a
pointer to its suites list and the generated docs/test-cases.md.
- (5) The mock sentence describes one RegisterUnitEvent frame per unit
(addon:SyncUnitEventFrames), not the retired two-frame split.
- (6) The "live here at DebugLog 6 / Slash 5 / Perf 5" minors are dropped;
the landing minors (history) stay.
- (7) The disabled-verb refusal settles on LibKa0s v1.42.0 at both sites,
matching the register and docs/slash-dispatch.md.
The unrelated "thirty-two findings" in the test_lintconfig row is spelled
"32 findings" so the inventory grep stays clean.
AT-A-03 (audit AT-83): docs/automated-tests/README.md's complexity cell
quotes `bash tests/_kit/run-automated-tests.sh --suite complexity`, matching
docs/testing.md and DEPENDENCIES.md; the other cells already match the
runner's lint/tests/perf commands.
AT-R-05 (review F-005, optional): no code change. docs/smoke-tests.md
## Bars gains BAR-18 "Master scale keeps a dragged bar in place" (confirm
or refute, review S-05), listed under ## Pending sign-off; the index range
is BAR-1-18. docs/ARCHITECTURE.md Known Limitations gains the line that
saved positions live in the bar's scaled space (savePosition,
NS.RestoreBarPosition), pending BAR-18.
Deviations: the S-05 check is numbered BAR-18 to follow the file's stable
<THEME>-<n> scheme; the audit's line cites had shifted by about four lines
and were located by content. core/WidgetsSetup.lua (AT-02) was already in
both module maps. Docs-only.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit 1454fbf47c7cdd9fa5935235ef96602ea824f58d
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:45:52 2026 +0530
AT-08: address review — roll docs/module-map.md line counts for the eight files 3846e6c changed
core/CoreSetup.lua 156->172, core/AbsorbTracker.lua 460->454,
modules/Display.lua 485->491, tests/test_database.lua 572->574,
tests/test_coresetup.lua 183->205, tests/test_slash.lua 408->411,
tests/test_helpers.lua 573->576, tests/test_debugcoverage.lua 453->496.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit 3846e6c7346adebce7642289bb3909662809e608
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:42:40 2026 +0530
AT-08: Route the debug memos through DebugChanged; format the ladder line
AT-A-09 (debug-logging-§9): traceAbsorb's readable/secret edge and
NS.ApplyVisibility's [Bar] line now go through the console's own
NS.DebugLog.DebugChanged gate (keys "absorb:secret" and "bar:<unit>")
instead of the hand-rolled dbgAbsorbSecret / dbgLastShown memos, so a
console Clear() or turning logging on re-arms them and the state is
restated on the next pass. dbgAbsorbSecret is gone; dbgLastShown stays as
the unconditional diagnostics record behind NS.LastAppliedVisibility. The
[Bar] key and reason are built only inside the NS.State.debug guard.
AT-A-08 (events-frames-taint-§8): runLadder's migration-failure line hands
its two versions to the printer's format seam instead of joining them;
the chat text is byte-identical, now pinned whole in test_database.lua.
Tests: two red-first cases in test_debugcoverage.lua (Clear re-arms the
absorb secret edge and the bar line; both went red under the old memos),
a new NS.Format case (live and degraded) in test_coresetup.lua.
test_slash.lua's [Set] case, test_helpers.lua's linesOf and the quiet
steady-state case now settle the [Bar] gates with logging on first, since
the first logged pass of an armed gate states each bar once. Inventory
regenerated (885) and the README badge rolled to match.
Deviations:
- NS.Print space-joins its arguments and cannot reproduce "v5 -> v6;"
byte for byte, so core/CoreSetup.lua now publishes NS.Format
(LibKa0s-Core printer.Format live, a short pcall'd fallback in the
library-absent stub, picked up by the Core surface-parity case), and the
ladder line uses it. ARCHITECTURE, module-map, performance and
common-tasks name the new member.
- The absorb edge's readable text is "reads readable" (was "reads
readable again"), per the item's call: the first readable observation of
an armed gate now writes it, where "again" would be false.
- The [Bar] line is gated on the whole line, so a new deciding rung for an
unchanged shown/hidden state is a line too (documented in Display.lua
and debug.md).
- The events-frames-taint-§8 register row is unchanged; no register text
names core/Database.lua.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit 9c4ea2464a65f1f70710d86ab48f79bd1465579a
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:35:28 2026 +0530
AT-07: Re-lock unlocked bars when standing up or enabling mid-combat
Review C-5 (finding AT-R-04). The only combat re-lock lived in
addon:OnEnterCombat, so an `/at enable` mid-fight or a /reload mid-fight on
an unlocked profile came up after the one PLAYER_REGEN_DISABLED that would
have re-locked, and the bars sat on the placeholder for the whole fight.
- core/AbsorbTracker.lua: extract the re-lock into NS.RelockForCombat(reason),
returning true when it re-locked; one chat literal per reason
("combat started" / "in combat"). OnEnterCombat keeps its either/or
(VISIBILITY + REPAINT only when it did not re-lock). OnEnable's running
path calls it after the POSITION/APPEARANCE/REPAINT publishes when
UnitAffectingCombat("player").
- core/Lifecycle.lua: StandUp ends with NS.RelockForCombat("in combat") when
the player is in combat (looked up at call time; runs after the latch has
released). No new event registration.
- tests: +2 cases with red-under notes (test_disabled: /at enable mid-combat
on an unlocked profile re-locks and prints once; test_events: OnEnable in
combat on an unlocked profile re-locks). Both were red before the change.
The existing OnEnterCombat re-lock cases stay green. The kit mock already
answers UnitAffectingCombat, so no mock change.
- docs: one sentence each in docs/lifecycle.md (stand-up rebuild) and
docs/ARCHITECTURE.md (The disabled state is total); docs/module-map.md
rows and line counts; docs/test-cases.md regenerated; README Tests badge
rolled to 882.
Gates: 882 passed / 0 failed / 1 skipped; luacheck 0/0; complexity suite
green (max CCN 14).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit 3908b923b221056aaa88e0a7ed199410293da3c9
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:27:47 2026 +0530
AT-06: Refuse /at debug hold while stood down; retarget the degraded test
Review C-3 (AT-R-03): runHold gated only on the stored `enabled`, so during
a perf capture's suspended arm (`/at perf measure b`, which takes the `perf`
hold on the stand-down latch) it printed "Holding ..." and NS.HoldPreview
armed an expiry that republished REPAINT onto a stood-down bus. runHold now
keeps the DisabledLine refusal first, then asks NS.IsStoodDown() and refuses
with NS.Debug("Cmd", "debug hold refused: stood down") and one chat line
("Bars are suspended for a perf capture; run /at perf finish (or /at perf
measure a) first") before parsing, painting or arming anything.
tests/test_debughold.lua gains the stood-down case (red under the removed
gate: it printed Holding and reached NS.HoldPreview).
Review C-4, as corrected (AT-R-06): tests/test_perf.lua's degraded-load case
read back the stub literal `Perf.suspended == false`, which cannot fail for
a ladder reason. It now asserts NS2.IsStoodDown() == false, what the show
ladder's rung 0 reads; confirmed red in a scratch copy with the latch stub's
IsDown forced true. `suspended = false` stays in core/PerfSetup.lua's
degraded stub for the Perf host contract and test_surface_parity.
Docs: smoke-tests.md (STATE-3 note, new DIAG-52, inventory DIAG-1-52, register
row), debug.md, slash-dispatch.md, common-tasks.md, module-map.md (line counts
and the test_debughold description); docs/test-cases.md regenerated and the
README Tests badge rolled to 880.
Deviations: the item's smoke text says `/at perf start` stands the addon
down; in the vendored LibKa0s-Perf only `measure b` suspends, so the test
and DIAG-52 suspend through NS.Perf.Suspend / `/at perf measure b`. The
ShouldShowBar("player") extra assertion ("if cheap") was skipped: the
degraded env has no database in that case, and the next degraded case
already drives the show ladder.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit e6900622d600d013ea3d16c195748cbfbfd65441
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:21:49 2026 +0530
AT-05: Loop NS.Units.LIST in doRepaint instead of a per-pass closure
modules/Timer.lua doRepaint handed NS.ForEachUnit a fresh function(unit)
closure over `painted` and `parent` on every coalesced pass. That went
against the file header's own hoisting rationale. It now walks
NS.Units.LIST with a plain ipairs loop, the same list and order that
NS.ForEachUnit iterates (modules/Display.lua). Behaviour is unchanged:
same unit order, same painted/NoteRepaint/Perf.Note accounting. No suite
stubs NS.ForEachUnit (re-grepped).
Perf (tests/perf.lua, three runs, identical to the decimal):
repaintPass 144.0 -> 0.0 bytes/pass
probeOverheadOff 144.0 -> 0.0 bytes/pass
probeOverheadOn 144.5 -> 0.5 bytes/pass
paintBars 48.0 (unchanged; this is its own test closure)
So the whole 144.0 that AT-01 measured was the closure and its two
closed upvalues.
Red first: with PROBE_OFF_BYTES_CEILING lowered below 144, perf failed
on the old code ("a dormant pass allocated 144.0 bytes/iter, over the
120-byte ceiling").
The ceiling is re-derived by the documented method:
measured 0.0, and one extra `{}` in the scenario body moves it
0.0 -> 64.0 (re-measured in a scratch copy), so the ceiling is
24 = 0.0 + 24, and 24 < 64. The RE-BASELINED comment block is rewritten
to record both re-baselines.
Docs: docs/performance.md gets the new figures. docs/module-map.md and
docs/data-flow.md now describe the timer's loop over NS.Units.LIST
instead of NS.ForEachUnit, and module-map's line counts for Timer.lua
(94 -> 97) and tests/perf.lua (352 -> 355) are updated.
Finding: AT-R-02 (review F-002, C-2).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit 86ab7cab9001c8bae7f31368baab8c80bc03ad1c
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:16:59 2026 +0530
AT-04: Retire the savedvariables-§1 per-profile-stamp register row
docs/ARCHITECTURE.md -> ## Documented deviations no longer carries the
savedvariables-§1 row for the per-profile schemaVersion stamp. Since
standard v2.65.0, §1 sanctions a per-profile stamp re-run idempotently
from AceDB's OnProfileChanged/OnProfileCopied/OnProfileReset callbacks,
and the addon does exactly that (NS.OnProfileChanged and the other two
callbacks in core/AbsorbTracker.lua via adoptProfile, plus the
migrateAllProfiles sweep at load in core/Database.lua), so the row read
as a live deviation that is not one.
docs/recorded-decisions.md -> ## Retired register rows gains a dated
2026-10-07 entry: the rule the row cited, why it is retired, the
profiles.md link, and the two residual differences, so a later audit
does not re-raise them blind:
- the per-profile stamp defaults to 1 (NS.defaults.profile.schemaVersion),
a floor below the only per-profile version, which keeps §1's
logout-strip and legacy-backfill reasons intact;
- NS.MigrateProfileToV3 writes the per-profile stamp itself, as its last
write after the lift completes, since the callback route has no runner.
Both carry the re-check trigger "savedvariables-§1 ruling on per-profile
stamp defaults/ownership". The hub's pointer paragraph names the new
retirement.
Pages that called the stamp a deviation now point at the retired entry:
docs/profiles.md, docs/data-flow.md, docs/module-map.md.
Finding: AT-A-06 (audit AT-86).
Deviation from the item text: the item is docs-only, but two comments in
defaults/Profile.lua still pointed at the retired register row (one
under its old "Standards Deviations" name). They were reworded,
comment-only, so no source comment points at a row that no longer
exists. No code changed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit 2ace072e313304342bc092cbc63880f228caa9fa
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:12:18 2026 +0530
AT-03: Annotate the load-bearing settings TOC lines and walk the rest
Adds `# LOAD-BEARING:` comments above settings\Schema.lua and
settings\OptionsSetup.lua (toc-file-§5, as WS-04 restates it: the
denominator is every position in the listing, not only # Core), and walks
the rest of the listing. Resolves AT-A-04 and AT-A-05.
Readers re-verified by grep before writing:
- Schema.lua: NS.SchemaRuntime.AllRows/BulkBegin/BulkEnd captured at file
load by settings/OptionsSetup.lua (:98, :144-145); NS.RegisterSchemaRows
called at file load by settings/General.lua (:254) and
settings/Appearance.lua (:276 via addUnitRows at :279).
- OptionsSetup.lua: NS.Helpers captured as a file-scope upvalue by
UnitPanel.lua:17, About.lua:19, General.lua:12, Appearance.lua:74.
Walk of the other positions:
- locales\enUS.lua: LOAD-BEARING (NS.L read at load by DebugLogSetup's
descriptor, modules/Bar.lua and Slash.lua's NS.COMMANDS rows).
- defaults\Profile.lua: LOAD-BEARING (NS.unitDefaults / NS.flatDefaults
captured at load by Bar.lua, General.lua, Appearance.lua; Bar sizes its
frames from them at load).
- modules Bar/Display/Timer, settings Slash, UnitPanel/About, Profiles:
marked conventional.
Test first: tests/test_loadorder.lua gains a case pinning both seams ahead
of every file-load reader and requiring the `# LOAD-BEARING:` line directly
above each TOC entry (red on the unannotated TOC, green after).
docs/test-cases.md regenerated (879), README badge and module-map rows
(Schema, OptionsSetup, test_loadorder) updated.
Deviations from the item text:
- The Schema note also names settings/Slash.lua (captures
NS.SchemaRuntime.FindRow at load, :774) and settings/Appearance.lua
(calls NS.RegisterSchemaRows at load); the item's text omitted both.
- The OptionsSetup note also names NS.RegisterOptionsPage, called at file
load behind a guard by General, Appearance and Profiles (a later
position fails silently).
- Line cites shifted by the existing annotations (Schema at :89-90,
OptionsSetup at :93-94 after the edit).
- Not changed (outside this item's walk, # Core): the existing
"Conventional order" note above core\State.lua says Data.lua is not read
at file load, but modules/Bar.lua calls NS.GetBorder/GetBarTexture/
GetFont (core/Data.lua) at file load when it builds NS.bars.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit cde238c23f3ff11e7a5a3a45f69b0655cc40c339
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:05:51 2026 +0530
AT-02: address review — count core/WidgetsSetup.lua among the self-naming headers
docs/recorded-decisions.md (documentation-§9): twenty authored files open
`local _, NS = ...`, and eight of them, not seven, carry a self-naming
header. core/WidgetsSetup.lua uses the `-- core/CoreSetup.lua — …` form.
The seven older headers are grandfathered. core/WidgetsSetup.lua was
written after the section and already places its header directly below
the bootstrap.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit d094da69bad29f3147d9105b111bd66091f85693
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:02:23 2026 +0530
AT-02: Give LibKa0s-Widgets-1.0 a setup seam publishing NS.Widgets
Resolves AT-A-07 (Option A; library-stack-§7, testing-§8). The Widgets
major was resolved twice, inline, with nil-guards in modules/Bar.lua and
modules/Display.lua, and had no setup file, stub or parity case.
- New core/WidgetsSetup.lua resolves LibStub("LibKa0s-Widgets-1.0", true)
once and publishes NS.Widgets: the live major, or a stub carrying exactly
the members the addon reaches. DragHandle answers nil, so NS.CreateBar
draws no strip, as before. DRAG_HANDLE is { HEIGHT = 0, GAP = 0 } rather
than nil, so Display's HANDLE_ROOM is 0 with no consumer nil-guard.
- AbsorbTracker.toc: core\WidgetsSetup.lua sits with the setup seams (after
LauncherSetup, before modules\Bar.lua), annotated LOAD-BEARING
(toc-file-§5). It does not use NS.LIBKA0S_MISSING.
- modules/Bar.lua and modules/Display.lua read NS.Widgets. Bar no longer
has the `Widgets and Widgets.DragHandle` guard, and Display derives
HANDLE_ROOM straight from DRAG_HANDLE. Comments are rewritten to match.
- tests/test_surface_parity.lua: new case "parity: the Widgets stub
carries every Widgets member the addon reaches". It re-derives the
reached set from the TOC's files with comments stripped, pins it to
DragHandle + DRAG_HANDLE, and checks both on both arms (same type), plus
DRAG_HANDLE.HEIGHT/GAP as numbers.
- tests/test_draghandle.lua: a degraded-load case checking that NS.Widgets
is the stub, DragHandle builds nothing, the sizes add to 0, no bar has a
handle and the default stack keeps no strip room. Both new cases were
red (NS.Widgets nil) before the seam existed.
- Docs: the ARCHITECTURE.md module-map passage that said "no setup seam"
is rewritten, and a table row is added. docs/module-map.md gets a row,
the Core load order and the libs passage. The bootstrap count
"nineteen" becomes "twenty" (the new file opens `local _, NS = ...`)
in ARCHITECTURE.md, module-map.md and recorded-decisions.md.
docs/test-cases.md is regenerated and the README badge rolled, 876 -> 878.
tests/run.lua derives its file list from the TOC, as do degraded_env and
perf.lua, so no explicit list needed an edit. No register row (Option B).
Issue #26 gets no comment (per the verified finding).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit fde43d754db9d1aa3b4d68d55b548621ad065d31
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 19:56:09 2026 +0530
AT-01: Measure the shipped doRepaint in the offline perf runner
Review C-1 (finding AT-R-01). The offline "coalesced repaint" and
"zero-overhead" scenarios wrapped NS.UpdateAbsorbBar in a test closure,
so the outer repaintPass bracket, the `parent` derivation and doRepaint's
own per-pass fan-out were never measured, and a regression there could
not turn the dormant-probe gate red.
- modules/Timer.lua: publish the file-local doRepaint as the test-only
seam NS.Timer.__doRepaint, beside NS.Timer.__ev. No behaviour change;
no production caller.
- tests/perf.lua: scenario 3 paintPass is renamed paintBars and keeps its
12-API-calls assertion; a new repaintPass scenario calls
NS.Timer.__doRepaint() per iteration (doRepaint clears `pending` itself,
nothing is re-armed) and asserts 12 API calls too; probeOverheadOff/On
now run NS.Timer.__doRepaint().
- PROBE_OFF_BYTES_CEILING re-derived by its documented method:
measured 144.0 B/pass, identical in three runs of the dormant arm;
one `{}` re-measured on this commit (scratch copy) at 144.0 -> 208.0,
so 64 B; ceiling 168 = 144.0 + 24 (24 < 64). The figure includes the
per-pass closure doRepaint hands to NS.ForEachUnit (AT-05 removes it
and lowers the ceiling). The RE-BASELINED comment block is rewritten
with the date and the three numbers.
- Red proof: with probeOverheadOff/On pointed at the seam and the old
72 B ceiling, `lua tests/perf.lua` exited 1 with "a dormant pass
allocated 144.0 bytes/iter, over the 72-byte ceiling". The old gate
missed the shipped path.
- docs/performance.md: the scenario table, figures and reading guidance
now name paintBars / repaintPass. docs/module-map.md: the Timer.lua and
tests/perf.lua rows (line counts, seam, scenario list) follow.
Gates: lua tests/run.lua 876 passed / 0 failed / 1 skipped; luacheck 0/0;
lizard no function above CCN 15; complexity suite green;
lua tests/perf.lua exits 0.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit 7db2f368e9ebe6a11e1a09b1450ff2276eac05bd
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 19:50:32 2026 +0530
RV-AT: re-vendor LibKa0s v1.71.0; span bundle v1.69.0-v1.70.0
Copy both payloads whole from the local LibKa0s tag v1.71.0 (commit
cb274a4): libs/LibKa0s/ (Env 2, Slash 20 / SlashParse 2,
WidgetsLineChart 3, WidgetsAutocomplete 2, OptionsIdList 4) and
tests/_kit/ (kit revision 38, adds secrets.lua). Roll the CLAUDE.md
provenance line to v1.71.0 in the same commit.
Regenerate docs/test-cases.md with kit 38: the declared diagnostics
opt-out skip moves to a "| Skipped | 1 |" row and Total drops from 877
to 876, equal to the README badge (876/876, unchanged). Resolves AT-R-07.
Record the unrecorded v1.69.0 (5075fd5) and v1.70.0 (4c16982)
re-vendors in one span bundle docs/revendor/2026-10-07-v1.69.0-v1.70.0/
(line 1 names only the unrecorded tags, per the command spec, not the
audit's v1.68.1-v1.70.0 shape). Resolves AT-A-01. Write the v1.71.0
bundle docs/revendor/2026-10-07-v1.71.0/: no contract blockers; Env 2's
dropped bare-global rung does not reach core/EnvSetup.lua, whose own
fallback reads C_AddOns only. Candidates (Kit.secret,
ChartMath.ClipSegment, LineChart hover re-sync, Autocomplete re-hook)
are listed as not adopted in this run; Widgets adoption is AT-02.
Not touched here: the stale tag in docs/testing.md:170 and the kit
revision in docs/module-map.md row 31, both owned by AT-09's doc sweep
(AT-80 / AT-A-02), so they are not fixed twice.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit e83325bfc26aa8cd394934ea4e2695780298d71a
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 16:51:51 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 4c1698260d040c216365a27e1127476d8b5234b5
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 11:38:32 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 4c1698260d040c216365a27e1127476d8b5234b5
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 11:38:32 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 5075fd596969dc669af2cc4391e3add4e49a98f9
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Oct 6 14:52:48 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 8030ac1e142b69f963f369605dfd645c3abc3125
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sun Oct 4 15:10:50 2026 +0530
DC-REV-01: re-vendor LibKa0s v1.68.1 (kit 36; library bytes unchanged)
Copies libs/LibKa0s/ and tests/_kit/ whole from the local tag v1.68.1 (tag 9fb7956, commit
9000cbd) via git archive. The library payload is byte-identical between v1.68.0 and v1.68.1, so
all 32 minors stand; kit 35 -> 36 (framework.lua, run-automated-tests.sh, test_eol.lua: the
dev-copilot command names, comments and one printed RESULTS.md line). Nothing added or deleted.
Vendor parity: diff -r against the tag is empty for both payloads, both directions.
- CLAUDE.md provenance line and docs/testing.md:170 roll to v1.68.1.
- docs/module-map.md row 31 names the held kit as revision 36.
- Frozen bundle docs/revendor/2026-10-04-v1.68.1/ (01, 02, 03, 05). Zero adoption candidates,
no interview, no contract blocker, no span bundle.
Gates (ka0s-bounded):
- lua tests/run.lua: 876 passed, 0 failed, 1 skipped, 877 total (test_vendor_sync green)
- luacheck .: 0 warnings / 0 errors in 69 files
- run-automated-tests.sh --suite complexity --no-bundle: pass, max CCN 14, 0 warnings
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MsGF7a1YxB69EsRnBC8rcE
commit 8030ac1e142b69f963f369605dfd645c3abc3125
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sun Oct 4 15:10:50 2026 +0530
DC-REV-01: re-vendor LibKa0s v1.68.1 (kit 36; library bytes unchanged)
Copies libs/LibKa0s/ and tests/_kit/ whole from the local tag v1.68.1 (tag 9fb7956, commit
9000cbd) via git archive. The library payload is byte-identical between v1.68.0 and v1.68.1, so
all 32 minors stand; kit 35 -> 36 (framework.lua, run-automated-tests.sh, test_eol.lua: the
dev-copilot command names, comments and one printed RESULTS.md line). Nothing added or deleted.
Vendor parity: diff -r against the tag is empty for both payloads, both directions.
- CLAUDE.md provenance line and docs/testing.md:170 roll to v1.68.1.
- docs/module-map.md row 31 names the held kit as revision 36.
- Frozen bundle docs/revendor/2026-10-04-v1.68.1/ (01, 02, 03, 05). Zero adoption candidates,
no interview, no contract blocker, no span bundle.
Gates (ka0s-bounded):
- lua tests/run.lua: 876 passed, 0 failed, 1 skipped, 877 total (test_vendor_sync green)
- luacheck .: 0 warnings / 0 errors in 69 files
- run-automated-tests.sh --suite complexity --no-bundle: pass, max CCN 14, 0 warnings
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MsGF7a1YxB69EsRnBC8rcE
commit 880442d97fcc22f1bc57b5241bfafbc143289b88
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sun Oct 4 14:32:42 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 880442d97fcc22f1bc57b5241bfafbc143289b88
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sun Oct 4 14:32:42 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 3215549b4a5dff0b42332943b6490709f13e805c
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sun Oct 4 14:21:18 2026 +0530
DC-REN-01: docs name /dev-copilot commands (wow-addon plugin merged into dev-copilot)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MsGF7a1YxB69EsRnBC8rcE
commit 05f1f8c1f957968c3441db78a3dd23e7765b82bf
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sat Oct 3 12:47:44 2026 +0530
SD-FIN-01: sync docs; peel /at profile cases into tests/test_slashprofile.lua (test_slashcmds 1472 -> 1079 lines)
File counts nineteen (Diagnostics.lua), stale line refs and cap census, lizard note in DEPENDENCIES; ProfileRowsOffDefault marked a test seam; .pkgmeta screenshot count; recorded-decisions exemption covers all seven self-naming headers.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GBEbct8mwzFqZSG1oTkv8f
commit ac3f009c4e5a69e1e134d6351479c5c75ee43ae9
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sat Oct 3 00:03:25 2026 +0530
TP-AT-02: strip, ? and X tooltips open beside the strip (tooltipPlace)
Adopts LibKa0s WidgetsDragHandle minor 4's tooltipPlace on all three bars'
drag strips. This reverses TP-AT-01's decline: the owner asked for
consistency across all Ka0s addons. NS.Util.PlaceTooltipBeside
(modules/Bar.lua) mirrors KickCD's core/Util.lua (TP-KC-01). It anchors the
tooltip's TOPLEFT 4 px right of the strip's TOPRIGHT. When the strip's right
edge plus the tooltip's width would pass the screen's right edge, it anchors
the tooltip's TOPRIGHT 4 px left of the strip's TOPLEFT instead. The
comparison is in screen pixels, each read times its frame's effective scale,
because a bar carries its own scale times the master scale. A hovered ? or X
resolves to its strip, so all three tooltips open in one place.
Every read is guarded: a missing method, nil, a secret (NS.IsConcatSafe,
this addon's one secret question, standing in for KickCD's
NS.Compat.IsSecret) or a non-number. On any such read it answers nil with
nothing anchored, and the widget falls back to the cursor. It returns true
only once placed. The help and close descriptors' anchor =
"ANCHOR_TOPRIGHT" fields are removed, because the widget reads no owner or
anchor while a hook is in force.
Test first, in tests/test_draghandle.lua. Nine cases were red before the
code. Six cover the placement: right, left flip, the ? and the X resolving
to the strip, a scaled strip, a secret read and a nil read. Three cover
hovering: every strip, ? and X owned once by UIParent at ANCHOR_NONE and
anchored beside the strip, the left flip, and the cursor fallback. The
existing tooltip-text hover helper now gives the strip room, so the
tooltip is drawn once.
Docs: Bar.lua header; module-map.md (Bar row and prose, test row);
ARCHITECTURE.md; common-tasks.md. smoke-tests.md gains BAR-17 (owner-run,
unmarked), notes on BAR-12 (d) and BAR-13, an index range of BAR-1-17 and an
owed-table row. The revendor bundle's 03_DECISIONS.md has the reversal
appended, and 05_SUMMARY.md has a "Later" note.
Gate: 876 passed / 0 failed / 1 skipped (877); before this change it was
867 / 0 / 1 (868). docs/test-cases.md regenerated, README badge 876.
luacheck 0/0 in 68 files. Sighted complexity: pass, 0 warnings, max CCN 14
(PlaceTooltipBeside CCN 10). Every file is under 1500 lines. No version
bump.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit ac3f009c4e5a69e1e134d6351479c5c75ee43ae9
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sat Oct 3 00:03:25 2026 +0530
TP-AT-02: strip, ? and X tooltips open beside the strip (tooltipPlace)
Adopts LibKa0s WidgetsDragHandle minor 4's tooltipPlace on all three bars'
drag strips. This reverses TP-AT-01's decline: the owner asked for
consistency across all Ka0s addons. NS.Util.PlaceTooltipBeside
(modules/Bar.lua) mirrors KickCD's core/Util.lua (TP-KC-01). It anchors the
tooltip's TOPLEFT 4 px right of the strip's TOPRIGHT. When the strip's right
edge plus the tooltip's width would pass the screen's right edge, it anchors
the tooltip's TOPRIGHT 4 px left of the strip's TOPLEFT instead. The
comparison is in screen pixels, each read times its frame's effective scale,
because a bar carries its own scale times the master scale. A hovered ? or X
resolves to its strip, so all three tooltips open in one place.
Every read is guarded: a missing method, nil, a secret (NS.IsConcatSafe,
this addon's one secret question, standing in for KickCD's
NS.Compat.IsSecret) or a non-number. On any such read it answers nil with
nothing anchored, and the widget falls back to the cursor. It returns true
only once placed. The help and close descriptors' anchor =
"ANCHOR_TOPRIGHT" fields are removed, because the widget reads no owner or
anchor while a hook is in force.
Test first, in tests/test_draghandle.lua. Nine cases were red before the
code. Six cover the placement: right, left flip, the ? and the X resolving
to the strip, a scaled strip, a secret read and a nil read. Three cover
hovering: every strip, ? and X owned once by UIParent at ANCHOR_NONE and
anchored beside the strip, the left flip, and the cursor fallback. The
existing tooltip-text hover helper now gives the strip room, so the
tooltip is drawn once.
Docs: Bar.lua header; module-map.md (Bar row and prose, test row);
ARCHITECTURE.md; common-tasks.md. smoke-tests.md gains BAR-17 (owner-run,
unmarked), notes on BAR-12 (d) and BAR-13, an index range of BAR-1-17 and an
owed-table row. The revendor bundle's 03_DECISIONS.md has the reversal
appended, and 05_SUMMARY.md has a "Later" note.
Gate: 876 passed / 0 failed / 1 skipped (877); before this change it was
867 / 0 / 1 (868). docs/test-cases.md regenerated, README badge 876.
luacheck 0/0 in 68 files. Sighted complexity: pass, 0 warnings, max CCN 14
(PlaceTooltipBeside CCN 10). Every file is under 1500 lines. No version
bump.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 63b0795bdcf608f5ba09a1b7e18101406577e159
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 23:39:02 2026 +0530
TP-AT-01: re-vendor LibKa0s v1.68.0 (WidgetsDragHandle 4; kit 35 unchanged)
Payloads copied whole from the LOCAL tag v1.68.0 (tag object 6d83731 -> commit cc9f5eb) via git
archive. One file moves a minor (WidgetsDragHandle 3 -> 4, Widgets key 12.1.3 -> 12.1.4); none is
added or deleted. The kit stays at revision 35, byte-identical to v1.67.0's. Vendor parity: diff -r
against the tag is empty for both payloads.
- CLAUDE.md provenance line and docs/testing.md:170 roll to v1.68.0.
- docs/test-cases.md in sync (868 cases); README badge stays 867/867.
- Frozen bundle docs/revendor/2026-10-02-v1.68.0/ (01, 02, 03, 05). No contract blocker: the host
sets no hook, so every hover keeps minor 3's calls in minor 3's order.
tooltipPlace NOT adopted, by decision. The owner wants the strip tooltip beside the strip instead
of at the cursor. Here it is already owned by the strip: modules/Bar.lua passes no tooltipOwner,
so the widget owns by the strip at ANCHOR_TOP (the ? and X by their marks at ANCHOR_TOPRIGHT).
The tooltip already sits on the strip, which is what the request fixes elsewhere. The client
clamps a frame-owned tooltip to the screen, so the right-edge flip has no case to solve. A
spec-level hook would also take over the ? and X tooltips, and a strip-only place would split one
strip into two placement styles. Either way the host would gain guarded rect reads and a fallback
path to reproduce an attachment it already has. That matches the plan's rule for frame-owned
strips. This is not a real gap, so no issue was filed (03_DECISIONS.md).
Gates (ka0s-bounded):
- lua tests/run.lua: 867 passed, 0 failed, 1 skipped, 868 total (before 867/0/1, 868)
- luacheck .: 0 warnings / 0 errors in 68 files
- bash tests/_kit/run-automated-tests.sh --suite complexity --no-bundle (sighted): pass,
max CCN 14, 0 warnings, 2181 functions.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 1120ccaa4814dce06c4e7a366e499c7145a2a6ab
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 02:00:22 2026 +0530
CA-AT-01: adopt Slash.SplitVerb, Slash.ProfileNames and Core.SECRET (#33)
- runDebug, runProfile, runToggle and the stub's OnSlash split through
SlashLib.SplitVerb. The library-absent arm defines the file's one
minimal SplitVerb (slash-commands-§1), published as Sl.__SplitVerb and
pinned against the library's over a corpus.
- /at profile list reads SlashLib.ProfileNames(db): sorted ignoring case,
current always listed, the bare form's order. The "Available profiles"
header and " (current)" marker are kept; the degraded arm prints the
store's own GetProfiles() list.
- core/CoreSetup.lua publishes NS.SECRET on both arms (lib.SECRET live, the
one "<secret>" literal in the stub, which its SafeToString returns);
modules/Diagnostics.lua's secretSafe returns NS.SECRET.
- Docs: profiles, slash-dispatch (stale line cites refreshed), module-map,
common-tasks, midnight-quirks; smoke PROFILE-16 and DEGRADED-5 with
Pending sign-off rows; test-cases.md regenerated; badge 867/867.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 1120ccaa4814dce06c4e7a366e499c7145a2a6ab
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 02:00:22 2026 +0530
CA-AT-01: adopt Slash.SplitVerb, Slash.ProfileNames and Core.SECRET (#33)
- runDebug, runProfile, runToggle and the stub's OnSlash split through
SlashLib.SplitVerb. The library-absent arm defines the file's one
minimal SplitVerb (slash-commands-§1), published as Sl.__SplitVerb and
pinned against the library's over a corpus.
- /at profile list reads SlashLib.ProfileNames(db): sorted ignoring case,
current always listed, the bare form's order. The "Available profiles"
header and " (current)" marker are kept; the degraded arm prints the
store's own GetProfiles() list.
- core/CoreSetup.lua publishes NS.SECRET on both arms (lib.SECRET live, the
one "<secret>" literal in the stub, which its SafeToString returns);
modules/Diagnostics.lua's secretSafe returns NS.SECRET.
- Docs: profiles, slash-dispatch (stale line cites refreshed), module-map,
common-tasks, midnight-quirks; smoke PROFILE-16 and DEGRADED-5 with
Pending sign-off rows; test-cases.md regenerated; badge 867/867.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 3f6df555182830d363ac493b89bd0df8761cbe41
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 01:55:07 2026 +0530
CA-AT-01: characterize the /at sub-verb split and the degraded profile list
Pins, green on today's code, what the SplitVerb / ProfileNames adoption
must not change: /at debug EVENTS and HOLD fold the sub-verb and keep the
remainder, /at profile NEW CasePin folds only the verb, the stub dispatcher
routes a corpus exactly as the live one, and on a degraded load debug
events, profile current and profile list still answer from the store.
New cases go in tests/test_slash.lua (test_slashcmds.lua is at the cap).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit d2d9df8157e19a0ab4683f070b84795d33dba793
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 01:49:56 2026 +0530
CA-AT-NM: the Options descriptor passes addonName (LibKa0s#42)
settings/OptionsSetup.lua binds the first vararg as `addonName` and hands it
to LibKa0s-Options-1.0 as `descriptor.addonName`, so the library can build its
IdList help-mark art path from the folder name (Options 28 / OptionsIdList 3
check it against the loaded-addon list). Latent here: no page draws an id list.
Tests (red-first): a spy on a second full load asserts the descriptor lib:New
received carries addonName = "AbsorbTracker"; a source guard asserts the
vararg binding and `addonName = addonName,` inside the descriptor table with no
literal; libs/LibKa0s/media/icons/info.tga is on disk. Degraded path unchanged.
Docs: test inventory and badge (858/858), PANEL-10 smoke check with its
Pending sign-off row, the descriptor tables, and the vararg counts (ten bind
addonName, eighteen open `local _, NS`).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 7ed3af6fe1a392ec5e7c951e1def2bddbd1de42a
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 01:40:48 2026 +0530
CA-AT-RV: re-vendor LibKa0s v1.67.0 (Core 10, Options 28, OptionsIdList 3; kit 35 unchanged)
Copies libs/LibKa0s/ and tests/_kit/ whole from the local tag v1.67.0 (tag 749c42e, commit
0bccf4c) via git archive. Three files move a minor (Core 9 -> 10, Options 27 -> 28,
OptionsIdList 2 -> 3); none is added or deleted. The kit stays at revision 35 and is
byte-identical to v1.66.0's. Vendor parity: diff -r against the tag is empty for both payloads.
- CLAUDE.md provenance line and docs/testing.md:170 roll to v1.67.0.
- docs/test-cases.md regenerates byte-identical (856 cases); README badge stays 855/855.
- Frozen bundle docs/revendor/2026-10-02-v1.67.0/ (01, 02, 05). Candidates assigned, not
interviewed: the Options descriptor addonName goes to CA-AT-NM; the MakeResizable opts to none
(no host grip here).
No consumer test broke on the library change; no contract blocker. No host code calls
MakeResizable or draws an O.IdList.
Gates (ka0s-bounded):
- lua tests/run.lua: 855 passed, 0 failed, 1 skipped, 856 total (before 855/0/1, 856)
- luacheck .: 0 warnings / 0 errors in 68 files
- bash tests/_kit/run-automated-tests.sh --suite complexity --no-bundle (sighted): pass,
max CCN 14, 0 warnings, 2144 functions.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit f921770d89eb230de601cff43cac173fb6849988
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 00:13:30 2026 +0530
GI-FIN-02: record the 2026-10-02 smoke passes; doc sync
LOOK-15, LOOK-17 and DIAG-26..39 passed in the owner's 2026-10-02 client run and leave Pending
sign-off. module-map: tests/test_docs.lua is 310 lines.
Gate: 855 pass / 0 fail / 1 skip; luacheck 0/0 in 68 files; vendor diff empty.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit f921770d89eb230de601cff43cac173fb6849988
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 00:13:30 2026 +0530
GI-FIN-02: record the 2026-10-02 smoke passes; doc sync
LOOK-15, LOOK-17 and DIAG-26..39 passed in the owner's 2026-10-02 client run and leave Pending
sign-off. module-map: tests/test_docs.lua is 310 lines.
Gate: 855 pass / 0 fail / 1 skip; luacheck 0/0 in 68 files; vendor diff empty.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit eccf7665b1ce71b628b75bbce1a5de36007ca129
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Oct 1 14:23:46 2026 +0530
GI-AT-02R: point the #20 citation at test_panelmirror and list it in scope.md
cc72830 moved the AbsorbTracker#20 refresher case to tests/test_panelmirror.lua,
but settings/UnitPanel.lua's comment still cited test_panelpages, and
docs/scope.md's headless-suite list omitted test_panelmirror. Comment and doc
only; suite 855 passed / 0 failed / 1 skipped before and after.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ng9STmzmM1JYwT2WWSakpL
commit e284e8f91edfd84339658d11cb404af987a3f438
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Oct 1 14:23:06 2026 +0530
GI-AT-RVR: DEPENDENCIES.md names the sighted complexity suite, not raw lizard
The lizard section and the "Am I set up correctly?" block still called the
raw `lizard -l lua -x ...` command the runner's `complexity` suite. Under kit
revision 35 the suite is `bash tests/_kit/run-automated-tests.sh --suite
complexity`, which runs `lizard -l lua -L 1500 ...` over the sighted shadow
with function-count parity. Raw lizard is blind in Lua (WowAddonStandards#6),
so it stays only as the tool install check. Docs only; suite 855/0/1 skipped.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ng9STmzmM1JYwT2WWSakpL
commit cc728302a364add8e354a8451c3c6d093041b04f
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Oct 1 14:18:14 2026 +0530
GI-AT-02R: peel the Appearance mirror half out to tests/test_panelmirror.lua
tests/test_panelpages.lua grew from 894 lines on master to 1019 with the
#20/#32 cases, entering the layout-§1 1000-1500 band, which this cycle's
M1 addendum (A2) says gains no file. Its "chrome block registers a
refresher" section moves verbatim and in order to the new
tests/test_panelmirror.lua (10 cases: the refresher re-sync pair, the
re-entrancy and failure-report cases, the two-tier refresher pair, the
tab-click refresher, the Link group and the hidden-page rebuild, with
mirrorHeaderState and scrollContent). barPanel, chromeWidget/chromeLabel
and tabButtons are repeated there. The runner loads it straight after
test_panelpages; the one case that followed the section
(/at resetposition without the helpers) touches no page state, so it now
runs before the moved cases.
test_panelpages.lua: 1019 -> 676 lines (34 -> 24 cases);
test_panelmirror.lua: 388 lines (10 cases).
Suite totals identical: 855 passed, 0 failed, 1 skipped (856) before
and after. luacheck 0/0 over 68 files (was 67); lizard no function
above CCN 15.
Docs moved with it: docs/test-cases.md regenerated, docs/module-map.md
rows 44a/44b plus the suite list and the run.lua/test_widgets line
counts, docs/common-tasks.md suite table, docs/settings-panel.md (two
pins now in test_panelmirror), docs/testing.md (68 luacheck files),
docs/ARCHITECTURE.md cap census.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ng9STmzmM1JYwT2WWSakpL
commit ef895a4c6b6b386b1b03c34f3cbd1899626d1691
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Oct 1 14:17:57 2026 +0530
GI-AT-02R: docs and the AT-15 comment name untabbedSkipRender, not the deleted partitionTabs
docs/module-map.md row 26 and docs/schema.md (the counts note and the
`mirror` row) still credited `partitionTabs` / `Helpers.__partitionTabs`
with keeping the mirror row off the strip. Since the RenderTabbedSchema
adoption it is OptionsTabs minor 8's `untabbedSkipRender` that keeps the
all-skipRender Link group off the strip. The AT-15 case comment in
tests/test_widgets.lua is reworded the same way; the case body is
untouched. Suite totals unchanged: 855 passed, 0 failed, 1 skipped
before and after.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ng9STmzmM1JYwT2WWSakpL
commit ff226dbd508fb8bbecf1ccf7f46f3904991d6a6b
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Oct 1 14:17:32 2026 +0530
GI-AT-RVR: ARCHITECTURE counts the thirty-two files LibKa0s v1.66.0 vendors
docs/ARCHITECTURE.md:49 still said "twenty-eight files" after the v1.66.0
re-vendor; `ls libs/LibKa0s/*.lua | wc -l` is 32. Doc only; suite totals
unchanged (855 passed, 0 failed, 1 skipped).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ng9STmzmM1JYwT2WWSakpL
commit ac2ff82e68ee2af590ac0d4c86169a95a481f493
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Oct 1 14:07:52 2026 +0530
GI-AT-02: the Appearance strip renders through RenderTabbedSchema with OptionsTabs minor 8 (#32)
settings/UnitPanel.lua's renderUnitPanelBody hands the strip and the tab body to
Helpers.RenderTabbedSchema with the three opt-in fields LibKa0s v1.66.0 added for this page:
- untabbedSkipRender = true: the Link group (the mirror row alone, skipRender) is no tab.
- disabledReplaces = true with disabledFor (the mirror state this render captured, the value the
block refresher compares against) and disabledNotice: a mirrored unit's hint replaces its rows.
- rerender = RenderUnitPanel: a tab click re-runs the whole page render, so the chrome block and
the block refresher registered after the body survive it.
The PageHeader chrome block stays before the call, the refresher registration after it, and the
ctx.__rendering guard is unchanged. Deleted: partitionTabs, Helpers.__partitionTabs,
renderMirroredHint and the Helpers.TabStrip composition; the doc block that explained why the
library strip was not used now describes the opts.
Each opt is load-bearing, checked by removing it: without rerender, "after a tab click the
two-tier refresher is still registered" goes red; without untabbedSkipRender, four strip cases
(both AT-15 cases among them) go red; without disabledReplaces, seven mirror cases go red.
The two AT-15 characterization cases in tests/test_widgets.lua stay green with their bodies
untouched (their header comment is rewritten). One existing case changes with the layout: "the
mirrored hint is a laid-out row followed by a ROW_VSPACER" becomes "...a full-width line followed
by a ROW_VSPACER": the hint is now the library's TextRow Label rather than a Label inside a
RenderGrid Flow row, still followed by ROW_VSPACER, and nothing under it. disabledNoticeFont is not
passed: the library's default, GameFontHighlightSmall, is AceGUI Label's own default font
(libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua:136), so the hint's font does not change.
Comments: settings/Appearance.lua (the mirror row), settings/OptionsSetup.lua (stub list note),
tests/test_schema.lua, tests/test_panelpages.lua.
Docs: docs/settings-panel.md (RenderUnitPanel section: the opts table replaces the TabStrip-direct
paragraph), docs/module-map.md rows 21/26/44a/46 and the page-builder paragraph, plus the
LibKa0s file list and load order the GI-AT-RV commit left at twenty-eight files,
docs/ARCHITECTURE.md module-map row, docs/smoke-tests.md (LOOK-17 new, LOOK-15/17 and the
v1.66.0 perf-run checks DIAG-26-39 in Pending sign-off), docs/test-cases.md regenerated.
Gates (ka0s-bounded): lua tests/run.lua 855 passed, 0 failed, 1 skipped (856, totals unchanged
from the characterization commit); luacheck . 0/0 in 67 files; sighted complexity pass, maxCcn 14,
warnings 0, blindFiles 0, 2139 functions.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ng9STmzmM1JYwT2WWSakpL
commit c1d8492855d869c85b0faba03cbb056856b90f07
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Oct 1 13:59:41 2026 +0530
GI-AT-02: characterization cases for the Appearance strip before RenderTabbedSchema adoption
Written first, green against today's host composition (partitionTabs + Helpers.TabStrip), so the
adoption that follows has to keep them green:
- "after a tab click the two-tier refresher is still registered": focus unmirrored, click tab 2,
RestoreDefaults (which runs only the refreshers) re-mirrors the unit; the checkbox follows, the
rows go and the hint replaces them. Red under RenderTabbedSchema's default tab click
(ClearScroll + a rows-only redraw resets ctx.refreshers).
- "the Link group never becomes a tab, mirrored or not": target and focus, both mirror states,
the strip's keys are exactly Size,Bar,Background,Border,Text. Red under a partition that keeps
the all-skipRender Link group.
- tests/test_panelpages.lua's tabNames derives the expected strip from the schema itself instead
of calling the page's own Helpers.__partitionTabs, which the adoption deletes.
docs/test-cases.md regenerated; README badge 855/855.
Gates (ka0s-bounded): lua tests/run.lua 855 passed, 0 failed, 1 skipped (856); luacheck . 0/0.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ng9STmzmM1JYwT2WWSakpL
commit 45cf8ccc68609693ccf1f098cb748072f8caa8c3
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Oct 1 13:56:03 2026 +0530
GI-AT-01: pin the hidden Appearance page's lazy rebuild (#20)
AbsorbTracker#20 (review F-008) was delivered by 156077c (one Appearance page) and 5c03fb8 (the
page adopts SetRenderer, whose refresh gate marks a hidden ctx dirty instead of running its
refreshers). Nothing asserted the hidden half, so a refactor dropping SetRenderer would bring the
off-screen rebuild back silently.
- tests/test_panelpages.lua: "a hidden Appearance page is not rebuilt by a mirror flip; its next
OnShow rebuilds it". No behaviour change, so it is green on arrival; checked that it bites by
temporarily replacing the page's SetRenderer with a hand-wired OnShow: the case goes red
("expected 507, got 513" widgets), then restored.
- settings/UnitPanel.lua refresher comment and docs/settings-panel.md (Appearance section): the
refresher runs only while the page is shown (options-ui-§11, anti-pattern #39).
- docs/module-map.md rows 21 and 44a, docs/test-cases.md regenerated, README badge 853/853.
Gates (ka0s-bounded): lua tests/run.lua 853 passed, 0 failed, 1 skipped (854); luacheck . 0/0
in 67 files.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ng9STmzmM1JYwT2WWSakpL
commit 79f83d6a552fc65135fa042e93598de0096de963
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Oct 1 13:51:48 2026 +0530
GI-AT-RV: re-vendor LibKa0s v1.66.0 (kit 35), wire test_lizard_sighted, sighted complexity recorded
Copies libs/LibKa0s/ and tests/_kit/ whole from the local tag v1.66.0 (tag 178ee0b, commit
e4c5ef7) via git archive. Six files move a minor (Widgets 12, DebugLog 19, Slash 19,
OptionsWidgets 34, OptionsTabs 8, Perf 14), four are added (WidgetsReorder, SlashParse,
PerfSampler, PerfCommands); kit 34 -> 35 (lizard_sighted.lua, test_lizard_sighted.lua). Nothing
deleted. The TOC loads the library through LibKa0s.xml and tests/run.lua derives its list from
the same XML, so no load-list row is needed. Vendor parity: diff -r against the tag is empty for
both payloads.
- tests/run.lua declares { name = "test_lizard_sighted", dir = "tests/_kit/" }.
- CLAUDE.md provenance line and docs/testing.md:170 roll to v1.66.0. CLAUDE.md's green-gate line
quotes no raw lizard; docs/testing.md's suite table now names the runner's complexity suite.
- docs/performance.md, docs/scope.md, docs/module-map.md: thirty-two library files, the kit's
fifth suite, revision 35 and its line counts.
- docs/test-cases.md regenerated; README badge 844/844 -> 852/852.
- Frozen bundles docs/revendor/2026-10-01-v1.66.0/ (01, 02, 03, 05; adoption candidates listed,
not interviewed, per spec S4) and the span docs/revendor/2026-10-01-v1.64.0-v1.65.0/ for the
two tags vendored without a bundle.
No consumer test broke on a library change; no contract blocker.
Gates (ka0s-bounded):
- lua tests/run.lua: 852 passed, 0 failed, 1 skipped, 853 total (before 844/0/1, 845)
- luacheck .: 0 warnings / 0 errors in 67 files
- bash tests/_kit/run-automated-tests.sh --suite complexity --no-bundle (sighted): pass,
maxCcn 14, warnings 0, blindFiles 0, 2134 functions. No newly revealed function above CCN 15.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ng9STmzmM1JYwT2WWSakpL
commit 0fb7c79521bed149803448aeafe27e6e4095c6c7
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Oct 1 02:14:47 2026 +0530
DG-AT-01S: sync-docs: docs/testing.md lint-gate row counts the 67 files luacheck checks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 0fb7c79521bed149803448aeafe27e6e4095c6c7
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Oct 1 02:14:47 2026 +0530
DG-AT-01S: sync-docs: docs/testing.md lint-gate row counts the 67 files luacheck checks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit fb069bc78c249013f45d2333d8c60174b2e43684
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Oct 1 01:27:29 2026 +0530
DG-AT-01R: pin the Options combat lock's [Cfg] refusal line, re-point the stale render-gate comment
tests/test_debugcoverage.lua gains a case that turns the combat lock on (InCombatLockdown mocked,
the library's combat hook run as the edge that re-arms it), makes a Defaults click through
NS.Helpers.RestoreDefaults, and asserts exactly one `[Cfg] defaults appearance refused (in combat)`
line, no host copy of it, and nothing more from repeats in the same combat. Red under dropping
`debug` from the Options descriptor (checked by mutation).
The unit-panel case's red-under comment now names NS.DebugLog.DebugChanged keyed by
RENDER_ERROR_KEY, not the deleted lastRenderError upvalue.
docs/debug.md no longer claims every library line is pinned here: the register parked / flushed
pair needs a first registration inside combat, which the shared harness cannot replay, and rests
on the library's own suite. test-cases.md regenerated, badge 844/844, module-map and
common-tasks rows updated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 23de7ee0793d4c09dd4eae2d44cbe75dd02afa4e
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Oct 1 01:12:22 2026 +0530
DG-AT-01: adopt the console's change gates and at-enable queue (refused events, unit panel render errors, launcher state lines)
core/AbsorbTracker.lua's noteRejected drops its loggedRejected table for
NS.DebugLog.DebugOnce("rejected:<event>", ...), and settings/UnitPanel.lua
drops its lastRenderError upvalue for NS.DebugLog.DebugChanged; both keep
their behaviour (once per name, once per distinct error, nothing
remembered while logging is off) and are now re-armed by the console's
Clear and by turning logging on, which the hand-rolled copies never were.
The render gate compares the whole line, so the same error on a different
page is a new line.
core/LauncherSetup.lua passes debugAtEnable to the Launcher descriptor
(Launcher minor 5) through NS.DebugLog.DebugAtEnable, so Register's state
lines (a broker library absent, no minimap table, "registered"), written
at OnInitialize with logging off, land once after [Init] the first time
logging is turned on.
Tests pin both gates re-arming on Clear and spending nothing with logging
off, and the launcher's state line held, landing once after [Init], not
again on a second enable, and written at once (and once) with logging
already on. debug.md Coverage gains "Which lines are the library's" and
names the Options [Cfg] and Launcher lines as the library's; smoke DIAG-51
is new. The payload stamps roll to twenty-eight files with
DebugLogGates.lua in the load order, and the module-map line counts
follow. Inventory and badge 843/843.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 7d43b9c5d7cad8a1aae4045c5df0431a7fcd7900
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Oct 1 01:05:03 2026 +0530
DG-AT-01: adopt the library's Slash refusal and Lifecycle edge lines (pass debug, drop the DisabledLine match and the host edge lines)
settings/Slash.lua passes the gated sink as the Slash descriptor's debug
(Slash minor 18), so every refusal the dispatcher decides is the library's
one "[Cmd] refused <verb>: <guard>" line. The dispatchPrint wrapper that
matched each printed line against DisabledLine() to log the gate's refusal
is deleted with its dispatchVerb bookkeeping; the refusals of the host's
own verbs (/at debug hold, /at toggle <unknown unit>) stay this file's.
core/Lifecycle.lua passes debug to the Lifecycle descriptor (minor 3), so
each edge is the library's "[Lifecycle] stood down: added <key> (holds:
...)" / "stood up: released <key> (holds: none)" line. StandDown and
StandUp no longer name the edge or the holds: they keep one [Life] line
each for what only they know ("teardown: pending repaint dropped=...",
"rebuild from current state: N bus subscription(s) replayed").
Tests pin the library lines landing in this addon's log, one line per
refusal and per edge, the dispatched (aliased) verb, an unknown verb and
get usage / not-found, silence with logging off, and no line for a hold
that moves no edge; the profile already-current case now expects the
library's one refusal line. debug.md Coverage names [Lifecycle] and the
dispatcher's [Cmd] lines as the library's; smoke DIAG-49 and DIAG-50 are
new and STATE-4 reads the new lines. Inventory and badge 838/838.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 1469a8b107fdddb4cc3afd3a0fc2f4208c42f6ef
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Oct 1 00:55:42 2026 +0530
DG-AT-01: re-vendor LibKa0s v1.65.0 (Slash 18, DebugLog 18 + DebugLogGates 1, Options 27, Launcher 5, Lifecycle 3; kit 34)
Both payloads copied whole from the local tag v1.65.0 (git archive of
LibKa0s/ and testkit/); tests/_kit/ is byte-identical to revision 34 and
held no addon-owned file. The CLAUDE.md provenance line rolls to v1.65.0 in
the same commit, and docs/testing.md's "CLAUDE.md names" sentence with it.
The DebugLog degradation stub in core/DebugLogSetup.lua gains DebugOnce,
DebugChanged, DebugForget and DebugAtEnable (each answering false or
nothing), which the by-name surface-parity case requires on the copy alone.
The standards reference is unchanged: the TOC X-Standard, README badge and
CLAUDE.md "Standards compliance" follow the standard's versionless
templates, so v2.73.0 stamps nothing here. Adoption follows in its own
commits.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 7e1e3b0b312322eba0ab923262210b1f8553d806
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Sep 30 21:25:29 2026 +0530
DL-AT-04: README uses bullets, never numbered lists (standard v2.72.0)
README.md's two numbered lists (the four setup steps under Usage and the How the bar works
pipeline) become `- ` bullets, markers only: no item cites another by number, and the lead
sentence and top-down reading carry the order. ## Reporting a bug is the v2.72.0 fixed body
(three bullets, /at). tests/test_docs.lua pins the bulleted section text and gains a case that
README.md carries no numbered list outside a fenced block; docs/test-cases.md regenerated and the
Tests badge moves to 835/835. No live standards-version stamp to refresh.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 7e1e3b0b312322eba0ab923262210b1f8553d806
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Sep 30 21:25:29 2026 +0530
DL-AT-04: README uses bullets, never numbered lists (standard v2.72.0)
README.md's two numbered lists (the four setup steps under Usage and the How the bar works
pipeline) become `- ` bullets, markers only: no item cites another by number, and the lead
sentence and top-down reading carry the order. ## Reporting a bug is the v2.72.0 fixed body
(three bullets, /at). tests/test_docs.lua pins the bulleted section text and gains a case that
README.md carries no numbered list outside a fenced block; docs/test-cases.md regenerated and the
Tests badge moves to 835/835. No live standards-version stamp to refresh.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit e89cb7db729bb125b888b3b7b40c61162e9d57a4
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Sep 30 19:51:35 2026 +0530
DL-AT-03R: module-map row 55a says a diagnostics run turns session logging on, and counts 330 lines
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit a0a84a95803bfb071133d41d17b4261671271614
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Sep 30 19:44:38 2026 +0530
DL-AT-03R: rename the diagnostics no-change case, and say a run turns logging on in common-tasks, scope and slash-dispatch
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 39c86f93bf986ab2186c9f00ad6c38c18445c350
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Sep 30 19:37:20 2026 +0530
DL-AT-03: re-vendor the final LibKa0s v1.64.0 (DebugLog 17, DebugLogDiagnostics 2, kit 34); diagnostics turns logging on
Both payloads copied whole from the moved local tag v1.64.0 (1cb69a7).
DebugLog 15 -> 17 draws the orange Diagnostics link in the console's title
bar, a small gap right of the Debug On/Off label, whose click runs
D:RunDiagnostics(); DebugLogDiagnostics 1 -> 2 turns debug logging on for
the session through SetEnabled(true) before the report writes, when it is
off (debug-logging-14 at v2.71.0). This addon keeps that default: its
descriptor does not set diagnosticsEnablesLogging = false. tests/_kit/ moves
to revision 34: the contract's "leaves it off" case becomes "turns it on for
the session", plus an already-on case and an opt-out case that is a declared
skip here. tests/_kit held no addon-owned file. The CLAUDE.md provenance line
stays v1.64.0, the same tag re-cut.
The standards reference is unchanged: the TOC X-Standard, README badge and
CLAUDE.md "Standards compliance" follow the standard's versionless canonical
templates, so v2.71.0 stamps nothing here.
tests/test_diagnostics.lua: "the report reads state and changes none of it"
no longer holds the flag as it was; it starts from logging off and asserts
the run leaves it on. docs/debug.md says the report (either form or the
link) turns logging on for the session, and names the link.
docs/smoke-tests.md: DIAG-21 rewritten (the report turns logging on, a
/reload turns it off), new DIAG-48 (the orange link: look, hover, click,
the gap across On/Off, the minimum width), DIAG-2/4/45 name the link; index
and Pending sign-off updated. docs/module-map.md's kit row moves to
revision 34 (10419 lines).
Gate: 834 passed / 0 failed / 1 skipped (835 cases); README badge 834/834
(a skip counts in neither figure, testing-5); docs/test-cases.md
regenerated; luacheck 0/0 in 67 files; lizard 0 over CCN 15 on the touched
test file.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 7f4ed1eb9db65d0f93869a6d9e35817ab86ba0aa
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Sep 30 16:42:04 2026 +0530
DL-AT-02: debug coverage audit and fill (debug-logging-§8 diagnosis, §9 quiet steady state)
Inventory of every event, state edge, deferral, refusal, caught error and
repeating path against debug-logging v2.70.0 §8/§9, and the lines a
support read of a pasted log was missing:
- [Life] stand-down (holds, pending repaint dropped) and stand-up edges
- [World] names the loading screen's kind (login, reload, zone change)
- [Combat] entered says when it re-locked unlocked bars
- [Absorb] readable/secret edge of the player read, one line per edge
- [Bar] a /at debug hold held, expired or cleared early
- [Cmd] refusals naming the guard: the disabled gate's refused verb
(read off the gate's own line), /at debug hold, /at toggle <bad unit>
- [Set] locked: unlock refused (in combat)
- [Init] adds the stood-down holds and missing libraries when present
- [Events] a refused name once per session; [Cfg] a unit panel render
error once per distinct error; [Bus] list joined behind the gate
Every repeating path (absorb/max-health events, repaint pass, swaps,
visibility pass) was already quiet or change-gated; tests now hold it.
New suite tests/test_debugcoverage.lua (14 cases); docs/debug.md gains
the Coverage section; moved citations re-pointed; counts regenerated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 9cabbb57a775df4e30a0a8227a2a18d23260b542
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Sep 30 16:08:37 2026 +0530
DL-AT-01: re-vendor LibKa0s v1.64.0 (kit revision 33), resize smoke checks
Both payloads copied whole from the local tag v1.64.0 (Core 9, DebugLog 15,
Widgets 11, PerfPanel 6; kit revision 33 adds mock_resize.lua). tests/_kit held
no addon-owned file. CLAUDE.md provenance and docs/testing.md's live-state
sentence roll to v1.64.0; docs/module-map.md's kit row moves to revision 33
(10353 lines, mock_resize.lua listed).
The standards reference is unchanged: the TOC X-Standard, README badge and
CLAUDE.md "Standards compliance" follow the standard's versionless canonical
templates (documentation-6), so v2.70.0 stamps nothing here.
No fallout: the Core stub parity case derives NS names from CoreSetup.lua
rather than reading the live Core table, so MakeResizable owes no stub entry,
and no host suite reads IsResizable/IsUserPlaced/GetResizeBounds.
docs/smoke-tests.md gains a Resizing subsection under Diagnostics, DIAG-45 to
DIAG-47 (console, Copy window, perf panel), indexed and listed under Pending
sign-off; the theme's Code line names Core's MakeResizable.
Gate: 819 passed / 0 failed / 0 skipped; luacheck 0/0 in 66 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 c111a2077fa486fb4b1d54927dd849b4fa6ba832
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Sep 30 08:51:52 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 c111a2077fa486fb4b1d54927dd849b4fa6ba832
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Sep 30 08:51:52 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 f11a3d78a8bd72d30746f10036b40a1988d04ddc
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Sep 30 08:12:26 2026 +0530
SP-FIN-01: say tests/prose_waivers.lua is optional and absent today
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 144204ecb28e3e0c3c805117344c09249ca9ccc2
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Sep 30 01:39:51 2026 +0530
SP-FIN-01: sync docs (re-point two stale core/AbsorbTracker.lua line citations)
- docs/ARCHITECTURE.md, events-frames-taint-§8 row: the two sites that
read UnitGetTotalAbsorbs are core/AbsorbTracker.lua:233 and :313, not
:225 (a comment) and :305 (the combat-entered debug line).
- docs/slash-dispatch.md: the guarded NS.Slash:Register() call in
OnInitialize is core/AbsorbTracker.lua:52, not :44 (a blank line).
Everything else checked in sync: 819/819 badge and test-cases.md, the
19-verb COMMANDS table against every doc count, the documentation map
against docs/, module-map line counts, and the Slash.lua citations.
Gate: 819/0/0, luacheck 0/0 in 66 files.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 9931e6bf6d444cb6b65b4c6309a9ec2a13cf6acd
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Sep 29 23:23:06 2026 +0530
SP-AT-03R: match LOOK-1 and LOOK-5 to the Appearance labels in the code
LOOK-1 and LOOK-5 now name the Background tab's dropdown "Background
Texture", as settings/Appearance.lua:184 declares it. LOOK-1's Size tab
now names "Bar Width (in px)" and "Bar Height (in px)" (Appearance.lua:130,
:142) in place of the shortened Width and Height.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit f59026e13ed1d46053274f275593c905278f3627
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Sep 29 23:08:26 2026 +0530
SP-AT-03R: drop COMBAT-6's impossible in-combat Lock frame untick
A settings page on screen in combat sits under the LibKa0s combat cover,
which takes every click, so the Lock frame box cannot be unticked there.
COMBAT-6 now checks the refusal through /at unlock only and points at the
cover (COMBAT-4) and the launcher menu (LAUNCH-4); its Pending row records
the correction.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit b2f9e6d33f56f06e663e74b5d12dc1f82692abad
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Sep 29 22:54:36 2026 +0530
SP-AT-03R: list the checks the 2026-09-24 remediation rewrote as pending
Pending sign-off missed the old steps that the 2026-09-23 remediation
rewrote on 2026-09-24. Their owed client sessions (AT.1, AT.2, AT.6,
AT.7, AT.8, X2.3, X2.6) have no recorded result, so by the clarified
S4 rule they are pending: SLASH-4, PROFILE-9, PROFILE-14, PROFILE-15,
STATE-3, COMBAT-5, COMBAT-6, BAR-11, MIGRATE-2, LAUNCH-5, LAUNCH-7,
DIAG-16, DIAG-17 and DEGRADED-1. DEGRADED-2's row now also names the
unrun AT-09 stub-shape session.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 36a63fec2a3ca207bf3afd6aa9a8e8096b289235
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Sep 29 22:35:42 2026 +0530
SP-AT-03R: check that an inactive pre-v3 profile's color and position are lifted and used
MIGRATE-6's hand-made block now carries a flat barColor and position beside
barWidth, and the check confirms after the switch that the bar sits at the
saved anchor with the saved fill, restoring old K.66's position coverage.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 2417eabd820e14b1b5ef9980c58ba61f91e8434c
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Sep 29 22:22:42 2026 +0530
SP-AT-03R: fix the combat code pointer, correct perf and migrate checks, widen Pending
The Combat section's Code line put the combat re-lock in the `locked` row.
The re-lock and its `Bars locked — combat started` line are
addon:OnEnterCombat in core/AbsorbTracker.lua. Only the unlock refusal is
the row's onChange in settings/General.lua.
Re-checking every expected string against the code found these wrong:
- DIAG-4, DIAG-35, DIAG-37, DIAG-43: the perf panel has six rows
(PerfPanel.lua STEPS) and no JSON Dump row. `report` prints the summary
and then the JSON line (Perf.lua SUBS.report). The JSON keys are sorted,
so the line starts {"addon":"AbsorbTracker","buckets": and the nesting
pair has no space after the colon.
- DIAG-30: the report pads the label (`%-10s (not sampled)`).
- MIGRATE-6: the v3 sweep runs in OnInitialize while debug logging is
still off, so the `[Migrate] lifted N` line never reaches the console.
The check now reads the inactive block in the SavedVariables file, and
tests/test_database.lua already pins the count.
- PANEL-8: the tooltip reads `Profiles -> Reset Profile`, not an arrow.
- PANEL-7: `/at resetall` prints its line without the button's period.
- PANEL-3: the row label is `Update throttle (in sec)`.
- BAR-12: a bar's width floors at 50 px, so 40 px could not be set.
Pending sign-off now follows the clarified S4 policy. It lists the old
unrun checks, every check new with the `profile` verb (including PROFILE-5
and PROFILE-13, which now switch through it, SLASH-3's new help row and
DEGRADED-2's new stub step), and every check corrected against the code
in this run. The new PROFILE checks stay listed: the review asked to drop
them, but under the clarified policy a new check is pending.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 189151700123617afcd30c4bcf4c8a79b56dca97
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Sep 29 21:37:52 2026 +0530
SP-AT-03R: correct DIAG-40's perf strings and list the unrun O/P/C checks as pending
DIAG-40 carried old P.106's mistake: it expected `unlabeled` on the start
line, the report header and the cancel line after an unlabeled start. The
library always passes P.Start a `YYYY-MM-DD HH:MM` stamp (Perf.lua
SUBS.start), so the start line and header show the timestamp, and the
cancel line is `perf run CANCELED — nothing saved` with no label. A tester
on a correct build would have recorded a failure. The check now quotes
what the client prints and keeps the doubled-L rule without spelling the
British forms, which the prose lint would flag.
Pending sign-off also missed checks the 2026-09-07 cycle's checklist
lists and that no later run records: old § O 103-104 (LOOK-5, LOOK-6),
§ P 105 and 106 (PANEL-4, DIAG-40; the same session 3 as the unrun
§ S 109) and § C 13a (COMBAT-4, rewritten for the v1.46.1 cover). The old
doc never stamped O and P NOT YET RUN, which is the only reason they read
as signed. Each row now names the old step it came from, per S4 and D4.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit c15abe6acfc86a58a4518546c09dc43a46bdaf9f
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Sep 29 21:15:54 2026 +0530
SP-AT-03R: restore lock-refuses-drag, fix perf strings and a code pointer
The review of SP-AT-03 found the rewrite had dropped or garbled five things:
- BAR-11 now checks that a locked bar (by /at lock or Lock frame) cannot be
dragged by its body, the negative half of old D.14 and F.30 that the merge
lost (Display.lua gates SetMovable/EnableMouse on `locked`).
- LOOK-5 now opens the Background texture dropdown too, so old D.15's "every
LSM dropdown has entries" is covered in full (Appearance.lua bgTexture row
is an LSM30_Statusbar).
- DIAG-28 no longer expects "next steps" after /at perf start; SUBS.start
prints only the STARTED line and the context lines, as DIAG-37 says.
- DIAG-34 quotes the real chat line `addon RESUMED — restored` (and the
console's `events and frames restored`) instead of the stale
`bars restored`.
- The Appearance Code line names the color getters that exist
(NS.GetBarColor/GetBgColor/GetBorderColor/GetFontColor, resolveBgColor)
instead of a nonexistent resolveColor.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 2a16960e3d728ac304c9cbbacdb167036cf6d043
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Sep 29 21:00:20 2026 +0530
SP-AT-03: rewrite the smoke suite as one evergreen, theme-grouped doc
docs/smoke-tests.md had grown into 22 lettered sections, several of them
release or session batches that re-walked what A-L already covered, with
colliding step numbers (94/95 twice, U and V restarting at 1) and a stale
"121 checks" count. Spec S4 asks for one deduplicated suite grouped by
theme, with stable IDs, so every Ka0s addon's smoke doc reads the same way.
The 168 old checks now live in 150 checks across 13 themes (INSTALL,
SLASH, PANEL, PROFILE, STATE, COMBAT, BAR, LOOK, MIGRATE, LAUNCH, DIAG,
DEGRADED, LOC). Duplicates were merged, and no check was dropped. Seven
PROFILE checks are new, for the `profile <name>` verb SP-AT-02 shipped:
list, already current, unknown name refused with nothing created, quotes
and spaces, `use` for a profile named like a sub-verb, combat refusal, and
the disabled path. The checks never run in a client (old Q, R, S, 86a and
T, plus the new verb checks) are listed under Pending sign-off. The General
layout now lists the Minimap button row, which the old step 14 had left out.
Inbound references follow the new IDs: code and test comments, debug.md,
settings-panel.md, and the ConsumableMaster / KickCD locale citations,
which now point at LOC-1. The prose waiver only covered the two British
perf-string spellings that old step 106 quoted, and the new DIAG-40 does
not quote them, so tests/prose_waivers.lua and its module-map row are
removed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 7508ff0f3a7e5dfec1d18ce53e168c05b0b845e9
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Sep 29 12:57:45 2026 +0530
SP-AT-02R: name every NS.L-routed string in the localization-§1 row
The review of SP-AT-02 found that the Documented deviations register's
localization-§1 row still listed the routed strings as only the drag
handle's and the library-absent line, and said their keys were the only
ones enUS.lua lists. SP-AT-02 routed the profile row's COMMANDS
description, and the diagnostics report's two keys were already missing
from the row. CLAUDE.md makes that register the single home that
ratifies a deviation, so a row with the wrong scope misstates what was
accepted (documentation-§5, localization-§3).
The row now names all of them: the drag handle's strings (its three
tooltips and the close mark's chat line as well as the unit labels), the
library-absent line (both the Slash stub and the DebugLog stub print it),
the diagnostics row's help text and DIAG_WRITTEN line, and the profile
row's help text. The three older "nothing is wrapped" claims in
ARCHITECTURE.md's file table, module-map.md's Locale section and
scope.md now say the same thing. Each edit replaces one line with one
line, so no file:line citation moves. The test count is unchanged (819).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit dcbaebb8211b96d0560d016174cbbb4b45cdaccf
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Sep 29 12:43:02 2026 +0530
SP-AT-02: /at profile via CliProfile
Route the existing /at profile tree through LibKa0s-Slash minor 17 so
this addon answers `profile <name>` the way every Ka0s addon now does
(owner decisions D1, D3; spec S3).
- Bare /at profile prints the library's list (current marked, hint row)
and then the sub-help. A first word matching a sub-verb, in any case,
runs that sub-verb; anything else goes to CliProfile with the whole
remainder, so case, inner spaces and one pair of quotes are kept.
- `use <name>` goes to ProfileSwitch. It used to hand any name to
AceDB's SetProfile, which creates a missing profile, so a typo became
a profile. Unknown names are now refused with the list; the old
"Unknown profile subcommand" line is gone.
- The descriptor passes `profiles = function() return NS.db end`.
`profile` was already on liveVerbs, so it answers while disabled.
- The COMMANDS row keeps its place and takes the collection's
description through NS.L (new enUS key); the sub-help gains a
`<name>` row.
Tests first: bare list then sub-help, switch of an existing profile
with the handler's one [Profile] line, quotes/case/spaces, unknown name
and `use` of one refused with nothing created, did-you-mean, already
current, combat, live while disabled, the degraded stub, and `use`
reaching a profile named like a sub-verb. Three older cases that relied
on the silent create now make their profile first.
Docs: slash-dispatch.md (verb row, sub-verb tree, liveVerbs row, and
every shifted or stale Slash.lua citation), profiles.md, ARCHITECTURE
(Slash Commands and the events-frames-taint-§8 row, re-measured 19 ->
17 pre-formatted sites), module-map.md, README FAQ and badge,
test-cases.md regenerated, smoke-tests.md citation re-pointed.
Gate: 819/0/0 (was 810), luacheck 0/0 in 67 files.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 7f49f77990617ab216a735e4315cc25c91fc4692
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Sep 29 12:27:12 2026 +0530
SP-AT-02: re-vendor LibKa0s v1.63.0
Take LibKa0s v1.63.0 from the local tag (git archive, never a working
tree) so the addon carries Slash minor 17, the shared profile verb
(CliProfile, ProfileSwitch, ProfileNames). Slash.lua is the only file
that moved; the test kit is unchanged at revision 31. The CLAUDE.md
provenance line rolls with the payload, as the vendor-sync case needs.
The by-name Slash parity case went red on the copy alone: the live
instance now has CliProfile and ProfileSwitch and the library-absent
stub had neither. Both join the stub on route (b), printing the
library-absent line for /at profile and switching nothing, so the gate
is green in this commit.
The revendor bundle docs/revendor/2026-09-29-v1.63.0 records the delta
and that only the Slash minor 17 profile surface is adopted, by the
next SP-AT-02 commit. Shifted citations re-pointed (slash-dispatch.md
Register, module-map.md line count, testing.md tag).
Gate: 810/0/0, luacheck 0/0 in 67 files.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
This mod has no additional files