id: e76dcc40c17e460da5e3e447f7c3732d
parent_id: 
item_type: 1
item_id: 60976d006f58404387784a6b90ebf04c
item_updated_time: 1782124717721
title_diff: "[{\"diffs\":[[1,\"Live Audit Findings — 2026-06-22 Session\"]],\"start1\":0,\"start2\":0,\"length1\":0,\"length2\":40}]"
body_diff: "[{\"diffs\":[[1,\"# Live Audit Findings — 2026-06-22 Session (Updated)\\\n\\\nAudited ~100 hands of live Torn cash NL play ($500/$1000 blinds, antes).\\\nServer: `live_server` on 127.0.0.1:8088, bot config: `cash_nl.toml` (g2_postflop_rollout_v4).\\\n\\\n---\\\n\\\n## Already Fixed This Session\\\n\\\n1. **`powf(0)` raise gate bug** — `strength^0 = 1.0` always exceeded raise threshold when `num_raises=0`. Fixed in `rollout_postflop_base.rs` + `table_state.rs`.\\\n2. **Preflop re-raise pot odds** — AJs folded facing 3-bet getting 13.8:1. Added `reraise_pot_odds_call_ratio` to `big_stack_preflop.rs`.\\\n\\\n---\\\n\\\n## CRITICAL — Bot Strategy Issues\\\n\\\n### B1: \\\"4-bet = AllIn\\\" without stack/sizing awareness\\\n**File:** `rollout_postflop_base.rs:665-667` (and OTB path at 717-718)\\\n```rust\\\nif self.did_raise_this_round(ctx) {\\\n    return Action::AllIn;\\\n}\\\n```\\\n**Evidence:** Hand `592cf47e` — A6o on [As 6d 3d] (two pair), hero c-bet $1800, opponent min-raised to $3600. Bot shoved **$119,700** (120BB) into a $8900 pot. Opponent called with A8o and lost, but this is extreme high-variance.\\\n**Impact:** Any time the hero has already raised this street (c-bet, 3-bet) and wants to raise again, it goes all-in regardless of stack depth. Designed for short-stack but catastrophic with deep stacks.\\\n\\\n### B2: Postflop call threshold ignores extreme pot odds\\\n**File:** `rollout_postflop_base.rs:671-684`\\\n**Evidence:** Hand `816a02ea` — AKs on [Qc 6d Th], facing $1000 into $15500 pot (15.5:1, needs 6% equity). Bot folded.\\\n**Root cause:** Pot-odds adjustment formula `(pot_odds/2.0)^1.6 / 60.0` only reduces threshold from 0.86→0.43 at 15.5:1. AKs has ~30% equity but needs >43%.\\\n**Impact:** Bot folds too tightly facing small bets postflop.\\\n\\\n### B3: Suited one-gappers excluded from playable range\\\n**File:** `big_stack_preflop.rs:399`\\\n```rust\\\nif r0 >= FIVE && r0 == r1 + 1 && suited {\\\n```\\\n**Evidence:** J9s folded twice from BTN facing 1BB (hands `2ac4eb85`, `796b8c7e`). J(9) - 9(7) = 2 gap, so `r0 == r1 + 1` fails.\\\n**Impact:** J9s, T8s, 97s, 86s etc. all folded from late position. Range too tight.\\\n\\\n---\\\n\\\n## CRITICAL — Userscript Issues\\\n\\\n### U1: `seenTexts` never cleared between hands\\\n**File:** `parser.ts:242, 574` — `resetHand()` clears everything except `seenTexts`\\\n**Impact:** After hand 1, messages with identical text (e.g., \\\"Bolsa folded\\\", \\\"Bolsa checked\\\") are silently skipped as \\\"already seen.\\\" Repeated actions by the same player across hands are dropped. Server sees missing actions and must synthesize blinds.\\\n**Note:** Blind messages include player names, so they're less affected (different player each hand). But hero's own repeated actions (fold/check) ARE affected.\\\n\\\n### U2: `forceFlush` race — game_start emitted before blind messages\\\n**File:** `parser.ts:411-443`, `index.ts:456`\\\n**Impact:** Every poll tick (1s), if `awaitingBlinds=true` and events are pending, `forceFlush` synthesizes `game_start` with fallback blinds. Real blind messages arrive later as separate events. Server sees inconsistent blind data.\\\n**Evidence:** 15 of ~20 recent hands had \\\"synthesized missing blind posting\\\" WARN on the server.\\\n\\\n### U3: k/M suffix raise parsing failure\\\n**File:** `parser.ts:141-142` — regex `[\\\\d,]+` stops before k/M\\\n**Impact:** `\\\"raised $5k to $10k\\\"` parsed as `$5 to $10` instead of `$5000 to $10000`. Catastrophic for large bets.\\\n\\\n### U4: Player names containing \\\"flop\\\"/\\\"turn\\\"/\\\"river\\\" misclassified\\\n**File:** `parser.ts:172-176` — `actor.toLowerCase().includes(...)` checked before action classification\\\n**Impact:** Player \\\"Turner\\\" or \\\"Rivera\\\" has ALL their actions misclassified as street deal events.\\\n\\\n### U5: `clickWhenReady` retry doesn't re-validate hand ID\\\n**File:** `executor.ts:96-114`\\\n**Impact:** 3-second retry loop can click an action button from hand N in hand N+1 if the turn expires and a new hand starts.\\\n\\\n### U6: Events lost on observer re-attachment\\\n**File:** `index.ts:304-317` — marks ALL messages as seen without processing on re-attach\\\n**Impact:** When React re-renders the `<ul>`, messages in the gap are permanently lost.\\\n\\\n---\\\n\\\n## WARNING — Data Pipeline Issues\\\n\\\n### D1: Missing ante events (chronic)\\\n**Evidence:** Most hands capture only 1-2 of ~9 player antes. E.g., hand `f96b00c5`: pot=2500 but should be ~10500 (missing ~8000 in antes).\\\n**Impact:** Pot undercounted by 7-8BB/hand → wrong pot odds, wrong bet sizing. T9s turn raise of $1300 was meant as ~50% pot but was actually ~12% of true pot.\\\n\\\n### D2: Timestamp-based hand IDs (recurring)\\\n**Evidence:** 3 hands with `torn-holdem-<timestamp>` IDs, indicating `forceHandStart` fallback.\\\n**Root cause:** `game_started` message not parsed before hero's turn fires (page reload or observer lag).\\\n\\\n### D3: SB amount=0 in synthesized blinds\\\n**Evidence:** Hand `torn-holdem-1782122891479`: `synthesized missing blind posting seat=1 blind=\\\"small blind\\\" amount=0`\\\n**Root cause:** `self.small_blind` was 0 when server synthesized the blind (game_start hadn't arrived yet).\\\n\\\n---\\\n\\\n## MEDIUM — Userscript Edge Cases\\\n\\\n### M1: `inferBlindSeats` mutates stable seat assignments\\\n**File:** `parser.ts:450-472` — calls `seatForName` which fabricates seats\\\n**Impact:** Players not in the initial snapshot get wrong seat numbers for the entire hand.\\\n\\\n### M2: `readSeatName` fails on wrapped names\\\n**File:** `table_dom.ts:219-227` — only reads direct text nodes, misses `<span>`-wrapped names\\\n**Impact:** Players with styled names silently dropped from snapshot.\\\n\\\n### M3: Infinite reload loop possible\\\n**File:** `index.ts:515-523` — 3 consecutive corrupt hands → page reload, but no backoff or max count\\\n**Impact:** If blind parsing is consistently broken, page enters infinite reload cycle.\\\n\\\n### M4: Hero name hardcoded\\\n**File:** `config.ts:27` — `heroName: \\\"Bolsa\\\"`\\\n**Impact:** No auto-detection; if Torn changes display name or config is wrong, bot silently never acts.\\\n\\\n---\\\n\\\n## Strategic Decision Review (Post-Fix Hands)\\\n\\\n### Correct Decisions\\\n- T9s check from BB, turn semi-bluff raise with flush draw ✓ (sizing affected by D1 though)\\\n- A6o raise from SB preflop ✓\\\n- A6o c-bet $1800 on [As 6d 3d] with two pair ✓\\\n- 42o fold from BTN ✓\\\n- 63o fold from BTN facing 5x ✓\\\n- 75o fold from HJ ✓\\\n\\\n### Questionable Decisions\\\n- **A6o ALL-IN $119,700 with two pair** — overbet shove, won by luck (B1)\\\n- **AKs fold facing $1000 into $15500** — too tight (B2)\\\n- **J9s fold from BTN** — too tight, standard call (B3)\\\n\\\n### Bankroll\\\n- Session peak: ~248k (after winning the A6 all-in)\\\n- Session low: ~119k\\\n- Current: ~248k (rebounded from the all-in win)\\\n\\\n---\\\n\\\n## Priority Fix Order (Suggested)\\\n\\\n1. **U1** (`seenTexts` clear) — 1-line fix, prevents action loss\\\n2. **B1** (all-in without sizing) — add stack-depth check before `Action::AllIn`\\\n3. **U3** (k/M suffix) — regex fix, prevents catastrophic amount parsing\\\n4. **B3** (suited gappers) — add `r0 - r1 <= 2` condition\\\n5. **D1** (missing antes) — server-side pot reconciliation from table snapshot\\\n6. **B2** (pot odds threshold) — tune `call_pot_odds` parameters\\\n7. **U4** (name misclassification) — reorder classification logic\\\n8. **U5** (stale click) — pass hand ID into executor\"]],\"start1\":0,\"start2\":0,\"length1\":0,\"length2\":7043}]"
metadata_diff: {"new":{"id":"60976d006f58404387784a6b90ebf04c","parent_id":"1246bbc3bb4948fc8329079b84b4ae3d","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":1782123630824,"markup_language":1,"is_shared":0,"share_id":"","conflict_original_id":"","master_key_id":"","user_data":"","deleted_time":0},"deleted":[]}
encryption_cipher_text: 
encryption_applied: 0
updated_time: 2026-06-22T10:46:18.881Z
created_time: 2026-06-22T10:46:18.881Z
type_: 13