id: 5d240b0ab9e74e2cb9589d67dca28dd4
parent_id: b0490e35837a4abc86c00d773005b5f5
item_type: 1
item_id: 0f0e106e3da94b75a2223dd2b22aafca
item_updated_time: 1785522927757
title_diff: "[]"
body_diff: "[{\"diffs\":[[0,\"e Equity\"],[1,\" (State of the Art)\"],[0,\"\\\n\\\n> **Cu\"]],\"start1\":20,\"start2\":20,\"length1\":16,\"length2\":35},{\"diffs\":[[0,\"26-0\"],[-1,\"6-30\"],[1,\"7-31\"],[0,\".** \"]],\"start1\":70,\"start2\":70,\"length1\":12,\"length2\":12},{\"diffs\":[[0,\" by \"],[-1,\"all production configs. Gen 4 wraps Gen 3 and feeds it better ranges and adaptive thresholds.\\\n\\\n## Role in the Framework\\\n\\\nGen 3 is the postflop engine used by **all production configs**. Both `cash_nl.toml` (Gen 3 baseline) and `cash_nl_g4_live.toml` (Gen 4 production) use the Gen 3 postflop strategy — Gen 4 wraps Gen 3 and feeds it better ranges.\\\n\\\nThe `RolloutPostFlopGen3` struct is the most important file in the codebase for postflop decisions\"],[1,\"Gen 4/5. Gen 4 wraps Gen 3's range-aware equity concept with adaptive observer stats and formula decisions. Gen 5 replaces heuristic ranges with neural range prediction (RangeNet).\\\n\\\n## Role in the Framework\\\n\\\nGen 3 is the **range-aware equity** concept that all production strategies build upon. The `RolloutPostFlopGen3` struct (`compute_equity_with_ranges`) is still used by Gen 4/5 for MC equity computation — only the range source changes (Gen 3: heuristic, Gen 5: RangeNet NN)\"],[0,\".\\\n\\\n#\"]],\"start1\":107,\"start2\":107,\"length1\":456,\"length2\":488},{\"diffs\":[[0,\"elds\"],[-1,\": preflop_open_raise, flop_bet, flop_fold_to_bet, etc.\"],[0,\") to\"]],\"start1\":1175,\"start2\":1175,\"length1\":62,\"length2\":8},{\"diffs\":[[0,\"ange\"],[-1,\" (not all 1326 hands)\"],[0,\"\\\n4. \"]],\"start1\":1412,\"start2\":1412,\"length1\":29,\"length2\":8},{\"diffs\":[[0,\"**: \"],[-1,\"Same t\"],[1,\"T\"],[0,\"hres\"]],\"start1\":1430,\"start2\":1430,\"length1\":14,\"length2\":9},{\"diffs\":[[0,\"gic \"],[-1,\"as Gen 2 \"],[0,\"(cal\"]],\"start1\":1452,\"start2\":1452,\"length1\":17,\"length2\":8},{\"diffs\":[[0,\"`)\\\n\\\n\"],[-1,\"> **Note**: The `range_tightness_scale` threshold discount was **removed** (2026-06-29). It double-counted range narrowing — once in equity (narrower ranges → lower hs/win_prob), once in the threshold. Removing it fixed the 88-shove bug where thresholds went negative.\\\n\\\n\"],[0,\"### \"]],\"start1\":1498,\"start2\":1498,\"length1\":278,\"length2\":8},{\"diffs\":[[0,\"idth\"],[-1,\" (1.0 = full, <1.0 = narrowed)\\\n}\\\n```\\\n\\\n### Pot Odds Gate\\\n\\\n`should_raise()` includes:\\\n1. **Large bet penalty**: facing bet >30% pot → threshold increases proportionally\\\n2. **SPR penalty**: SPR >2 → threshold increases by up to 0.18\\\n3. **Hard equity gate**: hs <0.60 + committing >100% pot → threshold ≥0.65\\\n\\\n### Bet Sizing\\\n\\\nConfigurable bet fractions by street (current **live** values after post-discount sweep):\\\n- **Flop**: `bet_flop_base = 0.15`\\\n- **Turn**: `bet_turn_base = 0.40`\\\n- **Value bets**: fraction based on hand strength above threshold\\\n- **Protection bets**: smaller bets with vulnerable made hands\\\n- **Bluffs**: `bluff_hs_max = 0.05` (only bluff with hs < 0.05)\\\n\\\n## Configs\\\n\\\n| Config | Chain | Notes |\\\n|---|---|---|\\\n| `cash_nl.toml` | ke_hu → short_stack → ng_preflop → g3_postflop_rollout | Gen 3 baseline (non-adaptive) |\\\n| `cash_nl_normal.toml` | same chain, different thresholds | Tuned for normal VPIP tables |\\\n| `cash_nl_loose.toml` | same chain, looser thresholds | Tuned for loose tables |\\\n| `cash_nl_tight.toml` | same chain, tighter thresholds | Tuned for tight tables |\\\n\\\n## Key Thresholds (current live values)\\\n\\\n```\\\n# Call decisions\\\ncall_base = 0.45\\\ncall_ppot_base = 0.25\\\ncall_w_draw = 0.75\\\ncall_w_pot_odds = 0.70\\\n\\\n# Bet decisions (post-discount sweep)\\\nbet_flop_base = 0.15\\\nbet_turn_base = 0.40\\\n\\\n# Raise decisions\\\nraise_base = 0.80\\\nraise_w_protection = 0.35\\\nraise_w_draw = 0.50\\\n\\\n# Bluff safety\\\nbluff_hs_max = 0.05\\\nsemi_bluff_max_bet_ratio = 0.30\\\n\\\n# Range construction (weight map)\\\nnarrow_center_offset = 0.2\\\nstrong_hands_fraction = 0.30\\\nscurve_steepness_mult = 0.3\\\n```\"],[1,\"\\\n}\\\n```\\\n\\\n## Configs\\\n\\\n| Config | Chain | Notes |\\\n|---|---|---|\\\n| `cash_nl.toml` | ke_hu → short_stack → ng_preflop → g3_postflop_rollout | Gen 3 baseline (non-adaptive) |\\\n\\\nUsed as a sanity-check opponent (neutral pool).\"],[0,\"\\\n\\\n##\"]],\"start1\":1890,\"start2\":1890,\"length1\":1600,\"length2\":225},{\"diffs\":[[0,\"onfig + \"],[-1,\"Gen3Equity\"],[1,\"`compute_equity_with_ranges` (used by Gen 4/5)\"],[0,\" |\\\n| `ho\"]],\"start1\":2230,\"start2\":2230,\"length1\":26,\"length2\":62},{\"diffs\":[[0,\"elds\"],[-1,\", Default, from_config_map\"],[0,\") |\\\n\"]],\"start1\":2354,\"start2\":2354,\"length1\":34,\"length2\":8},{\"diffs\":[[0,\"n Issues\"],[1,\" (all addressed by Gen 4/5)\"],[0,\"\\\n\\\n- **St\"]],\"start1\":2459,\"start2\":2459,\"length1\":16,\"length2\":43},{\"diffs\":[[0,\"**: \"],[-1,\"The `PlayerModel` uses fixed default frequencies — it doesn't adapt to specific opponents. **Address\"],[1,\"Fix\"],[0,\"ed b\"]],\"start1\":2519,\"start2\":2519,\"length1\":108,\"length2\":11},{\"diffs\":[[0,\"by Gen 4\"],[-1,\"**\"],[0,\" (dynami\"]],\"start1\":2529,\"start2\":2529,\"length1\":18,\"length2\":16},{\"diffs\":[[0,\"c model)\"],[-1,\".\"],[0,\"\\\n- **Col\"]],\"start1\":2570,\"start2\":2570,\"length1\":17,\"length2\":16},{\"diffs\":[[0,\": Fi\"],[-1,\"rst decisions against unknown opponents use default ranges that may be inaccurate. **Address\"],[1,\"x\"],[0,\"ed b\"]],\"start1\":2603,\"start2\":2603,\"length1\":100,\"length2\":9},{\"diffs\":[[0,\"by Gen 4\"],[-1,\"**\"],[0,\" (profil\"]],\"start1\":2611,\"start2\":2611,\"length1\":18,\"length2\":16},{\"diffs\":[[0,\"end)\"],[-1,\".\\\n- **Single range**: Gen 3 predicts ONE range per opponent. Multi-way pots need separat\"],[1,\" and Gen 5 (NN predicts from default stats + context)\\\n- **Singl\"],[0,\"e range\"],[-1,\"s\"],[0,\" per \"],[-1,\"active \"],[0,\"opponent\"],[-1,\". **Partially a\"],[1,\"**: A\"],[0,\"ddre\"]],\"start1\":2656,\"start2\":2656,\"length1\":139,\"length2\":96},{\"diffs\":[[0,\"by Gen 4\"],[-1,\"**\"],[1,\"/5\"],[0,\" (per-op\"]],\"start1\":2757,\"start2\":2757,\"length1\":18,\"length2\":18},{\"diffs\":[[0,\"nges\"],[-1,\" in multiway).\"],[1,\")\"],[0,\"\\\n\\\n##\"]],\"start1\":2784,\"start2\":2784,\"length1\":22,\"length2\":9},{\"diffs\":[[0,\"Gen \"],[-1,\"4 wraps Gen 3 and replaces the static `PlayerModel` with a **dynamic observer** that tracks real opponent stats (VPIP, PFR, AF, bet frequencies) via EMA, then uses those stats to build more accurate ranges and adapt thresholds. Gen 5 will eventually replace the heuristic decision logic with a neural network\"],[1,\"3 is stable. The `compute_equity_with_ranges` function is shared infrastructure used by Gen 4 and Gen 5. The heuristic range builder is retained for Gen 3/4 but unused in Gen 5 (pure NN, alpha=1.0)\"],[0,\".\"]],\"start1\":2816,\"start2\":2816,\"length1\":313,\"length2\":202}]"
metadata_diff: {"new":{},"deleted":[]}
encryption_cipher_text: 
encryption_applied: 0
updated_time: 2026-07-31T18:39:43.501Z
created_time: 2026-07-31T18:39:43.501Z
is_locked: 0
type_: 13