Grouper-v0.8.1
What's new
Grouper
Grouper-v0.8.1 (2026-08-05)
Full Changelog Previous Releases
- release: Grouper v0.8.1 — Auto-Join repair, 2nd Role, per-flavour TOCs
Auto-Join was dead on every Classic client and took several defects with it.
fix: InviteUnit is no longer a global on Classic Era. Blizzard moved it into
C_PartyInfo on Classic as well as retail; 1.15.9 removed the bare form. The
call was gated on IS_RETAIL and fell through to a nil global, so every Classic
client raised "attempt to call a nil value". Replaced with
Grouper.InviteUnitCompat, which feature-detects. Verified against Blizzard's
Classic Era source: C_PartyInfo.InviteUnit is documented there and no Blizzard
Classic Era code calls the bare form. (AUTOJOIN-003)
fix: Restored the confirmation popup deleted in 3308af5. It is not a courtesy —
clicking it is the hardware event that makes the invite and the roster
broadcast legal. Without it the flow ran tainted and produced eight
ADDON_ACTION_BLOCKED errors per invite. OnAutoJoinRequest now only validates,
refuses and asks; OnAccept invites and broadcasts. (AUTOJOIN-005)
fix: Auto-Join refused anyone already listed in the group they were joining, and
whispered the LEADER "disband your party first" on a self-request.
(AUTOJOIN-001, AUTOJOIN-002)
fix: A failed invite was silent on both sides — the error branch sat behind
IsDebugEnabled. (AUTOJOIN-004)
fix: The 2nd Role column showed a dash for everyone in BOTH tabs. Two causes: a
secondary equal to the primary was suppressed, and most members carry no
secondaryRole at all. Both renderers were private copies; they now share
Grouper.SecondaryRoleText. (UI-012, UI-013)
fix: An enabled LFG channel the player had not joined was skipped silently.
(UI-014)
fix: Shaman used the post-TBC blue on Classic Era, where it shares Paladin's
pink. Flavour-gated. (UI-015)
fix: Status bar ran the label into the version; Grouper_TBC.toc hardcoded
v0.6.1 forever. (UI-016)
fix: Long titles are sent as the community abbreviation (LBRS) rather than
truncated mid-word.
fix: Removed /grouper autojoin accept. Both autoJoin settings were write-only,
and autoAccept promised to skip a popup that cannot be skipped. enabled is
now honoured.
chore: Per-flavour TOCs authored explicitly (TBC/Wrath/Cata/Mists/Mainline),
enable-toc-creation off, interface numbers refreshed.
test: 233 -> 319 assertions. New autojoin, flow, secondary_role, announce,
appearance and toc specs. flow_spec drives Auto-Join and Sync end to end,
handing each step the real artefact from the one before. env/protected.lua is
enforced so ADDON_ACTION_BLOCKED is caught offline. Every fix above was
verified by restoring the broken code and confirming the suite goes red.
docs: CHANGELOG, Grouper_Bugs.md, CurseForge description and README updated.
Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com - docs: v0.8.1 changelog covers the whole harness adoption
Brings the v0.8.1 section up to what actually landed: the submodule pin moved to
62ec9e4, the spec count is 12, and four entries were missing -- the five harness
contracts raised and delivered, the per-flavour sandbox that probes the expansion
gate on all seven clients, the stub helper and the teardown-order leak it
exposed, and the mixed-type annotation on players<input disabled="disabled" type="checkbox" checked="checked" />.level.
Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com - test: adopt the last two harness globals, and silence the diagnostics cleanly
Adopts 62ec9e4 (UnitAffectingCombat, JoinPermanentChannel). All five contracts
Grouper raised are now delivered, so installGaps() is empty -- each was verified
by probing for the symbol before its stand-in was deleted, never on the strength
of the written response alone.
Three IDE diagnostics, fixed at the cause rather than suppressed:- assign-type-mismatch on players<input disabled="disabled" type="checkbox" checked="checked" />.level. Not a defect: the field is
deliberately mixed-type ("?" is the display fallback, used identically at ~10
write sites) and nothing compares a player's level numerically -- the only
numeric comparisons on a .level are quest levels, a different field. Annotated
---@type integer|string, because coercing it to a number would silently turn
"unknown" into a real-looking level 0 in the member lists. - duplicate-set-field reported against GrouperUtilities.lua, caused by specs
assigning stubs with plainGrouper.X = function. The language server reads
that as a second DEFINITION of the field, so a test file was putting a warning
on shipped source -- and it could not be silenced from the spec, because the
diagnostic attaches to the other file. Specs now stub through Tests/support/
stub.lua, which assigns via rawset (a call declares nothing) and returns a
restore function. - invisible on widget.frame in ui_spec, which is expected when a spec walks
AceGUI internals.
Converting to the stub helper exposed a real leak in chunks_spec: the
CheckForMissingChunks teardown unwound its stubs in FORWARD order, so a stub a
test appended over one the before_each installed restored the earlier stub
rather than the original, leaving GetGrouperChannelIndex pinned at 5 for every
later spec file. Invisible in a single-file run; it took two comms specs red on
the full-suite run. All teardowns now unwind in reverse.
Also fixes two specs that reassigned wow.channels instead of emptying it in
place, which detached it from the reference the harness's GetChannelName holds.
233 passed, 0 failed.
Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com
- assign-type-mismatch on players<input disabled="disabled" type="checkbox" checked="checked" />.level. Not a defect: the field is
- test: adopt the WoWAPITesting harness, and fix the five defects it found
Adds the shared offline harness as the Tests/wowapi submodule (pinned bed4205),
with Tests/support/addon.lua loading all 12 TOC files in order on the widget
layer and driving the real Grouper:OnInitialize(). 10 spec files, 233 assertions
passing, 41.08% line coverage measured with Tests/wowapi/coverage.lua.
Five defects found by the suite on the day it was written, four of them raising
a Lua error on a path players hit routinely -- invisible with the client default
of error display off, which is why none had been reported:- UI-009 Tooltips wired to AceGUI .label/.titletext FontStrings. A FontString
inherits Region + FontInstance only, so it has neither EnableMouse nor
SetScript; all 15 sites raised and aborted the enclosing tab builder,
leaving the Search Filters and Create Group tabs part-built. Now
routed through Grouper:AttachWidgetTooltip, anchored to the widget's
real frame. GrouperBrowse.lua coverage went 1.58% to 65.22% on this
fix alone. - COMM-005 Chunk resend timers armed per chunk instead of per message, so an
incomplete multi-part message broadcast 2*(N-1) duplicate GRPR_REQ
requests on the shared channel, scaling with chunk count. - UI-010 ReleaseScrollFrame's double-release guard cleared its own marker
before it could work, so a second call reached AceGUI:Release and
raised from whichever addon next drew from the shared pool. - COMM-006 GetFullPlayerName doubled the realm when name already carried one,
producing Name-Realm-Realm keys that match nothing -- and skipping the
space-stripping branch, so a key could contain a literal space. - UI-011 /grouper status always reported "Players: 0" (# on a hash table), and
a bare /grouper printed usage instead of opening the window.
Also brings wow-version-replication.ps1 back into agreement with the packager:
bare folder names in .pkgmeta compiled to ^docs$ and matched only a file of that
name, so docs/ and Tests/ replicated despite being listed; and the always-skip
list named only git files, so dotfolders replicated too. Verified with -DryRun.
Three harness contracts were raised and delivered during the session (UTF-8 BOM
tolerance, a caller-supplied env for loadAddonFile, and three missing globals);
two remain open and are staged locally in Tests/support/addon.lua.
Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com
- UI-009 Tooltips wired to AceGUI .label/.titletext FontStrings. A FontString
This mod has no additional files

