File Details
v3.1.12
- R
- May 10, 2026
- 5.14 MB
- 6
- 12.0.5
- Retail
File Name
WHEREDNGN-v3.1.12.zip
Supported Versions
- 12.0.5
Loot & Baloot
v3.1.12 (2026-05-10)
Full Changelog Previous Releases
- v3.1.12: Full-addon audit fixes (SWA + Takweesh/Kawesh + BALOOT) + behavioral tests
External full-addon audit (Codex on head 929dd13) flagged three P1/P2
reliability gaps and one process gap.
P1 — SWA reliability. SendSWAReq/SendSWAResp were single-shot (the
v3.1.10 retry pattern was never applied). Two failure modes:- Non-host caller's MSG_SWA_REQ drops → caller has local swaRequest
pinned forever, UI hides SWA button, host never sees request,
hard-stall recoverable only by /reload. - Defender's deny MSG_SWA_RESP drops → defender pre-clears local
state, host never sees deny, host's 5s timer auto-accepts the SWA.
Fix: 250ms retry on both. Non-host LocalSWA also schedules a
SWA_TIMEOUT_SEC+3s safety-clear timer to roll back local swaRequest
if no host echo arrives.
P1 — Takweesh/Kawesh used one-shot frames. New SendTakweesh /
SendKawesh helpers with 250ms retry. LocalTakweesh, LocalKawesh, bot
Takweesh, bot Kawesh all routed through helpers. Host receivers
already idempotent (phase + state guards).
P2 — Remote BALOOT button. UI.lua:2780 violated UI.lua:10 by reading
s.hostHands (host-only); LocalBelote did the same. Remote humans
holding K+Q of trump never saw the button until BOTH cards were
played. Fixed both to use S.s.hand + played-card scan; strengthened
predicate from hasK or hasQ to hasK and hasQ.
Process — Behavioral tests (not source pins). v3.1.10's bug was
missed because tests only verified the helper existed, not that
callers used it. New section AZ has 25 behavioral tests with captured
broadcast() and capturable C_Timer.After: SWA retry/idempotence,
Takweesh/Kawesh retry + duplicate handling, non-host BALOOT in 3
scenarios. First time Net.lua is loaded into the test harness.
Tests: 1007/1007 (was 982, +25). Lua syntax: 26 files clean.
Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
- Non-host caller's MSG_SWA_REQ drops → caller has local swaRequest

