File Details
v3.2.10
- R
- May 15, 2026
- 5.16 MB
- 0
- 12.0.5
- Retail
File Name
WHEREDNGN-v3.2.10.zip
Supported Versions
- 12.0.5
Loot & Baloot
v3.2.10 (2026-05-15)
Full Changelog Previous Releases
- docs(CHANGELOG): add v3.2.10 release notes
- test(BQ): polish play-observer guard fixture/comments
Comment/fixture-only polish on the v3.2.10 play-observer guard
(no runtime logic change; harness stays 1320/0):- Net.lua safeOnPlayObserved docblock: "chat + freezelog" was
inaccurate — log("Error", ...) writes the B.Log ring buffer
(L.Error("net", ...)), it does not directly print to chat.
Reworded to "B.Log ring buffer via log("Error", ...) + the
freezelog". - BQ.1 host fixture: seat 2 (Mants) now holds {"7C"} in
S.s.hostHands instead of an empty hand, so the play is a
genuine legal follow-suit. The regression no longer leans on
illegal-play tolerance — it isolates purely the
observer-throw half-applied-stall it is meant to guard.
Verification: full harness 1320/0 (unchanged), H1=11/0,
H7=9/0, git diff --check clean.
Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
- Net.lua safeOnPlayObserved docblock: "chat + freezelog" was
- fix(Net.lua): guard play observer so human plays always advance
Confirmed root cause of the user-reported recurring ~60s
multiplayer freeze (Game 9M6KAP, host Mohtaal + Mants + 2 bots):
The five play sites (_OnPlay, LocalPlay, _HostTurnTimeout AFK,
MaybeRunBot success, MaybeRunBot recover) all applied the card
via S.ApplyPlay — card becomes visible on the table, hand count
drops — and THEN called the raw B.Bot.OnPlayObserved(...) BEFORE
N.CancelTurnTimer() / N._HostStepPlay(). When the bot-memory
observer threw, the play was visibly half-applied but the turn
never advanced and the previously-armed AFK timer stayed live.
The game "recovered" only when K.TURN_TIMEOUT_SEC (60s,
Constants.lua:452) fired N._HostTurnTimeout and force-stepped
the chain — exactly the reported symptom: "host shows 'Mants to
act', Mants's card is on the table, resumes after ~60s". Not
normal AFK; not a mere visual-refresh bug.
Fix: new file-local safeOnPlayObserved(seat, card, leadBefore,
context) that nil-checks B.Bot.OnPlayObserved, pcall-isolates
the call, logs the error to chat + freezelog, and never
rethrows. Bot-memory observation (void inference / firstDiscard
/ Fzloky / AKA dedup / trump-tempo) is a non-authoritative
side-channel; its failure must never block the authoritative
pipeline (send / cancel-timer / host-step / bot-dispatch / AFK
recovery / UI refresh). All five raw call sites now route
through the helper. Bot.lua observer logic is unchanged
(investigation did not implicate a separate observer bug; the
defect was the unguarded call ordering in Net.lua).
Tests: new BQ section (19 checks) inside the AZ Net harness:
BQ.1 (4) — host _OnPlay half-applied stall regression.
Pre-fix BQ.1b FAILS ("turn ... got 2"), BQ.1d
FAILS (rethrow); post-fix turn==3, no rethrow.
BQ.2 (3) — non-host LocalPlay send-safety: SendPlay still
broadcasts MSG_PLAY despite a throwing observer
(real broadcast spy).
BQ.3 (9) — source pins: all five sites route through
safeOnPlayObserved + negative pins that no raw
B.Bot.OnPlayObserved(seat/localSeat,...) direct
call remains (sole raw ref is the helper's pcall).
BQ.4 (3) — helper never rethrows; still calls through on the
happy path.
Verified pre-fix: BQ.1b/1d/2a/2c/3*/4* FAIL with Net.lua
stashed; post-fix 1320/0 (was 1301/0). H1/H7 smokes clean
(11/0 + 9/0). git diff --check clean.
Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com - docs: clarify v3.2.9 playtest checklist marker refs
- docs: add v3.2.9 manual multiplayer playtest checklist

