v1.1.0-bcc
What's new
GuildWordle
v1.1.0 (2026-09-03)
Full Changelog Previous Releases
- Add guild streak leaderboard and nickname system (#5) #minor
Tabbed leaderboard (Today / Streak / Best), account-wide nicknames, and
participation-based streaks. New gossip message types are additive, leaving
RESULTS: byte-identical so v1.0.4 clients stay compatible -- verified against
the real v1.0.4 code.
Adds a 175-test suite (LuaJIT/Lua 5.1), CI gating on merge and release, and a
developer-only in-game dev panel that is stripped from published builds.
#minor -- new features, backwards compatible. - Report the real version in-game instead of a hardcoded 1.0
The .toc hardcoded '## Version: 1.0', so every release so far shipped
reporting 1.0 regardless of its tag -- confusing when asking a player what
version they are on. The packager substitutes @project-version@ from the git
tag via vcs_filter, which does run over .toc files, so this makes the shipped
version match the release. REL-02 now asserts the placeholder survives
stripping. - Run tests in CI, gate releases on them, and trim published builds
tests.yml runs the suite on every PR and push to main. With 'Lua tests' set as
a required status check, a failing suite blocks merge.
release.yml gains a test job the release job needs, so nothing is tagged or
published unless tests pass. Those tests run against the merge commit -- the
exact tree being released -- so a problem introduced by the merge itself still
blocks it, which testing the pre-merge branch would miss.
Both workflows assert the interpreter really is Lua 5.1, failing loudly rather
than reporting a green run that proves nothing.
.pkgmeta drops tests/, CLAUDE.md and the dev panel so developer-only files
never reach players. - Add test suite: 175 tests under LuaJIT (Lua 5.1)
Runs with ./tests/run_all.sh against a WoW API mock and a dependency-free
runner. Covers game logic, streak math, nickname sanitisation and UTF-8
truncation, SavedVariables init and pruning, the addon-message wire protocol
(serialise + parse, batching, and the STREAKS freshness / best-only-increases
merge rules), plus two-client gossip round-trips including secondhand
propagation.
Uses luajit specifically, not lua: it implements Lua 5.1 like WoW's embedded
interpreter and reproduces the malformed-pattern bug that Lua 5.5 silently
accepts. A suite green under the wrong interpreter would be actively
misleading.
crossversion.lua runs the ACTUAL released v1.0.4 code, taken from the v1.0.4
tag, against the current build in both directions -- v1.0.4 survives the new
NICKS:/STREAKS: messages, still reads RESULTS: correctly, and its own real
broadcast output is captured and replayed into the current build. Testing with
a second account is impractical, and every cross-version claim here was
otherwise argued from reading the code: the same reading that produced several
shipped bugs.
release_check.lua builds a simulated release using the packager's own filters
and exercises the addon with developer-only files genuinely absent -- the only
thing that catches a break appearing once they are stripped. Note the .toc and
.lua filters differ: the former deletes debug blocks, the latter wraps them in
a long comment.
Every bug that reached a player in game has a named regression test, and the
suite was validated by reintroducing several of them and confirming only the
relevant tests fail. BEHAVIOR_SPEC.md documents expected behaviour with stable
IDs the tests reference by name, and carries the manual UAT checklist for
layout and real-transport checks, which have no headless path. - Add developer-only in-game dev panel for multi-client testing
A single client cannot exercise the interesting half of this addon: what the
UI does when OTHER clients talk to it. The panel injects fake guildmate
results, nicknames, streaks, renames and stale gossip echoes, plus helpers to
force a win/loss and set or break your own streak.
Injection goes through the real message handler with genuine wire strings, so
parsing is exercised too -- what you see is what a real guildmate's broadcast
would actually produce.
Revealed by /wordle dev via a Dev button on the main window; the panel does
not open by itself, since dev mode persists and a debug window reappearing on
every reload is noise. An Isolate toggle (on by default) no-ops outgoing
broadcasts so injected fakes cannot reach a real guild, and fake entities are
prefixed Zzt so cleanup can remove exactly those.
Kept out of published builds entirely: the .toc entry is inside #@debug@
markers and .pkgmeta drops the file, so releases neither ship it nor reference
a missing file. Addon code ships as readable Lua, so an allowlist would still
publish the panel and be trivial to edit out -- not shipping it is the only
real answer. The Dev button additionally requires the dev file to actually be
loaded, so a hand-edited devMode flag cannot surface a dead button.
Also adds a REAL round-trip test: the only check of prefix registration,
SendAddonMessage, the server round trip and CHAT_MSG_ADDON delivery, none of
which local injection touches. It works solo because WoW echoes your own addon
messages back to you -- the same reason HandleAddonMessage guards SYNC_REQ
withname ~= me-- and probes with ordinary SYNC_REQ traffic rather than a
fake result, which would put a bogus player on real guildmates' leaderboards. - Add guild streak leaderboard, nicknames, and always-on error visibility
Leaderboard panel becomes tabbed: Today's results, current streaks, and
all-time-best streaks, sharing one scrollable row pool.
Nicknames give players one stable name across alts, since streaks are
account-wide but character names are not. Crucially they are gossiped over a
NEW message type (NICKS:) rather than being added to RESULTS:, leaving that
wire format byte-identical to the very first release -- so old and new clients
stay compatible in both directions. Streak entries are keyed by a hidden,
frozen accountId rather than the nickname, so renaming is an in-place field
update and two players can share a nickname without colliding.
Streaks now measure participation, not skill: finishing the daily puzzle
extends the streak win or lose, and only a skipped day breaks it. No migration
is needed for saved data -- a streak zeroed under the old lose-resets rule
simply restarts at 1 on the next play.
Error visibility, added after several bugs here failed completely silently:
any uncaught error from this addon's own files always prints to chat, and
/wordle dev additionally surfaces other addons' errors. Entry points reached
directly from UI events (slash dispatch, guess submission, panel refresh,
SetNickname) are pcall-wrapped so one failure cannot silently abort unrelated
sibling work in the same call chain. The /wordle dev branch sits inside
--@debug@ markers so the command does not exist in published builds.
Robustness fixes for crashes found in play: CharKey() no longer concatenates a
possibly-nil realm (which aborted InitDB and left tables nil for a whole
session), InitDB initialises every table before touching any WoW API that can
fail, today's word is computed on demand rather than once at load, and the
letters-only nickname filter avoids a byte-range pattern that parses under
newer Lua but throws under WoW's Lua 5.1.
All Relations
- All Relations
- Embedded Library
- Optional Dependency
- Required Dependency
- Tool
- Incompatible
- Include
This mod has no related projects

