Skip to content

Releases: sjdodge123/ledger-link

v1.3.3

Choose a tag to compare

@github-actions github-actions released this 13 Oct 17:28
f2fb1b6

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

Choose a tag to compare

@github-actions github-actions released this 13 Oct 15:14
c3cff2e

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

Choose a tag to compare

@github-actions github-actions released this 13 Oct 15:02
8a8699b

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

Choose a tag to compare

@github-actions github-actions released this 13 Oct 14:33
1ed1f78

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

Choose a tag to compare

@github-actions github-actions released this 10 Oct 15:36
e2fad45

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

Choose a tag to compare

@github-actions github-actions released this 09 Oct 21:16
b3c504b

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
  • 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

Choose a tag to compare

@github-actions github-actions released this 09 Oct 19:48
87c35ed

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

v1.1.1

Choose a tag to compare

@github-actions github-actions released this 09 Oct 19:08
c86edfd

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

Choose a tag to compare

@github-actions github-actions released this 09 Oct 18:23
bcf6089

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
  • 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

Choose a tag to compare

@github-actions github-actions released this 07 Oct 14:40
7fbbcb4

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
  • 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.

    Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
  • 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...
Read more