promotional bannermobile promotional banner

Loot & Baloot

Loot & Baloot — Play Saudi Baloot (بلوت) inside World of Warcraft. A four-player trick-taking card game over the party addon channel. Host with friends or play solo against bots, with full Hokm / Sun rules, melds, escalations, and SWA claims.

File Details

v3.2.3

  • R
  • May 13, 2026
  • 5.15 MB
  • 18
  • 12.0.5
  • Retail

File Name

WHEREDNGN-v3.2.3.zip

Supported Versions

  • 12.0.5

Loot & Baloot

v3.2.3 (2026-05-13)

Full Changelog Previous Releases

  • docs: add v3.2.3 release notes
    Pos-3 Sun bot fix release notes for commit 7d32416 (relocate F5-3
    pos-3 Sun Takbeer/Tasgheer donate above Rule 1B). Focused bot-play
    bugfix framing — no UI / protocol / saved-variable / scoring /
    network changes. v3.1.x / v3.2.x clients remain addon-message
    compatible.
    The four safeguards covered in the entry:
    • doesn't override smother's led-suit point-card donation
    • doesn't override Tahreeb signal encoding
    • filtered with not-wouldWin so it can't steal partner's trick
    • highestByRank routes tied donor cards through pickRandomTied
      (closes the v3.2.2-deferred F5/D-1 tie-randomization site)
      F2 pos-3 Sun hold-back stays intentionally deferred to a future
      deception-play audit.
      Verification: 1,258 / 0 harness, 20 / 0 standalone smokes.
      No tag yet — release-prep only. Design + 4 rounds of Codex review
      live in .swarm_findings/v3_2_3_pos3_sun_relocation_design.md.
      Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
  • docs(v3.2.3): align design counts with BF.7 emitting 2 assertions
    Codex review of pos3-sun-relocation-v3.2.3 at 7d32416 approved
    the runtime implementation but flagged a count drift in the
    design doc: the v0.4 doc predicted 1,257 / 0 final harness with
    +12 BF.* checks, but BF.7 ships with two assertions in the same
    do-block (BF.7a assertEq(card, "9S") + BF.7b
    assertTrue(card ~= "KS")) for tighter diagnostics — so the
    real delta is +13 and the harness lands at 1,258 / 0.
    Doc-only amend on this branch (no runtime/test changes):
    • §0 executive summary F5-3 row: "8 behavioural + 4 source-pin =
      12 new harness checks" → "8 BF behavioural blocks emitting 9
      assertion checks (BF.7 emits 2 assertions for tighter
      diagnostics) + 4 source-pin sub-asserts = 13 new harness
      checks".
    • §5 test count summary: BF.7 row now labelled "(2 harness
      checks: 7a + 7b)"; total reworded to "9 behavioural assertion
      checks (BF.1, BF.2, BF.3, BF.4, BF.5, BF.6, BF.7a, BF.7b,
      BF.9) + 4 source-pin sub-asserts = 13 new harness checks";
      final harness 1,245 → 1,257 changed to 1,245 → 1,258.
    • §5 pre-runtime expected: 7 failing checks unchanged (BF.1,
      BF.2, BF.9, BF.8a-d); passing list now "6 harness checks (five
      BF blocks producing six passing checks: BF.3, BF.4, BF.5, BF.6,
      BF.7a, BF.7b)" with explanation that BF.7's two assertions
      both pass pre- and post-fix.
    • §8 implementation order step 5: target harness 1,257 / 0 →
      1,258 / 0 with delta +13.
      Branch full harness on 7d32416 already verified locally by
      Codex at 1,258 / 0; standalone smokes at 11/0 and 9/0. This
      amend brings the design doc into alignment with the actual
      shipped test count.
      Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
  • fix(Bot.lua): relocate F5-3 pos-3 Sun Takbeer donate above Rule 1B
    Per .swarm_findings/v3_2_3_pos3_sun_relocation_design.md (v0.4
    after 4 rounds of Codex review): F5-3 (v1.4.1 Takbeer/Tasgheer
    pos-3 Sun donate non-A/T) used to live in the opp-winning region
    at old Bot.lua:4444-4495 but was structurally unreachable
    (its gate required partnerWinning while the enclosing scope
    guaranteed partnerWinning=false after the early-return at
    Bot.lua:3886). v3.2.3 relocates the branch into the live
    partnerWinning block, between Tahreeb sender end (~L3737) and
    Rule 1B start (~L3739).
    Final ordering inside the partnerWinning block:
    Smother → Tahreeb sender → F5-3 → Rule 1B
    Three Codex-required design properties of the relocated block:
    1. Uses not wouldWin(c, trick, contract, seat) to filter each
      donate candidate, preventing F5-3 from stealing partner's
      current trick via a same-suit K/Q/J. Replaces the original
      #winners == 0 gate (semantically tied to the opp-winning
      context where this branch used to live).
    2. Builds a donate pool and calls
      Primitives.highestByRank(donate, contract) rather than a
      manual donateRank / cr > donateRank strict ranking loop.
      This closes the v3.2.2-deferred F5/D-1 tie-randomization site
      at F5-3 — without it, making the branch reachable would have
      re-introduced the v1.1.0 hand-order leak in newly-live code.
    3. Placed AFTER Tahreeb sender (signals beat point-feed on
      overlap) and BEFORE Rule 1B (so F5-3 fires before Rule 1B's
      "second-lowest" biggest-mistake mitigation).
      F2 hold-back («تخليه يمسك») remains deferred to v3.2.4+ per the
      design doc — its probabilistic 30%/40% fire-rate needs a separate
      deception-play test framework that doesn't fit alongside this
      deterministic batch.
      Behavioural tests (tests/test_state_bot.lua, section BF, +13
      checks):
    • BF.1: wire-proof — pos-3 Sun void-in-led, pos-4 void, hand
      {KH, TH, QH} → F5-3 returns KH (highest non-A/T).
      Pre-fix returned QH via fallback.
    • BF.2: F5-3 fires regardless of partner being bot or human
      (v1.4.5 removed Tahreeb's partner-bot gate; F5-3 doesn't
      gate on partner-bot either).
    • BF.3: Tahreeb T-1 Bargiya wins overlap regression — Tahreeb
      runs first, F5-3 doesn't steal the signal.
    • BF.4: Smother's A-donate stays canonical (#pointCards>=2
      gateOk) — Interpretation A invariant.
    • BF.5: F5-3 doesn't fire without pos-4 void (gate respected).
    • BF.6: F5-3 doesn't fire at non-pos-3 positions.
    • BF.7: not-wouldWin filter regression guard (hand {KS, 9S, 8S,
      7H}, partner JS leading: filter rejects KS as it would
      beat partner; bot returns 9S in both pre- and post-fix
      states).
    • BF.8: source-pin block (4 sub-asserts: marker, "relocated",
      not-wouldWin filter substring, old-dead-block-removed).
    • BF.9: tie-randomization wire-proof — hand {KH, QH, KC, QC}
      with stub math.random(2)=2 → F5-3 returns KC (tied
      second K via highestByRank+pickRandomTied). Pre-fix
      returned QC (fallback lowestByRank tied second);
      post-fix with strict ranking would return KH (BUG case).
      Pre-runtime test outcome: exactly 7 fails as designed — BF.1,
      BF.2, BF.9, BF.8a, BF.8b, BF.8c, BF.8d. After runtime fix:
      1,245 → 1,258 / 0 (+13 BF.* checks; design doc estimated +12
      but BF.7 ships with 2 assertions for tighter diagnostics).
      Standalone smokes: test_H1_pin_J9_trump 11/0;
      test_H7_sun_shortest_lead 9/0.
      Files: Bot.lua, tests/test_state_bot.lua only.
      Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
  • docs: add v3.2.3 pos-3 Sun relocation design
    Design pass + 4 rounds of Codex review for relocating F5-3
    (Takbeer/Tasgheer pos-3 Sun donate non-A/T) out of its currently
    unreachable opp-winning location into the live partnerWinning
    block at Bot.lua:~3738, between Tahreeb sender and Rule 1B.
    Approved scope:
    • F5-3 relocation only.
    • F2 hold-back remains deferred to v3.2.4+ (probabilistic
      deception play; needs its own audit + test framework).
    • Final ordering: Smother → Tahreeb → F5-3 → Rule 1B.
    • Required shape: donate-pool + Primitives.highestByRank (closes
      the v3.2.2-deferred F5/D-1 tie-randomization site at F5-3 as
      part of making it reachable).
    • Required filter: not wouldWin(c, trick, contract, seat) per
      card (prevents F5-3 from stealing partner's current trick
      via same-suit K/Q/J).
      Test plan: BF.1-BF.9, 12 new harness checks. Expected pre-runtime
      fails: exactly 7 (BF.1, BF.2, BF.9, BF.8a-d). Expected final
      harness: 1,245 → 1,257.
      Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com