id: 1a3736233bfe4b0f9078d4ddb6bdc6bd
parent_id: 16a5fceb13f24acabd8afbd1d10102af
item_type: 1
item_id: 60976d006f58404387784a6b90ebf04c
item_updated_time: 1782230103244
title_diff: "[]"
body_diff: "[{\"diffs\":[[0,\"23 (\"],[-1,\"end of \"],[0,\"session\"],[1,\" 2\"],[0,\").\\\nP\"]],\"start1\":52,\"start2\":52,\"length1\":22,\"length2\":17},{\"diffs\":[[0,\":** \"],[-1,\"The dealer chip is rendered by React a few frames\"],[1,\"React renders dealer chip\"],[0,\" AFTER \"],[-1,\"the \"],[0,\"blind\"],[-1,\"\\\n\"],[1,\" \"],[0,\"mess\"]],\"start1\":285,\"start2\":285,\"length1\":74,\"length2\":46},{\"diffs\":[[0,\"ges \"],[-1,\"arrive.\"],[1,\"→\"],[0,\" `sn\"]],\"start1\":332,\"start2\":332,\"length1\":15,\"length2\":9},{\"diffs\":[[0,\"lerSeat`\"],[-1,\" was\"],[0,\" always \"]],\"start1\":347,\"start2\":347,\"length1\":20,\"length2\":16},{\"diffs\":[[0,\"t()`\"],[-1,\" time\\\n→ defaulted to seat 0 in 19/20 hands\"],[0,\".\\\n\\\n*\"]],\"start1\":392,\"start2\":392,\"length1\":50,\"length2\":8},{\"diffs\":[[0,\"):**\\\n1. \"],[-1,\"**\"],[0,\"SB-seat \"]],\"start1\":418,\"start2\":418,\"length1\":18,\"length2\":16},{\"diffs\":[[0,\".ts)\"],[-1,\":** `buildGameStart()` derives the button from\\\n   the SB player's seat — button = previous active player counter-clockwise from SB\\\n   (heads-up: button = SB).\"],[1,\" — button = previous active player CCW from SB\"],[0,\"\\\n2. \"],[-1,\"**\"],[0,\"DOM \"]],\"start1\":452,\"start2\":452,\"length1\":172,\"length2\":58},{\"diffs\":[[0,\".ts)\"],[-1,\":** `waiting_for_action` includes\\\n   `confirmed_dealer_seat` read from the actual chip (guaranteed visible at hero-turn).\"],[1,\" — `confirmed_dealer_seat` sent with `waiting_for_action`\"],[0,\"\\\n3. \"],[-1,\"**\"],[0,\"Serv\"]],\"start1\":534,\"start2\":534,\"length1\":135,\"length2\":69},{\"diffs\":[[0,\".rs)\"],[-1,\":** On `WaitingForAction`, if\\\n   `confirmed_dealer_seat` differs from `button_seat`, corrects it + `is_dealer` flags\\\n   before computing the decision.\\\n\\\n**Verification:** btn rotates correctly across full cycle. SB derivation is accurate\\\n~95% of the time; the confirmation layer caught **2 corrections** (off-by-one when a\\\nplayer wasn't detected at game_start). Both layers are needed and working.\"],[1,\" — corrects `button_seat` + `is_dealer` before `decide()`\"],[0,\"\\\n\\\n**\"]],\"start1\":629,\"start2\":629,\"length1\":404,\"length2\":65},{\"diffs\":[[0,\"l()`\"],[-1,\" now\"],[0,\" counts \"],[-1,\"all \"],[0,\"deal\"]],\"start1\":727,\"start2\":727,\"length1\":24,\"length2\":16},{\"diffs\":[[0,\"rs (\"],[-1,\"Active,\\\nFolded, AllIn; excludes SittingOut) so folded button players don't shift position offsets\"],[1,\"excludes SittingOut). Now running (server restarted this session)\"],[0,\".\\\n\\\n*\"]],\"start1\":753,\"start2\":753,\"length1\":105,\"length2\":73},{\"diffs\":[[0,\"led \"],[-1,\"hand-by-hand \"],[0,\"anal\"]],\"start1\":923,\"start2\":923,\"length1\":21,\"length2\":8},{\"diffs\":[[0,\"notebook\"],[-1,\"\\\n\"],[1,\" \"],[0,\"(`56a8e6\"]],\"start1\":955,\"start2\":955,\"length1\":17,\"length2\":17},{\"diffs\":[[0,\"c6`)\"],[-1,\":\\\n\\\n- **Hand #3 (166fb094)** — AQo SB fold (too tight, preflop) — B7/B9\\\n- **Hand #29 (ea30be42)** — ATs flop fold at 18:1 (too tight, postflop) — B7\\\n\\\nBoth are the same root issue: **bot too passive overall.**\\\n\\\n---\\\n\\\n## STILL OPEN — Bot Strategy (highest priority)\\\n\\\n### B7: Bot never bets strong hands postflop when checked-to\\\n**Root cause:** `bet_adj_cap=2.0` requires `win_prob > ~70%` in multiway.\\\n**Hand evidence:** Hand #29 (ATs flop fold at 18:1), Hand #3 (AQo SB\"],[1,\".\\\n\\\n---\\\n\\\n## STILL OPEN — Bot Strategy\\\n\\\n### B7: Bot too passive postflop (range model too tight) — PARTIALLY ADDRESSED\\\n**Root cause:** Gen 3 opponent ranges are binary (0/1) with tight cutoff → win_prob underestimated → folds top pair.\\\n**Hand evidence:** Hand #175 (KJo top pair fold, win_prob=0.217 vs 0.245 pot odds), Hand #159 (AhTd pair+flush draw fold), Hand #29 (ATs flop\"],[0,\" fol\"]],\"start1\":996,\"start2\":996,\"length1\":474,\"length2\":383},{\"diffs\":[[0,\" at \"],[-1,\"4\"],[1,\"18\"],[0,\":1)\"],[1,\".\"],[0,\"\\\n**\"],[-1,\"Fix path:** Lower `bet_adj_cap` to 1.0-1.5; consider lowering `bet_flop_base`.\\\n**Confirmed by hand_replay:** 27.3% mismatch rate, ALL mismatches are bot checking/folding when it should bet/call\"],[1,\"This session:** Added `range_looseness=0.30` + `range_floor=0.03` — widens opponent ranges to model loose tables. Committed `d641780`.\\\n**Still needed:** Lower `bet_adj_cap` from 2.0 → 1.0-1.5 for multi-way pots\"],[0,\".\\\n\\\n#\"]],\"start1\":1380,\"start2\":1380,\"length1\":208,\"length2\":227},{\"diffs\":[[0,\"n SB\"],[-1,\" (NEW)\\\n**Hand:** #3 (166fb094).\"],[1,\"\\\nHand #3:\"],[0,\" AQo\"]],\"start1\":1646,\"start2\":1646,\"length1\":39,\"length2\":17},{\"diffs\":[[0,\"ded \"],[-1,\"in SB \"],[0,\"at 4\"]],\"start1\":1667,\"start2\":1667,\"length1\":14,\"length2\":8},{\"diffs\":[[0,\"lop \"],[-1,\"position-aware\\\n\"],[1,\"SB \"],[0,\"thre\"]],\"start1\":1695,\"start2\":1695,\"length1\":23,\"length2\":11},{\"diffs\":[[0,\"lds \"],[-1,\"may be \"],[0,\"too \"]],\"start1\":1709,\"start2\":1709,\"length1\":15,\"length2\":8},{\"diffs\":[[0,\"tive\"],[-1,\" in SB, or pot-odds override not firing for premiums\"],[0,\".\\\n\\\n#\"]],\"start1\":1725,\"start2\":1725,\"length1\":60,\"length2\":8},{\"diffs\":[[0,\"lls \"],[-1,\"on street \"],[0,\"(inc\"]],\"start1\":1767,\"start2\":1767,\"length1\":18,\"length2\":8},{\"diffs\":[[0,\"impers)\\\n\"],[-1,\"**\"],[0,\"File:\"],[-1,\"**\"],[0,\" `strate\"]],\"start1\":1789,\"start2\":1789,\"length1\":25,\"length2\":21},{\"diffs\":[[0,\"2`. \"],[-1,\"Counts every `Call` instead of only post-last-raise\\\ncallers → inflates call threshold → over-calling in raised multiway pots.\\\n**Verified:** QJs hand `736c9b23`, bot=7 callers, correct=4.\\\n\\\n### B1: \\\"did_raise_this_round → AllIn\\\"\"],[1,\"Inflates call threshold.\\\n\\\n### B1: All-in\"],[0,\" wit\"]],\"start1\":1826,\"start2\":1826,\"length1\":234,\"length2\":48},{\"diffs\":[[0,\"ess\\\n\"],[-1,\"**\"],[0,\"File:\"],[-1,\"**\"],[0,\" `ro\"]],\"start1\":1898,\"start2\":1898,\"length1\":17,\"length2\":13},{\"diffs\":[[0,\"040`\"],[-1,\" (Gen3 raised-pot path).\\\n\\\n### B2: Postflop call threshold vs small bets — needs live verification\"],[1,\".\"],[0,\"\\\n\\\n--\"]],\"start1\":1935,\"start2\":1935,\"length1\":105,\"length2\":9},{\"diffs\":[[0,\"## U\"],[-1,\"2: forceFlush grace period not implemented\\\n### U4: Player names containing \\\"flop\\\"/\\\"turn\\\"/\\\"river\\\" misclassified\\\n### U5: `clickWhenReady` retry doesn't re-validate hand ID\"],[1,\"5: `clickWhenReady` retry doesn't re-validate hand ID\\\nFold click sometimes doesn't register → hero stays in hand (Hand #167: bot folded but hero called $9000).\\\n\"],[0,\"\\\n###\"]],\"start1\":1976,\"start2\":1976,\"length1\":177,\"length2\":168},{\"diffs\":[[0,\"nted\"],[-1,\" by 7-8BB/hand\"],[0,\"\\\n###\"]],\"start1\":2276,\"start2\":2276,\"length1\":22,\"length2\":8},{\"diffs\":[[0,\"SOLVED\\\n\\\n\"],[1,\"- [x] **D5: Stale hole cards across hands** — Fixed: `lastHeroCards` tracking in parser.ts (commit `c38af6e`, v0.1.5)\\\n- [x] **U4: Player names containing \\\"flop\\\"/\\\"turn\\\"/\\\"river\\\"** — Fixed: word-boundary regex (commit `c38af6e`, v0.1.5)\\\n\"],[0,\"- [x] **\"]],\"start1\":2337,\"start2\":2337,\"length1\":16,\"length2\":250},{\"diffs\":[[0,\"sing** —\"],[-1,\" Fixed:\"],[0,\" `parseA\"]],\"start1\":2711,\"start2\":2711,\"length1\":23,\"length2\":16},{\"diffs\":[[0,\"ixes\"],[-1,\" (commit `1dce06d`)\"],[0,\"\\\n- [\"]],\"start1\":2750,\"start2\":2750,\"length1\":27,\"length2\":8},{\"diffs\":[[0,\" cleared** —\"],[-1,\" Fixed:\"],[0,\" `resetHand(\"]],\"start1\":2782,\"start2\":2782,\"length1\":31,\"length2\":24},{\"diffs\":[[0,\"nt=0\"],[-1,\" in synthesized blinds** — Largely resolved: client-side SB synthesis + server-side `sb_amount` derivation from BB\"],[1,\"** — Client-side SB synthesis + server-side derivation\\\n- [x] **Range too tight (table-adaptive)** — `range_looseness` + `range_floor` params (commit `d641780`)\"],[0,\"\\\n- [\"]],\"start1\":2845,\"start2\":2845,\"length1\":122,\"length2\":167},{\"diffs\":[[0,\"gate** —\"],[-1,\" Fixed:\"],[0,\" `aggres\"]],\"start1\":3031,\"start2\":3031,\"length1\":23,\"length2\":16},{\"diffs\":[[0,\"ers** — \"],[-1,\"Fixed: `\"],[0,\"ng_prefl\"]],\"start1\":3107,\"start2\":3107,\"length1\":24,\"length2\":16},{\"diffs\":[[0,\"_preflop\"],[-1,\"`\"],[0,\" uses 16\"]],\"start1\":3117,\"start2\":3117,\"length1\":17,\"length2\":16},{\"diffs\":[[0,\" tables\\\n\"],[1,\"- [x] **B4: 93.5% fold rate facing postflop bets** — `call_adj_cap=1.2`\\\n- [x] **B5: 85% check rate when first-in** — `bet_adj_cap=2.0` (still needs further lowering)\\\n- [x] **B6: SB completion too tight** — 0.60 threshold\\\n\"],[0,\"- [x] **\"]],\"start1\":3147,\"start2\":3147,\"length1\":16,\"length2\":237},{\"diffs\":[[0,\"odds** —\"],[-1,\" Fixed:\"],[0,\" `rerais\"]],\"start1\":3405,\"start2\":3405,\"length1\":23,\"length2\":16},{\"diffs\":[[0,\"inel\"],[-1,\" in limp threshold\"],[0,\"** —\"]],\"start1\":3464,\"start2\":3464,\"length1\":26,\"length2\":8},{\"diffs\":[[0,\"_me cost\"],[-1,\" underestimate\"],[0,\"** — Fix\"]],\"start1\":3501,\"start2\":3501,\"length1\":30,\"length2\":16},{\"diffs\":[[0,\"* — \"],[-1,\"Fixed: d\"],[1,\"D\"],[0,\"ynam\"]],\"start1\":3553,\"start2\":3553,\"length1\":16,\"length2\":9},{\"diffs\":[[0,\"ode \"],[-1,\"= true \"],[0,\"in p\"]],\"start1\":3587,\"start2\":3587,\"length1\":15,\"length2\":8},{\"diffs\":[[0,\"tion** —\"],[-1,\" Fixed:\"],[0,\" `sweep_\"]],\"start1\":3600,\"start2\":3600,\"length1\":23,\"length2\":16},{\"diffs\":[[0,\"] **\"],[-1,\"B4: 93.5% fold rate facing postflop bets** — Fixed: `call_adj_cap=1.2`\\\n- [x] **B5: 85% check rate when first-in postflop** — Partially fixed: `bet_adj_cap=2.0`\\\n- [x] **B6: SB completion too tight** — Fixed: 0.60 threshold for SB completion\\\n- [x] **U2 (partial):\"],[1,\"U2 (partial)** —\"],[0,\" for\"]],\"start1\":3634,\"start2\":3634,\"length1\":269,\"length2\":24},{\"diffs\":[[0,\"ush \"],[-1,\"race** — S\"],[1,\"s\"],[0,\"ynth\"]],\"start1\":3662,\"start2\":3662,\"length1\":18,\"length2\":9},{\"diffs\":[[0,\"zes \"],[-1,\"both \"],[0,\"SB+B\"]],\"start1\":3674,\"start2\":3674,\"length1\":13,\"length2\":8},{\"diffs\":[[0,\"0 | ← **\"],[1,\"still \"],[0,\"needs lo\"]],\"start1\":3915,\"start2\":3915,\"length1\":16,\"length2\":22},{\"diffs\":[[0,\"|\\\n| \"],[-1,\"bet_value_fraction | 0.67 | Dry board value bet sizing |\\\n| bet_wet_fraction | 0.75 | Wet board sizing |\\\n| bet_bluff_fraction | 0.40 | Bluff bet sizing |\\\n| sweep_mode | false | Production mode |\\\n\\\n---\\\n\\\n## Priority Remaining Fixes\\\n\\\n1. **B7** (bet/call range too tight) — apply sweep results, lower `bet_adj_cap`\\\n2\"],[1,\"**range_looseness** | **0.30** | Medium-tier hands at 30% weight |\\\n| **range_floor** | **0.03** | Min 3% weight for all hands |\\\n| sweep_mode | false | Production mode |\\\n\\\n---\\\n\\\n## Priority Remaining Fixes\\\n\\\n1. **B7** (bet_adj_cap) — lower from 2.0 → 1.0-1.5\\\n2. **B8** (num_callers) — count only post-last-raise callers\\\n3\"],[0,\". **\"]],\"start1\":4097,\"start2\":4097,\"length1\":318,\"length2\":325},{\"diffs\":[[0,\"preflop \"],[-1,\"too tight for \"],[0,\"premiums\"],[1,\" SB\"],[0,\") — chec\"]],\"start1\":4428,\"start2\":4428,\"length1\":38,\"length2\":27},{\"diffs\":[[0,\"heck ng_preflop \"],[-1,\"SB \"],[0,\"thresholds + pot\"]],\"start1\":4452,\"start2\":4452,\"length1\":35,\"length2\":32},{\"diffs\":[[0,\"olds\"],[-1,\" + pot-odds override\\\n3\"],[1,\"\\\n4\"],[0,\". **\"],[-1,\"B8\"],[1,\"U5\"],[0,\"** (\"],[-1,\"`num_callers` inflation) — count only post-last-raise callers\\\n4\"],[1,\"clickWhenReady) — re-validate hand ID on retry\\\n5\"],[0,\". **\"]],\"start1\":4474,\"start2\":4474,\"length1\":103,\"length2\":68},{\"diffs\":[[0,\"(all-in \"],[-1,\"without \"],[0,\"sizing) \"]],\"start1\":4547,\"start2\":4547,\"length1\":24,\"length2\":16},{\"diffs\":[[0,\"eck\\\n\"],[-1,\"5. **U4** (player name keyword collision) — message classification fix\\\n\"],[0,\"6. *\"]],\"start1\":4579,\"start2\":4579,\"length1\":79,\"length2\":8},{\"diffs\":[[0,\"racy\"],[-1,\"\\\n7. **U2** (forceFlush grace period)\"]],\"start1\":4619,\"start2\":4619,\"length1\":40,\"length2\":4}]"
metadata_diff: {"new":{},"deleted":[]}
encryption_cipher_text: 
encryption_applied: 0
updated_time: 2026-06-23T15:57:21.382Z
created_time: 2026-06-23T15:57:21.382Z
type_: 13