id: a39724a7002d46e981e659739677f4f1
parent_id: e76dcc40c17e460da5e3e447f7c3732d
item_type: 1
item_id: 60976d006f58404387784a6b90ebf04c
item_updated_time: 1782143576503
title_diff: "[{\"diffs\":[[0,\"dit \"],[-1,\"Findings — 2026-06-22 Session\"],[1,\"— Open Issues Tracker\"]],\"start1\":7,\"start2\":7,\"length1\":33,\"length2\":25}]"
body_diff: "[{\"diffs\":[[0,\"dit \"],[-1,\"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\"],[1,\"— Open Issues Tracker\\\n\\\nUpdated 2026-06-22 after Gen 3 production switch + bet sizing improvements.\\\n\\\nProduction bot is now `cash_nl.toml` = `ng_preflop` + `g3\"],[0,\"_pos\"]],\"start1\":9,\"start2\":9,\"length1\":193,\"length2\":165},{\"diffs\":[[0,\"lout\"],[-1,\"_v4)\"],[1,\"`\"],[0,\".\\\n\\\n-\"]],\"start1\":183,\"start2\":183,\"length1\":12,\"length2\":9},{\"diffs\":[[0,\"\\\n## \"],[-1,\"Already Fixed\"],[1,\"RESOLVED\"],[0,\" Thi\"]],\"start1\":195,\"start2\":195,\"length1\":21,\"length2\":16},{\"diffs\":[[0,\"on\\\n\\\n\"],[-1,\"1.\"],[1,\"- [x]\"],[0,\" **\"],[-1,\"`\"],[0,\"powf(0)\"],[-1,\"`\"],[0,\" rai\"]],\"start1\":218,\"start2\":218,\"length1\":22,\"length2\":23},{\"diffs\":[[0,\"gate\"],[-1,\" bug\"],[0,\"** — \"],[-1,\"`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\"],[1,\"Fixed: `aggression_adjustment()` floors to 1.0\\\n- [x] **B3: Suited one-gappers** — Fixed: `ng_preflop` uses 169-hand ranking tables\\\n- [x] **Preflop re-raise pot odds** — Fixed: `reraise_pot_odds_call_ratio` in big_stack_preflop\\\n- [x] **f64::MAX sentinel in limp threshold** — Fixed: returns 0.0 instead of MAX\\\n- [x] **action_commits_me cost underestimate** — Fixed: passes `to_call + raise_amount`\\\n- [x] **Rigid 50% pot bet sizing** — Fixed: dynamic sizing (value 67%, wet 75%, bluff 40%) with ±10% jitter and 15% sizing swap\\\n- [x] **sweep_mode = true in production** — Fixed: `sweep_mode = false` in cash_nl.toml\\\n\\\n---\\\n\\\n## STILL OPEN\"],[0,\" — B\"]],\"start1\":244,\"start2\":244,\"length1\":300,\"length2\":645},{\"diffs\":[[0,\"Strategy\"],[-1,\" Issues\"],[0,\"\\\n\\\n### B1\"]],\"start1\":892,\"start2\":892,\"length1\":23,\"length2\":16},{\"diffs\":[[0,\"1: \\\"\"],[-1,\"4-bet =\"],[1,\"did_raise_this_round →\"],[0,\" All\"]],\"start1\":907,\"start2\":907,\"length1\":15,\"length2\":30},{\"diffs\":[[0,\"lop_\"],[-1,\"base.rs:665-667` (and OTB path at 717-718\"],[1,\"gen3.rs:978` (Gen3 raised-pot path\"],[0,\")\\\n``\"]],\"start1\":996,\"start2\":996,\"length1\":49,\"length2\":42},{\"diffs\":[[0,\"if self.\"],[1,\"base.\"],[0,\"did_rais\"]],\"start1\":1044,\"start2\":1044,\"length1\":16,\"length2\":21},{\"diffs\":[[0,\"`\\\n**\"],[-1,\"Evidence:** Hand `592cf47e` — A6o on [As 6d 3d] (two pair),\"],[1,\"Impact:** If\"],[0,\" her\"]],\"start1\":1115,\"start2\":1115,\"length1\":67,\"length2\":20},{\"diffs\":[[0,\"-bet\"],[-1,\" $1800,\"],[1,\"s and\"],[0,\" opp\"]],\"start1\":1138,\"start2\":1138,\"length1\":15,\"length2\":13},{\"diffs\":[[0,\"aise\"],[-1,\"d 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\"],[1,\"s, bot shoves full stack regardless of depth. Deep-stacked this is catastrophic high-variance. Needs\"],[0,\" stack\"],[-1,\" \"],[1,\"-\"],[0,\"depth\"],[-1,\". 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 — U\"],[1,\" check before converting to AllIn.\\\n\\\n### B2: Postflop call threshold still too tight vs small bets\\\n**Status:** Partially improved by Gen 3 weighted call system. Still needs verification with live data. The Gen 2 pot-odds formula at `rollout_postflop_base.rs:671` only reduces threshold to ~0.43 at 15:1 odds.\\\n\\\n---\\\n\\\n## STILL OPEN — Userscript (super-marvin-u\"],[0,\"sers\"]],\"start1\":1162,\"start2\":1162,\"length1\":1167,\"length2\":476},{\"diffs\":[[0,\"erscript\"],[-1,\" Issues\"],[1,\"s repo)\"],[0,\"\\\n\\\n### U1\"]],\"start1\":1635,\"start2\":1635,\"length1\":23,\"length2\":23},{\"diffs\":[[0,\":** \"],[-1,\"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 affect\"],[1,\"Repeated actions across hands silently dropp\"],[0,\"ed.\\\n\"]],\"start1\":1792,\"start2\":1792,\"length1\":406,\"length2\":52},{\"diffs\":[[0,\"art \"],[-1,\"emitted \"],[0,\"befo\"]],\"start1\":1880,\"start2\":1880,\"length1\":16,\"length2\":8},{\"diffs\":[[0,\":** \"],[-1,\"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\"],[1,\"Server synthesizes blinds with wrong amounts\"],[0,\".\\\n\\\n#\"]],\"start1\":1960,\"start2\":1960,\"length1\":324,\"length2\":52},{\"diffs\":[[0,\" failure\"],[1,\" ⚠️ CRITICAL\"],[0,\"\\\n**File:\"]],\"start1\":2043,\"start2\":2043,\"length1\":16,\"length2\":28},{\"diffs\":[[0,\"* `\\\"\"],[-1,\"raised \"],[0,\"$5k \"]],\"start1\":2138,\"start2\":2138,\"length1\":15,\"length2\":8},{\"diffs\":[[0,\"$10`\"],[-1,\" instead of `$5000 to $10000`\"],[0,\". Ca\"]],\"start1\":2173,\"start2\":2173,\"length1\":37,\"length2\":8},{\"diffs\":[[0,\"176`\"],[-1,\" — `actor.toLowerCase().includes(...)` checked before action classification\"],[0,\"\\\n**I\"]],\"start1\":2302,\"start2\":2302,\"length1\":83,\"length2\":8},{\"diffs\":[[0,\"er\\\" \"],[-1,\"or \\\"Rivera\\\" has ALL their\"],[1,\"has all\"],[0,\" act\"]],\"start1\":2331,\"start2\":2331,\"length1\":33,\"length2\":15},{\"diffs\":[[0,\"eet deal\"],[-1,\" event\"],[0,\"s.\\\n\\\n### \"]],\"start1\":2371,\"start2\":2371,\"length1\":22,\"length2\":16},{\"diffs\":[[0,\":** \"],[-1,\"3-second retry loop c\"],[1,\"C\"],[0,\"an c\"]],\"start1\":2481,\"start2\":2481,\"length1\":29,\"length2\":9},{\"diffs\":[[0,\"ick \"],[-1,\"an \"],[0,\"action \"],[-1,\"button \"],[0,\"from\"]],\"start1\":2491,\"start2\":2491,\"length1\":25,\"length2\":15},{\"diffs\":[[0,\" N+1\"],[-1,\" if the turn expires and a new hand starts\"],[0,\".\\\n\\\n#\"]],\"start1\":2521,\"start2\":2521,\"length1\":50,\"length2\":8},{\"diffs\":[[0,\"317`\"],[-1,\" — marks ALL messages as seen without processing on re-attach\"],[0,\"\\\n**I\"]],\"start1\":2598,\"start2\":2598,\"length1\":69,\"length2\":8},{\"diffs\":[[0,\"pact:** \"],[-1,\"Whe\"],[1,\"Messages i\"],[0,\"n React \"]],\"start1\":2607,\"start2\":2607,\"length1\":19,\"length2\":26},{\"diffs\":[[0,\"nder\"],[-1,\"s the `<ul>`, messages in the gap are\"],[1,\" gap\"],[0,\" per\"]],\"start1\":2638,\"start2\":2638,\"length1\":45,\"length2\":12},{\"diffs\":[[0,\"\\\n## \"],[-1,\"WARNING\"],[1,\"STILL OPEN\"],[0,\" — D\"]],\"start1\":2670,\"start2\":2670,\"length1\":15,\"length2\":18},{\"diffs\":[[0,\"Pipeline\"],[-1,\" Issues\"],[0,\"\\\n\\\n### D1\"]],\"start1\":2692,\"start2\":2692,\"length1\":23,\"length2\":16},{\"diffs\":[[0,\")\\\n**\"],[-1,\"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.\"],[1,\"Impact:** Pot undercounted by 7-8BB/hand → wrong pot odds, wrong bet sizing.\\\n\\\n### D2: Timestamp-based hand IDs (recurring)\"],[0,\"\\\n**R\"]],\"start1\":2738,\"start2\":2738,\"length1\":448,\"length2\":130},{\"diffs\":[[0,\"started`\"],[-1,\" message\"],[0,\" not par\"]],\"start1\":2887,\"start2\":2887,\"length1\":24,\"length2\":16},{\"diffs\":[[0,\"ires\"],[-1,\" (page reload or observer lag)\"],[0,\".\\\n\\\n#\"]],\"start1\":2927,\"start2\":2927,\"length1\":38,\"length2\":8},{\"diffs\":[[0,\"nds\\\n\"],[-1,\"**Evidence:** Hand `torn-holdem-1782122891479`: `synthesized missing blind posting seat=1 blind=\\\"small blind\\\" amount=0`\\\n\"],[0,\"**Ro\"]],\"start1\":2972,\"start2\":2972,\"length1\":128,\"length2\":8},{\"diffs\":[[0,\"_blind` \"],[-1,\"wa\"],[1,\"i\"],[0,\"s 0 when\"]],\"start1\":3003,\"start2\":3003,\"length1\":18,\"length2\":17},{\"diffs\":[[0,\"nthesize\"],[-1,\"d\"],[1,\"s\"],[0,\" the bli\"]],\"start1\":3030,\"start2\":3030,\"length1\":17,\"length2\":17},{\"diffs\":[[0,\"lind\"],[-1,\" (game_start hadn't arrived yet).\\\n\\\n---\\\n\\\n## MEDIUM — Userscript\"],[1,\".\\\n\\\n---\\\n\\\n## STILL OPEN —\"],[0,\" Edg\"]],\"start1\":3045,\"start2\":3045,\"length1\":70,\"length2\":31},{\"diffs\":[[0,\"nts\\\n\"],[-1,\"**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 \"],[1,\"### M2: `readSeatName` fails on wrapped names (styled player names)\\\n### M3: Infinite reload loop possible (\"],[0,\"no b\"]],\"start1\":3139,\"start2\":3139,\"length1\":504,\"length2\":115},{\"diffs\":[[0,\" backoff\"],[-1,\" or \"],[1,\"/\"],[0,\"max coun\"]],\"start1\":3252,\"start2\":3252,\"length1\":20,\"length2\":17},{\"diffs\":[[0,\"ount\"],[-1,\"\\\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\"],[1,\")\\\n### M4: Hero name hardcoded (`heroName: \\\"Bolsa\\\"`)\\\n\\\n---\\\n\\\n## Priority Fix Order\\\n\\\n1. **U3** (k/M suffix) — regex fix, prevents catastrophic amount parsing\"],[0,\"\\\n2. \"]],\"start1\":3266,\"start2\":3266,\"length1\":1054,\"length2\":161},{\"diffs\":[[0,\"ore \"],[-1,\"`Action::\"],[0,\"AllIn\"],[-1,\"`\"],[0,\"\\\n3. **U\"],[-1,\"3\"],[1,\"1\"],[0,\"** (\"],[-1,\"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\"],[1,\"seenTexts clear) — 1-line fix, prevents action loss\\\n4. **D1** (missing antes) — server-side pot reconciliation\\\n5. **U4** (name misclassification) — reorder classification\\\n6. **B2** (pot odds) — verify with live Gen 3 data, tune if needed\\\n7\"],[0,\". **U5\"],[1,\"/U6\"],[0,\"** (\"]],\"start1\":3485,\"start2\":3485,\"length1\":372,\"length2\":273},{\"diffs\":[[0,\"lick\"],[-1,\") — pass hand ID into executor\"],[1,\" / lost events) — executor + observer fixes\"]],\"start1\":3765,\"start2\":3765,\"length1\":34,\"length2\":47}]"
metadata_diff: {"new":{},"deleted":[]}
encryption_cipher_text: 
encryption_applied: 0
updated_time: 2026-06-22T15:57:19.148Z
created_time: 2026-06-22T15:57:19.148Z
type_: 13