promotional bannermobile promotional banner

Ka0s Bank Ledger (Retail)

Records every item and gold movement between your bags and your banks, tags each one with the store, direction and place, and lets you browse and analyze your banking history — account-wide.
Back to Files

1.3.0-release

File nameBankLedger-1.3.0-release.zip
Uploaded
Oct 9, 2026
Downloads
8
Size
6.9 MB
Flavors
Retail
File ID
9110181
Type
R
Release
Supported game versions
  • 12.1.0

What's new

tag cb6d13310df4d8b0e8ecefdad0d23b40953a9528 1.3.0-release
Author:    Tushar Saxena <tushar.saxena@gmail.com>
Date:    Fri Oct 9 20:08:19 2026 +0530

Release 1.3.0

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

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

    Release gate (docs/automated-tests/20261009-191733/manifest.json, run on
    6aedd39, clean tree), all six gates PASS:
    - Lint: 0 warnings / 0 errors in 88 files
    - Tests: 1265 passed, 0 failed, 1 skipped of 1266 (the skip is the kit's
      diagnostics opt-out contract case, which does not apply to this addon)
    - Perf: skipped under the ratified performance-§12 no-combat-path
      exemption (no tests/perf.lua); passes via automated-tests-§3's narrow
      exception, and the release notes say so
    - Complexity: ran, lizard 1.24.0; 22780 NLOC / 3657 functions,
      avg CCN 2.0
    - CCN <= 15: 0 warnings, max CCN 15
    - Sighted: blindFiles 0 (the first sighted run in this addon's record)

    Files changed:
    - BankLedger.toc: ## Version 1.2.0 -> 1.3.0
    - core/Namespace.lua: NS.version 1.2.0 -> 1.3.0
    - core/Database.lua: InitSummary example comment v1.2.0 -> v1.3.0
    - README.md: new 1.3.0 row at the top of ## Version History (five
      highlights plus the perf-skip note); de-AI pass run on the new row
    - docs/automated-tests/20261009-191733/: the release bundle, with
      ANALYSIS.md
    - docs/automated-tests/RESULTS.md: the run's row, and the band
      dispositions: Browser.lua and Insights.lua refreshed with this run's
      figures, tests/test_browser.lua and tests/test_profiles.lua ruled as
      newly crossed

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

commit 6aedd398cb9c14952265d74c0fb85530193c2702
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 9 18:53:17 2026 +0530

    SD-FIN-03: remove dead export F:ClearAll

    No caller outside its own self-test (removed with it). Writer lists in Filters.lua, Schema.lua and docs/schema.md updated; test-cases.md regenerated, badge 1265.

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

commit c00380acdc0ac5d5686b090084657079b5ace00c
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 9 17:49:22 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 36736a51fbf0bf136b9f377977708a16eab107d7
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:27:56 2026 +0530

    BL-STD: sync docs to v2.77.0 standard and this run's changes

    Standards roll to WowAddonStandards v2.77.0 (feature branch). v2.77.0's
    addon-side note says each addon's three-place reference "rolls to
    v2.77.0"; toc-file and documentation-§2 still prescribe the unversioned
    X-Standard URL, the unlinked Standard badge and the unversioned
    CLAUDE.md "Standards compliance" wording, which BankLedger.toc, README.md
    and CLAUDE.md already carry. No change there.

    Sweep: every `<file>-§N` reference in the live docs and comments
    (libs/, tests/_kit/ and the frozen audits/reviews/automated-tests run/
    revendor/superpowers bundles excluded) resolves to a numbered section in
    ../WowAddonStandards/standards/standards/. No retired notation,
    documentation-§3 "ninth"/"tenth" ordinal, shebang carve-out restatement
    or versioning-git branch wording needed fixing (CoreSetup's "ninth" is a
    TOC position, not a documentation ordinal).

    Docs sync of this run:
    - docs/ARCHITECTURE.md: 36 -> 37 source files (BL-03 added
      modules/Browser_Views.lua); the module-map and load-order notes already
      name it.
    - docs/testing.md: the stale "../LibKa0s sits on v1.67.0" paragraph is
      dated to the v1.71.0 re-vendor; the _kit tree names secrets.lua and the
      --list renderer's move into inventory.lua (kit revision 38); the case
      inventory section explains the Totals table's Skipped row.
    README Tests badge (1266/1266) equals docs/test-cases.md Total (1266).
    CLAUDE.md provenance stays v1.71.0 / kit 38; DEPENDENCIES.md unchanged.
    No version bump, no Version History entry, no CHANGELOG (OWNER_SCOPE 4).

    Gates: 1266 passed / 0 failed / 1 skipped; luacheck 0/0 in 88 files;
    lizard 0 warnings; largest authored .lua is 1179 lines.

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

commit 36736a51fbf0bf136b9f377977708a16eab107d7
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:27:56 2026 +0530

    BL-STD: sync docs to v2.77.0 standard and this run's changes

    Standards roll to WowAddonStandards v2.77.0 (feature branch). v2.77.0's
    addon-side note says each addon's three-place reference "rolls to
    v2.77.0"; toc-file and documentation-§2 still prescribe the unversioned
    X-Standard URL, the unlinked Standard badge and the unversioned
    CLAUDE.md "Standards compliance" wording, which BankLedger.toc, README.md
    and CLAUDE.md already carry. No change there.

    Sweep: every `<file>-§N` reference in the live docs and comments
    (libs/, tests/_kit/ and the frozen audits/reviews/automated-tests run/
    revendor/superpowers bundles excluded) resolves to a numbered section in
    ../WowAddonStandards/standards/standards/. No retired notation,
    documentation-§3 "ninth"/"tenth" ordinal, shebang carve-out restatement
    or versioning-git branch wording needed fixing (CoreSetup's "ninth" is a
    TOC position, not a documentation ordinal).

    Docs sync of this run:
    - docs/ARCHITECTURE.md: 36 -> 37 source files (BL-03 added
      modules/Browser_Views.lua); the module-map and load-order notes already
      name it.
    - docs/testing.md: the stale "../LibKa0s sits on v1.67.0" paragraph is
      dated to the v1.71.0 re-vendor; the _kit tree names secrets.lua and the
      --list renderer's move into inventory.lua (kit revision 38); the case
      inventory section explains the Totals table's Skipped row.
    README Tests badge (1266/1266) equals docs/test-cases.md Total (1266).
    CLAUDE.md provenance stays v1.71.0 / kit 38; DEPENDENCIES.md unchanged.
    No version bump, no Version History entry, no CHANGELOG (OWNER_SCOPE 4).

    Gates: 1266 passed / 0 failed / 1 skipped; luacheck 0/0 in 88 files;
    lizard 0 warnings; largest authored .lua is 1179 lines.

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

commit 4d7c08f1f476d5cf3dcf063a1dc5ba5c9dda06d5
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:23:38 2026 +0530

    BL-05: drop the dead bare-global GetAddOnMetadata rung

    Cluster C27 parity with LK-06, MM-07 and PM-09 (no finding of its own).
    NS.Meta's library-absent branch in core/EnvSetup.lua kept a bare
    GetAddOnMetadata rung below C_AddOns.GetAddOnMetadata that no admitted
    client (## Interface 120100, after the 11.0 AddOns purge) can reach. The
    ladder is now two rungs: LibKa0s-Env, else C_AddOns, else nil. The doc
    comment names the two rungs and why there is no third.

    - tests/test_envsetup.lua: new case "EnvSetup degraded: NS.Meta never
      reads the bare GetAddOnMetadata global" (library and C_AddOns absent,
      recording spy planted, asserts nil and zero calls). It was red before
      the change (got "bare-global").
    - .luacheckrc: GetAddOnMetadata dropped from read_globals. luacheck
      stays at 0/0, so nothing else reads it bare.
    - The test mock carries no bare GetAddOnMetadata, so there was nothing
      to remove there. No doc describes the ladder rung by rung
      (docs/compat-layer.md only names NS.Meta), so no doc edit was needed.
    - docs/test-cases.md regenerated (1265 -> 1266); README Tests badge
      updated to match.

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

commit 888156aeb40fec354bedfb60a52ae727923e5785
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:20:27 2026 +0530

    BL-04: address review — finish the per-tab saved-views sweep

    The review found the single-saved-view wording left at docs/settings-panel.md
    (the "Defaults asks first" paragraph, the seventh BL-R-05 line) and in the
    core/Database.lua header. Both now say the saved views, one per tab. The same
    drift is fixed where players read it (README.md's resetall line and
    troubleshooting row, the General Defaults tooltip) and in the settings/Profiles.lua
    and settings/Slash.lua comments. The v3-historical comments in core/Database.lua
    are left as they are.

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

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

    BL-04: Sweep doc drift: Logo-art pointers, mono glyph, per-tab views

    Docs and comments only (documentation-§5).

    BL-A-04: core/Constants.lua and docs/smoke-tests.md PANEL-1 re-point
    "ARCHITECTURE ▸ Logo art" to docs/media.md ▸ Logo art, where the heading
    lives. The modules/LedgerTable.lua Direction-glyph comment now cites
    debug-logging-§2's sanctioned mono-face exception and drops the
    "accepted, documented deviation" wording and the pointer to a register
    row that does not exist (none is needed). The ARCHITECTURE over-cap
    census figure was already dropped by BL-03 (verified: the page carries
    no line figure).

    BL-R-05: schema v5 keeps profile.savedViews per tab and lastTab is a
    session-only file-local. docs/ARCHITECTURE.md (Profiles), settings-panel.md
    and slash-dispatch.md now say the saved views are one per tab;
    docs/debug.md says the active tab is remembered for the session only and
    never written to SavedVariables; smoke PANEL-28 now saves a view on both
    History and Insights and expects both discarded (Clear on each tab lands
    on stock). No smoke result recorded.

    Deviation: modules/Browser.lua's MakeDropdown comment called the same
    glyph "the same documented deviation" as LedgerTable; reworded in step to
    cite debug-logging-§2, so the two comments agree.

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

commit 4c07d8dca0abd0678c23fea2de2c5d66d915eeaa
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:15:02 2026 +0530

    BL-03: address review — US spelling in the Browser_Views header comment

    The header comment carried "behaviour", which the localization-§5 prose
    test flags; a2cbfed's committed tree was therefore 1264/1/1, not the
    1265/0/1 its body claimed. Changed to "behavior".

    Gate: lua5.1 tests/run.lua 1265 passed / 0 failed / 1 skipped (1266);
    luacheck 0 warnings / 0 errors; lizard no thresholds exceeded.

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

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

    BL-03: Peel the per-tab view machinery into modules/Browser_Views.lua

    Pure move (BL-R-02, with BL-A-04's census ruling). modules/Browser.lua sat
    at 1450 lines (layout-§1 band, 50 short of the cap) and its tracked BL-24
    seam was never cut. The per-tab view section -- defaultCharSelection,
    STOCK_VIEW, savedSlots, savedViewOrStock, asSet, VIEW_SETS,
    tableViewState, B:CaptureView, applyTableState, viewSets, paintDropdowns,
    buildActiveFilter, B:ApplyView, B:ClearFilters, B:SaveView, B:ResetView,
    tabLive, applyBaseline, forgetTabStates, B:SwapTabState, B:ClearAllTabs,
    the B._STOCK_VIEW / B._savedViewOrStock test seams and B:OnDatasetChanged
    -- moves verbatim into the new modules/Browser_Views.lua (303 lines);
    Browser.lua drops to 1179.

    The new file reaches Browser.lua's file locals through one explicit table,
    B._viewSeam = { CURRENT_CHAR, setToFilter, searchClause,
    dropFilterDebounce }, published by Browser.lua at load; no new globals.
    searchClause stays in Browser.lua (SetSearchText and the search box use
    it too). lastTab stays owned and written by Browser.lua; the moved code
    reads it through the existing public B:ActiveTab() (the only edit inside
    the moved body: four lastTab reads). The `local print = NS.Print` upvalue
    moves with its only callers (SaveView/ResetView).

    BankLedger.toc: modules\Browser_Views.lua right after modules\Browser.lua,
    annotated. Docs: module-map.md gains the row, Browser.lua's row narrowed,
    the load-bearing list gains the entry (six -> seven, also in
    ARCHITECTURE.md); ARCHITECTURE.md's over-cap census names the largest
    file and the wc command with no line figure; RESULTS.md's BL-24 watch row
    records the cut seam, names the skin/close-button + geometry seam as the
    remaining one and carries the wc figure; schema.md and a settings/Schema.lua
    comment re-point the savedViews writer to Browser_Views.lua.

    Gates: tests 1265 passed / 0 failed / 1 skipped (1266, identical to the
    baseline; `tests/run.lua --list` md5 unchanged), luacheck 0/0, lizard 0
    warnings. No test files touched.

    Deviations from the item text:
    - The TOC comment uses the repo's and the standard's `# LOAD-BEARING:`
      marker, not `# LOAD-ORDER:` (the standard and tests/test_libka0s.lua
      name LOAD-BEARING; LOAD-ORDER appears nowhere).
    - No lastTab accessor was added to the seam: B:ActiveTab() already is one.
      pendingFilterTimer is reached only through dropFilterDebounce.
    - ARCHITECTURE.md has no file-by-file load-order list (it points at
      module-map.md); it gains the entry in its load-bearing sentence instead.
    - Standalone-windows register condition (3) and docs/windows.md were
      re-read: both concern B:MakeCloseButton, which stays in Browser.lua, so
      neither changed.

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

commit 146fb8adafe9b6bb6748011010c78d6761b528d7
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 20:03:52 2026 +0530

    BL-02: trim the search clause, drop redundant re-filters, printer args

    Browser search and filter passes (modules/Browser.lua), plus one
    printer line in settings/Slash.lua.

    - BL-R-04 (C-04): new file-local searchClause(t) trims the box text with
      the same pattern the suggestions' trimLower uses (case kept) and answers
      nil when nothing is left. OnTextChanged, B:SetSearchText and
      buildActiveFilter (so B:ApplyView) all store it as activeFilter.text, so
      ' linen' / 'cloth ' no longer empty the table while the list offers
      Linen Cloth. The box keeps the raw text; CaptureView is unchanged.
    - BL-R-03 (C-03): new file-local dropFilterDebounce() cancels and nils
      the typing debounce. SetSearchText, B:ApplyView (right after its
      SetText, before ApplyFilterNow) and B:CancelPending use it, so the
      debounce the client's OnTextChanged arms no longer re-runs the same
      filter 0.2 s later. B:SelectTab skips the incoming pane's
      LedgerTable/Insights Refresh on a real switch (SwapTabState already
      painted it), still rebuilds History's filter options, and repaints as
      before on a re-select; that branch moved into a file-local
      paintIncoming() to keep SelectTab under CCN 15.
    - BL-A-05 (narrowed): SaveView/ResetView pass lastTab as a printer
      argument (bytes unchanged); Sl:ResetEverything passes the profile name
      as its own argument. The line now reads "profile Default reset to
      defaults." (quotes dropped: re-adding them would need the `..` join the
      finding removes); tests/test_libka0s_slash.lua pins updated. Slash.lua
      :253/:339 and core/DebugLogSetup.lua:51 left alone per the verdict.

    Tests (red first): whitespace query on SetSearchText, OnTextChanged and
    ApplyView; ApplyView applies its search once with a client-like SetText
    that fires OnTextChanged; a tab switch paints the incoming pane at most
    once while History's options are rebuilt; Save/Reset exact chat lines.
    docs/test-cases.md regenerated (1265), README Tests badge 1265/1265.

    Deviation: the profile reset line loses its quotes around the name (see
    above).

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

commit d1cf6fbef2207df1cc289b2823f6287efdde7e76
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 19:56:47 2026 +0530

    BL-01: hoist GroupEntries' sort key and comparators under CCN 15

    LT:GroupEntries measured CCN 16 on the sighted shadow since 5a78432 added
    `or groupOrder` to the group sort-key default, the only BankLedger function
    over the automated-tests-§3 release gate. Resolves BL-R-01 + BL-A-02.

    - Characterization first: three cases in tests/test_ledgertable.lua pin
      typesub group order ascending and descending with a sort-key tie (keys
      differing only in case) broken key-ascending both ways, and a
      column-backed grouping (char) ordered by the column's sortFn rather than
      the label. Green against the old code; a mutation run (descending
      tie-break flipped, sortFn dropped from the key) turned two of them red.
    - Module-level groupAscending/groupDescending replace the per-call closure;
      GroupEntries calls table.sort(order, (self.groupAsc ~= false) and
      groupAscending or groupDescending).
    - The comparators alone did not lower it: the old closure was its own
      function for lizard, and the new and/or selector added two decisions
      (sighted CCN 18). So, as the item allows, the sort-key default is hoisted
      too: groupSortKey(sortFn, e, groupOrder, valueLabel) returns
      sortFn and sortFn(e) or groupOrder or valueLabel, the same precedence.
      GroupEntries now measures CCN 15 (sighted); the complexity suite reports
      0 warnings, max CCN 15.
    - docs/test-cases.md regenerated (Total 1261); README Tests badge follows.

    Behaviour is unchanged: group order, headers, counts, collapse handling and
    in-group row order are the same.

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

commit 8d22a58d981c68b026a128de3ef6ceba1850e08b
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 19:50:36 2026 +0530

    RV-BL: re-vendor LibKa0s v1.71.0 (kit 38) and record the v1.69-70 span

    Replace libs/LibKa0s/ and tests/_kit/ whole from the local LibKa0s tag
    v1.71.0 (cb274a4), exported with git archive, never the working tree.
    Minors: Env 1->2, Slash 19->20 / SlashParse 1->2 (key 20.2),
    WidgetsLineChart 2->3 and WidgetsAutocomplete 1->2 (Widgets key
    12.1.4.3.2), OptionsIdList 3->4; kit revision 37->38 (adds secrets.lua,
    --list Totals count only the cases that run).

    In the same commit, as CLAUDE.md requires:
    - CLAUDE.md provenance line names v1.71.0 and kit revision 38.
    - docs/test-cases.md regenerated (CRLF): the diagnostics contract's
      declared skip leaves its count row for a "| Skipped | 1 |" row and
      Total falls 1259 -> 1258, equal to the README badge 1258/1258
      (BL-A-03, no local framework edit).
    - docs/revendor/2026-10-07-v1.71.0/ (01_DELTA, 02_CANDIDATES,
      05_SUMMARY): base v1.70.0 from CLAUDE.md; Autocomplete minor 2's
      scripts-before-Autocomplete precondition is already met by
      modules/Browser.lua (:1093-1100 then :1105); nothing adopted, no issue
      filed (owner scope ruling 5).
    - docs/revendor/2026-10-07-v1.69.0-v1.70.0/ (01_DELTA, 05_SUMMARY): the
      span bundle for b5e638b (v1.69.0) and 2c87997 (v1.70.0), base v1.68.1,
      Autocomplete adopted in e5cd620 (BL-A-01).

    Gates: luacheck 0/0 (87 files); tests 1258 passed, 0 failed, 1 skipped;
    lizard 0 warnings. No red came from the new kit or library.

    Deviation: before the test run, two committed RA-00 audit files
    (docs/audits/2026-10-07/01_CURRENT_STATE.md, 02_DEVIATIONS.md) were LF
    in the working tree and failed the kit's eol case; they were re-checked
    out (rm + git checkout), a working-tree-only fix with no content change.
    The item's verify note expected an LT.GroupEntries CCN warning; lizard
    reports none.

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

commit 3094a0af9e88ca53093f8bf6dfede7f24187721d
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 16:51:52 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 e8d264a92febe3ad54762c8d639edbf39d45c418
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 12:37:18 2026 +0530

    feat(browser): per-tab filter views; Save/Reset/Clear act on the active tab

    History and Insights each keep their own live filter state and their own
    saved view. A tab switch captures the outgoing tab's view and character
    selection and paints the incoming tab's (or, on a first visit, its
    baseline) onto the one filter bar (B:SwapTabState). Save, Reset and
    Clear act on the active tab only.

    Storage moves from profile.savedView to profile.savedViews =
    { History = view, Insights = view }. Schema v5 (NS.MIGRATIONS[5]) walks
    every stored profile raw, copies an old savedView into both slots (a
    deep copy each, never overwriting an existing slot), removes the old
    key, drops a corrupt scalar, and is idempotent. The stamp default stays
    0. A profile event now repaints through B:ClearAllTabs so no tab keeps
    a live state from the replaced profile.

    Docs: schema.md (v5 section, carve-out), profiles.md, ARCHITECTURE.md,
    module-map, insights.md, windows.md, testing.md, README usage and badge,
    smoke-tests (LEDG-50 new, INS-15 rewritten, version numbers to 5).

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

commit e8d264a92febe3ad54762c8d639edbf39d45c418
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 12:37:18 2026 +0530

    feat(browser): per-tab filter views; Save/Reset/Clear act on the active tab

    History and Insights each keep their own live filter state and their own
    saved view. A tab switch captures the outgoing tab's view and character
    selection and paints the incoming tab's (or, on a first visit, its
    baseline) onto the one filter bar (B:SwapTabState). Save, Reset and
    Clear act on the active tab only.

    Storage moves from profile.savedView to profile.savedViews =
    { History = view, Insights = view }. Schema v5 (NS.MIGRATIONS[5]) walks
    every stored profile raw, copies an old savedView into both slots (a
    deep copy each, never overwriting an existing slot), removes the old
    key, drops a corrupt scalar, and is idempotent. The stamp default stays
    0. A profile event now repaints through B:ClearAllTabs so no tab keeps
    a live state from the replaced profile.

    Docs: schema.md (v5 section, carve-out), profiles.md, ARCHITECTURE.md,
    module-map, insights.md, windows.md, testing.md, README usage and badge,
    smoke-tests (LEDG-50 new, INS-15 rewritten, version numbers to 5).

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

commit d530a5baf558b3112638b0c7790aafcdf7253156
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 12:26:49 2026 +0530

    docs(plan): per-tab filter views

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

commit 3b4a77b0a908b269dcd744b9766e8628fa6a1667
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 11:46:26 2026 +0530

    fix: Phase 9 final-review fixes

    README Tests badge brought in line with the docs/test-cases.md Totals
    (pass/pass convention), as docs/testing.md requires.

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

commit 12d7ba7764bfaa6612469b55768c766a657d2db7
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 11:35:28 2026 +0530

    fix(C3): widen the Group dropdown so "Group: Type & SubType" reads whole

    The Group dropdown was a fixed 110 px, leaving ~88 px for a closed label that
    never wraps, so the new 21-char label would clip. It is now GROUP_W = 150
    (~6 px/char + 22 px inset). Row 1 spans exactly the row-2 dropdowns (Search is
    pinned to Character's right edge), so the extra width only narrows Search and
    B:MinWidth stays truthful; a new suite case holds the label budget and Search's
    SEARCH_MIN floor at minimum width. LEDG-13 gains the readable-label check.

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

commit 5a784327c9c4707d6b6ef9975c2d93992d19b2ab
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 11:31:40 2026 +0530

    feat(group): Group by Type & SubType on History

    A "typesub" group mode beside Type and Sub-type: one header per pair,
    "Type: <Type> · <SubType>", the bare type when there is no sub-type and
    plain "Gold" for gold. It has no table column, so its groups order by
    the lowercased "<Type>\001<SubType>" key (type, then sub-type; groupAsc
    still flips it). The saved view stores the mode verbatim. Tests for
    labels, order, keys and the dropdown; module-map, smoke LEDG-13 and the
    regenerated test-cases updated.

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

commit e5cd6205971112dfcbaac8ae1f24db7f5433e05f
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 11:25:28 2026 +0530

    feat(search): autocomplete under the search box (LibKa0s Autocomplete)

    - modules/Browser.lua: B:MakeAutocomplete, the Widgets seam beside B:MakeDropdown (copies opts, nil
      without the library, leaving a plain filter box). The filter bar attaches the list after the
      box's own scripts (the library hooks them). Provider B.SuggestNames: the distinct item names,
      "Gold" included when a gold movement is in the slice, among the rows the other filters show from
      the dataset on screen (test mode included), colored as the table paints them, prefix matches
      first, at most eight. B.PickName / B:SetSearchText put the name in the box and apply the filter
      once, at once, dropping the typing debounce. A tab switch and B:Hide (so the stand-down) close it.
    - modules/LedgerTable.lua: publishes MONEY_RGB for the Gold suggestion's color.
    - tests/test_autocomplete.lua (new suite, 15 cases), registered in run.lua.
    - Docs: smoke LEDG-49 (index and status rows), testing.md, module-map.md, ARCHITECTURE.md size
      census, README test badge, test-cases.md regenerated.

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

commit 2c8799786071fe270f5cff9b61b316618907b18b
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Oct 7 11:15:55 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 b5e638ba4575209b6a85a6c7c29f48b562fc42f0
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Oct 6 14:53:01 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 b898d5929bd61d8cbc6387f44e46f4bf69f8718b
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Oct 4 15:18:39 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 rolls to v1.68.1; CLAUDE.md:48 names kit 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; Perf stays a settled decline.

    Gates (ka0s-bounded):
    - lua tests/run.lua: 1226 passed, 0 failed, 1 skipped, 1227 total (test_vendor_sync green)
    - luacheck .: 0 warnings / 0 errors in 86 files
    - run-automated-tests.sh --suite complexity --no-bundle: pass, max CCN 15, 0 warnings

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

commit b898d5929bd61d8cbc6387f44e46f4bf69f8718b
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Oct 4 15:18:39 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 rolls to v1.68.1; CLAUDE.md:48 names kit 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; Perf stays a settled decline.

    Gates (ka0s-bounded):
    - lua tests/run.lua: 1226 passed, 0 failed, 1 skipped, 1227 total (test_vendor_sync green)
    - luacheck .: 0 warnings / 0 errors in 86 files
    - run-automated-tests.sh --suite complexity --no-bundle: pass, max CCN 15, 0 warnings

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

commit 9acebfb5fa75b2a33eb668a5adaa0b04f4f3e047
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Oct 4 14:32:47 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 9acebfb5fa75b2a33eb668a5adaa0b04f4f3e047
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Oct 4 14:32:47 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 57c6903c8df73c7879c094b36fe19d15287c845a
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sun Oct 4 14:21:29 2026 +0530

    DC-REN-01: docs name /dev-copilot:bump-version (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 6e803a3de1b5467e9878da88c02f121df4238e9b
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Sat Oct 3 12:47:49 2026 +0530

    SD-FIN-01: sync docs; drop uncalled S:ReadPath/S:WritePath

    README FAQ settings path, lizard in DEPENDENCIES, Browser.lua size; P:Batch documented as a test seam (no production coalescer); SettingsChanged senders corrected; README credits keep external credit only; two drifted line citations in test_surface_parity.

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

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

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

    Both payloads copied whole from the local annotated tag v1.68.0 (cc9f5eb);
    libs/LibKa0s/ and tests/_kit/ are byte-identical to it. The CLAUDE.md
    provenance line rolls v1.67.0 -> v1.68.0 in the same commit.

    The only delta is WidgetsDragHandle minor 4's optional tooltipPlace hook.
    No contract blocker: a host that sets neither field gets minor 3's calls.
    BankLedger builds no drag strip, so the candidate is declined as not
    applicable, not a gap, and no issue is filed. Bundle:
    docs/revendor/2026-10-02-v1.68.0/.

    Gate: 1226 passed / 0 failed / 1 skipped (vendor-sync green), inventory
    and README badge unchanged, luacheck 0/0, sighted complexity max CCN 15.

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

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

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

    Both payloads copied whole from the local annotated tag v1.68.0 (cc9f5eb);
    libs/LibKa0s/ and tests/_kit/ are byte-identical to it. The CLAUDE.md
    provenance line rolls v1.67.0 -> v1.68.0 in the same commit.

    The only delta is WidgetsDragHandle minor 4's optional tooltipPlace hook.
    No contract blocker: a host that sets neither field gets minor 3's calls.
    BankLedger builds no drag strip, so the candidate is declined as not
    applicable, not a gap, and no issue is filed. Bundle:
    docs/revendor/2026-10-02-v1.68.0/.

    Gate: 1226 passed / 0 failed / 1 skipped (vendor-sync green), inventory
    and README badge unchanged, luacheck 0/0, sighted complexity max CCN 15.

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

commit 59147ced6e337426f06ca7898b46cdf43dcd7e79
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 10:24:59 2026 +0530

    CA-FIN-02: doc sync before merge

    testing.md: eleven files bind addonName (was seven); module-map.md: OptionsSetup row names its addonName (LibKa0s#42).

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

commit 59147ced6e337426f06ca7898b46cdf43dcd7e79
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 10:24:59 2026 +0530

    CA-FIN-02: doc sync before merge

    testing.md: eleven files bind addonName (was seven); module-map.md: OptionsSetup row names its addonName (LibKa0s#42).

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

commit cb23423816a34d039b855a090a40b940774b1cae
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 02:07:07 2026 +0530

    CA-BL-01R: stand-down frame survey compares by identity, not raw count; rewrap two lines

    tests/test_disabled.lua step 6 ("firing every baseline event ...") and the launcher
    click case counted #mocks.__shownFrames() before and after. The kit tracks frames
    weak-keyed, so a shown frame nobody holds could be reaped between the surveys and the
    count dropped. Both sites now collect garbage, hold the frames already up and assert
    newlyShown(before, after) is empty (the file's own helper).

    red under: a clean worktree of 3005447 / a115afa / d825805 (1223 passed, 1 failed:
    "expected 1261, got 1254"), where CA-BL-01's new characterization suites moved the
    collector's timing. Green now both in a fresh worktree (1224/0/3) and in place (1226/0/1).

    Also rewraps the test_marks.lua grip comment and the docs/schema.md main-window
    geometry line to the ~100-column wrap.

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

commit d8258051ed3c4cc731957400ad1bf2caa0ea28d5
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 02:01:47 2026 +0530

    CA-BL-01R: restore the windows.md seam table and rewrap common-tasks.md

    Move the resize-grip paragraph after the ApplyGeometry() row so the
    Seam/Runs table is contiguous again, and rewrap the long line in the
    common-tasks.md window paragraph to the file's ~100-column width.

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

commit a115afa250932a2ae5cf7fa1488db62e8902bd54
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 01:59:28 2026 +0530

    CA-BL-01: both windows' resize grips are Core.MakeResizable (BankLedger#21)

    core/CoreSetup.lua publishes NS.MakeResizable: lib.MakeResizable on the
    live arm (Core minor 10), and on the library-absent arm the pre-library
    grip moved byte for byte as a working fallback that honors minWidth,
    minHeight and onResizeStop (design D3.2). modules/Browser.lua and
    modules/SessionWindow.lua drop their hand-built grips and bounds ladders
    and pass their floor plus onResizeStop = save geometry + table refresh.
    No onResize: it also fires on every OnSizeChanged and would break the
    ApplyGeometry-writes-nothing contract in docs/schema.md. No canResize:
    Lock frame gates only the drag today (D3.1, smoke SESS-13 asks).

    The SizeGrabber texture-gate entry moves to core/CoreSetup.lua. New
    cases pin the live arm's identity, the degraded grip's behavior and one
    grip implementation per arm. Docs: module-map, windows, schema,
    common-tasks, test-cases, README badge; smoke LEDG-47, LEDG-48, SESS-13,
    DEGRADED-12 added as pending sign-off.

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

commit 300544742858852ffbc0e575a5a1b706adc2c0d6
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 01:55:31 2026 +0530

    CA-BL-01: characterize both windows' resize grips (BankLedger#21)

    Seven cases, green on the hand-built grips, that the move onto
    Core.MakeResizable must keep green: sizing starts from BOTTOMRIGHT, the
    window floor is the minimum bound, the release saves geometry and
    refreshes the table exactly once, and a size change that is not a
    release (OnSizeChanged, ApplyGeometry, ResetWindow) writes nothing. The
    footer's DB-size text stays clear of the grip.

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

commit 44b435b87c8f31a67995e7ea3520c31502bf3efa
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 01:48:54 2026 +0530

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

    settings/OptionsSetup.lua keeps its first vararg as `addonName` and hands it
    to LibKa0s-Options-1.0 beside parentTitle/mainPanelName, so OptionsIdList can
    reach the vendored `info` help-mark art (guarded by the loaded-addon check in
    OptionsIdList 3). Latent here: neither item list carries `help` today. The
    degraded (library-absent) arm is unaffected; it never reads the descriptor.

    Tests: a source-pattern guard on the descriptor line and the vararg, and an
    on-disk assert that libs/LibKa0s/media/icons/info.tga is vendored. 1216/1216
    (1 skipped), luacheck 0/0, vendor parity clean, sighted complexity max CCN 15.
    Docs: test-cases.md regenerated, README Tests badge, smoke FILT-15 + pending row.

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

commit 5e49c3a8f371304ef72232d1d17e0cc878cbb6fa
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 01:41:11 2026 +0530

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

    Copied whole from the local tag v1.67.0 (git archive of commit 0bccf4c, which is also ../LibKa0s's
    clean HEAD): libs/LibKa0s/ and tests/_kit/. Core 9 -> 10 (MakeResizable canResize / onResizeStop /
    gripParent, LibKa0s#41), Options 27 -> 28 (addonName docblock), OptionsIdList 2 -> 3 (addonName
    loaded-addon guard, LibKa0s#42). testkit/ did not change, so the kit stays at revision 35. No file
    was added or removed, and nothing was deleted. Vendor parity: diff -r of both payloads against the
    tag is empty in bytes (the tag's CRLF kept, as in 968665a).

    - CLAUDE.md provenance line v1.66.0 -> v1.67.0 (kit line unchanged); docs/testing.md version-now.
    - docs/revendor/2026-10-02-v1.67.0/ (frozen): 01_DELTA, 02_CANDIDATES (addonName -> CA-BL-NM,
      MakeResizable + onResizeStop -> CA-BL-01, canResize and gripParent -> none), 05_SUMMARY.

    No consumer test broke on the library change. The case inventory did not move, so
    docs/test-cases.md and the README badge (1214) stand.

    Tests: 1214 passed / 0 failed / 1 skipped (1215).
    luacheck: 0 warnings / 0 errors in 86 files.
    Sighted complexity (--suite complexity --no-bundle): 0 warnings, max CCN 15.

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

commit b9bb0556bfc4f6ba67ac91d2e62db9dd0d7582e9
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 00:38:35 2026 +0530

    .luacheckrc: the 212/self stanza count is 14 today, not 12

    The comment recorded the 12 stanzas that replaced the blanket ignore. Later files of the same
    shape took one each, most recently modules/Ledger_Diagnose.lua. Comment only.

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

commit b9bb0556bfc4f6ba67ac91d2e62db9dd0d7582e9
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 00:38:35 2026 +0530

    .luacheckrc: the 212/self stanza count is 14 today, not 12

    The comment recorded the 12 stanzas that replaced the blanket ignore. Later files of the same
    shape took one each, most recently modules/Ledger_Diagnose.lua. Comment only.

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

commit 26e71900b3ea689adc4f3d50de3af88f945a650c
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 00:13:32 2026 +0530

    GI-FIN-02: record the 2026-10-02 smoke passes for CAPT-18/19; doc sync

    CAPT-18 and CAPT-19 (the login backfill, BankLedger#2) passed in the owner's 2026-10-02 client run
    and leave Pending sign-off. testing.md: luacheck lints 86 files; 14 212/self stanzas today.

    Gate: 1214 pass / 0 fail / 1 skip; luacheck 0/0 in 86 files; vendor diff empty.

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

commit 26e71900b3ea689adc4f3d50de3af88f945a650c
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Fri Oct 2 00:13:32 2026 +0530

    GI-FIN-02: record the 2026-10-02 smoke passes for CAPT-18/19; doc sync

    CAPT-18 and CAPT-19 (the login backfill, BankLedger#2) passed in the owner's 2026-10-02 client run
    and leave Pending sign-off. testing.md: luacheck lints 86 files; 14 212/self stanzas today.

    Gate: 1214 pass / 0 fail / 1 skip; luacheck 0/0 in 86 files; vendor diff empty.

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

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

    GI-BL-02R: put W.BuildBackToBackRows' doc comment back on the function

    The backToBackRow helper had been inserted between the doc block and
    W.BuildBackToBackRows, so the doc read as the helper's header. Move the
    helper and its one-line comment above the doc block. Pure move: suite
    totals identical before and after (1214 passed, 0 failed, 1 skipped,
    1215 total).

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

commit 2d8b8bde45833189eb874925914977a2f9fa2768
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 14:11:17 2026 +0530

    GI-BL-02: bring the four sighted CCN>15 functions below 15, behavior unchanged

    The re-vendored kit 35 complexity suite (sighted shadow, parity) listed four functions above CCN 15
    that the blind raw run never measured. Each is split into named, file-level helpers, one per
    section or step, with the characterization cases of the earlier GI-BL-02 commit pinning output
    byte for byte (InsightsCSV, Diagnose), call order (StandDown) and every row field (back-to-back).

    Before -> after (sighted lizard, CCN):
    - E.InsightsCSV (modules/Export.lua)               44 -> 3   helpers: addRow 5, sortedKeys 3,
      addSummary 9 (the card rows from two file-level tables), addStores 7, addBreakdowns 2,
      addCharacters 3, addItems 5, addDays 3, addClock 7
    - L.Diagnose (modules/Ledger_Diagnose.lua)        37 -> 3   helpers: countSlots 4 (shared by the
      container probe and the guild tabs), addBagIndex 6, addGroups 4, addContainerProbe 4,
      probeMoney 4, addBankTypes 3, probeBankFetch 7, addMoney 5, addGuildBank 4, addEvents 3
    - NS.StandDown (core/BankLedger.lua)               23 -> 4   helpers: cancelTimers 7, dropEvents 3,
      dropCaptureState 4, dropBusTarget 4, hideWindows 5 (the step comments move with their helper;
      the docstring stays on NS.StandDown)
    - W.BuildBackToBackRows (modules/InsightsWidgets.lua) 19 -> 10  helper: backToBackRow 7; the sort
      reuses the file's byTotalThenLabel, the same comparator it spelled inline

    Sighted complexity (--suite complexity --no-bundle): warnings 4 -> 0, maxCcn 44 -> 15,
    blindFiles 0. Tests 1214 / 0 / 1 (1215) before and after; docs/test-cases.md unchanged.
    luacheck 0/0 in 86 files.

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

commit 8f4623fe3bfae089597196965294451f1452966d
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 14:07:43 2026 +0530

    GI-BL-02: peel L:Diagnose to modules/Ledger_Diagnose.lua, a pure move ahead of its CCN split

    modules/Ledger.lua sat at 997 lines, three short of layout-§1's 1000-1500 band; splitting
    L:Diagnose in place would have pushed it in, which this cycle adds no file to (M1 addendum A2).
    The /bl debug scan block moves unchanged (section header through `end`) to the new
    modules/Ledger_Diagnose.lua, loaded after Ledger.lua on the same NS.Ledger table, as
    LedgerTable_TestMode.lua was peeled. Ledger.lua 997 -> 867 lines; the new file 141.

    - BankLedger.toc row; .luacheckrc gets the same narrow 212/self stanza Ledger.lua has (the method
      form is what /bl debug scan and the diagnostics report call).
    - Docs: ARCHITECTURE.md source count 36, module-map.md row, debug.md's file pointer, and the
      core/CoreSetup.lua comment citation.

    Suite totals identical: 1214 passed / 0 failed / 1 skipped (1215) before and after;
    docs/test-cases.md unchanged. luacheck 0/0 in 86 files.

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

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

    GI-BL-02: characterization tests for the four functions the sighted complexity suite reveals above CCN 15

    Pinned before any refactor, green against the current code:
    - E.InsightsCSV (modules/Export.lua): the full document byte for byte over a fixture touching every
      section (quoting, money format, store/quality/day ordering, tie-breaks, the item-name fallback,
      the fixed hour/weekday grids); the zero document for {} and nil; the one-ended date range.
    - L.Diagnose (modules/Ledger.lua): the whole dump line for line under fixed money, event record and
      hook latch; a raising and an absent money reader; no C_Bank, no BankType, a Character-only
      BankType; no BagIndex, name tie-break, non-number members; hooks not installed, nothing refused.
    - NS.StandDown (core/BankLedger.lua): every step in order against recording fakes; bare modules and
      no addon object; a half-capable bus target dropped; the postponed line only with logging on.
    - W.BuildBackToBackRows (modules/InsightsWidgets.lua): every row field with the defaults (negative
      clamp, a missing magnitude table), the three opts hooks, a nil matrix.

    docs/test-cases.md regenerated, README badge 1201 -> 1214.
    Tests 1201 / 0 / 1 (1202) -> 1214 / 0 / 1 (1215). luacheck 0/0.

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

commit dd3080ae7009a72f49d90a5b807b7c6a88c9b8d4
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 13:59:42 2026 +0530

    GI-BL-01: backfill name, quality, type, sub-type and link onto uncached ledger rows at login (#2)

    New modules/Backfill.lua (NS.Backfill), loaded after modules/Ledger.lua:
    - Backfill.Collect(ledger, cap): pure, one walk, up to C.BACKFILL_MAX_IDS = 40 distinct item ids
      from ITEM rows missing itemName or itemType, with each id's rows.
    - Backfill.Apply(rows, ...): pure, fills nil fields only, answers rows changed; idempotent.
    - Backfill:Run(): resolves cached ids at once (row.itemLink first, then the id, as BuildEntry
      does), asks the client to load the rest through NS.Item.LoadItem, and registers
      GET_ITEM_INFO_RECEIVED on the addon object only until every id answered or C.BACKFILL_TIMEOUT
      (10s) passes. One Database:FireLedgerChanged for the pass, only if a row changed.
    - Stand-down: Backfill joins TIMER_MODULES, so NS.StandDown's walk calls Backfill:CancelPending;
      UnregisterAllEvents / CancelAllTimers reach the event and the timeout; every handler checks the
      latch as a belt. The event name is dropped from NS.EventRecord when the pass lets go.
    - addon:OnEnterWorld's once-per-session timer runs it right after Database:PruneOld.
    - [Backfill] debug lines: "N rows over M ids filled now, K requested" and
      "done: N rows filled, K unresolved"; a ledger with nothing to fill writes nothing.

    Docs: ARCHITECTURE.md (source count 35, the ledger's field-fill writer, the transient registration,
    Known Limitations: the "no name backfill" clause out, the 40-ids-per-login line in), scope.md,
    module-map.md, data-flow.md, debug.md Coverage, performance.md sweep rows, schema.md, smoke rows
    CAPT-18 and CAPT-19, the Ledger.lua BuildEntry comment, test-cases.md, README badge 1186 -> 1201.

    Tests first: tests/test_backfill.lua's 15 cases were red against the previous tree (no NS.Backfill),
    then green. Totals 1186 / 0 / 1 (1187) -> 1201 / 0 / 1 (1202). luacheck 0/0 in 85 files. Sighted
    complexity: blindFiles 0, warnings 4 (unchanged; no new function above CCN 15).

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

commit dd3ebc388c81e16c478472662699c4840b050d66
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 13:58:09 2026 +0530

    GI-BL-RV: docs/testing.md's tests/ tree names kit 35's lizard_sighted.lua

    Follow-up to the re-vendor: the vendored-kit listing gains the sighted-shadow module. Docs only;
    suite totals unchanged (1186 passed / 0 failed / 1 skipped, 1187).

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

commit 968665a8c9e4dcb2f1a74dd4962bb2d988b6572c
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 13:51:38 2026 +0530

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

    Copied whole from the local tag v1.66.0 (git archive, never a branch tip): libs/LibKa0s/ and
    tests/_kit/. Slash 19 + SlashParse 1, Widgets 12 + WidgetsReorder 1, DebugLog 19, OptionsWidgets 34,
    OptionsTabs 8, Perf 14 + PerfSampler 1 + PerfCommands 1; kit 34 -> 35. The TOC loads the library
    through LibKa0s.xml and tests/run.lua derives from it, so the four new files need no line.
    Vendor parity: diff -r of both payloads against the tag is empty. Nothing deleted.

    - CLAUDE.md provenance line v1.65.0 -> v1.66.0, kit revision 34 -> 35; docs/testing.md version-now.
    - tests/run.lua wires { name = "test_lizard_sighted", dir = "tests/_kit/" }.
    - docs/testing.md, docs/automated-tests/README.md and DEPENDENCIES.md quoted raw lizard; they now
      name `bash tests/_kit/run-automated-tests.sh --suite complexity`, and lizard is pinned at 1.24.0.
      CLAUDE.md's green-gate line never quoted lizard.
    - tests/test_panel.lua: the reset-routes case's function literals hoisted out of the `for ... in`
      header (the one blind file). Pure move, no case added.
    - docs/revendor/2026-10-01-v1.66.0/ (frozen; candidates listed, not interviewed, per spec S4) and
      the span bundle docs/revendor/2026-10-01-v1.64.0-v1.65.0/ for the two unrecorded tags.
    - docs/test-cases.md regenerated, README badge 1178 -> 1186.

    No consumer test broke on the library change.

    Tests: 1178 passed / 0 failed / 1 skipped (1179) before -> 1186 / 0 / 1 (1187) after (+8 kit cases).
    luacheck: 0 warnings / 0 errors in 83 files.
    Sighted complexity (--suite complexity --no-bundle): first run blindFiles 1 (tests/test_panel.lua,
    114 of 115 listed), after the hoist blindFiles 0, warnings 4, maxCcn 44:
    E.InsightsCSV 44, L.Diagnose 37, NS.StandDown 23, W.BuildBackToBackRows 19 (-> GI-BL-02).

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

commit 4077d774809e3dff0ba8d5205b84c43686fff566
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 01:13:30 2026 +0530

    DG-BL-01: adopt docs: debug.md Coverage names the library's tags; smoke rows for a Slash refusal and a Lifecycle edge

    - docs/debug.md Coverage: which tags are the library's ([Cmd], [Lifecycle], [Cfg], [Launcher], with
      [Debug] and [Init] from the console) and that the addon writes no line beside them; the at-enable
      queue and the three state lines it holds at login; new [Lifecycle], [Cmd] and [Cfg] rows; [State]
      says what only the host adds to an edge; [Init]'s tail loses the launcher; [Launcher] says
      debugAtEnable vs debug; the [Diff] steady-state gate is the console's, re-armed by Clear and by
      enable. "Deliberately not traced" loses the slash refusal (it is traced now).
    - docs/smoke-tests.md: DIAG-30 (an unknown verb and the disabled gate each show one [Cmd] line in
      the console, chat unchanged, no second line) and DIAG-31 (both Lifecycle edges once, the [State]
      events line after the stand-up, no host stood line, and a disabled /reload's held line after
      [Init]); DIAG-2 corrected (the [Init] tail, then [Launcher] registered and the login's event
      record, once); DIAG-26 keeps its combat half. Index DIAG-1 - 31; pending sign-off rows added.
    - docs/slash-dispatch.md: the descriptor's `debug` bullet; docs/module-map.md: DebugLogSetup's
      NS.DebugSink, NS.DebugAtEnable and the four stub members.

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

commit 4077d774809e3dff0ba8d5205b84c43686fff566
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 01:13:30 2026 +0530

    DG-BL-01: adopt docs: debug.md Coverage names the library's tags; smoke rows for a Slash refusal and a Lifecycle edge

    - docs/debug.md Coverage: which tags are the library's ([Cmd], [Lifecycle], [Cfg], [Launcher], with
      [Debug] and [Init] from the console) and that the addon writes no line beside them; the at-enable
      queue and the three state lines it holds at login; new [Lifecycle], [Cmd] and [Cfg] rows; [State]
      says what only the host adds to an edge; [Init]'s tail loses the launcher; [Launcher] says
      debugAtEnable vs debug; the [Diff] steady-state gate is the console's, re-armed by Clear and by
      enable. "Deliberately not traced" loses the slash refusal (it is traced now).
    - docs/smoke-tests.md: DIAG-30 (an unknown verb and the disabled gate each show one [Cmd] line in
      the console, chat unchanged, no second line) and DIAG-31 (both Lifecycle edges once, the [State]
      events line after the stand-up, no host stood line, and a disabled /reload's held line after
      [Init]); DIAG-2 corrected (the [Init] tail, then [Launcher] registered and the login's event
      record, once); DIAG-26 keeps its combat half. Index DIAG-1 - 31; pending sign-off rows added.
    - docs/slash-dispatch.md: the descriptor's `debug` bullet; docs/module-map.md: DebugLogSetup's
      NS.DebugSink, NS.DebugAtEnable and the four stub members.

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

commit bb28e5c2ebaf2e0f567e4c0fa61eb7430578b3a5
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 01:10:25 2026 +0530

    DG-BL-01: adopt the library's debug lines: the host sink on every descriptor, the console's gates, no duplicate host lines

    - core/DebugLogSetup.lua: NS.DebugSink(tag, message), the one gated sink every LibKa0s descriptor
      is handed ("%s", so a player's text carrying `%` is never a format), and NS.DebugAtEnable, the
      console's at-enable queue; both no-ops on the degraded arm.
    - Slash (settings/Slash.lua) and Lifecycle (core/LifecycleSetup.lua) take `debug = NS.DebugSink`
      (new in Slash 18 / Lifecycle 3); Options and Launcher's existing sinks become the same function.
      Launcher takes `debugAtEnable`, so its Register state lines land after [Init] the first time
      logging is turned on.
    - core/BankLedger.lua: the host's `[State] stood down (holds: ...)` / `stood up: ...` lines are gone,
      the library's `[Lifecycle]` edge line replaces them. What only the host knows stays: `[State]
      events: N registered, M unavailable` after a stand-up, `[State] login prune postponed`, and the
      AceAddon OnDisable arm. The load-time bring-up and a load in the disabled state are state, so
      they go through the at-enable queue (`events at login: ...`, `stood down at login (holds: ...)`).
    - core/Database.lua: the [Init] tail drops its launcher fact; the Launcher's own held line now says
      it, and two lines for one state is the duplicate debug-logging-§4 forbids.
    - modules/Ledger.lua: the hand-rolled `L._lastDiff` memo becomes the console's D.DebugChanged, keyed
      per store (L.DiffGateKey), forgotten on each open and before a movement pass: same behaviour, and
      now re-armed by a Clear and by turning logging on.
    - tests/test_debug_library.lua (10 cases): each library line lands in this console and is written
      once ([Cmd] unknown verb, disabled gate, set not found, silent with logging off; [Lifecycle] both
      edges and no host second line, no line on a no-op; [Cfg] combat-locked write; the Launcher's and
      the login's held lines after [Init], one-shot; a disabled load; the [Diff] gate re-armed by Clear).
      Each was checked red with its descriptor field removed. tests/test_debug_coverage.lua re-pins the
      [State] and [Init] cases.
    - docs/test-cases.md regenerated (1179 cases, 1 declared skip); README badge 1178/1178; testing.md's
      suite map names the new suite.

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

commit 477c7824c9b9cb34be32625d60d86e6f54ec816e
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Thu Oct 1 00:55:50 2026 +0530

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

    - libs/LibKa0s/ and tests/_kit/ replaced whole from the local tag v1.65.0 (git archive). The new
      DebugLogGates.lua arrives with the folder; CRLF kept; nothing addon-owned in either folder. The kit
      stays at revision 34.
    - CLAUDE.md provenance line rolls to v1.65.0 in the same commit. Standards reference: the TOC
      X-Standard, README badge and CLAUDE.md carry the unversioned forms, so v2.73.0 needs no stamp edit.
    - core/DebugLogSetup.lua: the degradation stub gains DebugOnce, DebugChanged, DebugForget and
      DebugAtEnable (each answering nothing), as the v1.65.0 CHANGELOG says a consumer owes, so the
      surface-parity case stays green.
    - docs/testing.md names v1.65.0 as the sibling checkout's and CLAUDE.md's tag.
    - docs/test-cases.md regenerated: unchanged (1169 cases, 1 declared skip).

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

commit c7488f82a9fb8629832551bde65380da4f2dbeab
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 21:47:14 2026 +0530

    DL-BL-FIN: module map names Util.VisibilityRefusal and ApplyVisibility's counts

    The core/Util.lua row now lists the refusal-guard helper the show and
    test-mode trace lines use, and that ApplyVisibility answers how many
    windows it hid and re-showed for the [Combat] line.

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

commit c7488f82a9fb8629832551bde65380da4f2dbeab
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 21:47:14 2026 +0530

    DL-BL-FIN: module map names Util.VisibilityRefusal and ApplyVisibility's counts

    The core/Util.lua row now lists the refusal-guard helper the show and
    test-mode trace lines use, and that ApplyVisibility answers how many
    windows it hid and re-showed for the [Combat] line.

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

commit 7dc1555ce8d17e0bb0308cf0edb99dd202738707
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 21:20:00 2026 +0530

    DL-BL-04: README numbered lists become bullets (standard v2.72.0, CurseForge)

    The first-visit walkthrough, the How the ledger works steps and Reporting a
    bug now use "- " bullets; the words already carry the order, so nothing is
    reworded. Reporting a bug is the v2.72.0 fixed body with /bl.

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

commit 99c348c0789b2443c00f183d8f22c76507ac6976
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 19:34:19 2026 +0530

    DL-BL-03: re-vendor the final LibKa0s v1.64.0 (Diagnostics link, kit revision 34), diagnostics turns logging on

    - libs/LibKa0s/ and tests/_kit/ replaced whole from the local tag v1.64.0 (DebugLog 17 with the
      orange Diagnostics title-bar link, DebugLogDiagnostics 2: a run turns debug logging on for the
      session; kit revision 34's diagnostics contract). CRLF kept; nothing addon-owned in either folder.
    - CLAUDE.md provenance: kit revision 34. Standards reference: the TOC X-Standard, README badge and
      CLAUDE.md carry the unversioned forms the templates prescribe, so v2.71.0 needs no stamp edit.
    - tests/test_diagnostics.lua: "leaves the debug flag exactly as it found it" becomes "turns logging
      on for the session and never turns it off". Kit contract: the turn-on and already-on cases pass,
      the opt-out case is a declared skip (this addon keeps the default).
    - docs/test-cases.md regenerated (1169 cases, 1 declared skip); README badge 1168/1168 passing
      (testing-§5 counts passes, a skip folds into neither figure).
    - docs/debug.md: the Diagnostics link, and the report turning logging on for the session (a
      /reload turns it off again); docs/slash-dispatch.md's diagnostics row says the same.
    - docs/smoke-tests.md: DIAG-28 (the orange Diagnostics link beside Debug On/Off, a small gap, plain
      text; a click writes the report), DIAG-29 (diagnostics, link or /bl diagnostics, turns logging on
      for the session, no second enable line, /reload turns it off); DIAG-13's Debug: OFF expectation
      corrected and moved to pending sign-off; index DIAG-1 – 29.
    - tests/test_surface_parity.lua: the DebugLog test-seam citation re-pointed (:609, :614, :904, :905).

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

commit 7ef79405bbd2b77c2b7ba45d496756e78537b4d4
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 16:58:03 2026 +0530

    DL-BL-02R: trace every /bl session outcome, naming the guard

    SW:TogglePreview now writes one gated [Session] line per outcome:
    "preview refused: a real session is open", "preview on" (with
    ", window not shown: <SW:ShowRefusal()>" when SW:Show holds the window
    shut on its own switch, capture off, or visibility) and "preview off".
    The StartSession path keeps its guard on its own started line, so
    nothing is double-logged. Adds a red-under case to
    tests/test_debug_coverage.lua, the outcomes to the [Session] row of
    docs/debug.md, and regenerates docs/test-cases.md (1167 cases).

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

commit 3906ef71a6baa0669659033a6570d25a8597652f
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 16:47:59 2026 +0530

    DL-BL-02: debug coverage against debug-logging v2.70.0 §8 diagnosis and §9 quiet steady state

    Fill (§8 diagnosis):
    - [State] one line per stand-up (events registered, refused names) and stand-down (holds,
      a postponed login prune).
    - [Combat] one line per combat edge the addon reacted to; silent under `always`.
    - [Diff] the settle hold's two edges (held, settled); closes and stand-downs that drop a
      held change say so on their [Store] line.
    - [Prune] the login pass armed, and PruneOld's line on every run (retention Always included).
    - Refusals naming their guard: ledger window show, session window at a session start,
      test mode start; test mode on/off traced ([Table]); the guild frame showing over an
      armed bank ([Store]).
    - [Init] carries the dependency tail: loaded bank-replacing addons and the launcher state.

    Fix (§9):
    - The reconcile pass's [Diff] line is change-gated per store (reset on every open); a pass
      with a movement always writes.
    - [Skip] is one line per store per pass listing each refused movement, not one per item.

    Tests: tests/test_debug_coverage.lua (16 cases). Docs: docs/debug.md Coverage section,
    smoke DIAG-25..27, testing.md suite tree, doc map row, re-pointed moved citations.

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

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

    DL-BL-01R: re-point three comment citations the v1.64.0 re-vendor moved

    tests/test_surface_parity.lua: the four DebugLog test seams now sit at
    DebugLog.lua:566, :571, :861 and :862. .luacheckrc: the library's
    D:UpdateStatus() calls are now at :655, :659, :742, :805 and :952.
    tests/test_envsetup.lua: the mock_base C_AddOns note moved to :1112.

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

commit 2a3f6373497742949441eb37dfe0b442e9525b5c
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 16:03:20 2026 +0530

    DL-BL-01: re-vendor LibKa0s v1.64.0 (kit revision 33), standard v2.70.0, resize smoke checks

    - libs/LibKa0s/ and tests/_kit/ replaced whole from the local tag v1.64.0 (Core 9, DebugLog 15.1,
      Widgets 11.3, PerfPanel 13.6; kit revision 33 adds mock_resize.lua). CRLF kept, the kit's
      run-automated-tests.sh stays LF.
    - CLAUDE.md provenance line rolled to v1.64.0 / kit revision 33; docs/testing.md's vendor-sync
      "state as this is written" paragraph names v1.64.0.
    - Standards reference: the three places (TOC X-Standard, README badge, CLAUDE.md Standards
      compliance) carry the unversioned URL/badge the standard's templates prescribe, so v2.70.0 needs
      no edit there; no live doc stamps a current standard version.
    - No kit fallout: the Core parity case compares the addon's own namespace, not the live
      LibKa0s-Core-1.0 table, so MakeResizable needs no stub; no host suite reads IsResizable,
      IsUserPlaced or GetResizeBounds. Test count unchanged (1150), docs/test-cases.md unchanged.
    - docs/smoke-tests.md: DIAG-20 - 24 (console grip, minimum, session-only size, each copy window
      including the export's, another addon's console unaffected), index and pending sign-off updated.
      No perf panel check: this addon ships no perf harness (performance-§12).

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

commit 463190e7824c964b98d8817d93f98f89974b7e33
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 08:52:02 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 463190e7824c964b98d8817d93f98f89974b7e33
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 08:52:02 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 ceb629d6f5f48878e5f865080441881ce7cee6db
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Wed Sep 30 08:12:29 2026 +0530

    SP-FIN-01: locale comments name the strings that already route through NS.L

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

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

    SP-FIN-01: sync docs (NS.L routing, test_disabled count, 128 icon, scope storage)

    - ARCHITECTURE localization-§1 row, module-map and common-tasks: four strings
      now route through NS.L (the profile/debug/diagnostics help lines and the
      library-absent line); the docs said none did
    - testing.md: test_disabled.lua has 18 cases (the /bl profile live-verb case)
    - media.md: list bankledger.logo.128.tga, the IconTexture/launcher icon;
      DEPENDENCIES.md names what the Pillow recipe produces and re-cites its lines
    - scope.md: the retention window and Minimap button are account-wide too

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

commit d43944a4e2d0f82f34d7356c935b42fd3a4b16b5
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 23:06:49 2026 +0530

    SP-BL-03R: filter-bar line at the first /bl show, INSTALL-3 pending

    DEGRADED-8 expected "Filters need LibKa0s" on a /bl show that, in the
    doc's order, prints nothing: B:BuildFilterBar runs only when EnsureFrame
    builds the window, and DEGRADED-5's /bl show already built it. The line
    now belongs to DEGRADED-5, and DEGRADED-8 checks the bar is absent and
    that a hide/show round trip stays quiet.

    INSTALL-3 moves into Pending sign-off: X1.4's 2026-09-25 pass recorded
    the status tooltip, not the button's own logo or the matching art in the
    AddOns list.

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

commit 2a8484b47487103cf13ed34467c0d266d04f5069
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 22:52:56 2026 +0530

    SP-BL-03R: list INSTALL-5 as pending sign-off

    X1.4's recorded pass covers the right-click menu opening, not the Show
    window entry opening, ticking and closing the ledger. INSTALL-5 now sits
    in the Pending table like INSTALL-6, and the preamble excludes only
    INSTALL-3 and INSTALL-4.

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

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

    SP-BL-03R: Pending sign-off lists every carried-over check without a recorded pass

    The old doc kept no Result lines and Session BL of the 2026-09-23 checklist is still owed, so every
    carried-over check with no recorded pass is now listed, grouped by theme with its S-n origin. Ten
    stay off the list because a recorded pass covers an unchanged expectation: INSTALL-3 - 5 (X1.4,
    PASS 2026-09-25) and DIAG-13 - 18 and COMBAT-8 (BL-S rows of the diagnostics report, PASS
    2026-09-26). CAPT-12 joins as corrected: its [Store] line is logged only with logging on, which
    old S-17 step 13 never turned on.

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

commit e046604e305f1a7763540a6c85a32ec57ed3c042
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 22:25:23 2026 +0530

    SP-BL-03R: expectations re-read against the code, clarified Pending list

    The third review of SP-BL-03 found four defects, and a re-read of every
    expected string against the code and libs/LibKa0s found more.

    - PANEL-31 no longer expects the Database size line to update: Yes
      keeps the ledger, and the line is estimated from the ledger alone.
    - PANEL-29 now has a setup a client can arrange (the ledger window on
      Insights beside General > History's read-out) and keeps only the
      history half; the live list-empty half stays PANEL-31's.
    - DIAG-19 starts from a reset with logging off, since earlier checks
      leave rows off their defaults and each one is counted, and reopens
      the console that each reset closes.
    - COMBAT-4 reads the in-combat refusal from /bl test; the box is under
      the settings combat lock. CAPT-14 and CAPT-15 turn logging on after
      the /reload, which turns it off.
    - SLASH-3, PANEL-17, PANEL-19, FILT-8 and INS-18 now quote what the
      client prints or draws.
    - Pending sign-off follows the clarified policy: never-run checks plus
      every check that is new or whose expectation was corrected, which
      adds the /bl profile checks, DEGRADED-1 to 5, 7 and 11, and the
      checks corrected above.

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

commit 89ccc879eceef256011ccc3d6eac86bbdc779249
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 21:33:16 2026 +0530

    SP-BL-03R: degraded login lines, migration evidence a client can see, owed rewrites

    The second review of SP-BL-03 found three defects in the smoke suite.

    - DEGRADED-1 to 3 and 5 expected the notice on /bl version and a
      panel-unavailable line on /bl config. addon:OnInitialize registers the
      settings category, which ends in the stub's once-only
      CreateOptionsPanel, and that first printed line brings the notice with
      it, so both lines print at login. Reproduced headlessly; the checks now
      expect the two login lines, one line from /bl version, and nothing from
      /bl config.
    - INSTALL-8 and 10 looked for a [Migrate] line that no client can show:
      the ladder runs in OnInitialize and logs only when NS.State.debug is on,
      which is off at every login. INSTALL-8 now reads the stamp from the
      diagnostics [State] line, INSTALL-9 reads the stripped vendorPrice from
      the file, and INSTALL-10 watches the ladder re-run on a profile switch.
      The test_database comments and the case name no longer claim a smoke
      step reads the line; docs/test-cases.md is regenerated.
    - Pending sign-off now lists the checks whose expectations SP-BL-01
      rewrote for profiles (PANEL-27 to 29, SESS-10, DIAG-19), two of which
      now expect the opposite of master's doc.

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

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

    SP-BL-03R: restore narrowed coverage, fix degraded expectations, merge reset duplicates

    The review of SP-BL-03 found in-client coverage narrowed without a record,
    checks that could not pass, and duplicates the rework was meant to merge.

    - LOC-4 walks all of old S-27 step 4 again (S-1, S-2 and S-8 in full:
      INSTALL-1 to 7, CAPT-1, CAPT-2, LEDG-4 to 18, LEDG-21).
    - INSTALL-5 keeps old S-1 step 6's undo: clicking Show window again
      closes the ledger.
    - DEGRADED-4 now expects the one CLI-unavailable line that the degraded
      Slash stub prints. DEGRADED-11 compares against a healthy /bl list kept
      before the rename. DEGRADED-5 and DEGRADED-7 had the same stale carry-over:
      the degraded panel and console print unavailable lines rather than open,
      so the Media fallback check stays on the surfaces this state can reach.
    - PANEL-32 folds into PANEL-27. PROFILE-5 keeps only Reset Profile, and
      LEDG-27 keeps only the /reload half; the reset routes and their Yes are
      PANEL-27 and PANEL-28.
    - Pending sign-off lists only checks carried over from the pre-rework doc
      (16398dd). The new verb checks already have empty Result lines.

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

commit 04c51c484310bf3c6ea1d2a357c3731bb9f31775
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 20:54:05 2026 +0530

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

    The smoke document had grown to 1073 lines across 31 change-log shaped
    sections, with the full reset, the degraded install, window geometry,
    combat and the close marks each walked in several places, and stale
    details (a hardcoded v1.2.0, a /bl export verb that does not exist, a
    pointer to a missing S-21 step 10). Spec S4 (owner decision D4) asks for
    one deduplicated suite grouped by theme with stable IDs.

    All 246 old steps map to 219 checks in 14 themes; none dropped. The new
    PROFILE checks cover the Profiles page and the /bl profile verb (list,
    switch, unknown name, quotes, while disabled, in combat), and DEGRADED-6
    its library-absent line. The never-run S-24/S-25/S-26/S-27/S-30 checks
    and the new verb checks sit under Pending sign-off with their origin.
    The Non-English client section keeps what tests/test_docs.lua pins.
    Inbound citations in debug.md, media.md, midnight-quirks.md and two test
    comments now name the new IDs.

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

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

    SP-BL-02: /bl profile via CliProfile

    BankLedger has had AceDB profiles since SP-BL-01, but the only way to
    switch was the Profiles page. This adds the collection's shared verb
    (owner decisions D1, D3): `/bl profile` lists the profiles with the
    current one marked, and `/bl profile <name>` switches to an existing
    profile. LibKa0s-Slash-1.0 minor 17 owns the behavior (quotes stripped,
    case kept, unknown names refused and never created, combat refused), so
    the host adds one COMMANDS row after resetall and the descriptor's
    `profiles = function() return NS.db end`. A switch is db:SetProfile, so
    NS.OnProfileEvent adopts it and writes the one [Profile] line.

    `profile` has to answer while the addon is disabled, or a player on a
    profile with the addon off could only leave it through the panel. The
    library keeps it out of lib.LIVE_VERBS, so the descriptor now passes
    liveVerbs = lib.LIVE_VERBS plus HOST_LIVE_VERBS ({ "profile" }), and the
    library-absent gate's hand-copied set reads the same list. The degraded
    stub carries CliProfile and ProfileSwitch (route b: the library-absent
    line, no switch), keeping NS.Slash parity between the arms.

    Tests first: the row, the list, a switch reaching the adopt path,
    quotes and spaces, an unknown name refused with nothing created,
    already-current, combat, the disabled pin, and the degraded line; the
    verb-count, live-list and degraded-gate pins move with it. Docs:
    slash-dispatch.md, ARCHITECTURE (nineteen verbs), module-map.md,
    profiles.md, README, testing.md; test-cases.md and the badge regenerated
    (1141 -> 1150). The re-vendor bundle's Slash lookup citation no longer
    names a line this commit moves.

    Gate: 1150 passed, 0 failed; luacheck 0 warnings / 0 errors in 81 files.

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

commit 27554abd95394195ad58c7432bd4f957ce5dee43
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 12:24:31 2026 +0530

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

    Takes LibKa0s v1.63.0 from the local tag so the next commit can route
    /bl profile through the library's shared CliProfile (Slash minor 17)
    instead of writing a host copy of the verb. Slash.lua is the only file
    that moves (minor 16 -> 17, additive); the test kit is unchanged at
    revision 31 but is copied whole with the library, per the pairing rule.
    The CLAUDE.md provenance line and docs/testing.md's version-now lines
    roll in the same commit, as tests/test_vendor_sync.lua requires.

    The Slash parity case compares two host tables (the four-argument form),
    so the copy alone leaves it green and the stub members land with the
    verb. The docs/revendor/2026-09-29-v1.63.0 bundle records the delta and
    that only the minor 17 profile surface is adopted, by SP-BL-02.

    Gate: 1141 passed, 0 failed; luacheck 0 warnings / 0 errors in 81 files.

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

commit ab3128ea149b32b68db799b98eda7de6e3b4c374
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 11:45:32 2026 +0530

    SP-BL-01R: v4 reads a Default profile without the window as its implicit 30; D6 doc drift

    The v4 step fell through to "the first other profile's in name order" whenever the
    Default profile held no raw retentionDays key. In the pre-D6 v3 build the profile
    defaults declared 30 and AceDB's logout strip removes a stored default, so an absent
    key in Default IS 30. Treating it as "no value" is savedvariables-§1's forbidden
    presence test, and it let a shorter window from another profile (Alt = 7) become
    the account-wide one; the next login prune then deleted history the Default
    profile's characters kept, the exact loss D6 exists to prevent.

    The step now resolves each account-wide key once: a global value off the declared
    default is kept, otherwise the Default profile's value, reading an absent key as the
    pre-D6 profile default (frozen as V3_PROFILE_DEFAULTS, so a later change to the live
    default cannot change what that build's absent key meant). No other profile's value
    is ever promoted, and a store with no Default profile resolves to 30 the same way.
    The step is a strict no-op when no profile holds the key. Two new tests (the
    reviewer's fixture, which also runs the prune, and the no-Default store) were red
    against the previous step and are green now.

    Docs: the ARCHITECTURE at-a-glance row, schema.md's GLOBAL_ROWS sentence and v4
    precedence, and profiles.md's scope table and v4 paragraph now say that retention
    and the Minimap button are account-wide and that Default's implicit 30 wins. The
    withLedger comment no longer claims the adopt path prunes. Inventory regenerated
    (1141), README badge updated, and the two smoke-tests.md citations of
    core/Database.lua re-pointed (+17 lines).

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

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

    SP-BL-01R: pin v4's default comparison with AceDB's backfill; fix the :13 citation

    The v4 migration counts a db.global value as the player's choice only when it
    differs from the declared default (savedvariables-§1), but no test pinned it:
    the mock AceDB keeps scalar defaults behind __index, while real AceDB
    copyDefaults rawsets retentionDays = 30 into db.global before v4 runs. A
    presence-only mutation therefore stayed green, though in the client it would let
    the backfilled 30 beat the Default profile's value and undo a player's Always (0).
    The v4 "winner" fixture now writes that backfill itself; the test stays green on
    the shipped rule and goes red under the presence-only mutation (verified in a
    scratch copy).

    The .luacheckrc core/Database.lua stanza cited NS:RunMigrations() at :13; the
    InitDB header comment grew a line in 78ed368 and the call is now at :14.

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

commit 78ed3683b713066dfdb9b1c102ed0da009407286
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 11:16:15 2026 +0530

    SP-BL-01R: retention stays account-wide (D6); name the reset veto; fix two citations

    Owner decision D6 (2026-09-29): settings that govern recorded data stay in
    db.global, and no profile switch, copy or reset may prune or delete history.
    The SP-BL-01 review found that per-profile retention plus a prune on every
    profile event let a switch to a shorter-window profile delete history every
    other profile still showed.

    - The retention window lives at db.global.settings.retentionDays again (the
      key v2 always used, so the CLI path is unchanged). defaults/Global.lua
      declares it, defaults/Profile.lua no longer does, and the schema row carries
      its own get/set onto db.global. Its tooltip says it is account-wide.
    - Schema v4. NS.MIGRATIONS[3] no longer lifts NS.GLOBAL_SETTINGS keys out of
      db.global.settings. NS.MIGRATIONS[4] repairs a store the earlier v3 build
      wrote. It walks every stored profile raw and takes retentionDays out of
      each. A player choice already in db.global wins, then Default's value, then
      the first other profile's. The step is idempotent and does nothing on a v2
      upgrade.
    - The adopt path runs no prune. PruneOld reads the global window through
      Database:RetentionDays, and its quietIfNone flag is gone with its only
      caller. The retention row joins S.RESET_EXEMPT, so a row sweep cannot put
      Always back to 30 days, and the reset's row count skips S.GLOBAL_ROWS.
    - The reset veto is named once, as S.VetoedFromResetAll (the Profiles page and
      every stored row), and passed as the Options descriptor's skipRestoreAll,
      per options-ui-§3/§12. That is the same shape KickCD, WhatGroup, PrettyChat
      and LootHistory ship. The Profiles page is keyed by S.PROFILES_PAGE.
    - Citations: smoke-tests.md now cites core/Database.lua:480-511 for
      accumulateItemTaxonomy and :376/:393 for the two :lower() calls.
      common-tasks.md cites settings/Schema.lua:796 for NS.COMMANDS.
    - Docs: profiles.md lists retention under account-wide and drops the
      per-profile retention and [Prune] passages. schema.md gains a v4 section.
      settings-panel.md, ARCHITECTURE.md, module-map.md, testing.md, debug.md,
      common-tasks.md, README and smoke tests (v4 stamp, and a D6 check in S-30)
      now match the code.
    - Tests: switching, copying, resetting a profile and the global reset leave
      recorded history and the window untouched with no [Prune] line; retention
      writes land in db.global and every profile and the prune read that value; a
      stale profile copy is ignored; the tooltip names the scope. The v3 test
      checks the window stays; four v4 tests cover the move, the winner,
      idempotence and the no-op case. Three veto tests cover what it vetoes, the
      skipRestoreAll wiring, and the library walk keeping the window and history.
      1127 -> 1139 cases. test-cases.md and the badge are regenerated.

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

commit 82444f063d4afbe8b678b68898f6854ab6295ffe
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date:   Tue Sep 29 10:09:45 2026 +0530

    SP-BL-01R: quiet the adopt path's no-op prune; correct the stale reset and root docs

    The review of SP-BL-01 found three docs still describing the pre-v3 storage and one
    logging gap.

    The docs: settings-panel.md said the General page's Defaults runs the wholesale reset
    "recorded history included", and that the reset holds the minimap table across its
    wipe. Since SP-BL-01 Yes runs db:ResetProfile(), which keeps the account-wide ledger,
    and the minimap table sits in db.global, which no profile event reaches. module-map.md
    still named the NS.db.global schema root; resolveRoot answers NS.db.profile. All three
    now say what the code does.

    The logging gap: every profile event runs the retention prune, and under the shipped
    30-day window PruneOld always wrote "[Prune] retention 30d: removed 0 entries", so one
    switch, copy or reset logged two lines where debug-logging-§10 and profiles.md promise
    one. The fixtures hid it by setting retentionDays = 0 and filtering by tag. PruneOld
    now takes quietIfNone; the adopt path passes it, so a prune that removes nothing is
    silent there, while login and a retention change keep their trace. A prune that does
    remove history still logs, because that is a material effect the act's line cannot
    show. profiles.md, ARCHITECTURE.md and schema.md say so.

    Two tests: one keeps the default retention and counts every line a switch, a copy and
    a reset write (only the views' debug-logging-§9 render-pass summaries are set aside),
    and goes red without the flag; one pins that a prune which removes a row still reports
    it. Tests 1125 -> 1127; test-cases.md and the README badge regenerated.

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

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

    SP-BL-01: settings move into AceDB profiles, with a Profiles page and a v3 migration

    Owner decision D5 (2026-09-29): Bank Ledger gains profile support, settings
    only. Every schema row, both item-id filter lists and the saved view now live
    in db.profile; the recorded ledger, LibDBIcon's minimap table and the schema
    stamp stay account-wide in db.global. Every character starts on the shared
    Default profile, so an upgrade changes nothing a player sees.

    - defaults/Profile.lua is created and defaults/Global.lua keeps only the
      ledger, the minimap table and the stamp (savedvariables-§2). The Schema
      runtime, NS.Filters, the windows' geometry and the saved view resolve
      against db.profile.
    - Schema v3: NS.MIGRATIONS[3] lifts each stored settings/blacklist/whitelist/
      savedView value from db.global into the raw Default profile and clears it
      from global. It runs before anything reads db.profile, is idempotent, and
      never touches the ledger.
    - One adopt path, NS.OnProfileEvent, for OnProfileChanged, OnProfileCopied and
      OnProfileReset: migrations, the enable latch, one SettingsChanged("profile")
      and one LedgerChanged, every setting's effect re-applied (geometry, saved
      view, chrome, visibility, row tint, retention), the panel refreshed, and
      exactly one debug line (debug-logging-§10). A reset also ends the
      session-only rows, so the Profiles page's Reset Profile is the same act.
    - The global reset is now db:ResetProfile() with options-ui-§12's first
      canonical wording. The standard's "addon with both" clause keeps the
      account-wide store out of a settings reset, so /bl resetall and the Defaults
      controls no longer delete recorded history; /bl purge still does.
    - settings/Profiles.lua: AceDBOptions in a canvas subcategory registered after
      General, no Defaults button (options-ui-§3). AceConfig-3.0 and
      AceDBOptions-3.0 are vendored from the collection's Ace3 release (identical
      to AuraMaster, KickCD, ConsumableMaster, MultiMeters, AbsorbTracker and
      PartyFrameEnhanced) and listed in the TOC and DEPENDENCIES.md.
    - The savedvariables-§2 deviation row is retired (the addon now conforms), and
      every doc that said the addon has no profiles is corrected; docs/profiles.md
      is new and registered in the Documentation map.
    - Tests: the AceDB fake in tests/wow_mock.lua gains a lazy profile, switch/
      copy/reset/delete and the three callbacks, plus AceConfig recorders.
      tests/test_profiles.lua covers the defaults split, the v3 lift (values land,
      global cleared, ledger untouched, idempotent), reads against the profile,
      switch/copy/reset handling and the page; the reset suites now pin a profile
      reset that keeps history. 1104 -> 1125 cases; test-cases.md and the badge
      are regenerated.

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

This mod has no additional files