RaidKit
Changelog
Every release across the tools, newest first.
- Raid Ledger2026-09-22
- Meta gems are checked for activation, not just presence. A TBC meta does nothing until the rest of the gear meets its color requirement and the game never says so, so the Enchants & gems table has a Meta column — active, INACTIVE, empty, ? or — — with the requirement and the gear's actual color counts in the tooltip. An inactive meta counts as missing gear, so it reaches the Status column, the night grid and the player's history. Requirements come from Wowhead's own tooltip text for all eighteen TBC metas, in both of its forms ("at least 2 Red Gems" and "more Red gems than Blue gems"); an orange gem counts as a red and a yellow, purple as red and blue, green as yellow and blue. A gem the offline data cannot color leaves the verdict at ? rather than accusing anyone.
- Docs: a /docs section with a guide per tool and six for Raid Ledger — how to read every table and flag, the fight and link syntax, private reports, the shadow-resistance arithmetic, and what an unknown item means. Every audit header links to its section.
- Live logs: a report whose last fight is within a day is re-fetched at most once every five minutes however many people are watching, and the report page and night grid show a Live pill, poll for the next pull for two hours after the last one, and refresh themselves when it lands.
- Buffs at the pull: a fourth audit with one column per raid buff family (Fortitude, Spirit, Intellect, Mark of the Wild, Shadow Protection, the six blessings, Shout, Blood Pact), a Missing count and Flags such as 'no Kings', 'no Might', 'Salvation on a tank' and low ranks. A buff is expected only when at least half the raid visibly carries it, because Warcraft Logs cannot see a buff cast before logging began.
- Guilds: create yours with realm, region and faction; roles read Guild Master, Officer and Raider; Discord-pasteable join links with a role, an expiry and an optional use cap; email invites for the individual case.
- Per-guild roster: talent ranks (a Mage's Magic Absorption) and manual SR bonuses live on /guilds/<slug>/roster and on the Talent cell of any SR audit; an audit reads the guild named on the report, or your own; one click adds a report's missing players to the roster; raiders unseen for sixty days are marked stale.
- Automatic posts: turn it on beside the webhook and every new log's summary lands in the channel the morning after the raid — nobody pastes a link.
- Player history: every name in a table links to that character's page — the latest audited pull of each public report, an enchants trend, consumables night by night, and the things that keep coming back (the same missing slot on three or more reports).
- Gear sanity under the enchants table: PvP pieces named, empty slots, armor lighter than the class wears, and an item level far under the raid's — warnings, never a Status.
- Hit & expertise: every dps against the boss caps — 9% melee and ranged, 16% spell, 26 expertise — from the ratings in the log plus the talent hit that spec usually carries, named so you can disagree; the Flags say how many rating points short.
- Sign in with Warcraft Logs alone: no email or password needed to open your private reports; add an address later from Settings if you want notifications.
- The night: /ledger/<code>/night is every player by every boss pull with one dot per audit — gear, buffs, shadow resistance on Mother Shahraz — a consumables dot for the whole night and a Red count per player; pulls not yet cached load one at a time while you watch.
- Summary: /ledger/<code>/summary shows the last kill as three or four tiles — enchanted & gemmed, buffed at the pull, flasked & fed, shadow resistance on Mother Shahraz — with the names that did not make it, and the link unfurls into a card with the same numbers.
- Post to Discord: an Officer saves the raid channel's webhook on the guild page, and every audit page gets a button that posts the same text Copy for Discord produces. A flag on every audit row files 'this looks wrong' with the row as shown.
- Attendance: who was in the raid for which pulls, from the report header alone — boss pulls, kills, first and last pull, joined late / left early / sat out, and a bench-swaps table per pull.
- Your guild's latest logs: with a guild set up here (realm and region), /ledger lists its newest Warcraft Logs reports with an 'audited' mark and a link straight to the night — no hunting for the URL in Discord.
- Compare with last week: /ledger/<code>/compare lines this report up against the previous one from the same guild — or any report you paste — and says per player what was fixed, what is new and what is still there.
- Pre-pots: the consumables audit now knows when each potion was used, so a Pre-pots column counts the boss pulls that opened with one and the Flags say which pulls did not.
- Consumables: the wrong flask for the job is flagged — Mighty Restoration on a Rogue, Healing Power on a Warrior, Fortification on a Mage — judged as tank, healer, caster or physical from the spec, and only when the spec is known. Hybrids get the benefit of the doubt.
- Account export is raidkit-export-*.json with your Warcraft Logs link (never its tokens), guilds, opened reports and the character facts you set; the only Guild Master of a guild cannot delete their account until someone else leads it.
- Raid Ledger2026-09-13
- Character memory: the site now remembers each character's race and professions by name and realm, learned from every report (racial casts, Blizzard, class rules, profession-only gear and casts, ring enchants) and reused on the next one.
- Click-to-set: signed in, a pencil on any uncertain Race or Engineer cell lets a raid leader set the race or the two professions; a manual entry wins over every automatic source from then on.
- Professions rule things out: two known professions without Engineering means "not an Engineer"; without Enchanting, ring enchants are no longer expected of that player.
- Races from Blizzard's character profile API where the log cannot name them, cached per character. On a typical Anniversary raid this resolves most of the remaining unknowns; the audit says which source each race came from.
- A privacy page (/privacy) describing what the site stores, including the Blizzard character data.
- Raid Ledger2026-09-12
- Races are now read from the log where possible: a racial ability cast anywhere in the report names the race, and the Warcraft Logs character API supplies each player's faction so Alliance shamans, Horde paladins and druids resolve by class. Unknown races stay unknown rather than guessed.
- Engineer detection: Engineering-only gear worn at the pull and Engineer-only casts (sappers, bombs, rocket boots) anywhere in the report. Shown on the Enchants & gems and Consumables audits with the evidence.
- Shadow Guard (+10 shadow resistance, head or legs) now counts toward gear SR.
- Audit tables: flags, missing and warnings sit under each player's row and wrap to the screen; the player column stays pinned while the numbers scroll.
- Pick any pull from the fight list or the Pull dropdown on an audit.
- Recent reports are now per account: the list on /ledger and the homepage shows only the reports you opened, with a Forget button, and nothing is listed while signed out. The site-wide list is gone.
- Product pages for every RaidKit tool at /tools, with a merged changelog.
- 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 are read through the viewer's own Warcraft Logs connection.
- 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.
- Broken Dice2026-09-09
- UIKit.lua copy re-synced to kit 1.4.0 (adds UIKit.EditBox, built for GrudgeList). No Broken Dice 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.
- Broken Dicev0.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.
- Broken Dicev0.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.