Live Audit — Session Findings (2026-06-23)

# Live Audit — Session Findings (2026-06-23)

Auto-collected by `scripts/live_audit.sh` (loop: `scripts/live_audit_loop.sh`, 10-min interval).
Scope: hands, decisions, and scraper (event-stream) audit. Issues logged for later processing; **only scraper/data-pipeline issues are fixed in-flight**. Full detail in "Live Audit — Open Issues Tracker".

## Setup
- **Server**: `live_server` on `127.0.0.1:8088`, debug log → `/tmp/live_server.log`
- **Bots**: `cash_nl` (Gen 3), `sng_gen2`
- **Audit loop**: 10-min, findings in `/tmp/live_audit_findings.{log,jsonl}` + `/tmp/live_audit_digest.md`

## D4 — Dealer button stuck at seat 0 (scraper) — fix BUILT, NOT YET ACTIVE
- **Root cause**: `buildGameStart()` (parser.ts:650) ignored the correctly-detected
  `snap.dealerSeat` (from the `dealer___ position-N___` div) and keyed off flaky
  `dealerName`, defaulting to `0` ~95% of hands.
- **Fix applied** (parser.ts, built to `torn/dist/torn.user.js` @ 07:58): prefer `snap.dealerSeat`.
- **STATUS: NOT ACTIVE in browser.** The userscript is self-contained (no `@require`/`@updateURL`,
  static `@version 0.1.0`), so TamperMonkey keeps its installed copy — a page refresh does NOT
  reload the rebuilt dist. **User must re-import `dist/torn.user.js` into TamperMonkey, then refresh.**
- Live data after 10m still shows mostly `dealer=0` (old script running). Blinds themselves
  rotate correctly (SB/BB at 3/4 → 2/3 → 1/2 → 0/1 → 6/8 → 5/6 …); only the button is wrong.

## B8 — `num_callers` counts all calls, not callers of the last raise (bot) 🔴 NEW
**File:** `holdem_bots/src/strategy_bot.rs:119-122`
```rust
let num_callers = our_street_actions
    .iter()
    .filter(|ra| matches!(ra.action, Action::Call))
    .count() as u32;   // BUG: includes SB post + limpers before the last raise
```
**Definition (per user):** callers = only players who called the LAST raise/bet on the street.
- Should count `Call` actions occurring **after the last `Raise`** on the street.
- **Demonstrated on QJs hand (736c9b23)**, facing a 3-bet to 7000: bot computes
  `num_callers=7` (SB-post + 2 pre-raise limps + hero limp + 3 callers), correct value = **4**
  (only the 4 callers of seat2's 3-bet).
- **Impact:** inflates `num_callers` → widens `determine_call_cards_threshold`
  (`to_call_bb <= 6.0 + num_callers`) and limp-threshold blending → calls too wide in raised
  multiway pots. (For promotion to Open Issues Tracker as B8.)
- **NOT fixed** — bot logic, out of in-flight scope.

## num_raises — verified CORRECT ✅
Uses `GameInfo.num_raises` (TableState: BB=1, each Bet/Raise +1). QJs hand: 3 raises
(BB + seat1 + seat2). Blinds count as one raise; postflop bets count as raises. Sound.

## Live behaviour flags (bot strategy — logged only, not fixed)
- J5s limp + call min-raise; Q8s/A8o/JTs limps — aggravated by D4 (wrong button) + B8.
- K6s flop bet on [Ac Td Th] (missed board, air) — `g3_postflop` aggression (B7).

## Cumulative findings log (auto loop)
Appended by the 10-min loop to `/tmp/live_audit_findings.{log,jsonl}`; synced here each interaction.

id: a9fdebe8c23b4840b9d1d273ba0812f6
parent_id: 1246bbc3bb4948fc8329079b84b4ae3d
created_time: 2026-06-23T05:20:16.508Z
updated_time: 2026-06-23T14:30:00.951Z
is_conflict: 0
latitude: 0.00000000
longitude: 0.00000000
altitude: 0.0000
author: 
source_url: 
is_todo: 0
todo_due: 0
todo_completed: 0
source: joplin-desktop
source_application: net.cozic.joplin-desktop
application_data: 
order: 1782192016508
user_created_time: 2026-06-23T05:20:16.508Z
user_updated_time: 2026-06-23T06:31:34.168Z
encryption_cipher_text: 
encryption_applied: 0
markup_language: 1
is_shared: 0
share_id: 
conflict_original_id: 
master_key_id: 
user_data: 
deleted_time: 1782225000951
type_: 1