RaidKit
Changelog
Every release across the tools, newest first.
- Raid Ledger2026-09-12
- Private reports open through the viewer's own Warcraft Logs connection: public and unlisted reports still use the site client, a not-found is retried with your token, and cached private data is served only after Warcraft Logs confirms your access on that request.
- Report header now records visibility and owner; private reports never appear in Recent reports.
- User tokens refresh through the refresh-token grant near expiry; a refused refresh asks you to reconnect.
- Error notices show the next step beside the message: Sign in, Connect Warcraft Logs or Reconnect Warcraft Logs.
- Raid Ledger2026-09-11
- Connect Warcraft Logs: an OAuth provider for warcraftlogs.com, Continue with Warcraft Logs on the sign-in page (for accounts that already connected it), and Settings > Connections with Connect, Reconnect and Disconnect.
- Only Warcraft Logs tokens are stored (with your username there); disconnecting deletes them and is refused if it would remove the only way into the account.
- RaidKit branding: site name, header wordmark and a homepage that leads straight into Raid Ledger with a plain form that works before JavaScript loads.
- Report cache and the first pages: three database models cache the report header, per-fight snapshot and whole-report consumables lines; reports that ended in the last day are re-checked so a log loaded mid-raid does not stay frozen.
- /ledger takes a report URL, /ledger/<code> lists boss fights, and /ledger/<code>/sr, /gear and /consumables run the engine on the server and hand a finished table to a sortable client table.
- Race and talent settings come from the seed files until guild settings exist.
- Warcraft Logs client in TypeScript, verified live: report header with trash flagged and ability names, fight snapshot from the Summary table and CombatantInfo events, and whole-report consumables lines with the boss-snapshot and trash-carry-forward rule.
- One token source serves both the site's own client and a signed-in user's token; the live smoke test reproduces the Python numbers.
- Engine ported from the wow-audit Python tool to TypeScript with parity tests: the Anniversary rules module, offline item, enchant and gem data (wowsims dump plus Anniversary extras), roster normalization and the three audits as pure modules.
- Fixtures are the Python tool's own; the parity tests hold both implementations to the same numbers (174 gear SR and 244 buffed for one character's in-game sheet).
- Gargul Persistence Bonus2026-09-09
- Kit sync, no version bump: the addon's UIKit.lua copy re-synced to the shared kit 1.4.0 (adds an EditBox control built for another addon). No GPB behavior change; test suites green.
- BrokenDice2026-09-09
- UIKit.lua copy re-synced to kit 1.4.0 (adds UIKit.EditBox, built for GrudgeList). No BrokenDice behavior change; test suites green.
- First build; verified headless (79 checks and a 9-step UI smoke test, run with sh test/run_all.sh under Lua 5.1; the runner also checks the bundled UIKit copy against the shared 1.4.0 source), not yet seen in-game.
- The list: add by name, by target, or from the Recent tab; six fixed categories plus a free-text reason edited in place; remove with /grudge undo as the session-only safety net.
- Group watching: roster diff records every groupmate (name, realm, class, GUID, zone, party or raid, time; cap 60) and warns once per join for listed players; every loading screen re-warns for anyone already present; party invites are checked by name before you accept.
- Warnings: chat line with class-colored name, category, reason, date and "on N lists"; raid-warning banner; raid-warning sound; each on its own toggle. Reasons are pipe-scrubbed before any chat or banner output.
- Matching by lower-case name-realm, then by GUID for renamed characters.
- Sharing: versioned text export (GRUDGELIST 1) with escaped fields; import merges, never removes, never overwrites your own reason, upgrades Other to a real category, records every source and who imported each entry, and refuses a higher format number.
- Window on the shared UI kit 1.4.0: 760x500 by default, resizable, Esc to close, List / Recent / Settings tabs, Export / Import / Add Target footer, accent presets persisted.
- Script only: the Raid Night Digest's PB earned section is reconciled against the live ledger. A grant zeroed in game after Add Raid, or an item won later the same night, is dropped from the digest and a note says how many lines were left out.
- Addon files carry only the version bump.
- Loot History views (By Player, By Item, Locked Slots) open in the text window with a Back button returning to the view picker.
- Every window is now on the shared UIKit: the Which raid picker, Craft dialog, Export and Import windows, SR Check window and Roll Monitor. Only Blizzard's StaticPopup confirmations and the scrollbar art remain stock.
- The PHASE stat lists the phase's raids inline, with full names and the start date in the tooltip.
- Tooltips hide on click so a footer button's tooltip no longer hangs over the popup it opened.
- Roll Monitor's Close is now the window's X; closing still mutes the monitor for that roll-off only.
- Roster column headers centered over their controls; PB gets its own column header.
- Status strip replaces the faint caption: INCREMENT and PHASE as two labeled facts with tooltips; the increment is changed under Menu > Settings.
- Friends-list class source for non-guild regulars, plus /pb class to view or set a remembered class by hand.
- Menu, Add Raid PB dialog and the Loot History, Team and Sync pickers re-skinned on UIKit; behavior unchanged.
- Class colors now work outside raids: classes are learned from the guild roster, the live group and imported sheets, and remembered once seen.
- Brighter button text, headers and borders.
- New class-lookup test suite (8 checks).
- Fixed invisible column headers in 0.25.0.
- New default accent gold (#D9A340) on a neutral charcoal base; /pb accent switches presets live.
- Hover tooltips on every roster window control, including exactly when to run Add Raid PB.
- Roster window is resizable (665x420 to 1100x900) and the size persists.
- Roster window re-skinned on the shared UIKit: flat dark chrome, title block with the team name, on/off toggles for the four settings, By Player / By Item tab bar, and a footer with Add Raid PB as the primary action. Behavior unchanged.
- Class-colored player names from the live group or the imported SoftRes sheet.
- New UIKit smoke test suite and a check that fails if the addon's UIKit.lua drifts from the shared source.
- Window rebuilt on the shared UIKit toolkit with a title block, version tag, close button, Esc-to-close, and Host / Boards / Ledger / Settings as a tab bar.
- Host tab: modes and join window as button groups, OPEN GAME as the primary action, Cancel in the danger style, live status and roster on a card, rules tooltips on every mode button.
- Boards, Ledger, and Settings re-skinned; net gold in accent or red by sign; the three Settings sliders became kit sliders and test mode became a switch.
- Names are class-colored when the player is in your group. Hover tooltips added across the window; the changelog says every control, but the Boards paging buttons and the Settings alt-name boxes have none.
- Test harness: shared widget mock replaces the inline one; the 9-step UI smoke suite drives the new window.
- Fix: disenchants are no longer treated as a player. Gargul's DE pseudo-winner no longer reaches PB points or session awards; DE loot rows are still recorded, ownerless, for drop totals and kill dates.
- Login self-heal removes any existing disenchant entries from points, ineligibility, friends and session awards.
- New /pb activeraids list|add|remove|clear (alias /pb raidset), the first way to take a raid back out of the active set; add also records the raid for sheet-tab archiving.
- New test/run_all.sh runs the whole battery (38 checks).
- Fix: a member whose last PB reset to zero no longer vanishes from the Google Sheet; empty roster stubs are kept as membership.
- New optional Watch-PB.ps1: watches the SavedVariables file and runs the pipeline when a new Add Raid receipt appears, holding split nights until the closing unfiltered Add Raid. Logs to Watch-PB.log, rotated at 2 MB.
- First micro-suite kept in the repo (test/test_setpoints_stub.lua) with verbatim extraction of the functions under test.
- Roster refresh for the phrase table: new per-character entries, a new matchup, and spelling aliases, with keys verified against real in-game names recorded from actual raids rather than Discord handles.
- Departed members kept as inert entries; nothing removed. Content only, no logic changes.
- Raid Ping2026-09-01
- Repository consolidated into the development workspace as a live git clone; deployment is now commit and push instead of web-editor pastes.
- Canonical 50-check test_local.py committed, replacing the original 17-check version.
- CLAUDE.md, CHANGELOG.md, MIGRATION.md, and docs/ moved into the repository so it is self-contained for handoff.
- README rewritten for the three-tier ladder, collapse, shared rosters, the external trigger as primary with the string-inputs gotcha, the webhook three-link chain, and dry-run defaults.
- Reconciliation with the live repository: nag.py confirmed byte-identical to the tested 2026-08-10 baseline; the 50-check suite passes against it.
- Workflow confirmed: backup cron 17,47 * * * *, checkout@v5, both webhook env lines present.
- Config confirmed: 120/72/24 ladder on both team entries with one template per tier; server_events_url present and empty.
- state.json shows three weeks of live history across 10 events, four of them completing the full natural 120, 72, 24 ladder.
- No-track windows: turning Track loot on this character off records a timestamped window; /pb importwins skips history inside it and /pb histaudit labels those entries as skipped.
- Login prints a loud warning while loot tracking is off.
- Add Raid persists a night receipt (granted, awarded, ineligible, filtered, absent); same-day runs merge, a new day replaces.
- Pipeline posts one Raid Night Digest instead of the full embed walls; posting is idempotent; -FullEmbeds restores the old streams.
- Old-phase PB filtered from all posted output (Discord, sheet PB tab, PB.csv); values remain in the addon.
- Zul'Aman reclassified into phase 3 with Black Temple and Hyjal Summit; Sunwell Plateau renumbered to 4. Prevents a ZA-only sheet from triggering a second phase transition mid-phase. Superseded the same day by 0.24.x.
- Raid Ping2026-08-10
- Multi-stage reminder engine: a per-team reminders list replaces the single deadline; the most urgent unfired due stage fires; moot larger tiers are marked done (collapse) when an event is first seen inside a smaller window.
- State moves to per-event stages_done lists, with a shim treating pre-stage entries as fully handled. Legacy single-deadline configs still work.
- Live config restructured to the 120/72/24 ladder, each tier with its own templates. A missing-comma JSONDecodeError established the dry-run-as-validator practice.
- Test suite grown to 50 checks, including the three-tier ladder end to end with time travel.
- Raid Ping2026-08-06
- GitHub Actions cron had produced near-zero scheduled runs over two days, matching community reports of 2026 degradation.
- cron-job.org wired as the primary trigger: hourly POST to the workflow-dispatch API with a fine-grained token and explicit string inputs, failure notifications on.
- The first test dispatch returned 204 and delivered a real backlog ping for an open, unclaimed window, as designed.
- A 401 during setup traced to header placement and the Bearer prefix; documented in the operations notes.
- Raid Ping2026-08-05
- Shared named rosters: a top-level rosters table that team entries reference by name; inline lists still accepted.
- Second team entry added for the second raid night, with its own signup channel and its own webhook secret and env line.
- Roster reference spreadsheet created with a Text-formatted id column to avoid Excel's digit truncation.
- checkout action bumped from v4 to v5.
- Raid Ping2026-08-04
- Build day: stdlib-only nag.py, hourly workflow with dry-run and ignore-window manual inputs, state dedupe, state.json committed back by CI, and a 17-check offline harness.
- Raid-Helper endpoint saga: legacy raid-helper.dev routes returned 404; snowflake-dating diagnostics, endpoint fallback chains, the raid-helper.xyz v4 routes, and the server_events_url override all landed.
- First live-fire fixes: a malformed webhook secret, then Discord's HTTP 403 against Python's default User-Agent, fixed with a custom User-Agent on every request.
- First successful live ping the same evening; an exposed API key was rotated immediately and secrets-only-in-the-secret-store became the rule.
- BrokenDicev0.9.1
- The pipe fix: removed | characters from the five game-open templates and the Pit Report separators after the first live use crashed on open and silently wedged the outgoing chat queue.
- Every outgoing message is now scrubbed of | and every send is wrapped so one bad line cannot stall the queue.
- New charsafe regression suite (5 tests) scanning every phrase pool and running a full-flavor game end to end.
- Documented the no-pipes rule for custom phrase lines. Verified in-game: loads and opens games cleanly.
- BrokenDicev0.9.0
- Initial release: five game modes, house rules engine, phrase system with per-character lines and matchups, stats and leaderboards, debt ledger with netting, session tracking, four-tab UI, host controls, test mode.
- Headless Lua 5.1 test harness with a 47-scenario main suite, 12 stress scenarios, and a 9-step UI smoke test.
- Two bugs caught by the harness before shipping: a login crash from sliders reading saved variables too early, and a prophecy that could announce more than once per bracket.