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.6

  • R
  • May 14, 2026
  • 5.16 MB
  • 12
  • 12.0.5
  • Retail

File Name

WHEREDNGN-v3.2.6.zip

Supported Versions

  • 12.0.5

Loot & Baloot

v3.2.6 (2026-05-14)

Full Changelog Previous Releases

  • docs(CHANGELOG): add v3.2.6 release notes
    v3.2.6 entry covers:
    • Bot Takweesh false-AKA fix (both completed-trick and
      current-trick carve-outs, narrowly scoped to
      illegalReason == "false AKA" — revoke/off-suit realism gate
      unchanged).
    • Same-team Takweesh behaviour unchanged; tooltip
      clarification deferred to a future UX slice.
    • Bundled v3.2.5 test-only coverage work (BH / BI / BJ / BK /
      BL) explicitly framed as internal validation only.
    • Verification: harness 1295 / 0, H1=11/0, H7=9/0. Pre-fix
      BM.1 FAILS at 1289/1; pre-current-trick-carve-out BM.6
      FAILS at 1292/1 (both wire-discriminators).
    • No UI, protocol, saved-variable, scoring, .toc, or
      packaging changes.
      Committed locally only — no push, no tag, no release until
      Codex reviews.
      Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
  • docs(v3.2.6): comment polish — final BM count + BM.6 header entry
    Codex final-review polish (comment/doc-only, no logic change):
    1. .swarm_findings/v3_2_6_aka_takweesh_investigation.md §9.3:
      "BM section, 6 checks per Codex amend round 2" → "BM section,
      7 test blocks emitting 15 harness checks per Codex amend
      round 2" (matches the actual final shape: BM.1, BM.2A, BM.2B,
      BM.3, BM.4, BM.5, BM.6 = 7 do-blocks; 3+1+2+4+1+1+3 = 15
      assertions).
    2. Same doc §9.3 item 4: "All five BM tests are deterministic
      and tractable" → "All seven BM blocks are deterministic and
      tractable."
    3. tests/test_state_bot.lua BM section header docblock: added
      BM.6 — current-trick false-AKA carve-out — to the bullet
      list that previously stopped at BM.5.
      Harness unchanged (1295 / 0). H1/H7 smokes unchanged (11/0 +
      9/0). No runtime / assertion / fixture changes.
      Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
  • fix(Bot.lua): current-trick false-AKA carve-out (Codex amend round 2)
    Codex review of the round-1 fix at 2c67a91 found that the
    p.illegalReason == "false AKA" carve-out applied only to the
    completed-tricks scan; the v1.5.1 "do NOT scan in-progress
    trick" rule at Bot.lua:5969 still blocked current-trick catches.
    That rule is correct for revoke / off-suit illegal plays —
    they need a later same-suit reveal which is structurally
    impossible inside the current trick — but false AKA is
    different. State.ApplyPlay marks the false-AKA lead via the
    public-knowledge predicate (playedCardsThisRound + AKA banner)
    the moment the lead hits the table; HostBeginTakweeshReview's
    own scan at Net.lua:3370-3372 already covers the current
    trick. A human pressing TAKWEESH the moment after an opp's
    false AKA catches it correctly; bot caller should match.
    Amend: add a second carve-out that scans S.s.trick.plays for
    opposing false-AKA plays only. Revoke / off-suit reasons stay
    gated by the v1.5.1 rule.
    Tests: BM.6 added. Pre-amend BM.6 FAILS (verified via stash
    push: 1292/1); post-amend passes. BM.2A (revoke without
    reveal) is the regression guard against accidentally widening
    the current-trick scan to all illegal reasons.
    Harness: 1280 baseline → 1292 (round 1) → 1295 (round 2).
    H1/H7 smokes clean.
    Doc: .swarm_findings/v3_2_6_aka_takweesh_investigation.md
    updated to document both carve-outs (A: completed-tricks,
    B: current-trick) and the round-2 amend rationale.
    Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
  • fix(Bot.lua): false-AKA carve-out in Bot.PickTakweesh
    Bot.PickTakweesh's v1.5.1 realism gate at Bot.lua:5962
    (laterPlayedLeadSuit) was designed for revoke / off-suit
    illegal plays where the violator later reveals having had the
    led suit. That gate does not fit false-AKA semantics: false-AKA
    marking at State.lua:1466-1493 is public-knowledge based,
    deriving the violation directly from playedCardsThisRound + the
    AKA banner at the moment of the lead. No later reveal is needed.
    Pre-fix the bot caller mis-gated false-AKA markers and rarely
    caught noise-AKA bluffs (the SaudiMaster v1.2.1 A2 / v1.6.0 8%
    deception layer), even though the host's HostBeginTakweeshReview
    scan at Net.lua:3360-3372 and HostResolveTakweesh scan at
    Net.lua:3543-3555 both already accept the illegal flag directly
    with no realism gating. Asymmetric: human opponents clicking
    TAKWEESH caught the bluff at 100% of click rate; bot opponents
    near 0%.
    Fix: in Bot.PickTakweesh's opposing-illegal scan, special-case
    illegalReason == "false AKA" to bypass the realism gate. The
    revoke-style branch is preserved verbatim. Scope: ~5 lines,
    single function, single branch. Restores v1.2.1 (A2) / v1.6.0
    design intent that noise-AKA is a bluff with a real probability
    of being caught.
    Tests: BM section in tests/test_state_bot.lua wire-proves the
    fix + locks adjacent behavior:
    BM.1 — false AKA is immediately bot-catchable (FAILS pre-fix,
    passes post-fix). The wire-discriminator for the
    carve-out.
    BM.2A — non-false-AKA illegal WITHOUT later reveal still
    returns nil (revoke-style realism gate preserved).
    BM.2B — non-false-AKA illegal WITH later reveal catches
    (revoke-style realism gate fires correctly).
    BM.3 — same-team Takweesh scan rejects via
    HostBeginTakweeshReview's same-team filter at
    Net.lua:3362 (documents the UX hazard for the future
    v3.2.6b tooltip clarification).
    BM.4 — Bot.PickAKANoise deterministic emission at
    SaudiMaster with math.random stub (new coverage).
    BM.5 — Bot.PickAKANoise declines when bot holds actual A
    (new coverage of the no-noise-opportunity carve-out).
    Verified pre-fix: BM.1 FAILS (1289/1) with the runtime change
    stashed. Post-fix: 1292/0. H1/H7 smokes clean.
    Design + investigation docs:
    .swarm_findings/v3_2_5_release_readiness_checkpoint.md
    .swarm_findings/v3_2_6_aka_takweesh_investigation.md
    Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
  • docs: add v3.2.5 release-readiness + v3.2.6 AKA/Takweesh investigation
    Two paired investigation docs:
    1. v3_2_5_release_readiness_checkpoint.md — recommends HOLD on
      a standalone v3.2.5 tag. v3.2.5 work is test-only (BH/BI/BJ/
      BK/BL = 22 new harness checks, harness 1258 -> 1280) with
      zero runtime/.toc/.pkgmeta/UI/protocol/scoring delta vs
      v3.2.3. Bundling into v3.2.6 avoids a double-release.
    2. v3_2_6_aka_takweesh_investigation.md — investigates a user-
      reported "bot AKA -> Takweesh" incident. Findings:
      • A1 (human opp clicks TAKWEESH on false AKA): working as
        designed; host's HostBeginTakweeshReview scan trusts the
        illegal flag with no realism gate.
      • A2 (bot opp Bot.PickTakweesh mis-gates false AKA via the
        revoke-style realism check at Bot.lua:5962): LIKELY
        RUNTIME BEHAVIOUR GAP. The v1.5.1 laterPlayedLeadSuit
        realism gate was designed for revoke-style violations,
        not for public-knowledge false-AKA marking from
        playedCardsThisRound + AKA banner. Bots therefore rarely
        punish noise-AKA bluffs.
      • B (same-team Takweesh click penalizes caller): UX hazard,
        deferred to a separate v3.2.6b round.
        Proposed runtime fix: ~5-line Bot.PickTakweesh carve-out for
        illegalReason == "false AKA" to bypass the realism gate.
        Proposed BM test slice: BM.1 false-AKA bot catch (FAILS pre-
        fix, motivates the change), BM.2A/B revoke-style realism gate
        preserved, BM.3 same-team filter, BM.4/BM.5 PickAKANoise
        deterministic emission + carve-out.
        Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
  • test(Bot.lua): add T-4 Sun pos-4 Faranka regression coverage
    Add BL section to tests/test_state_bot.lua for T-4 from
    .swarm_findings/v3_2_5_t4_sun_pos4_faranka_design.md:
    BL.1 — Sun pos-4 Faranka outer-gate positive. Advanced (NOT
    M3lm) tier; Sun bidder seat 1, bot seat 3 (team A);
    trick 8H/JH/9H partner-winning; hand {AH, KH, 8C, 7D}.
    Outer gate at Bot.lua:3179-3181 passes; hasA + cover=KH
    + suitCount=2; TH unplayed so holdsTopTwoUnplayed=false.
    Inner block enters but M3lm-gated random branches skip
    (Advanced not M3lm); falls to return cover = KH.
    BL.2 — v1.4.0 anti-trigger row 167 negative. Same fixture
    except TH added to playedCardsThisRound, so
    holdsTopTwoUnplayed becomes true. T-4 inner block
    bypassed at L3232; falls to smother at L3366 which
    returns highest point card = AH.
    BL.3a — Source pin on v0.5.21 outer-gate marker at Bot.lua:3155.
    BL.3b — Source pin on v1.4.0 Concern 5 audit-fix marker at
    Bot.lua:3201.
    Framing note (Codex review): BL.1's cover KH (RANK_PLAIN 6)
    actually beats partner's JH (RANK_PLAIN 4); the bot takes the
    trick rather than ducking. Test docstrings and inline comments
    describe BL.1 as wire-proving branch priority + AH preservation,
    NOT the canonical "duck and let partner take" v0.5.21 / video
    #06 strategic outcome. Our fixture violates the cover-strictly-
    lower-than-table premise to keep the wire-discriminator clean
    (KH vs AH).
    Tier: Advanced (NOT M3lm). Keeps the M3lm-gated 5-factor random
    capture path at Bot.lua:3345 + 3352 inactive; no math.random
    stub needed. Per design doc §10, the 5-factor framework's
    per-factor effects are wire-invisible at the returned-card
    level (deferred indefinitely).
    Harness delta: 1276 -> 1280 / 0.
    Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
  • docs: add v3.2.5 T-4 Sun pos-4 Faranka design
    Inventory pass for the v0.5.21 Sun pos-4 Faranka outer gate at
    Bot.lua:3179-3181 and the v1.4.0 (Concern 5) anti-trigger row 167
    carve-out at Bot.lua:3201-3225. Proposes a minimal-batch BL slice
    that wire-proves both deterministic paths without math.random
    stubs: Advanced (non-M3lm) keeps the M3lm-gated 5-factor random
    branches inactive.
    Classification A: test-only coverage backfill. The 5-factor
    framework's internal probabilistic behavior is wire-invisible
    (captureRate clamp + wobble + random roll), but the outer gate
    and anti-trigger row 167 are both deterministic and audit-
    relevant.
    Framing correction per Codex review: BL.1's cover KH actually
    beats partner's JH in our fixture (RANK_PLAIN K=6 > J=4); the
    bot takes the trick rather than ducking. The test wire-proves
    branch priority + row 167 polarity, NOT the "duck + let partner
    take" canonical Saudi strategic outcome. Doc explicitly
    forbids "duck under JH" / "partner keeps the trick" framing
    in implementation docstrings.
    Expected harness delta 1276 -> 1280 / 0 (+2 behavioural + 2
    source pins on v0.5.21 outer gate and v1.4.0 row 167 markers).
    Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
  • test(Bot.lua): add T-2 sweep-pursuit-early regression coverage
    Add BK section to tests/test_state_bot.lua for T-2 from
    .swarm_findings/v3_2_5_t2_sweep_pursuit_design.md:
    BK.1 — sweep-pursuit-early positive. Hokm trump=S, bot seat 3
    (bidder-team), M3lm. 6 prior tricks all won by team A
    → mySwept=6 == trickNum-1. Hand {JS, 9S}: U-7
    feasibility check auto-counts J+9 as 2 winners (>=
    remainingNeeded=2). Boss-scan returns JS via
    highestByFaceValue().
    BK.2 — sweep-pursuit-early negative (one opp prior win). Same
    fixture, tricks[2].winner = 2 (opp). mySwept=5 != 6 →
    gate fails. All-trump hand falls to no-non-trump
    fallback at Bot.lua:2937 → lowestByRank({JS, 9S}) = 9S
    (trump-rank 7 < J trump-rank 8).
    BK.3 — Source pin on v1.0.3 U-7 Kaboot-feasibility hand-shape
    gate marker at Bot.lua:1089.
    Fixture is deliberately minimal: all-trump 2-card hand at
    trickNum=7 sidesteps HUR stubbing and playedCardsThisRound
    seeding while wire-proving both branches of the v1.0.3 U-7
    feasibility gate.
    Harness delta: 1273 -> 1276 / 0.
    Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
  • docs: add v3.2.5 T-2 sweep-pursuit-early design
    Inventory pass for the T-2 sweep-pursuit-early Kaboot lead branch
    at Bot.lua:1081-1136 (the v1.0.3 U-7 Kaboot-feasibility hand-shape
    gate). Proposes a minimal-batch BK slice with all-trump 2-card
    hand at trickNum=7 to wire-prove the gate without HUR stubbing or
    playedCardsThisRound seeding.
    Classification A: already correct; needs regression coverage only.
    Positive (JS) and negative (9S) wire-discriminate the sweep-pursuit
    fire vs natural lowestByRank fallback. Expected harness delta
    1273 -> 1276 / 0 (+2 behavioural + 1 source pin on the v1.0.3
    U-7 Kaboot-feasibility hand-shape gate marker at Bot.lua:1089).
    Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
  • test(Bot.lua): add T-10 Tahreeb-return regression coverage
    Add BJ section to tests/test_state_bot.lua for T-10 from
    .swarm_findings/v3_2_5_t10_tahreeb_return_design.md:
    BJ.1 — Tahreeb-receiver T-supply positive. Hokm trump=S, bot
    seat 3, partner seat 1 bot, M3lm. tahreebSent.H = {"7","9"}
    → "want" flavor; hand {TH, 9H, 8H, JD}. T-10 fires at
    Bot.lua:1776-1788 → returns TH.
    BJ.2 — T-10 negative (flavor != want). Same fixture, signal
    changed to single Ace {"A"} → "bargiya_hint" flavor.
    T-10 doesn't fire; falls back to lowestByRank → 8H.
    Wire-discriminator on the v1.1.0 H1 flavor restriction.
    BJ.3 — Source pin on receiver-side bot-only doc marker at
    Bot.lua:1278 ("relevant seat is a bot").
    BJ.4 — Source pin on v1.4.5 sender/receiver asymmetry note at
    Bot.lua:3580 ("Receiver-side reads of human signals are").
    The partner-bot gate at Bot.lua:1294 is intentional per the v1.4.5
    audit (sender removed the gate; receiver kept it because human
    discards are noise, not deliberate signaling). BJ.3 + BJ.4 lock
    the two doc markers anchoring this architectural asymmetry.
    Harness delta: 1269 -> 1273 / 0.
    Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
  • docs: add v3.2.5 T-10 Tahreeb-return design
    Inventory pass for the T-10 Tahreeb-receiver T-supply branch
    (count>=3 + "want" flavor) at Bot.lua:1776-1788 and the upstream
    partner-bot gate at Bot.lua:1294.
    Conclusion: the partner-bot gate is intentional and audit-endorsed
    per the v1.4.5 sender-side asymmetry note (Bot.lua:3580-3583), the
    Fzloky H-12 rationale (Bot.lua:1804-1810), and the inline doc at
    Bot.lua:1278-1279. Classification A: test-only coverage backfill,
    no behavior bug.
    Proposes a smallest-batch BJ slice: positive + negative behavioural
    fixtures (TH vs 8H wire discriminator) plus two single-line source
    pins on the architectural-asymmetry markers. Expected harness delta
    1269 -> 1273. Round-2 amendment replaces wrapped-comment-line
    anchors with verified single-line anchors at Bot.lua:1278 and 3580.
    Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
  • test(Bot.lua): add Faranka Exception #2 regression coverage
    Add BI section to tests/test_state_bot.lua for the deferred Batch B
    candidate from .swarm_findings/v3_2_5_high_pickplay_batch_b_design.md:
    BI.1 — Exception #2 positive (F-16 K-cover satisfied).
    Side-suit H-led must-follow with hand {AH, 7H, KD, 9D}.
    myTrumpCount==2 + onBidderTeam fires E2; F-16 satisfied
    by KD. Faranka returns non-trump loser 7H.
    BI.2 — Exception #2 negative (F-16 vetoes via no-K).
    Same trick, hand {AH, 7H, 9D, 7D}. E2 trigger fires but
    F-16 vetoes (no K of trump). Natural pos-4 play returns
    winner AH. Wire-discriminator on the F-16 K-cover veto.
    BI.4 — Source pins on existing F-16 K-cover veto block markers
    (v0.10.0 X3 anti-rule F-16, v0.10.3 audit A-Src-29,
    v3.2.1 F4). No runtime markers added.
    Harness delta: 1264 -> 1269 / 0.
    Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
  • docs(v3.2.5 batch B): switch BI.1/BI.2 to side-suit-led fixtures
    The trump-led fixture proposed in the first Codex amendment turned
    out to be structurally unreachable: Saudi/Belote must-overcut at
    Rules.lua:175-196 strips the non-winner trump from legal whenever
    the hand contains an overcut, which short-circuits Bot.PickPlay
    before pickFollow's Faranka block runs.
    Re-amended per Codex re-approval to the BH.2-family side-suit-led
    fixture: H-led must-follow with myTrumpCount==2 counted off-legal
    in hand. BI.1 returns 7H (Faranka non-trump loser); BI.2 returns
    AH (natural pos-4 winner when F-16 vetoes via no-K).
    Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
  • docs: add v3.2.5 high pickplay batch B design
    Inventory pass for the deferred Batch B candidates after the v3.2.5
    BH-section merge: T-1.E2 (Hokm Faranka Exception #2 positive +
    F-16 K-cover veto negative), with T-10 and T-2 documented but
    deferred to later slices. Doc proposes a smallest-batch BI slice
    of two behavioural + three source-pin checks, expected harness
    delta 1264 -> 1269.
    Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
  • test(BH): comment-only polish per Codex review
    Two comment-only fixes to the v3.2.5 Batch A BH section:
    1. BH.3 trace comment: replaced "winning trump rank in led suit"
      with "winning led-suit Ace" — AH is a non-trump card winning
      the led suit H; calling it a "trump rank" was incorrect since
      trump is D in this fixture.
    2. BH.4b oppsVoidPath comment: removed the inaccurate reference
      to the relocated F5-3 site. The oppsVoidPath flag belongs to
      the Hokm Faranka Exception #4 / F-16 K-cover veto carve-out
      path, not to F5-3. Reworded to: "consumed by the F-16 K-cover
      veto carve-out in the Hokm Faranka exceptions block to allow
      Faranka when both opps are observed-void in trump."
      No test logic changes. No runtime changes. No .toc/.pkgmeta/
      workflow/CHANGELOG/tag/release.
      Verification:
    • git diff --check main...HEAD: clean
    • Full harness: 1,264 / 0 (unchanged)
    • H1 smoke: 11/0; H7 smoke: 9/0
      Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
  • test(Bot.lua): add HIGH pickplay regression coverage
    Batch A from .swarm_findings/v3_2_4_high_pickplay_coverage_design.md
    (approved by Codex with 2 rounds of doc amendment). Test-only batch
    covering two Saudi-canonical "Definite" branches identified as
    HIGH-risk untested in the v3.2.1 audit:
    • BH.1 (audit T-6): Tahreeb "want, no A/no T" sender at Bot.lua
      :3676-3701 (Sun pickFollow). Per signals.md §8 (Definite,
      videos 01/09/10).
    • BH.2 + BH.3 (audit T-1.E4): Hokm Faranka Exception #4 both-opps-
      void at Bot.lua:4017-4060. Per decision-trees.md §10 (Definite,
      video #04). BH.2 positive returns Faranka loser 7H; BH.3 negative
      (one opp void) returns winner AH. The 7H ↔ AH pair is the
      wire-discriminator that proves Exception #4 fired specifically.
    • BH.4 (source-pin block): three sub-asserts on EXISTING in-source
      markers (v0.11.18-final U-2, oppsVoidPath, v0.10.3 F-30b). No
      new runtime markers added — test-only batch.
      Fixture design notes:
    • BH.1 uses strict positive card == "8H" assertion (not weakened
      negative card ~= "7D"). Per-suit Tahreeb scope returns 8H from
      the candidate suit H; if T-6 didn't fire, fallback's
      lowestByRank(legal) would return 7D from the side D suit.
    • BH.2/BH.3 use a Hokm-LEGAL must-follow hand {AH, 7H, JD, 8C} →
      legal {AH, 7H} after must-follow H. (Earlier draft used a
      void-in-led {JD, 8C, 7C} hand which would have violated Hokm
      must-trump; non-trump 8C/7C are illegal when bot has trump in
      hand and is void in led suit.)
      All four tests are regression guards on already-correct runtime;
      no pre-runtime failures expected.
      Harness: 1,258 → 1,264 (+6 new BH.* checks: 3 behavioural +
      3 source-pin sub-asserts). Smokes: H1 11/0, H7 9/0.
      Files: tests/test_state_bot.lua only. NO Bot.lua, BotMaster.lua,
      Net.lua, State.lua, Rules.lua, Cards.lua, UI*, .toc, .pkgmeta,
      workflow, or packaging changes.
      Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
  • docs: add v3.2.5 high pickplay coverage design
    Design + 3 rounds of Codex review for Batch A test-only coverage
    of the v3.2.1-audit-identified HIGH-risk Saudi-canonical branches.
    Approved Batch A scope:
    • BH.1: Tahreeb "want, no A/no T" sender (Sun pickFollow)
    • BH.2: Hokm Faranka Exception #4 (both opps void in trump) positive
    • BH.3: Exception #4 negative-paired wire-discriminator
    • BH.4: source pins on existing in-source markers ONLY (no new
      runtime markers)
      Key design refinements via Codex review:
    • BH.2/BH.3 fixtures use Hokm-legal must-follow hand
      {AH, 7H, JD, 8C} (not the v0.2 illegal void-in-led {JD, 8C, 7C}). The non-trump losers 8C/7C were illegal under Hokm
      must-trump in the original draft.
    • Wire-discriminator: both-opps-void returns loser 7H; one-opp-void
      returns winner AH.
    • BH.1 strict positive card == "8H" (not weakened card ~= "7D").
    • BH.4 source-pins target EXISTING markers only; implementation
      MUST NOT modify Bot.lua to add new markers for these pins.
      Other 4 HIGH-risk audit candidates deferred:
    • T-2 (sweep-pursuit-early): MED — fixture state-setup complexity
    • T-10 (Tahreeb T-supply): MED — partner-style ledger setup
    • T-1.E2 (Exception #2 positive): MED — careful trump-count gating
    • T-4 (Sun pos-4 5-factor Faranka): MED-HIGH — probabilistic,
      same EV-gap concern as F2 deferral
      Expected harness delta: 1,258 → 1,264 (+6 new BH.* checks:
      3 behavioural + 3 source-pin sub-asserts).
      Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
  • docs: add v3.2.4 F2 deception deferral design
    F2 pos-3 Sun «تخليه يمسك» / hold-back deception relocation
    design pass, approved by Codex with the recommendation to defer
    F2 indefinitely.
    Key findings (full reasoning in §3.3 of the doc):
    • v3.2.3's F5-3 relocation already implements F2's primary
      "duck-low when K beats partner" behaviour deterministically
      via its not wouldWin(c, trick, contract, seat) candidate
      filter. F5-3 and F2 converge on the same low card for ~95%
      of F2's intended fire window.
    • The F2-unique territory — Smother override at tricks 4-5
      with a probabilistic 30%/40% gate — has speculative EV and
      requires the riskiest placement option (Option A: before
      Smother). The «تخليه يمسك» deception value diminishes as
      opp's hand-distribution model improves with more observed
      plays; trick-4-5 is the wrong window for it.
    • Deterministic fire/no-fire stubs (Strategy 1) + source pins
      on rate literals (Strategy 3) would be sufficient for a
      narrow implementation, but neither proves long-run rate or
      EV. The EV gap, not a test-framework gap, is the primary
      deferral rationale.
      This commit ships the design doc only — no Bot.lua, tests,
      .toc, .pkgmeta, or workflow changes. F2's existing v3.2.1
      "UNREACHABLE in production" comment marker at Bot.lua:4533-
      4547 stays as-is; the optional §8.1 narrow-batch comment-
      marker update was not requested.
      Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com