1.2.0-release
What's new
tag 76a351bbec0009e12110849483c09a195852e9ce 1.2.0-release
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 9 19:22:55 2026 +0530
Release 1.2.0
commit bee852f530867d59fe75d2cb8df72fb0778d0afa
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 9 19:22:55 2026 +0530
Release 1.2.0: version bump, release notes and the gated release run
Bumps MultiMeters 1.1.0 -> 1.2.0 through /dev-copilot:bump-version. The
release battery ran first (bundle docs/automated-tests/20261009-191721/,
measured b3c8b4f, clean tree) and every gate passed, read from its
manifest.json:
- Lint: pass, 0 warnings / 0 errors in 146 files
- Tests: pass, 2196 passed, 0 failed, 1 skipped (kit contract case that
does not apply to this addon), 2197 total
- Perf: pass, 18 scenarios measured
- Complexity: pass, lizard 1.24.0 ran
- CCN <= 15: 0 warnings, max CCN 15
- Sighted: blindFiles 0 (first sighted release run)
Files:
- MultiMeters.toc: ## Version 1.2.0
- core/Namespace.lua: FALLBACK_VERSION 1.2.0
- README.md: new 1.2.0 row at the top of Version History (2026-10-09),
five bulleted highlights, de-AI pass applied; older rows untouched
- docs/testing.md: the release-routing note records that 1.2.0 went
through bump-version, with its release run
- docs/automated-tests/20261009-191721/: the release bundle, with its
ANALYSIS.md
- docs/automated-tests/RESULTS.md: the release row; tests/test_roster.lua
newly entered the 1000-1500 band (1014) and has its disposition, the
other 22 dispositions carry forward
Left alone: the CLAUDE.md LibKa0s provenance line (v1.71.0, the
vendored library's tag), the Interface line, the auto-derived CurseForge
badge, the old Version History rows, and 1.1.0 mentions in frozen audit
and automated-test bundles. Tests re-run after the edits: 2196 passed,
1 skipped, lint 0/0. docs/test-cases.md did not change. Since
1.1.0-release: 69 commits.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J2w6FgfFYw93meWZN9Ahn6
commit b3c8b4f8a9241f697d59ca8febe81ffedc746b6b
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 9 18:53:25 2026 +0530
SD-FIN-03: remove dead test seam Helpers.__windowsCtx
Zero callers anywhere; no doc or surface pin named it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J2w6FgfFYw93meWZN9Ahn6
commit c3dd0ecfa6446987de8e092a5672a3e410c71d73
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 9 17:49:39 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 5278b795e7b9701f9a6804ac474beae093e797b8
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 21:09:40 2026 +0530
MM-STD: Confirm the v2.77.0 standards reference; sync docs to MM-01..10
Release-side item for the 2026-10-07 remediation (no finding of its own).
Standards reference, checked against WowAddonStandards v2.77.0 (feature
branch feat/2026-10-07-review-audit-remediation, WS-11):
- The three places already carry the versionless v2.77.0 form used by the
other addons in this run: MultiMeters.toc `## X-Standard` (:12), the
README Standard badge (:6) and CLAUDE.md "Standards compliance (read
first)". toc-file-§1 and documentation-§1/§6 require no version, so
none is added. No change.
- Citation sweep over authored files (libs/, tests/_kit/ and the frozen
audits/reviews/automated-tests runs/revendor/perf-analysis runs/
superpowers excluded): 940 `filename-§N` citations, every one resolves
to a `### N.` heading at v2.77.0 (the only miss is CLAUDE.md's literal
`filename-§N` placeholder). Bare `§N` continuations after a filename
cite (options-ui-§15/§16/§17, debug-logging-§8/§9/§10, ...) also
resolve; other bare `§N` refer to this addon's own design spec. No
anti-pattern number past #92, nothing cites a STANDARDS.md changelog
(WS-01), no cross-repo bare line citation (WS-07), CLAUDE.md restates
no branch rule (WS-08).
- .gitattributes is byte-identical to line-endings-§5's client-bound body
at v2.77.0 (WS-03); no edit.
Docs sync against MM-01..MM-10 and RV-MM:
- module-map.md: NS.Roster's export list gains LocalGUID (Aggregator and
Aggregator_Identity call it), NS.DrillDown's gains OnRowClick (the
right-click way out, called from Row.lua; MM-06 left it unlisted).
Secrets.PlainTruth and Roster.BeginPass were already documented by
MM-02/MM-03.
- compat-layer.md: MM-07 removed the EnvSetup.lua header text naming
Compat.GetAddOnMetadata, so the "its header names" sentence now states
the two-rung ladder; the Compat.OpenDeathRecap probe cite moves
DrillDown.lua:271 -> :264 after MM-06's deletions (typo fixed).
- performance.md and perf-analysis/README.md bucket tables: call-site line
cites re-pointed to the current Perf.Note lines (render Window.lua:1324
and aggregate DrillDown.lua:719/:731 moved with MM-06; Aggregator.lua
:1264 with MM-01..03; the meterEvent/spellEvent/systemEvent, Targets and
perf-analysis README rows had drifted before this run and are fixed in
the same pass).
- data-flow.md (order-independent pet fold, PlainTruth), ARCHITECTURE.md
(MM-10), DEPENDENCIES.md and testing.md (RV-MM, MM-09) checked, no
drift. README Tests badge 2196/2196 equals the --list Total and
docs/test-cases.md regenerates byte-for-byte.
No version bump, no Version History row.
Deviations: the perf-table cites that drifted before this run are
corrected here too, since the same rows were being re-pointed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit 5278b795e7b9701f9a6804ac474beae093e797b8
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 21:09:40 2026 +0530
MM-STD: Confirm the v2.77.0 standards reference; sync docs to MM-01..10
Release-side item for the 2026-10-07 remediation (no finding of its own).
Standards reference, checked against WowAddonStandards v2.77.0 (feature
branch feat/2026-10-07-review-audit-remediation, WS-11):
- The three places already carry the versionless v2.77.0 form used by the
other addons in this run: MultiMeters.toc `## X-Standard` (:12), the
README Standard badge (:6) and CLAUDE.md "Standards compliance (read
first)". toc-file-§1 and documentation-§1/§6 require no version, so
none is added. No change.
- Citation sweep over authored files (libs/, tests/_kit/ and the frozen
audits/reviews/automated-tests runs/revendor/perf-analysis runs/
superpowers excluded): 940 `filename-§N` citations, every one resolves
to a `### N.` heading at v2.77.0 (the only miss is CLAUDE.md's literal
`filename-§N` placeholder). Bare `§N` continuations after a filename
cite (options-ui-§15/§16/§17, debug-logging-§8/§9/§10, ...) also
resolve; other bare `§N` refer to this addon's own design spec. No
anti-pattern number past #92, nothing cites a STANDARDS.md changelog
(WS-01), no cross-repo bare line citation (WS-07), CLAUDE.md restates
no branch rule (WS-08).
- .gitattributes is byte-identical to line-endings-§5's client-bound body
at v2.77.0 (WS-03); no edit.
Docs sync against MM-01..MM-10 and RV-MM:
- module-map.md: NS.Roster's export list gains LocalGUID (Aggregator and
Aggregator_Identity call it), NS.DrillDown's gains OnRowClick (the
right-click way out, called from Row.lua; MM-06 left it unlisted).
Secrets.PlainTruth and Roster.BeginPass were already documented by
MM-02/MM-03.
- compat-layer.md: MM-07 removed the EnvSetup.lua header text naming
Compat.GetAddOnMetadata, so the "its header names" sentence now states
the two-rung ladder; the Compat.OpenDeathRecap probe cite moves
DrillDown.lua:271 -> :264 after MM-06's deletions (typo fixed).
- performance.md and perf-analysis/README.md bucket tables: call-site line
cites re-pointed to the current Perf.Note lines (render Window.lua:1324
and aggregate DrillDown.lua:719/:731 moved with MM-06; Aggregator.lua
:1264 with MM-01..03; the meterEvent/spellEvent/systemEvent, Targets and
perf-analysis README rows had drifted before this run and are fixed in
the same pass).
- data-flow.md (order-independent pet fold, PlainTruth), ARCHITECTURE.md
(MM-10), DEPENDENCIES.md and testing.md (RV-MM, MM-09) checked, no
drift. README Tests badge 2196/2196 equals the --list Total and
docs/test-cases.md regenerates byte-for-byte.
No version bump, no Version History row.
Deviations: the perf-table cites that drifted before this run are
corrected here too, since the same rows were being re-pointed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit e379f5cd2106ed523422c2d040e6a1bcb6d0a6eb
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 21:03:36 2026 +0530
MM-10: correct hub counts and comments, slim the hub, document copy by id
Documentation and comments only; no behaviour change.
MM-A-04: docs/ARCHITECTURE.md drops the stale "all fifty-eight" count from
the Module map line (the inventory line the doc-structure gate reads keeps
the count); "three library-stack-§8 declines" becomes "two" (the register
carries two); the two "One row is ratified." lead-ins over retired rows are
gone, each retired row now led by "Retired on <date>". settings/Slash.lua no
longer cites a README command table that does not exist (points at
docs/slash-dispatch.md) and the diagnostics comment says the run turns
logging on for the report (D:RunDiagnostics). test_doc_structure was not
widened to police spelled-out counts (declined).
MM-A-09: the five retired-row paragraphs in Documented deviations become
one-line bullets pointing at the frozen record (audits/revendor bundle) that
holds their reasoning; the Documentation map preamble and the Conditional
table's measurement prose are trimmed to the counts. No live register row or
required section removed. 578 -> 531 lines.
MM-A-03: core/LifecycleSetup.lua (architecture-4) -> (architecture-§4).
MM-R-05: docs/slash-dispatch.md, the WINDOW_USAGE locale string and the
comment above WINDOW_VERBS.copy say the copy source may be given as its
window id (M.Resolve falls back to tonumber after a name match), which
covers default names with spaces such as "Multi Meters #1". No parser
change. The usage key became "copy <source/id> <target>" in the locale
(a "|" would split the markdown table cells).
Deviations: the hub lands at 531 lines, clearly under 578 but above the
~400 target; the remaining weight is live register rows and sections the
item did not scope for trimming. The docs note that a default name's
number is a window count, so it equals the id only until a window is
deleted (core/Database.lua WindowName).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit e5a0cb45febaa5e04c3d7345c35cf87e29b4ca39
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:58:48 2026 +0530
MM-09: quote the sighted complexity suite and un-pin lizard
The complexity check was quoted as raw (blind) lizard without -L 1500
(anti-pattern #92) at DEPENDENCIES.md "Am I set up correctly?",
docs/automated-tests/README.md's suite table and docs/performance.md
section 4. All three now quote the kit's sighted suite:
`bash tests/_kit/run-automated-tests.sh --suite complexity` (with
--no-bundle in DEPENDENCIES.md's set-up check).
DEPENDENCIES.md pinned lizard==1.24.0, which documentation-section 7
rejects. The toolchain row now reads "any recent (verified with
1.24.0)", the install line is `pipx install lizard`, and the pin
rationale is replaced by the documentation-section 7 parity sentence:
the sighted suite checks function-count parity on every run, so a
reader change shows up as a blind file rather than needing a pin.
No register row (the owner has not asked to keep the pin).
The complexity suite ran green with the installed lizard 1.24.0
(0 warnings, max CCN 15, parity holds). The set-up block's comment
column was realigned to the longer command.
Finding: MM-A-07 (audit MM-A-29).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit fdca448553e8d5449b0ec8cb49ded3fc557bf560
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:55:52 2026 +0530
MM-08: tell 1.1.0 players the minimap CLI path is global.minimap.shown
launcher-§3 (launcher.md:78) makes a release-note sentence a MUST when a
CLI path is renamed. e979ef0 renamed the minimap row's CLI path before
1.1.0, and the 1.1.0 Version History row never said so, so an old macro
hit "Setting not found" with no notice. The 1.1.0 row now carries one
player-voice bullet: `/mm set minimap.hide true` is now
`/mm set global.minimap.shown true`.
Value mapping verified from git at 1.0.1-release: the row was
profile-root `minimap.hide` with invert = true (settings/Schema.lua:1168),
and both the CLI (settings/Slash.lua:194) and the panel
(settings/OptionsSetup.lua:139) wrote through NS.SetByPath, which applies
toStored (settings/Schema_Paths.lua:191/496). So the 1.0.1 CLI already
took the display ("shown") sense, and true maps to true, not to <not v>.
Finding: MM-A-06. Departure from the raw finding: the old path players
had was `minimap.hide`, not `global.minimap.hide`. The global.* form
existed only between released versions. No version bump, no new row.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit 562bce06eecfaac2480cba15c7f8790fbac92940
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:51:52 2026 +0530
MM-07: drop the dead bare-global GetAddOnMetadata rung from NS.Meta
The LibKa0s-Env-absent branch of NS.Meta (core/EnvSetup.lua) kept an
_G.GetAddOnMetadata rung below the C_AddOns rung. No client admitted by
## Interface 120100 can reach it, and the standard's compat dead-rung rule
names this exact site as its worked case. NS.Meta is now Env, then
C_AddOns.GetAddOnMetadata, then nil. No Compat shim was added.
- tests/test_envsetup.lua: new red-first case "EnvSetup degraded: with no
library and no C_AddOns, the bare global is no rung either". It loads with
libFiles = {}, plants a bare GetAddOnMetadata spy and asserts zero calls
(load-time read included), a nil NS.Meta and NS.version ==
FALLBACK_VERSION. Before the deletion it failed with
"assertNil (got 9.9.9)".
- Comments that defended the pre-11.x rung now describe the two-rung
ladder: core/EnvSetup.lua (header, degraded-install section, NS.Meta
doc), tests/test_envsetup.lua:4, settings/Slash.lua:62-65,
core/PerfSetup.lua:92-95 and tests/test_perfsetup.lua:110-112.
- docs/test-cases.md regenerated; README Tests badge 2195 -> 2196.
Finding: MM-A-05 (audit MM-A-27).
Deviations:
- The item says to replace the tests/test_envsetup.lua:146-160 case. RV-MM
had already rewritten that case to pin the library-PRESENT contract
(LibKa0s-Env-1.0 minor 2), and its own comment says the library-absent
branch is not exercised there. Replacing it would have dropped that
coverage, so it stays and the library-absent case is added next to it.
The suite count goes up by one.
- .luacheckrc never listed GetAddOnMetadata, so it needed no edit.
- To make the item's verify grep print nothing, the EnvSetup.lua header
comments that named the deleted Compat.GetAddOnMetadata shim were
reworded as well.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit 39aad30bb6a5b60a4d1906e1fc4baeb3ad569362
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:45:36 2026 +0530
MM-06: remove the retired drill-down Back button machinery and tests
Right-click on any row (modules/Row.lua) replaced the drill-down Back
button, but modules/DrillDown.lua still carried the backButtons table,
BACK_BUTTON_WIDTH/HEIGHT, the button lookups in Exit/ExitAll, and
AcquireBackButton/ReleaseBackButton (test-only, no in-addon caller), and
Window:Render called ReleaseBackButton on every pass.
- DrillDown.lua: all of that is deleted. Exit/ExitAll keep every other
effect (clear the view, debug line, DRILLDOWN_CHANGED announce). Header
and click-routing comments now name right-click as the way out.
- Window.lua: Render no longer calls into DrillDown for a button; the
NO BACK BUTTON note stays as history.
- tests/test_drilldown.lua: the three back-button cases are deleted.
- docs/module-map.md drops both functions from the DrillDown exports.
- docs/test-cases.md regenerated; README Tests badge 2198 -> 2195.
Finding: MM-R-08.
Deviations: none. docs/data-flow.md and docs/smoke-tests.md mention the
Back button only as retired history and stay as they are.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit b52a543f8b8ca66b4e228f1cd92c2b3cdca5a454
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:42:51 2026 +0530
MM-05: address review — mock_menu.lua header names both callers
The fake's header still said it was installed only by
tests/test_launchersetup.lua; since c531c74 tests/test_disabled.lua's
'Disabled 8b' installs it too. Comment-only.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit c531c747632cefee3a990987ec4606a0fbe8f728
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:39:52 2026 +0530
MM-05: drive the launcher right-click in conformance 'Disabled 8b'
slash-commands-§7 step 8 needs both launcher buttons. 'Disabled 8' drove
only the left click, so the right-click menu's "wrote nothing, showed
no frame" clause was pinned nowhere (test_launchersetup.lua grays the
entries but never reads __svWrites or shown frames).
New sibling case 'Disabled 8b' in tests/test_disabled.lua: disables the
addon, installs the addon-local tests/mock_menu.lua, right-clicks the LDB
object and asserts the menu opened (and the panel did not), Enabled is
clickable, Locked / Test mode / Show window are grayed and refuse a
click, zero SavedVariables writes, zero frames shown, no chat line.
Falsification comment per testing-§12; confirmed red in a scratch copy
whose descriptor answered isEnabled = true ("Locked is not grayed while
disabled"). No production code change: the behaviour is library-owned.
docs/test-cases.md regenerated (2197 -> 2198) and the README Tests badge
moved to match.
Finding: MM-A-08.
Deviation: the mock_menu loader is inlined in the case (the pattern
test_launchersetup.lua's openMenu uses) rather than lifted into a
shared helper, which the item allowed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit 55d864ee0cd9df016c193419ca166766651e15e2
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:35:34 2026 +0530
MM-04: keep a case-only rename of a window's own name
uniqueName(base) asked M.Resolve, which matches names case-insensitively,
so the window being renamed counted as its own collision: renaming "Raid"
to "raid" stored "raid 2". uniqueName now takes an optional selfId, and a
Resolve hit whose cfg.id equals it is not a collision, for the base and
for every "base N" probe. M:Rename passes cfg.id; Create and Duplicate
pass nothing and behave as before.
tests/test_windowmanager.lua gains "Rename to a different case of its own
name keeps that name" (Raid -> raid stores "raid"; another window's name
in a different case still gets " 2"), red under the old uniqueName.
docs/test-cases.md regenerated and the README Tests badge rolled to 2197.
docs/ARCHITECTURE.md and docs/slash-dispatch.md do not describe the
uniquing rule, so they are unchanged.
Resolves MM-R-04 (review F-004).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit 0ca2446d210d93ce8aa5bd1e9a6f779e14f08fec
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:27:46 2026 +0530
MM-03: rebuild a partial roster at most once per aggregate pass
modules/Roster.lua's ensure() rebuilt the map whenever cache.partial was
set, and Get / IsGroupMember / OwnerOf / LocalGUID all go through it, so a
short roster paid a whole unit walk per lookup: several per source per
column, four times a second while the group stayed short (MM-R-03).
- New Roster.BeginPass() arms one retry (cache.retryArmed). ensure()
rebuilds when there is no cached map, or when the map is partial AND the
retry is armed; build() disarms. A complete map is never rebuilt by
ensure(); Refresh / Forget / the roster messages are unchanged.
- Aggregator.Build calls Roster.BeginPass() once, before newPass and any
lookup, so the rest of the pass and every caller outside a pass
(tooltip, drill-down) answers from the stored map.
- The comments at the logBuild header (~:405), in build() and on ensure()
(~:535) now say one retry per aggregate pass; the DebugSteady partial
line gating is unchanged.
- tests/test_roster.lua: two new cases count builds (UnitGUID("player")
calls) across multi-column Aggregator.Build passes over a partial roster
-- red before the fix at 30 builds for one 7-column pass; now 1 per pass,
and a completed roster stops retrying. The two older retry cases now arm
the pass with BeginPass, as the per-pass contract requires.
- Optional item done: offline rosterPartial scenario in tests/perf.lua,
with measured figures in docs/performance.md (20 unit reads per refresh
vs rosterRebuild's 21; 3200 before the fix).
- Regenerated docs/test-cases.md, README badge 2194 -> 2196, and
docs/module-map.md's Roster exports.
Deviation: the new cases live in tests/test_roster.lua, not
test_aggregator.lua (which is at 1437 lines, near the 1500 cap).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit e31d860ad3b362021bc39d57605765fdef4e3ade
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:18:09 2026 +0530
MM-02: export Secrets.PlainTruth and route every boolean probe through it
core/Secrets.lua is the only file that inspects a value, but the "is this
possibly-secret flag plainly true?" question was answered by two drifted
file-local plainTruth copies (modules/Aggregator.lua, modules/Tooltip.lua),
and modules/Provider.lua's diagnostics compared isLocalPlayer unguarded.
- core/Secrets.lua exports Secrets.PlainTruth(v): false unless CanAccess(v),
else (v and true or false); the rationale doc comment moved with it.
- Aggregator.lua and Tooltip.lua lose their copies; the seam re-exports
(Aggregator._identity.plainTruth, TooltipInternals.plainTruth) are gone and
Aggregator_Identity, Tooltip_Builders and Tooltip_Lines call
Secrets.PlainTruth directly (the Tooltip siblings resolve NS.Secrets at call
time, keeping their existing absent-Secrets tolerance). Tooltip.lua's
orphaned plainTruth doc block is replaced by a pointer.
- MM-R-07: Provider.lua's ProbeSourceLookup and gatherSamples truth-test
isLocalPlayer through Secrets.PlainTruth; noteValue gates on IsSecret alone,
dropping the type(value)=="boolean" short-circuit that let a secret boolean
(whose client-side type() is "boolean") reach tostring and table keying.
- tests/test_secrets.lua: PlainTruth over plain values, an inaccessible
secret, a source scan for stray plainTruth definitions, and a Provider
diagnostics case with a secret isLocalPlayer (type() shimmed the client's
way) asserting no raise, PlainTruth asked, and no secret census key.
Each carries a red-under note and was confirmed red first.
- docs/data-flow.md, docs/module-map.md name Secrets.PlainTruth;
docs/test-cases.md regenerated; README Tests badge 2194/2194.
Findings: MM-R-06, MM-R-07.
Deviations: the item's line cites had drifted (Aggregator's copy was at
:480, Provider's probes at :551/:649/:676). core/Diagnostics_Identity.lua
:159/:208 do not carry the pattern (they only call the probes); the same
boolean-short-circuit-then-`== true` pattern was found in
core/Diagnostics_DeathRecap.lua's fillRecapSlot and fixed alike (IsSecret
first, then PlainTruth; a secret flag fills no slot), with a red-first case
in tests/test_diagnostics_deathrecap.lua.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit cc7dd88e6dcefc6230468a785f597b2509508294
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:01:57 2026 +0530
MM-01: sum a pet that precedes its owner in a column into the owner
With Merge pets on, foldPet's absent-cell branch adopted the pet's
figures into the owner's cell, and when the owner's own source arrived
later in the same column setCell replaced that cell outright, so the
pet's numbers were lost whenever the pet out-ranked its owner (wrong
total, rate, percent and /mm export).
- foldPet marks the cell it creates as pet-seeded.
- New mergeOwnIntoPetSeeded: the own-source write into a pet-seeded cell
lands the owner's figures through setCell (so maxAmount, deathRecapID,
deathTime and the row.deathRecapID promotion are the owner's, and the
mark is cleared), then adds the pet's total and rate back under exactly
foldPet's guards (Secrets.CanCompare2 + both type()=="number"). A
refusal leaves the owner's own figures and is counted in pass.unfolded,
the same per-pass tally foldPet's refusals use.
- placeSource routes an own, non-counted source onto a pet-seeded cell to
the helper; counted (Deaths) and owner-before-pet paths are unchanged.
placeSource is CCN 15 (at the cap), mergeOwnIntoPetSeeded 6.
- tests/test_aggregator.lua: two new cases next to the order-only case
(left unchanged): PET 400 -> BETA 200 -> ALPHA 100 sums to 500 with
rate 50; and a secret owner total after its pet shows the owner's own
figure with unfolded=1.
- docs/data-flow.md states the order-independence; docs/test-cases.md
regenerated; README Tests badge 2189/2189.
Red-first evidence: before the Aggregator change the new cases failed
with "expected 500, got 100" and "unfolded=0" respectively.
Findings: MM-R-01, MM-R-02.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit d7800613c641c6cff030fc64346b9ae34f65c678
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 19:54:40 2026 +0530
RV-MM: re-vendor LibKa0s v1.71.0; record the v1.69.0-v1.70.0 span
Copy libs/LibKa0s/ and tests/_kit/ whole from the local LibKa0s tag
v1.71.0 (git archive, not a branch tip); both are byte-identical to the
tag's LibKa0s/ and testkit/. Minors: WidgetsLineChart 3,
WidgetsAutocomplete 2, Slash 20 / SlashParse 2, Env 2, OptionsIdList 4;
kit revision 38 (inventory Totals count only cases that run, Kit.secret
in the new secrets.lua). The CLAUDE.md provenance line rolls to v1.71.0.
MM-A-01: new span bundle docs/revendor/2026-10-07-v1.69.0-v1.70.0/
(01_DELTA.md, 05_SUMMARY.md only) records the bare re-vendor commits
824999b (v1.69.0, kit 37) and 1ee53cf (v1.70.0), base v1.68.1.
New docs/revendor/2026-10-07-v1.71.0/ bundle (base v1.70.0 from the
provenance line) with the per-file deltas, consumption, contract changes
and a "Not adopted in this run" list; no interview, no issue filed.
MM-A-02: the stale tag/kit stamps are removed rather than bumped:
docs/settings-panel.md points at the CLAUDE.md provenance line;
docs/testing.md and DEPENDENCIES.md drop "kit 36" (the lizard pin is
left for MM-09).
Env 2 dropped the library's bare-global GetAddOnMetadata rung, which
turned tests/test_envsetup.lua's "the deprecated bare global is still a
live rung" red. It is replaced by a case pinning the v1.71.0 contract:
with the library loaded and no C_AddOns, a planted bare-global reader is
never called, NS.Meta is nil and NS.version is FALLBACK_VERSION (red
against the v1.70.0 payload, green now). The host's own library-absent
rung stays for MM-07.
docs/test-cases.md regenerated with kit 38: Total 2188 -> 2187 plus a
"Skipped | 1" row, now equal to the README badge (2187/2187, unchanged).
Gate: lua tests/run.lua 2187 passed, 0 failed, 1 skipped; luacheck 0/0
in 146 files; sighted complexity pass, max CCN 15; no authored .lua
file over 1500 lines.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit 349e319ed5e286382368ae29d2bb6b32e5a87b42
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 16:51:58 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 1ee53cf426bd40d9240b2a653b0a746efc9057c8
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 11:38:42 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 1ee53cf426bd40d9240b2a653b0a746efc9057c8
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 11:38:42 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 824999bd676901966bc5f9140414c0d8bac9b5f7
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Oct 6 14:53:00 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 cd73f82b23e27168b26e828dcc8b20bb931441fb
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sun Oct 4 15:10:21 2026 +0530
DC-REV-01: re-vendor LibKa0s v1.68.1 (kit 36; rename-only)
Both payloads copied whole from the local annotated tag v1.68.1 (9000cbd).
No LibStub minor moved; tests/_kit moves to revision 36, which names the
dev-copilot plugin's commands where revision 35 named /wow-addon:*.
CLAUDE.md's provenance line and docs/settings-panel.md's vendor stamp roll
v1.68.0 -> v1.68.1, and the two "kit 35" lines of the addon's own prose
(DEPENDENCIES.md, docs/testing.md) move to 36, in the same commit. No
contract blocker, zero adoption candidates, no interview, no issue filed.
Bundle: docs/revendor/2026-10-04-v1.68.1/.
Gate: lua tests/run.lua (bounded) 2187 passed, 0 failed, 1 skipped, 2188
total, vendor-sync green; luacheck 0/0 in 146 files; sighted lizard 0
warnings, max CCN 15. Case count unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MsGF7a1YxB69EsRnBC8rcE
commit cd73f82b23e27168b26e828dcc8b20bb931441fb
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sun Oct 4 15:10:21 2026 +0530
DC-REV-01: re-vendor LibKa0s v1.68.1 (kit 36; rename-only)
Both payloads copied whole from the local annotated tag v1.68.1 (9000cbd).
No LibStub minor moved; tests/_kit moves to revision 36, which names the
dev-copilot plugin's commands where revision 35 named /wow-addon:*.
CLAUDE.md's provenance line and docs/settings-panel.md's vendor stamp roll
v1.68.0 -> v1.68.1, and the two "kit 35" lines of the addon's own prose
(DEPENDENCIES.md, docs/testing.md) move to 36, in the same commit. No
contract blocker, zero adoption candidates, no interview, no issue filed.
Bundle: docs/revendor/2026-10-04-v1.68.1/.
Gate: lua tests/run.lua (bounded) 2187 passed, 0 failed, 1 skipped, 2188
total, vendor-sync green; luacheck 0/0 in 146 files; sighted lizard 0
warnings, max CCN 15. Case count unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MsGF7a1YxB69EsRnBC8rcE
commit c68726e87afc310363ca31759ee4c3043e165d54
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sun Oct 4 14:21:54 2026 +0530
DC-REN-01: name the dev-copilot commands in live docs
The wow-addon plugin merged into dev-copilot 2.0.0. Live docs and test
comments now name the dev-copilot commands; frozen bundles stay as written.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MsGF7a1YxB69EsRnBC8rcE
commit c68726e87afc310363ca31759ee4c3043e165d54
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sun Oct 4 14:21:54 2026 +0530
DC-REN-01: name the dev-copilot commands in live docs
The wow-addon plugin merged into dev-copilot 2.0.0. Live docs and test
comments now name the dev-copilot commands; frozen bundles stay as written.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MsGF7a1YxB69EsRnBC8rcE
commit 8d0938804e1b136ac66d941bbd46290430306e47
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sat Oct 3 12:48:03 2026 +0530
SD-FIN-01: sync docs (git needed by the suite; lizard pinned 1.24.0; test-only exports labeled)
DEPENDENCIES git row and lizard pin; the Perf note names the eight recording files; seven test-only exports carry a headless-suite note.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GBEbct8mwzFqZSG1oTkv8f
commit 8b0345c85da9346f0b3d75bf41878f533a75734e
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 23:37:41 2026 +0530
TP-MM-01: re-vendor LibKa0s v1.68.0 (WidgetsDragHandle 4; kit 35)
Both payloads copied whole from the local annotated tag v1.68.0 (cc9f5eb);
the only byte delta is libs/LibKa0s/WidgetsDragHandle.lua (DRAG_MINOR 3 -> 4,
the optional tooltipPlace hook). tests/_kit is unchanged at revision 35.
CLAUDE.md's provenance line and docs/settings-panel.md's vendor stamp roll
v1.67.0 -> v1.68.0 in the same commit. No contract blocker.
tooltipPlace is declined as not applicable: this addon draws no LibKa0s
drag strip, so there is no tooltip to place. Not a gap, so no issue filed.
Bundle: docs/revendor/2026-10-02-v1.68.0/.
Gate: lua tests/run.lua (bounded) 2187 passed, 0 failed, 1 skipped, 2188
total, vendor-sync green; luacheck 0/0 in 146 files; sighted lizard 0
warnings, max CCN 15. Case count unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 8b0345c85da9346f0b3d75bf41878f533a75734e
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 23:37:41 2026 +0530
TP-MM-01: re-vendor LibKa0s v1.68.0 (WidgetsDragHandle 4; kit 35)
Both payloads copied whole from the local annotated tag v1.68.0 (cc9f5eb);
the only byte delta is libs/LibKa0s/WidgetsDragHandle.lua (DRAG_MINOR 3 -> 4,
the optional tooltipPlace hook). tests/_kit is unchanged at revision 35.
CLAUDE.md's provenance line and docs/settings-panel.md's vendor stamp roll
v1.67.0 -> v1.68.0 in the same commit. No contract blocker.
tooltipPlace is declined as not applicable: this addon draws no LibKa0s
drag strip, so there is no tooltip to place. Not a gap, so no issue filed.
Bundle: docs/revendor/2026-10-02-v1.68.0/.
Gate: lua tests/run.lua (bounded) 2187 passed, 0 failed, 1 skipped, 2188
total, vendor-sync green; luacheck 0/0 in 146 files; sighted lizard 0
warnings, max CCN 15. Case count unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit c2a411f1f18b23ba09abf0ddea567454d7abcb8e
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 02:06:51 2026 +0530
CA-MM-02: adopt Core.MakeResizable with gripParent and onResizeStop (MultiMeters#58)
The window's hand-rolled resize grip is replaced by LibKa0s-Core's
MakeResizable (Core minor 10). It sizes the bare anchor (rule R3) and is
drawn on the art frame through gripParent, so it keeps the window's
strata, alpha and rule-driven visibility. SaveSize runs from onResizeStop,
once per release (issue #49), never from the per-tick onResize. canResize
refuses a locked window as defense in depth; ApplyLock and ApplyMinimized
stay the grip's two visibility authors, and ApplyResizeBounds still runs
after BuildFrame and owns the bounds. anchor:SetResizable and the host's
onResizeStop are gone.
core/CoreSetup.lua publishes NS.MakeResizable: the library's on Core
minor >= 10, a nil-answering function below that (an older Core would
ignore gripParent and onResizeStop) and in the library-absent arm (D3.3:
no grip on a degraded install).
Behavior changes: only the left button sizes; the grip has a pressed
state; it is 16 px at a 1 px inset (was 12 px at 2 px); a resize alone
no longer makes the anchor user-placed; a degraded install has no grip.
Tests: characterization first (green on the hand-rolled grip): the grip
sizes the anchor, is the frame's child, saves once per mouse-up and not
on OnSizeChanged or ApplyConfig, survives a rule-driven hide/show, and
lock and minimize hide it. Then: the grip is the library's (left button
only, pressed art, level +10), a locked grip refuses even when shown, the
user-placed flag is restored, the layout bounds win, degraded has no grip,
the seam hands over the library's function on Core 10 and a nil grip on
Core 9, and degraded parity lists MakeResizable. tests/mock_frame.lua
models the user-placed flag.
Docs: retired the library-stack-§8 register row and the two texture-path
census rows for the SizeGrabber pair with the DECLINED_SITES entry;
census counts re-measured; schema.md SaveSize wording; module-map member
lists; performance.md Window.lua citations that moved; smoke WIN-24
corrected, WIN-37, WIN-38 and DEGRADED-10 added (pending sign-off);
test-cases regenerated; Tests badge.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit c2a411f1f18b23ba09abf0ddea567454d7abcb8e
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 02:06:51 2026 +0530
CA-MM-02: adopt Core.MakeResizable with gripParent and onResizeStop (MultiMeters#58)
The window's hand-rolled resize grip is replaced by LibKa0s-Core's
MakeResizable (Core minor 10). It sizes the bare anchor (rule R3) and is
drawn on the art frame through gripParent, so it keeps the window's
strata, alpha and rule-driven visibility. SaveSize runs from onResizeStop,
once per release (issue #49), never from the per-tick onResize. canResize
refuses a locked window as defense in depth; ApplyLock and ApplyMinimized
stay the grip's two visibility authors, and ApplyResizeBounds still runs
after BuildFrame and owns the bounds. anchor:SetResizable and the host's
onResizeStop are gone.
core/CoreSetup.lua publishes NS.MakeResizable: the library's on Core
minor >= 10, a nil-answering function below that (an older Core would
ignore gripParent and onResizeStop) and in the library-absent arm (D3.3:
no grip on a degraded install).
Behavior changes: only the left button sizes; the grip has a pressed
state; it is 16 px at a 1 px inset (was 12 px at 2 px); a resize alone
no longer makes the anchor user-placed; a degraded install has no grip.
Tests: characterization first (green on the hand-rolled grip): the grip
sizes the anchor, is the frame's child, saves once per mouse-up and not
on OnSizeChanged or ApplyConfig, survives a rule-driven hide/show, and
lock and minimize hide it. Then: the grip is the library's (left button
only, pressed art, level +10), a locked grip refuses even when shown, the
user-placed flag is restored, the layout bounds win, degraded has no grip,
the seam hands over the library's function on Core 10 and a nil grip on
Core 9, and degraded parity lists MakeResizable. tests/mock_frame.lua
models the user-placed flag.
Docs: retired the library-stack-§8 register row and the two texture-path
census rows for the SizeGrabber pair with the DECLINED_SITES entry;
census counts re-measured; schema.md SaveSize wording; module-map member
lists; performance.md Window.lua citations that moved; smoke WIN-24
corrected, WIN-37, WIN-38 and DEGRADED-10 added (pending sign-off);
test-cases regenerated; Tests badge.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 7cf1aea7f8126dc79f816522d271bbf31fd0fae4
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 01:54:40 2026 +0530
CA-MM-01: adopt Core.SECRET; drop the zero-reader Diagnostics.SECRET (MultiMeters#58)
core/CoreSetup.lua publishes NS.SECRET on both arms: lib.SECRET by reference
on the live arm (Core minor 1, no fallback needed), and the one "<secret>"
literal in the library-absent arm, which the degraded SafeToString now
returns. core/Diagnostics.lua reads NS.SECRET instead of its own copy, and
the Diagnostics.SECRET alias, which nothing read, is deleted (D3.8).
Tests: NS.SECRET is the library's by reference; SafeToString's sentinel is
NS.SECRET on both paths; a static scan allows exactly one sentinel literal,
in CoreSetup's degraded arm; Diagnostics shown/probe render a secret as
NS.SECRET on both paths; the alias is gone. Docs: module-map member lists,
smoke DIAG-42 (pending sign-off), test-cases regenerated, Tests badge.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 67065be37cab2e6a0202c313fb7258b854e205e1
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 01:48:08 2026 +0530
CA-MM-NM: pass addonName on the Options descriptor (LibKa0s#42)
settings/OptionsSetup.lua keeps its first vararg as addonName and hands it
to the LibKa0s-Options-1.0 descriptor beside parentTitle/mainPanelName, so
OptionsIdList's help-mark art resolves to this addon's vendored info icon
rather than the client glyph. Latent here: no IdList on these pages carries
help today. The library-absent arm is untouched.
Tests: a source-pattern guard that the descriptor passes
addonName = addonName from the first vararg, and an on-disk assert that
libs/LibKa0s/media/icons/info.tga is vendored. Suite 2170 passed / 1 skipped,
luacheck 0/0, vendor parity clean, sighted complexity max CCN 15.
Docs: test-cases.md regenerated, Tests badge 2170, smoke PANEL-47 added
and listed under Pending sign-off.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit eba033eed68b8799bc6d01f9856f6710e32052d0
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 01:40:39 2026 +0530
CA-MM-RV: re-vendor LibKa0s v1.67.0 (Core 10, Options 28, OptionsIdList 3; kit 35)
Both payloads copied whole from the local tag v1.67.0 (0bccf4c) via git archive; CLAUDE.md
provenance rolled v1.66.0 -> v1.67.0 in the same commit, with docs/settings-panel.md's vendor stamp.
Three payload files moved (Core 9->10, Options 27->28, OptionsIdList 2->3); the kit is byte-identical
(revision 35). No file added or deleted. Vendor parity: diff -r against the tag is empty for
libs/LibKa0s and tests/_kit. No contract blocker: this host has no MakeResizable caller and draws no
IdList yet.
- Frozen bundle docs/revendor/2026-10-02-v1.67.0/ (01_DELTA, 02_CANDIDATES, 05_SUMMARY). Candidates
are assigned, not interviewed: addonName -> CA-MM-NM, MakeResizable gripParent/onResizeStop/
canResize -> CA-MM-02.
- docs/test-cases.md regenerated (unchanged); README badge unchanged at 2168/2168.
Tests: 2168 passed / 0 failed / 1 skipped / 2169 before and after. luacheck 0/0 in 146 files.
Sighted complexity: pass, 0 warnings, max CCN 15, 4868 functions.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 26a0ca41d52d0c365c15309529da755e9ef06884
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 00:10:17 2026 +0530
GI-FIN-02: record the 2026-10-02 owner smoke passes for GRID-15 and GRID-16
The owner ran the issue #56 checks in a client on 2026-10-02 (training
dummy refused, Valeera admitted): both Result lines are filled and their
Pending sign-off row is removed. Doc sync found no other drift.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 26a0ca41d52d0c365c15309529da755e9ef06884
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 00:10:17 2026 +0530
GI-FIN-02: record the 2026-10-02 owner smoke passes for GRID-15 and GRID-16
The owner ran the issue #56 checks in a client on 2026-10-02 (training
dummy refused, Valeera admitted): both Result lines are filled and their
Pending sign-off row is removed. Doc sync found no other drift.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 257ff49cebb6a4ded46982cb37cfebb75a92c1f0
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Oct 1 14:17:04 2026 +0530
GI-MM-02: DrillDown.BuildRows, Targets, WindowProto.Render and reportTargets below CCN 15
Sighted CCN (lizard 1.24.0 over the kit-35 shadow), before -> after:
- modules/DrillDown.lua DrillDown.BuildRows: 18 -> 10 (spellSource 6,
spellRows 4). Characterization first: the spells and deaths rows lines.
- modules/Targets.lua Targets.ForPlayer: 21 -> 5 (forPlayer 5, hoveredName 6,
sessionMap 4, trimmedCopy 6); buildMap: 19 -> 10 (walkEnemy 6,
enemyIdentifiers 3, orderedMap 5). Characterization first: non-positive and
non-number caps, empty/non-string hovered names, zero totals, the 64-enemy
walk limit. The perf bracket is noted on exactly the paths it was before.
- modules/Window.lua WindowProto.Render: 22 -> 13 (clampScroll 4, drawSlice 5,
showWaiting 3). Characterization first: no Waiting notice on an empty preview
or breakdown, and the pass line's `drew D/E rows (preview)` shape.
- core/Diagnostics.lua reportTargets: 39 -> 6 (targetsColumn 10, probeEnemy 9,
enemyIds 7, tallySpells 1, reportTargetsVerdict 4, reportTargetNames 6).
Characterization first: the per-enemy line, the detail-nil and
missing-combatSpellDetails verdicts, the caster/roster names, the empty column.
Kept under 1000 lines (995), so no file enters the 1000-1500 band.
Sighted complexity after: warnings 0, maxCcn 15 (none above), blindFiles 0
(4868 functions). The eight GI-MM-RV listed are all below 15: reportTargets
39->6, WindowProto.Render 22->13, Targets.ForPlayer 21->5, buildMap 19->10,
DrillDown.BuildRows 18->10, normalizeColumns 18->9, Export.Send 18->12, Roster
build 16->13.
Behaviour identical: no message, order, return or log line changed.
Tests: 2158/0/1/2159 before; 2168/0/1/2169 after (+10 characterization).
luacheck 0/0.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ng9STmzmM1JYwT2WWSakpL
commit 775f9218d2ff547bd7ce1cf2ea4e8c6c503b6d1c
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Oct 1 14:06:11 2026 +0530
GI-MM-02: Roster build, Export.Send and normalizeColumns below CCN 15
Sighted CCN (lizard 1.24.0 over the kit-35 shadow), before -> after:
- modules/Roster.lua build: 16 -> 13 (addMember 4). The per-unit member
entry moved, unchanged, into addMember; existing test_roster cases pin every
branch (unit absent, unsafe/secret GUID, raid duplicate, pets, partial build,
pruning, test mode, both log lines).
- modules/Export.lua Export.Send: 18 -> 12 (printLocally 5, sendStaggered 3).
Characterization added first: no sender and no printer answers false and
emits nothing; the other branches were pinned by test_export's Send cases.
- settings/Schema_Paths.lua normalizeColumns: 18 -> 9 (partitionColumns 10,
countKeys 2). Characterization added first: each refusal message (non-table,
holes, a non-table column, nothing enabled, a non-string stat) and enabled's
truthy coercion.
Behaviour identical: no message, order, return or log line changed.
Tests: 2156/0/1/2157 before; 2158/0/1/2159 after (+2 characterization).
luacheck 0/0.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ng9STmzmM1JYwT2WWSakpL
commit cdb75781b3a2442391d2e1093b3c884785479dbf
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Oct 1 14:01:35 2026 +0530
GI-MM-01: a None source needs a companion identity, not only a class (#56)
The delve-companion rule admitted any None source whose classFilename is a
RAID_CLASS_COLORS key. The PvP Training Dummy (creature 243211) is filed under
None with class WARRIOR, so it passed. The Enemy gate is kept.
- core/Constants.lua: COMPANION_CREATURE_IDS = { [248567] = "Valeera Sanguinar" },
seeded only with the measured id.
- modules/Aggregator.lua: realClass (the old class test), companionIdentity
(plain Player- GUID, or a plain creature id / Creature- GUID npc field in the
allowlist; every identifier proved by Secrets.IsSafeKey before it is matched or
indexed), companionClass = realClass AND identity, isForeignSource (Enemy, or a
plain None real-class source whose creature id or GUID is plain and names no
companion; undecidable sources stay admitted), admitsUnowned for diagnostics.
All exported on Aggregator._identity; the comment blocks citing the false
"a mob would have to report None AND carry a class" argument now cite #56.
- modules/Aggregator_Identity.lua: the sweep and buildByIdentity refuse through
isForeignSource, so a refused source takes no identity key.
- core/Diagnostics.lua: the targets section prints "enemies the grid would admit
as a row: N of M" through admitsUnowned.
Tests first (red against the old code: 5 aggregator cases + 1 diagnostics case):
classed None NPC refused in DamageDone (creature id, and GUID npc field);
allowlisted companion by creature id and Player- GUID admitted (pins); the GUID
pattern ignores Vehicle-; identity mode drops a plain unlisted classed None NPC
and counts it, keeps an allowlisted companion, keeps an all-secret source, keeps
an Ally pet; a refused dummy causes no collision; the diagnostics admit line.
The existing Valeera and Enemy-with-class cases stay green unchanged.
Docs: midnight-quirks.md (classed-NPC finding, allowlist rule), data-flow.md
(admission rules), scope.md and ARCHITECTURE.md Known limitations (a new
companion is off the grid until its id is added), smoke-tests.md GRID-15/16,
test-cases.md regenerated, README badge.
Tests: 2145/0/1/2146 before; 2156/0/1/2157 after. luacheck 0/0.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ng9STmzmM1JYwT2WWSakpL
commit 048639e80c60594dae2ee22c7ec3c2e5c465de72
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Oct 1 13:52:17 2026 +0530
GI-MM-RV: re-vendor LibKa0s v1.66.0 (kit 35), wire test_lizard_sighted, record sighted complexity
Both payloads copied whole from the local tag v1.66.0 (e4c5ef7) via git archive; CLAUDE.md
provenance rolled v1.65.0 -> v1.66.0 in the same commit. Four new payload files (WidgetsReorder,
SlashParse, PerfSampler, PerfCommands); the TOC loads LibKa0s through LibKa0s.xml, so no TOC
change; tests/run.lua's expected load list now names the four. No file deleted. Vendor parity:
diff -r against the tag is empty for libs/LibKa0s and tests/_kit. No contract blocker (01_DELTA 3g).
- tests/run.lua: { name = "test_lizard_sighted", dir = "tests/_kit/" } wired.
- docs/testing.md suite table quotes the runner's complexity suite instead of raw lizard;
CLAUDE.md's green-gate line quotes no lizard, so it is unchanged. DEPENDENCIES.md pins
lizard 1.24.0. docs/settings-panel.md names v1.66.0.
- Frozen bundles docs/revendor/2026-10-01-v1.66.0/ (candidates listed, not interviewed; GI-LK-13
takes them) and the span bundle docs/revendor/2026-10-01-v1.64.0-v1.65.0/.
- docs/test-cases.md regenerated, README badge 2145/2145.
Tests: 2137 passed / 0 failed / 1 skipped / 2138 before; 2145 / 0 / 1 / 2146 after (+8 is the
kit's test_lizard_sighted). luacheck 0/0 in 146 files. No consumer test broke.
Sighted complexity (bash tests/_kit/run-automated-tests.sh --suite complexity, lizard 1.24.0):
status pass, warnings 8, maxCcn 39, blindFiles 0, 4815 functions. Above CCN 15 (GI-MM-02):
reportTargets 39, WindowProto.Render 22, Targets.ForPlayer 21, buildMap 19,
DrillDown.BuildRows 18, normalizeColumns 18, Export.Send 18, Roster build 16.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ng9STmzmM1JYwT2WWSakpL
commit a6fe9af2ea4aea8363c21fc535cf5e0db43615ce
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Oct 1 01:13:06 2026 +0530
DG-MM-01: adopt, docs: Coverage names the library's tags, smoke rows for its slash and Lifecycle lines
docs/debug.md Coverage gains "The library's tags": Cmd, Lifecycle, Cfg,
Launcher and part of Set are written by LibKa0s through the gated sink
each descriptor takes, and this addon writes no line beside them. New
`Lifecycle` and `Cmd` rows replace the retired `[Init] stood down` row; the
Cfg and Launcher rows name the combat-lock refusals and the state lines
held by the at-enable queue; the `[Init] rejected events` row says it is
held at login; the Clear sentence says Clear now re-arms NS.DebugSteady
and why that sink is kept over the console's DebugChanged.
docs/smoke-tests.md: DIAG-39 (a slash refusal in the console), DIAG-40 (a
Lifecycle edge in the console), DIAG-41 (the launcher's login line at
enable, and Clear re-arming), all under Pending sign-off; DIAG-31
corrected (a refused event at login is written at `/mm debug on`); the
index range reads DIAG-1 to DIAG-41. docs/scope.md's Clear note,
docs/midnight-quirks.md's rejected-events sentence and docs/module-map.md's
DebugLogSetup, LifecycleSetup, LauncherSetup and Slash rows match.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit a6fe9af2ea4aea8363c21fc535cf5e0db43615ce
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Oct 1 01:13:06 2026 +0530
DG-MM-01: adopt, docs: Coverage names the library's tags, smoke rows for its slash and Lifecycle lines
docs/debug.md Coverage gains "The library's tags": Cmd, Lifecycle, Cfg,
Launcher and part of Set are written by LibKa0s through the gated sink
each descriptor takes, and this addon writes no line beside them. New
`Lifecycle` and `Cmd` rows replace the retired `[Init] stood down` row; the
Cfg and Launcher rows name the combat-lock refusals and the state lines
held by the at-enable queue; the `[Init] rejected events` row says it is
held at login; the Clear sentence says Clear now re-arms NS.DebugSteady
and why that sink is kept over the console's DebugChanged.
docs/smoke-tests.md: DIAG-39 (a slash refusal in the console), DIAG-40 (a
Lifecycle edge in the console), DIAG-41 (the launcher's login line at
enable, and Clear re-arming), all under Pending sign-off; DIAG-31
corrected (a refused event at login is written at `/mm debug on`); the
index range reads DIAG-1 to DIAG-41. docs/scope.md's Clear note,
docs/midnight-quirks.md's rejected-events sentence and docs/module-map.md's
DebugLogSetup, LifecycleSetup, LauncherSetup and Slash rows match.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 21f775086e87e2d1696cdf17aae00a3ba3617777
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Oct 1 01:08:52 2026 +0530
DG-MM-01: adopt the library's own debug lines: debug to Slash and Lifecycle, launcher state at enable, Clear re-arms the steady sink
LibKa0s v1.65.0 has the dispatcher, the stand-down latch, the options
panel's combat lock and the launcher log what they decide through the
host's gated sink (debug-logging-§4 at standard v2.73.0). Wiring:
- settings/Slash.lua passes `debug` (Slash 18): each refusal the
dispatcher decides is one `[Cmd] refused <verb>: <guard>` line; chat is
unchanged and the host adds none.
- core/LifecycleSetup.lua passes `debug` (Lifecycle 3) and drops its own
traceEdge `[Init] stood down (holds: ...)` / `[Init] stood up` pair: the
library's `[Lifecycle] stood down: added <key> (holds: <set>)` line
replaces it, one per edge, never two.
- core/LauncherSetup.lua passes `debugAtEnable` (Launcher 5) onto
NS.DebugAtEnable, the console's at-enable queue, bound bare in
core/DebugLogSetup.lua (the stub answers false). Register runs at
OnInitialize with logging off, so `[Launcher] registered` now lands the
first time logging is turned on.
- core/MultiMeters.lua's `[Init] rejected events` state line, written at
OnEnable, goes through the same queue.
- core/DebugLogSetup.lua's descriptor gains `onClear` (DebugLog 18): the
console's Clear re-arms NS.DebugSteady, as turning logging on already did.
- settings/OptionsSetup.lua already passed `debug`, so Options 27's `[Cfg]`
combat-lock refusal lines land with no change.
NS.DebugSteady is kept, not swapped for the console's DebugChanged: it
counts a run and writes `... (xN)` on the state's own line when the run
ends, which the library gate cannot, and debug-logging-§9 names onClear
as the route for a host that keeps its own gate.
tests/test_library_lines.lua (11 cases) pins each line landing in this
addon's console once, and the queue's one-shot flush; each case was
checked red with its descriptor field removed. tests/test_disabled.lua's
edge case moves to the library's line and asserts no second edge line.
docs/test-cases.md regenerated (2138 cases, 1 skipped); badge 2137/2137.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 8911e526a813b44b77c843525793a1d48a2db856
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Thu Oct 1 00:56:18 2026 +0530
DG-MM-01: re-vendor LibKa0s v1.65.0 (kit 34); degraded DebugLog stub answers the new gate members
Both payloads copied whole from the local tag v1.65.0. New minors: Slash 18,
DebugLog 18 plus the new secondary file DebugLogGates.lua (loaded by
LibKa0s.xml), Options 27 and its secondaries, Launcher 5, Lifecycle 3. Kit
revision 34 is unchanged (tests/_kit identical). CLAUDE.md provenance and
docs/settings-panel.md's "v1.x bundled" roll to v1.65.0. The standards
reference carries no live stamp (TOC X-Standard, README badge and CLAUDE.md
follow the versionless templates).
core/DebugLogSetup.lua's no-library stub gains DebugOnce, DebugChanged,
DebugForget and DebugAtEnable, answering "did not write", so the surface-parity
case holds against the live instance.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 12e6dfb0ef93bf4fe9b4f69c522c4f4ab13345bc
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Sep 30 21:20:16 2026 +0530
DL-MM-04: README uses bullets, never numbered lists; Reporting a bug is the v2.72.0 fixed text
Standard v2.72.0 (documentation-§1) forbids numbered lists in README.md because
CurseForge's description page does not render them. The four set-up steps and the
three Reporting a bug steps become "- " bullets (the "takes four steps" lead-in and
the imperative openings already carry the order, so no rewording). The Reporting a
bug closing sentence is aligned to the fixed body word for word.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 12e6dfb0ef93bf4fe9b4f69c522c4f4ab13345bc
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Sep 30 21:20:16 2026 +0530
DL-MM-04: README uses bullets, never numbered lists; Reporting a bug is the v2.72.0 fixed text
Standard v2.72.0 (documentation-§1) forbids numbered lists in README.md because
CurseForge's description page does not render them. The four set-up steps and the
three Reporting a bug steps become "- " bullets (the "takes four steps" lead-in and
the imperative openings already carry the order, so no rewording). The Reporting a
bug closing sentence is aligned to the fixed body word for word.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit b38e8c7e3bd460e54e9fe0fa6722108f14694552
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Sep 30 20:22:46 2026 +0530
DL-MM-03R: keep README's Reporting a bug section as the standard fixes it (no added sentences)
documentation-§1 item 9: nothing is added to the section. The enable and the
link are stated in docs/debug.md and the smoke rows.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 79440af62653f9a0a29b7e0677eaf1030ebd59d6
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Sep 30 20:13:03 2026 +0530
DL-MM-03: re-vendor the final LibKa0s v1.64.0 (kit 34); diagnostics turns logging on for the session
Both payloads copied whole from the local tag v1.64.0: DebugLog 16 -> 17
and DebugLogDiagnostics 1 -> 2, whose RunDiagnostics() calls
SetEnabled(true) before it writes when logging is off (standard v2.71.0,
debug-logging-§14). The console's orange Diagnostics link runs the same
function. Kit revision 34 rewrites the contract case to "turns it on for
the session" and adds the opt-out case (skipped here: MultiMeters keeps the
default) and the already-on case. CLAUDE.md provenance stays v1.64.0.
The standards reference needs no stamp: the TOC X-Standard, README badge
and CLAUDE.md follow the standard's versionless templates.
tests/test_diagnostics.lua: the marker case expects the enable line ahead
of the begin marker and the flag on afterwards; the console-routing case
expects two chat lines (the seam's ON line, then the count line); the
count-line case turns logging on first. A fromBegin helper in both suites
slices the report from its begin marker, since with logging on a gated
[Provider] meter available trace the report's reads cause can precede it.
tests/test_diagnostics_runtime.lua: the cap case turns logging on first.
docs/debug.md names the title-bar Diagnostics link and says a run turns
logging on for the session (a /reload turns it off); README's Reporting a
bug and docs/slash-dispatch.md match. docs/smoke-tests.md corrects DIAG-16
and adds DIAG-37 (the Diagnostics link) and DIAG-38 (diagnostics turns
logging on for the session, /reload turns it off), all under Pending
sign-off. docs/test-cases.md regenerated (2127 cases, 1 skipped); badge
2126/2126.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 75eaa37d4896c23f6d0c64ff95f5d47fa602a7c3
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Sep 30 17:02:57 2026 +0530
DL-MM-02R: export flush line, change-gated tooltip lines, doc blocks restored
- modules/Export.lua: a staggered dump's hold line now pairs with a flush
line when the last queued line goes out ("sent the queued rest of a dump
(N-1 lines) to X"), so a hold with neither flush nor cancel stands out
(debug-logging-§8, deferred work). A one-line dump writes "sent 1 line"
and no longer claims a queued tail.
- modules/Row.lua, modules/Tooltip_Builders.lua: the row, cell and name
[Tooltip] lines go through NS.DebugSteady keyed on the hovered frame
(debug-logging-§9, quiet steady state); leaving the cell or row calls the
new NS.DebugSteadyForget(frame), so each hover speaks once and a held
run's (xN) lands as it ends.
- settings/Schema_Paths.lua, core/LifecycleSetup.lua: traceRefused and
traceEdge moved above the doc blocks they split, so NS.SetByPath and
standDown have their own docs again.
- Tests for the flush, the one-line dump and the resting-cursor tooltip
paths; the tooltip source scan matches either sink and expects three
sites. docs/debug.md coverage, test-cases.md, badge and moved citations.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 03636239a1263b876c58a1297244df5271a56620
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Sep 30 16:42:45 2026 +0530
DL-MM-02: debug coverage audit and fill (debug-logging-§8 Diagnosis, §9 quiet steady state)
Quiet steady state (§9):
- NS.DebugSteady drops its 10 s heartbeat. An unchanged run is silent; its
(xN) comes out once when the run ends. This was the 060 log: a folded
[Aggregator]/[Render] pair (x41) every ~10 s through a whole key. Liveness
is /mm diagnostics' age=.
- [Visibility], [Roster] (partial-build retry), [Aggregator] dropped guid=,
[DrillDown] rows and the new [Provider] meter availability line are
change-gated through NS.DebugSteady.
- The debug-logging-§8 deviation row is retired: its re-check trigger fired.
Diagnosis (§8):
- [Init] stood down (holds: ...) / stood up on the addon's own latch edge.
- [Provider] meter available / unavailable: <reason>, on change.
- [Export] send and queued-tail cancel lines, plus csv/chat/open refusals.
- [Set] <path> refused: <reason> at the write seam.
- [Test] start refused: in combat; [Window] sort by name refused: restricted.
- [Init] summary gains the window count and whether LibSharedMedia loaded.
Tests: 14 new or rewritten cases pin the lines and one quiet-steady-state
case per repeating path. docs/debug.md gains the Coverage section.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 1f6c6ad22f28e7f50920c71157fcb8234606f9ee
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Sep 30 16:01:26 2026 +0530
DL-MM-01: re-vendor LibKa0s v1.64.0 (kit revision 33) and add the resize smoke checks
Copies libs/LibKa0s/ and tests/_kit/ whole from the local v1.64.0 tag (Core 9,
DebugLog 15.1, Widgets 11.3, PerfPanel 13.6; kit revision 33 adds
mock_resize.lua) and rolls the CLAUDE.md provenance line and the
settings-panel.md bundled-version note to v1.64.0. The three standards
references are unversioned and already match v2.70.0, so nothing moves there.
No test fallout. docs/smoke-tests.md gains DIAG-32 to DIAG-36 for the
resizable console, copy windows (the console's and the CSV export's) and perf
panel, listed under Pending sign-off.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 715f31fac98a29289b5b231b4d543db65f5ba945
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Sep 30 08:52:20 2026 +0530
SP-FIN-01: re-vendor the test kit at revision 32 (LibKa0s v1.63.0, re-cut)
LibKa0s folded kit revision 32 into the unpublished v1.63.0: tests/_kit/README.md now counts eleven
consumers and thirteen copies, and Kit.VERSION is 32. Prose and the revision integer only; no code,
case or mock changes. tests/_kit/ is byte-identical to the tag again (diff -r empty), so the
vendor-sync case stays green.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 715f31fac98a29289b5b231b4d543db65f5ba945
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Sep 30 08:52:20 2026 +0530
SP-FIN-01: re-vendor the test kit at revision 32 (LibKa0s v1.63.0, re-cut)
LibKa0s folded kit revision 32 into the unpublished v1.63.0: tests/_kit/README.md now counts eleven
consumers and thirteen copies, and Kit.VERSION is 32. Prose and the revision integer only; no code,
case or mock changes. tests/_kit/ is byte-identical to the tag again (diff -r empty), so the
vendor-sync case stays green.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 241976d9676dab379f849fcd990d9a542946941c
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Sep 30 08:12:31 2026 +0530
SP-FIN-01: the surface-parity note counts six seams not compared by name, as docs/testing.md does
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 959afc5dfa03970cc8bc79cc9b79571e5278ed53
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Sep 30 01:48:52 2026 +0530
SP-FIN-01: sync docs (scope's panel/schema counts, bundled Options tag, Slash parity case)
- docs/scope.md: the settings panel is three pages (General, Windows, Profiles) over a 169-row
schema, not "nine pages" and 162 rows (settings/Schema.lua, matching ARCHITECTURE.md and
settings-panel.md).
- docs/settings-panel.md: LibKa0s-Options-1.0 is bundled at v1.63.0 (CLAUDE.md's provenance
line), not v1.35.0.
- docs/testing.md: the stub-parity paragraph now names the Slash dispatcher case SP-MM-02 added
(NS.Slash.__dispatcher, live vs degraded load, two-table form).
Gate: 2107/2107 tests, luacheck 0/0 in 145 files. Test count unchanged, so docs/test-cases.md and
the README badge stand.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 7abe336f452eafd555b987c00fb86e49aba09188
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Sep 30 01:30:10 2026 +0530
SP-MM-03R: put DIAG-7's finish lines in chat order and stop requiring nonzero total ms
Chat shows "perf run FINISHED — saved; …" before "addon RESUMED — restored":
P.Announce prints at once and the RESUMED line is in the table doPerf prints
after OnCommand returns; only the console has P.Resume's line first. The event
rows need calls above zero and a total ms column, since %10.2f can print 0.00
for a correct systemEvent capture (the JSON totalMs keeps the real value).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 9a718797428abc6204708f78184eec4b66d996fe
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Sep 30 00:20:34 2026 +0530
SP-MM-03R: restore DIAG-7's per-bucket counts and list the 2026-09-23 plan's owed checks
DIAG-7 again expects meterEvent, spellEvent and systemEvent each to show
calls and ms, as the old perf-report check did. It now says what makes
each fire, verified against core/MultiMeters.lua, core/PerfSetup.lua and
LibKa0s Perf: the brackets record only inside window A's combat, and an
empty bucket prints no row. So the capture uses a raid pull and a whisper
to a name nobody is playing, because no fight raises CHAT_MSG_SYSTEM on
its own.
Pending sign-off now lists every Multi Meters step that
06_SMOKE_TESTS.md in Ka0sAddonsCommonTasks' 2026-09-23 plan owes, by new
ID with its origin. The steps with a recorded pass are cited instead of
listed. Owed checks the old doc never carried become INSTALL-9 (the v16
upgrade), PANEL-45 (color drag throttle), PANEL-46 (no leak across window
switches) and DIAG-31 (rejected events). The rest extend existing checks,
each re-read against the code: SLASH-7, PANEL-18, PANEL-23, PANEL-30,
STATE-9, WIN-26, EXPORT-33, EXPORT-38 and DIAG-17.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 9ebefe41f125b6eea7dffb6c201b04b8b255aaca
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Sep 29 23:41:54 2026 +0530
SP-MM-03R: fix PANEL-13's close path, WIN-16's dialog and SLASH-13's lock state
PANEL-13 reads window.frame.closeButton, the close row's real path; there
is no showClose. WIN-16 expects the dialog's own text and Yes / No buttons,
with the meter-data warning on the Show reset row's tooltip, and joins
Pending sign-off. SLASH-13 starts from /mm lock off, since SLASH-10 now
ends locked and the menu's Locked runs a bare /mm lock.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit c2bd195206fc776d440d0f7acab7831c5f6ff48e
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Sep 29 23:28:22 2026 +0530
SP-MM-03R: merge the drag checks into WIN-25 and fold GRID-6 into GRID-1
WIN-23 and WIN-25 both checked that an unlocked window drags. Merged into
WIN-25 and retired WIN-23. The merged check is corrected against
modules/Window_Placement.lua ApplyLock and modules/Row.lua ApplyMouse: the
window drags by its title bar, the lock only stops that drag, and the cells
answer the mouse locked or unlocked. WIN-25 joins Pending sign-off.
GRID-6 (numberFormat full via the CLI) repeated GRID-1's Full option;
PANEL-28 covers the panel/CLI sync. GRID-6 retired, and GRID-7 now points
at GRID-1's Number format control.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 8c4b00d0dd841aac55d4972a7ac6645edc98331f
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Sep 29 23:11:14 2026 +0530
SP-MM-03R: tick Merge pets before the pet-fold checks
GRID-17, GRID-18 and COMBAT-27 expected the pet fold on shipped settings,
but Merge pets into their owner ships off (defaults/Profile.lua data.mergePets,
settings/Schema.lua) and modules/Aggregator.lua placedRow gives a pet its own
row unless it is set. GRID-17 now checks the separate pet row first, then ticks
the option and checks the fold; GRID-18 runs with it still ticked; COMBAT-27
ticks it before the pull. The Blizzard comparison is restated against the
separate figures. All three join Pending sign-off as corrected.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 3a1e73b3632b70a7afc0a3a16a65af8a6c524bcd
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Sep 29 22:53:04 2026 +0530
SP-MM-03R: restore PANEL-13's tab rows, fix STATE-11/EXPORT-48 routes, widen Pending sign-off
PANEL-13 names each tab's rows again, checked against settings/Schema.lua:
Frame's Size and position, Background and border and Row; the
window.rows.* rows on Frame, not Bars; Header's Title text and Button
style; Visibility's contexts, hide rules and Combat tab. STATE-11 drops
the General page's Test mode box, which the combat cover makes
unreachable. EXPORT-48 and GRID-21 get their empty segment from the
header reset, because a fresh login keeps the old fights (INSTALL-5).
Pending sign-off adds INSTALL-6, INSTALL-8, SLASH-9, STATE-11, GRID-21,
EXPORT-33, EXPORT-39 and EXPORT-53.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit c76ba914cccb8d6c42b58efbc2e09f4553391afd
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Sep 29 22:33:55 2026 +0530
SP-MM-03R: close the smoke suite's review defects and re-verify its strings
Review defects closed:
- VIS-5 ticks Visibility -> When to hide this window -> Hide in vehicles
first; the rule ships off, so a correct build failed the old step.
- PROFILE-6 counts only [Set] lines again: an accepted reset rebuilds the
windows, and the rebuild logs Roster, Aggregator and Visibility lines.
The popup is named by its real text.
- DIAG-22 regains "no Lua error" (the probe walks a raw source row with
pairs) and the old record list, and says when the not-measured line
appears (before any flagged pull; a party capture runs but proves
nothing).
- EXPORT-29 compares its header row with LOC-1's line, so the literal
24-column header is checked on an English client too.
- WIN-5, GRID-12 and COMBAT-7 name the real controls; WIN-28 drops the
per-window refresh (the interval is addon-wide).
- GRID-13, COMBAT-14 and COMBAT-17 set the hidden sort row with
/mm set window.data.sortMode or the Player header; EXPORT-21 is a step.
Strings re-verified against the code (a headless probe of the real CLI):
- SLASH-7: the ordinal path answers "Setting not found", and an
out-of-range scale is clamped to 2.00x, not refused.
- SLASH-11: the list line reads Enabled/Disabled with a count of every
column; copy takes a one-word source; the CLI delete does not confirm.
- STATE-5 and DIAG-7: the suspended arm is /mm perf measure b; finish
prints no report, /mm perf report does.
- DIAG-11: the slash stamps the date and time into the label, so
"unlabeled" never shows.
- TIP-6 needs /mm debug tooltip; PANEL-40's line order and full shapes;
DIAG-1 reads value/provider mid-pull and folds repeats into (xN);
DIAG-15's end marker carries its count; DIAG-23 prints its backticks;
EXPORT-48 prints "There is nothing to export."; DEGRADED-2's first line
ends "; running on reduced built-in fallbacks."
Pending sign-off now follows the clarified policy: the old never-run and
unconfirmed checks, every new check, and every check corrected in this
rewrite.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 2771901d1b6a1f087f730fdaa5a27645db8ca1ee
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Sep 29 21:45:30 2026 +0530
SP-MM-03R: fix PANEL-20's modes, PROFILE-14's steps, pending DIAG-20, drag/resize duplicates
The review of SP-MM-03 found four defects in the rewritten suite.
PANEL-20 carried a stale fact from the old §4: Header -> Title text offers
only Class / Custom (CONTROLCOLOR_VALUES), so a correct build failed the
check and it contradicted WIN-20. It now lists each surface's own modes and
drops the title-bar Per-statistic clause.
PROFILE-14's first and third commands landed on the profile already
current, because creating a profile on the Profiles page switches to it.
Each switch now starts from /mm profile Default.
DIAG-20's atlas rung was "still unconfirmed" in the old doc and is now on
the Pending sign-off list, like GRID-7 and DIAG-10.
WIN-23 and WIN-24 re-checked /reload persistence that INSTALL-4 already
covers; they now point to INSTALL-4.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 5383ad13aae3c6e65d574c1d4a94e1bea0e95973
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Sep 29 21:26:46 2026 +0530
SP-MM-03R: fix the smoke suite's stale facts, lost mid-pull check and pending list
The review of SP-MM-03 found checks that a correct build would fail, a
mid-pull check that the merge lost, and new checks listed as if they were
carried-over sign-offs.
- PANEL-13: the Tooltip tabs are General, Bar, Bar background, Bar border,
Text, Contents, the schema order tests/test_schema.lua pins. The check
now names the rows on General (including Tooltip scale) and Contents.
- PANEL-25: General and Windows each carry a Defaults button, and the
Windows one acts on whichever entry is on screen. Only Profiles has none.
- PANEL-22 no longer repeats the Frame Defaults behavior that PANEL-26 and
PANEL-27 check. PANEL-26 names its six entries now that PANEL-25 no
longer lists them.
- COMBAT-18 repeats TIP-20 again, because the old section 10 ran the
mouse-off check mid-pull. The TIP intro now names what COMBAT-18 repeats.
- COMBAT-30 ticks Bars -> Border -> Bar border, which ships off. Without
it the backdrop path never runs and the check passes on nothing.
- TIP-26: Bar spacing ships at 1, not 0.
- TIP-7 and EXPORT-25 now have steps and an expected result.
- Pending sign-off lists only unsigned checks carried over from the old
doc. The new profile, degraded and border checks keep their own
Result lines.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit b986fd6b6422fea959cf8fe6a689290eeec762ad
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Sep 29 21:04:02 2026 +0530
SP-MM-03: rewrite docs/smoke-tests.md as one evergreen, theme-grouped suite
The suite had grown to 2285 lines across 37 numbered sections plus an
unnumbered one. Its index was stale (a wrong anchor, three sections
missing), batch sign-off records sat beside evergreen checks, and the same
behavior was checked in up to five places: reset-all, the disabled
refusals, the combat lock, Test mode, tooltip anchors. Several checks had
also drifted from the code: the reset window's name, the default name cap,
the removed At cursor anchor, the blank-whisper refusal, and the CSV
header's column count.
The new file is 1160 lines and 335 checks in 14 themes (INSTALL, SLASH,
PANEL, PROFILE, STATE, WIN, VIS, GRID, TIP, EXPORT, COMBAT, DIAG, DEGRADED,
LOC), each check one bullet ending in a Result line, with stable
<THEME>-<n> IDs. Every old in-client behavior is kept once. The only drop
is the Reset all settings tooltip wording, which
tests/test_options_panel.lua already asserts in full. The PROFILE theme
adds checks for the /mm profile verb: list, switch, the current name,
unknown and did-you-mean, quotes and spaces, live while disabled, refused
in combat, and the help row. DEGRADED-8 covers the verb on a
library-absent load. COMBAT-30 adds the mid-pull cell-border check that
modules/Row_Border.lua already said this suite made. Unsigned checks
(the "not yet run" items, the MM-E event-trace rows) and the new verb
checks are listed under Pending sign-off.
Inbound references move to the new IDs: SM-06 becomes INSTALL-5 in
modules/Roster.lua, tests/test_roster.lua, ARCHITECTURE, module-map and
schema.md; the section-33 anchor becomes GRID-32 and the section-28 anchor
becomes DIAG-25. The old-to-new coverage map is in the plan bundle
(smoke-maps/MultiMeters.md).
Gate: 2107/2107 tests, luacheck 0/0 in 145 files.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 34239de7c57a61424ec2d36b8838011dd6d359ad
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Sep 29 12:59:30 2026 +0530
SP-MM-02R: make the profile row's localization case observe L
The review found that the red-under line on "Slash profile: the verb follows
the thirteen reserved ones, with its localized description" named a mutation
that does not make it fail. enUS L answers the key itself, so comparing the row
against NS.L[key] cannot tell L["..."] from the bare literal; swapping in the
literal left the suite green. testing-§12 forbids a red-under line that names a
mutation it does not catch.
The case now gives a fresh instance a translation that differs from its key and
re-runs settings/Slash.lua over it, the way a later locale file would present.
Only a row that reads through L picks the translation up. Checked in a scratch
clone: the literal mutation now fails this case (2106 passed, 1 failed). The
comment also drops the claim that the README reads this string, since the
README has no command table.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit efddd3ce6ef0fc98eaeaf6a411aa73c3e291378d
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Sep 29 12:40:02 2026 +0530
SP-MM-02: /mm profile via CliProfile
Switching profiles took a trip to the Profiles page. `/mm profile` now lists
the profiles with the current one marked, and `/mm profile <name>` switches
to an existing one. The behavior is LibKa0s-Slash minor 17's shared
CliProfile: quotes stripped, case and spaces kept, an unknown name refused
with a did-you-mean and never created, the current name answered without a
rebuild, and the switch refused in combat. This addon supplies the row (a
localized description, right after the thirteen reserved verbs) and the
store (`profiles = function() return NS.db end`, asked at call time). The
switch goes through the ordinary SetProfile, so core/Database.lua's
OnProfileChanged logs the one [Profile] line and every window and an open
Profiles page follow.
The verb is live while disabled, because a profile switch can flip
`enabled`. The host used to pass no liveVerbs; it now passes one built from
the library's LIVE_VERBS plus "profile", read rather than copied, so the
reserved set can never be narrowed here.
The degraded stub carries CliProfile and ProfileSwitch because the live
dispatcher has both; each names /mm profile and the missing library and
switches nothing. The dispatcher is published as the NS.Slash.__dispatcher
debug seam, which gives this addon its first Slash parity case
(tests/test_surface_parity.lua, two-table form, with the three live-only
members named) and lets a case reach the stub's ProfileSwitch.
Tests first: tests/test_slash_profile.lua (11 cases) drives the real
dispatcher against the AceDB fake that tests/wow_mock.lua already wraps to
dispatch the method-name callbacks, so the switch case counts
OnProfileChanged and reads its debug line instead of dispatching by hand.
The refusal, disabled and slash pins list `profile` as live; test_disabled
gains a live-while-disabled case. Docs: slash-dispatch.md (table, a profile
section, live list, degraded, refusal lines), ARCHITECTURE counts (20
verbs), disabled-state, module-map, common-tasks, profiles, testing.
docs/test-cases.md regenerated and the README badge moved to 2107;
.luacheckrc's tests/run.lua citation re-pointed.
Gate: 2107/2107 tests, luacheck 0/0 in 145 files.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 070c0f6fd2cd8359ca1f6cbe30bf7d68cd621c38
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Sep 29 12:25:12 2026 +0530
SP-MM-02: re-vendor LibKa0s v1.63.0
LibKa0s payload from the local v1.63.0 tag (dd7a774): Slash.lua moves from
minor 16 to 17, which adds the shared profile verb (the `profiles`
descriptor field, CliProfile, ProfileSwitch, lib.ProfileNames and nine
PROFILE_* strings). Every other library file and the test kit (revision 31)
are unchanged; both payloads are still copied whole so the pairing rule
holds. The CLAUDE.md provenance line rolls to v1.63.0 in the same commit,
which tests/test_vendor_sync.lua needs.
No contract change: no existing Slash member moved, and this addon has no
by-name Slash parity case, so the copy alone stays green with no stub
change. The profile surface is adopted by the next commit of this item.
Bundle: docs/revendor/2026-09-29-v1.63.0/.
Gate: 2094/2094 tests, luacheck 0/0 in 144 files.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 6308d62d5e0d797f4effa19cdda7c46f06173ae4
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Sep 29 08:40:42 2026 +0530
Docs: sync to the [Event] trace channel
ARCHITECTURE.md names the [Event] line the context, restriction and combat
handlers now write, and counts nineteen NS.Debug channels in the debug.md row.
performance.md's meterEvent citations point at the three DAMAGE_METER_*
brackets again (:484, :494, :502).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 6308d62d5e0d797f4effa19cdda7c46f06173ae4
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Sep 29 08:40:42 2026 +0530
Docs: sync to the [Event] trace channel
ARCHITECTURE.md names the [Event] line the context, restriction and combat
handlers now write, and counts nineteen NS.Debug channels in the debug.md row.
performance.md's meterEvent citations point at the three DAMAGE_METER_*
brackets again (:484, :494, :502).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
commit 713b261379850ba5f67a9749bc0fde17084bcd13
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Sep 29 01:10:05 2026 +0530
Trace state-changing events on a new [Event] debug channel
One line per game event that changes where a window may show or what the
meters may read: ADDON_RESTRICTION_STATE_CHANGED (raw type and state, after
the restricted flag is refreshed), PLAYER_ENTERING_WORLD (login, reload),
ZONE_CHANGED_NEW_AREA, GROUP_ROSTER_UPDATE and both PLAYER_REGEN edges. Each
line carries lockdown and NS.State.restricted. Gated before anything is read
(debug-logging-§4). The player-state block (mount, vehicle, form, gliding, pet
battle, death) is left out by the owner's ruling; the spellcast,
system-message and DAMAGE_METER_* traffic because it fires constantly.
docs/debug.md describes the channel (twenty channels through the sink now);
smoke-tests §37 MM-E1..E5. Tests 2092 -> 2094; performance.md citations
realigned.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R83GGMfYm2GoXLBwdCsbUH
This mod has no additional files