Repository navigation
Releases: sjdodge123/ledger-link
Releases · sjdodge123/ledger-link
Release list
v1.3.3
Ledger Link
v1.3.3 (2026-10-13)
Full Changelog Previous Releases
- Merge pull request #31 from sjdodge123/feat/probe-s8-ah-deposits
feat: /rl probe S8 - auction house deposits per bag stack - feat: /rl probe S8 - auction house deposits per bag stack
Run at the auction house: for each tradeable bag stack (commodity or item),
the deposit C_AuctionHouse would charge for 12h / 24h / 48h, for the whole
stack and one unit, next to its vendor price, so Mailworthy can learn deposit
as a share of vendor price. Signatures from Forever's generated API docs.
Calculations only: nothing is posted (spec asserts it).
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com - Merge pull request #27 from sjdodge123/test/sync-contract-rok1758
test: re-sync contract to Raid Ledger 2406d73e (ROK-1758, ROK-1760, ROK-1756) + cross-checks - test: re-sync contract/v1 to Raid Ledger 2406d73e (ROK-1756 export clock window)
Raid Ledger #1568: every exportedAt (+ guild data.snapshotAt) must be within
+1 day / -365 days of the server clock; raid pulls get only the +1 day
bound; otherwise INVALID_PAYLOAD. Docs-only re-sync (CONTRACT.md §6,
CHANGELOG); schema.json, fixtures and the wire format unchanged.
spec/support/import.lua mirrors the rule with an explicit clock (opts.now).
contract_spec pins Raid Ledger's golden fixtures to 2026-09-21 + 1 h like
Raid Ledger's pin-export-clock.ts, and checks beta strings against the real
clock. spec/clock_window_spec.lua (5, written to fail first) covers the
bounds, the guild snapshot and raid-pull future-only rule; the pinned clock
is mutation-checked. README notes the generated strings age out of the real
decoder's window after 2027-09-21.
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com - test: re-sync contract/v1 to Raid Ledger b3823e0b (ROK-1760 decoded gear name/quality)
Raid Ledger #1566 decodes the item name (|h[...]|h) and quality (IQ) from
the raw gear link the addon already sends; the 8 char-/mixed-char- fixture
.json views now include them (additive; .txt pastes, schema.json and the
wire format unchanged).
New contract_spec check: every decoded gear name must appear bracketed in
the matching raw link (mutation-checked).
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com - test: re-sync contract/v1 to Raid Ledger 6a4d8eab (ROK-1758 fixture fix); check fixture talent hints
Raid Ledger #1565 regenerated char-forever-talents-named so its tree/row/col
hints match CONTRACT §3's posX/posY derivation (golden fixture correction,
no format change; schema.json unchanged).
New contract_spec check: TalentGrid recomputes tree/row/col from posX/posY
for every fixture node that carries hints and must agree. Against the
pre-ROK-1758 fixture it fails (node 105901), so hint drift on either side
is caught.
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
v1.3.2
Ledger Link
v1.3.2 (2026-10-13)
Full Changelog Previous Releases
- Merge pull request #30 from sjdodge123/feat/probe-s6-smart-nav
feat: /rl probe - smart navigation (S6), price age (S5), bag-slot menu (S7) - feat: /rl probe S7 - the gamepad "More" menu on a bag slot
A second addon wants a "Lock slot" entry in the menu Triangle opens on a bag
item. S7 lists the context-action labels, context/menu mixins and the Menu /
MenuUtil API (Menu.ModifyMenu), and a passive post-hook (hooksecurefunc) on the
menu manager records each menu opened since login: method, owner frame, tag and
entry texts. The hook only reads; it never changes a menu.
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com - feat: /rl probe - targeted smart-navigation dump (S6) and price age (S5)
The v1.3.1 report showed Forever's controller UI is Blizzard's "smart
navigation": gamepadFooter tables, "...FooterinputLegend" frames,
smartNavigationFocusKey, C_Navigation and gamepad mixins. S6 drops the broad
global scans (answered, and they crowded out the useful tables) and instead
dumps the mail windows' footer tables and legend frames, every gamepad-related
mixin, navigation namespaces, InputPromptLegends and gamepad/cursor/smartnav
CVars (ConsoleGetAllCommands, since C_Console is missing).
S5 item lines add Auctionator's price age and exactness and the modern AH's
commodity status. README records the first report's answers.
Read-only; no wire-format change.
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
v1.3.1
Ledger Link
v1.3.1 (2026-10-13)
Full Changelog Previous Releases
- Merge pull request #29 from sjdodge123/feat/probe-s6-gamepad-ui
feat: /rl probe S6 - Forever's built-in gamepad UI discovery - feat: /rl probe S6 - Forever's built-in gamepad UI discovery
The Forever client has its own controller UI (L2/R2 cycle windows, L1/R1
switch tabs, a footer of glyph hints such as "Square Open All"). S6 finds what
drives it so a second addon's windows can join it: globals named like the
gamepad UI, the functions of gamepad/glyph/footer/hint/prompt-named tables,
the mail frames' own fields and child frame names, and gamepad/cursor CVars.
S5 now also checks for ForeverMail, which replaces the mailbox window.
Read-only: nothing found is called. No wire-format change.
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
v1.3.0
Ledger Link
v1.3.0 (2026-10-13)
Full Changelog Previous Releases
- Merge pull request #28 from sjdodge123/feat/probe-s5-mailer-discovery
feat: /rl probe S5 - mailer discovery for a second addon - feat: /rl probe S5 - mailer discovery (price addons, bag values, mail/AH/gamepad APIs)
Discovery for a second addon that mails bag items worth more on the auction
house (or disenchanted) to a bank alt. Adds S5 lines to /rl probe: price
addons and their saved tables / APIs (Auctionator, Disenchantry, TSM), every
bag item with vendor / AH / disenchant / TSM price and bound/quest flags, and
the mail, auction, settings, auto-complete and gamepad-binding APIs.
Read-only: nothing is mailed, bound, auto-completed or exported, and no player
name is printed. Nothing in the wire format changes.
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
v1.2.0
Ledger Link
v1.2.0 (2026-10-10)
Full Changelog Previous Releases
- Merge pull request #26 from sjdodge123/feat/phase2-forever-fields
feat: Phase 2 - gender, full talent tree with positions and names, quests - feat: Phase 2 - gender, every talent node with positions and names, quests
Emits the fields Raid Ledger published in contract/v1 (3b4418ff, ROK-1742):- who.gender from UnitSex (2 male, 3 female; else left out), in every section
- every talent node of every tree, rank 0 included, with entryId (active, or
the only entry), spellId + name (C_Traits entry -> definition -> spell,
C_Spell.GetSpellName or GetSpellInfo), maxRanks, raw posX/posY (rounded)
and the tree/row/col hint from TalentGrid; a hint outside the contract
range is dropped and the raw position kept - data.quests: completed ids ascending, capped at 10 000 with
completedTruncated + a chat note; up to 35 quest-log quests with title and
up to 10 objectives (text, done, have, need); absent without C_QuestLog - ns.Clip no longer splits a UTF-8 character when it truncates
Size, same character before/after: char token 726 -> 2558 bytes (+1.8 KB),
JSON 940 -> 9043 bytes; nodes 1 -> 52.
Tests: spec/phase2_spec.lua (11, written to fail first); char_export_spec
now expects every node; new export case char-forever-phase2 passes the
schema and Raid Ledger's merged decoder (3b4418ff). Rank-0 and sort
mutation-checked. CurseForge description + README updated.
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
- test: re-sync contract/v1 to Raid Ledger 3b4418ff (ROK-1742 Phase 2 fields)
Additive, still v1: who.gender; talents.nodes[] name/spellId/maxRanks/posX/
posY/tree/row/col; data.quests { completed <= 10 000, completedTruncated?,
inProgress <= 35 with objectives <= 10 }. CONTRACT.md §3 states the talent
grid rule the addon pinned in TalentGrid.lua. New fixtures: char-forever-
quests (10 000 completed), char-forever-quests-truncated, char-forever-
talents-named; invalid gender-unknown-value, quests-completed-over-cap.
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
v1.1.3
Ledger Link
v1.1.3 (2026-10-09)
Full Changelog Previous Releases
- Merge pull request #25 from sjdodge123/feat/probe-s4-dungeon-legacy
feat: /rl probe S4 - dungeon run, talent grid, legacy talents/challenges discovery - feat: /rl probe S4 - dungeon, pulls, quest tags, talent grid, legacy discovery
Operator 2026-10-09: put as much as possible in the probe before a dungeon
run; "legacy talents" are a new Forever progression feature and "legacy
challenges" are achievement-like. New S4 lines, read-only, every function
looked up by name (missing / error: / value):- group: IsInGroup/IsInRaid/counts; party1-4 GUID and name readability
(never the values) - instance: difficulty ids, zone texts, C_Map.GetBestMapForUnit ->
GetMapInfo, EJ_GetInstanceForMap -> EJ_GetInstanceInfo - the last 5 recorded pulls (encounter, difficulty, size, success, roster)
- every quest-log quest: level, suggestedGroup, frequency, isComplete,
C_QuestLog.GetQuestTagInfo; IsQuestFlaggedCompleted for the dungeon watch
list; GetSavedInstanceInfo for up to 5 lockouts - every talent node with tree/row/col from the new TalentGrid module, rank
and name - discovery: globals named legacy|forever|challenge (names only, never
called) and the functions in such C_ namespaces; C_Traits systems 1-300
that have a config (name, type, trees, node counts, currency);
achievement points, categories, and legacy/challenge categories' first
achievements - item level, XP, rested XP, professions, skill lines
TalentGrid.lua (shared with Phase 2): tree = posX cluster (gap > 2000; a
sub-tree's widest internal gap is 1800), col/row rounded to the 600 grid,
rows from 2130.
Tests: spec/talent_grid_spec.lua (4), spec/probe_s4_spec.lua (10), all
written to fail first. Two test-only bugs found and fixed on the way: a
1.5-step cluster gap split sparse sub-trees (now 2000), and S4 spec cleanup
nil'd stub globals (now restored).
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
- group: IsInGroup/IsInRaid/counts; party1-4 GUID and name readability
- Merge pull request #24 from sjdodge123/feat/probe-dungeon-quest-ids
feat: /rl probe checks Classic dungeon quest ids (ROK-1748) - feat: /rl probe checks Classic dungeon quest ids (Raid Ledger ROK-1748)
Raid Ledger's dungeon-quest feature keys vanilla dungeon quests by their
Classic ids. /rl probe now reports, from the completed-quest list it
already reads, whether a watch list of Classic dungeon quest ids is
completed: Ragefire Chasm 5728/5761, Deadmines 141/166, Wailing Caverns
2040/2039, Stockade 1053 (list from the Raid Ledger Lead). Run after doing
one of those dungeons. Read-only; nothing exported.
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com - Merge pull request #23 from sjdodge123/docs/s3-talent-layout
docs: Paladin probe - round to the 600 grid (posX 5020/5030), 50 nodes - docs: Paladin probe - posX can be off by ~10 (5020/5030), 50 nodes; round to the 600 grid
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com - Merge pull request #22 from sjdodge123/docs/s3-talent-layout
docs: S3 talent layout confirmed (3 sub-trees x 4 columns x 7 rows) - docs: Druid probe confirms the shared talent grid (same 12 posX / 7 posY values)
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com - docs: S3 talent layout confirmed - 3 sub-trees x 4 columns x 7 rows, 600 apart
From the tester's v1.1.2 probe: posX clusters into three groups of four
columns (17/17/18 nodes; the middle one holds the Fury talents), posY into 7
rows from 2130, all 600 apart. tree = column group, col = (posX - group's
first posX)/600, row = (posY - 2130)/600; the groups start at 1020, 5020 and
9080, so col is measured per group. One class probed so far.
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
v1.1.2
Ledger Link
v1.1.2 (2026-10-09)
Full Changelog Previous Releases
- Merge pull request #21 from sjdodge123/docs/s3-probe-results
S3 Phase 1 probe results + talent position values in /rl probe - fix: keep docs/ out of the addon zip (.pkgmeta ignore)
CI's package job built the zip with LedgerLink/docs/raid-ledger-s3-probe-*.md
inside, and tools/check-package-layout.sh rejected it (not loaded by the
.toc). docs/ is repo-only, like media/ and contract/.
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com - Merge remote-tracking branch 'origin/main' into docs/s3-probe-results
- docs+feat: S3 Phase 1 probe results; /rl probe lists talent posX/posY values
docs/raid-ledger-s3-probe-2026-10-09.md answers Raid Ledger's S3 request
Phase 1 from the tester's v1.1.1 probe (build 1.60.1.70291, level 8 warrior):
every API exists and returns data, nothing threw; one C_Traits tree (1117,
52 nodes; posX 12 distinct, posY 7 distinct), entry -> definition -> spell ->
name works; 40 completed quests at level 8; quest log + objectives
(text/finished/numFulfilled/numRequired/type); char token 970 bytes, 40
quest ids add ~180 bytes encoded. Still open: max-level completed count,
exact talent row/column mapping.
/rl probe now also prints every distinct talent posX and posY value with its
node count, to state that mapping exactly.
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com - Merge pull request #20 from sjdodge123/test/beta-export-all-fixture
test: first real beta Export all paste as an anonymised fixture - test: first real Export all paste from the beta as an anonymised fixture
The tester's v1.1.0 Export all (char + guild, build 1.60.1.70291) decodes with
Raid Ledger's merged decodeImportPaste: level 8 warrior, ruleset pvp, 10 gear,
1 ranked talent node, guild 208 members / 33 online / 208 unique GUIDs,
exporter listed, 1 public note (the setting is on), canViewOfficerNote false.
Saved anonymised as spec/fixtures/beta/all-char-guild208-v1.1.0.txt (830
personal strings; 0 left per an independent check). contract_spec validates it
through the mixed-paste mirror.- anonymise.lua: realm fields (public) are checked whole, not word by word, so
a member whose name shares a word with the realm doesn't block the tool. - verify-with-raid-ledger.sh: beta-all-* files are Export all pastes too.
- README: the beta now reports GetCurrentRegion() = 110 (build 70291; was 90).
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
- anonymise.lua: realm fields (public) are checked whole, not word by word, so
v1.1.1
Ledger Link
v1.1.1 (2026-10-09)
Full Changelog Previous Releases
- Merge pull request #19 from sjdodge123/feat/probe-s3-request
feat: /rl probe covers Raid Ledger's S3 request (gender, talents, quests, size) - feat: /rl probe covers Raid Ledger's S3 request (gender, talents, quests, size)
Raid Ledger asked (planning-artifacts/LEDGERLINK-S3-REQUEST-2026-10-09.md,
Phase 1) for beta probes before any new export field. /rl probe now ends with
"S3" lines, read-only and pcall-wrapped (missing / error: / value):- UnitSex("player")
- talents: config, trees, node count and ranked count, posX/posY ranges with
distinct counts, and up to 3 nodes resolved entryID -> definitionID ->
spellID -> name (C_Spell.GetSpellName or GetSpellInfo), stopping at the
first missing value - C_QuestLog.GetAllCompletedQuestIDs count + first 5 ids
- quest log: GetNumQuestLogEntries, the first 8 GetInfo rows (headers,
questID, title) with GetQuestObjectives - size: the char token now, and what the completed-quest list would add
encoded (Export.EncodedSize, same codec settings) and as JSON
No wire format change: nothing new is exported.
Tests: spec/probe_s3_spec.lua (7, written to fail first).
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
v1.1.0
Ledger Link
v1.1.0 (2026-10-09)
Full Changelog Previous Releases
- Merge pull request #18 from sjdodge123/feat/single-export-button
feat: one Export to Raid Ledger button; per-section exports as optional commands - feat: one Export to Raid Ledger button in the panel; per-section exports become optional slash commands
Operator 2026-10-09: simplify the in-game UI. The panel's Character / Guild /
Raid / Export all buttons are replaced by a single, taller "Export to Raid
Ledger" button that makes the one-paste export (char + guild pages + raid,
CONTRACT.md §5.1). /rl export char|guild|raid|all all still work; /rl help
lists export all first and the per-section ones as optional. The panel is
36px shorter.
CurseForge description (media/) and README match: one button in How to use,
a note that missing parts (no guild, no pulls) are left out, and the command
table framed as optional, incl. Hardcore detection and the region guess.
Tests: ui_spec asserts the single button makes the char/guild/raid paste and
that the old buttons no longer exist; focus and window tests use the new
button. luacheck caught a leaked global (x) from the removed block; fixed.
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com - Merge pull request #17 from sjdodge123/feat/region-guess-from-locale
feat: guess the region from the game language (no /rl region needed) - Merge main (Hardcore detection #16) into feat/region-guess-from-locale
Conflicts kept both: /rl status prints the detected-aware ruleset (#16) and
the guessed-aware region (#17); README lists both changes.
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com - feat: guess the region from the game language when the client doesn't report one
Operator 2026-10-07: players shouldn't have to type /rl region. On live,
GetCurrentRegion() is expected to return 1-4 and is used as before. Where it
doesn't (the beta returns 90), the addon now sends the player's /rl region
pick if any, else a region guessed from GetLocale() (enUS/esMX/ptBR -> us;
enGB/deDE/frFR/esES/itIT/ruRU/ptPT -> eu; koKR -> kr; zhTW -> tw; zhCN -> cn;
unknown -> us). Exports no longer refuse for a missing region. The guess is
never saved and is shown as one: the panel's region row ("Region: EU
(guessed, click to change)", highlighted button) and /rl status.
Identity.Region() returns (id, source = client|set|guessed); RegionName /
RegionText feed the panel and status. Tests rewritten for the new rule
(language table, pick beats guess, shown as guessed; mutation-checked); new
export case char-beta-region-90-guessed-from-enGB passes the schema and Raid
Ledger's decoder (region 3).
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com - Merge pull request #16 from sjdodge123/feat/hardcore-detect
feat: auto-detect the Hardcore ruleset - feat: auto-detect the Hardcore ruleset (C_GameRules.IsHardcoreActive)
The client has no realm-type API. When the player hasn't picked a ruleset
and C_GameRules.IsHardcoreActive() returns exactly true, the export sends
who.ruleset = "hardcore" (existing field, no contract change). The player's
own pick always wins; a missing, failing or non-true result means not
detected. Identity.Ruleset()/RulesetText() feed the export, the panel (label- highlighted button), the minimap tooltip and /rl status, which show
"hardcore (detected)".
IsHardcoreActive() returning true on a Hardcore character is unverified on
the beta (README Beta unknowns): needs a /rl probe from one.
Tests: spec/ruleset_detect_spec.lua (5, written to fail first; the
exactly-true rule is mutation-checked); new export case
char-hardcore-detected passes the schema and Raid Ledger's decoder.
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
- highlighted button), the minimap tooltip and /rl status, which show
- Merge pull request #15 from sjdodge123/docs/curseforge-description-1.0
docs: CurseForge description for v1.0.0 - docs: CurseForge description for v1.0.0
Rewritten for what 1.0 does: the panel + minimap button, Export all (one
paste), click-the-text-then-Ctrl+C (the addon no longer pre-focuses), the
full command list (/rl, export all, region, minimap, probe, help), what each
export contains, privacy, and a feedback section (CurseForge comments +
/rl probe) instead of the alpha status note. cn is left out of the region
row: Raid Ledger can't import China-region characters.
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
v1.0.0
Ledger Link
v1.0.0 (2026-10-06)
Full Changelog Previous Releases
- Merge pull request #14 from sjdodge123/fix/region-cn-warning
fix: warn that Raid Ledger can't import China-region characters - Merge pull request #13 from sjdodge123/feat/export-all
feat: Export all (one paste) + re-sync contract to Raid Ledger ROK-1737 - fix: warn that Raid Ledger can't import China-region characters (/rl region cn, panel CN)
Raid Ledger characters are us/eu/kr/tw only (WowRegionSchema) and WoW:
Forever has no China region, so a cn string decodes and then fails at import
with REGION_MISMATCH (ROK-1724 spec §4.3, confirmed by the Raid Ledger
session). The wire format still allows 5, so cn stays selectable; ns.SetRegion
now warns for it from both the slash command and the panel.
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com - feat: Export all - char, guild pages and raid in one paste (/rl export all + panel button)
Raid Ledger ROK-1737 (fff6319) accepts one paste carrying one char string,
one complete guild export and one raid string. /rl export all and the
panel's "Export all (one paste)" button show them in one copy box, one per
line, each in its unchanged single-section format. No guild or no recorded
pulls: that section is left out with a chat note. The guild roster is
awaited like /rl export guild. Over 256 KB: refused with a hint to export
the guild separately. The panel grows by one row.
Tests: spec/export_all_spec.lua (7, written to fail first); three all-* export
cases join the schema check; verify-with-raid-ledger.sh uses decodeImportPaste
when the Raid Ledger checkout has it (else skips all-* strings).
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com - test: re-sync contract/v1 to Raid Ledger fff6319 (ROK-1737 mixed paste)
contract/v1 now carries the mixed-paste rules (CONTRACT.md §5.1): one paste
may hold one char, one raid and one complete guild export, any order, up to
10 tokens; every section shares who.guid, client.region and the realm-less
exporter name, exportedAt within 600 s; duplicates -> PAGES_INCOMPLETE;
all-or-nothing. New fixtures: mixed-char-raid, mixed-char-guild3-raid-shuffled
({ sections: [...] }, canonical char -> guild -> raid), and invalid
mixed-two-char / -guild-incomplete / -11-tokens / -different-exporters /
-different-region. Guild fixtures now list the exporter (ROK-1724 PR-B).
schema.json unchanged.
spec/support/import.lua mirrors decodeImportPaste's order (size, empty, token
cap, headers, group per section, decode, same exporter) and returns groups;
contract_spec validates every section and compares { sections } fixtures.
Same-exporter rule mutation-checked.
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com - Merge pull request #12 from sjdodge123/fix/panel-layout-overlap
fix: panel spacing; export window no longer see-through over the panel - fix: panel spacing; export window no longer overlaps the panel see-through
Beta feedback on alpha7: "Recorded boss pulls" collided with the Beta probe
button, and the export window opened on top of the panel with the
translucent dialog background, so the two were hard to tell apart.- The panel hides whenever an export or probe window actually opens (from the
panel or a slash command); it stays up if the export can't run. - Both windows use a solid dark fill (ChatFrameBackground, alpha 0.95).
- Panel is 330px tall; pulls/Clear and Beta probe are separate rows.
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
- The panel hides whenever an export or probe window actually opens (from the
- Merge pull request #11 from sjdodge123/docs/gamepad-fix-confirmed
docs: second beta probe - ruleset lead (GameModeRecordID), Skyborne race - docs: second beta probe - GameModeRecordID 14 (PvP) vs 15 (PvE); Skyborne race
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com - Merge pull request #10 from sjdodge123/feat/minimap-panel-icon-v2
feat: minimap button, Ledger Link panel, addon list icon - Merge pull request #9 from sjdodge123/docs/gamepad-fix-confirmed
docs: gamepad blocked-action fix confirmed on alpha6 - feat: minimap button, Ledger Link panel, addon list icon
- /rl (or the minimap button) opens a panel: Character/Guild/Raid export,
ruleset buttons (current one highlighted), region buttons only when the game
doesn't report a region (beta), public-guild-notes checkbox, recorded pull
count with Clear, Beta probe. Every control calls the same function as its
slash command (ns.RunExport/SetRuleset/SetRegion/SetGuildNotes/ClearPulls),
and slash changes refresh the panel. - Minimap button (no library): click toggles the panel, drag moves it around
the edge (angle saved), tooltip shows ruleset + pull count;
/rl minimap on|off. /rl help lists commands. -
IconTexture shows the logo in the AddOns list instead of the red "?".
- UI.lua: window/button helpers shared with the export window.
- No control moves keyboard focus (tested), per the gamepad crash fix.
- check-package-layout.sh allows Textures/*.tga|blp and checks the
IconTexture file is in the zip.
- /rl (or the minimap button) opens a panel: Character/Guild/Raid export,
- feat: addon textures - list icon and round minimap icon (uncompressed 32-bit TGA)
Textures/Icon.tga (rounded tile, from media/logo.svg) and Textures/Minimap.tga
(round variant, media/icon-round.svg), 64x64. macOS sips writes RLE TGA;
tools/tga-uncompress.py rewrites them as type 2, which the client loads.
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com - docs: gamepad blocked-action fix confirmed on v0.1.0-alpha6
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com - Merge pull request #8 from sjdodge123/fix/no-programmatic-focus
fix: never move keyboard focus from the addon (gamepad 'blocked action' popup + crash) - fix: never move keyboard focus from the addon (beta gamepad 'blocked action' + crash)
The tester's chat showed the blocked function: SetPreferredGamepadInteractTarget()
(playing with a gamepad). The export window called editBox:SetFocus() while
the game was still handling the /rl chat command; the gamepad UI reacted to
the focus change inside that addon-started call chain, the game blocked it,
and any click afterwards crashed the client. The roster request (#7) was not
the cause.
The addon no longer calls SetFocus anywhere: the export/probe window opens
with the text highlighted, and clicking the text (focus moved by the game)
selects all of it (OnEditFocusGained + OnMouseUp). The Select all button,
which also called SetFocus, is gone. spec/focus_spec.lua fails if SetFocus
returns on any export, page change or probe (mutation-checked).
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com - Merge pull request #7 from sjdodge123/fix/guild-no-roster-request
fix: never request the guild roster (beta 'blocked action' popup + client crash) - Merge pull request #6 from sjdodge123/test/beta-guild-fixture
test: real beta guild export as anonymised fixture; precise anonymiser leak check - fix: never request the guild roster from the addon (beta 'blocked action' popup)
On the beta, /rl export guild raised "LedgerLink has been blocked from an
action only available to the Blizzard UI", and any button on that popup
crashed the client (so the ADDON_ACTION_FORBIDDEN record never reached
SavedVariables). By elimination: /rl probe and /rl export char use the same
window, roster reads and encoding without the popup; the guild export alone
called C_GuildInfo.GuildRoster(). The addon no longer requests the roster:
it exports what the client has, or asks the player to open the Guild window
and exports on GUILD_ROSTER_UPDATE. Test fails if any roster request returns
(mutation-checked).
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com - test: first real beta guild export as an anonymised fixture; precise leak check in anonymise.lua
The tester's /rl export guild (39 members, 27 online, 12 with lastOnlineDays,
no notes, canViewOfficerNote false, exporter listed, no -realm suffixes)
decodes with Raid Ledger's real decoder with zero errors. Saved anonymised
as spec/fixtures/beta/guild-39-members-1-page.txt (157 personal strings).
anonymise.lua's leak check was a raw substring search, so a 2-letter name
part matched inside the JSON key "fullName". It now checks every string
value whole and word by word (keys excluded) and reports the path, never
the personal string. Verified independently: 0 of 157 originals remain.
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com - Merge pull request #5 from sjdodge123/fix/blocked-action-capture
fix: record actions the game blocks; first anonymised beta fixture - Merge main (beta probe docs) into fix/blocked-action-capture
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com - fix: record actions the game blocks (function + preceding command); first anonymised beta fixture
On the beta the client showed "LedgerLink has been blocked from an action
only available to the Blizzard UI" and crashed on Ignore. The addon now
listens for ADDON_ACTION_FORBIDDEN / ADDON_ACTION_BLOCKED, keeps the newest
10 for LedgerLink with the /rl command that preceded t...