id: e77ca0c5dbce45a88cba593c6fbf1b28
parent_id: 2758d137e3e646be91fbfc9db3347d4e
item_type: 1
item_id: de72ff3ebcbd45689c988e50038e80b0
item_updated_time: 1785522910800
title_diff: "[]"
body_diff: "[{\"diffs\":[[0,\"-07-\"],[1,\"3\"],[0,\"1\"],[-1,\"7\"],[0,\".** \"],[-1,\"Production strategy is **Gen 4.8** — matrix-based equity preflop (G47) + formula-based postflop (G48). The strategy chain is: `g2_ke_hu_nash` (HU only) → `g47_equity_preflop` → `g48_\"],[1,\"Gen 4.8 (G47 preflop + G48 postflop) is the formula engine that powers Gen 5. G48 formula + heuristic ranges is still available as `cash_nl_g48.toml`. Production is now **Gen 5** (G48 \"],[0,\"formula\"],[-1,\"_postflop`\"],[1,\" + RangeNet pure NN)\"],[0,\".\\\n\\\n#\"]],\"start1\":81,\"start2\":81,\"length1\":213,\"length2\":225},{\"diffs\":[[0,\"flop\"],[-1,\" (PRODUCTION)\"],[0,\"\\\n\\\nG4\"]],\"start1\":350,\"start2\":350,\"length1\":21,\"length2\":8},{\"diffs\":[[0,\"p | \"],[-1,\"**NEW: f\"],[1,\"F\"],[0,\"ormu\"]],\"start1\":828,\"start2\":828,\"length1\":16,\"length2\":9},{\"diffs\":[[0,\"r ranges\"],[-1,\"**\"],[1,\" (+ RangeNet in Gen 5)\"],[0,\" |\\\n\\\n### \"]],\"start1\":868,\"start2\":868,\"length1\":18,\"length2\":38},{\"diffs\":[[0,\"G48 \"],[-1,\"Harrington-Aligned Preflop Sizing (2026-07-16)\\\n- Standard open: **3BB** (was 2.5)\\\n- Premium: 3BB or **4BB** (35% random)\\\n- Speculative: **2BB** flat\\\n- Limpers: **+1BB** flat all types\\\n- Jitter: **0%** (was ±12%)\\\n- All raise-to amounts rounded to **whole BB** via `round_to_bb()`\"],[1,\"Key Parameters (live)\\\n\\\n| Parameter | Value | Description |\\\n|-----------|-------|-------------|\\\n| `sizing_base` | 0.33 | Base bet/raise fraction of pot |\\\n| `ppot_weight` | 0.75 | Draw bonus weight in combined score |\\\n| `npot_weight` | 0.10 | Negative potential penalty |\\\n| `call_base` | 0.42 | Base call threshold |\\\n| `raise_base_bb` | 3.0 | Preflop standard open |\\\n| `range_alpha_min` | 1.0 | Min NN blend weight (Gen 5: pure NN) |\\\n| `range_alpha_max` | 1.0 | Max NN blend weight (Gen 5: pure NN) |\\\n| MC samples | 10,000 (sim) / 40,000 (live) | Divided by opponent count, floor 8K |\"],[0,\"\\\n\\\n##\"]],\"start1\":1892,\"start2\":1892,\"length1\":286,\"length2\":590},{\"diffs\":[[0,\")`\\\n\\\n\"],[-1,\"### Decision Logic (g47_equity_preflop)\\\n\\\n**First-in (open raise):**\\\n- `open_vpip = vpip × open_vpip_factor`\\\n- `score = equity + ppot_open_bonus × ppot`\\\n- `thresh = position_threshold / looseness`\\\n\\\n**Facing a raise (reraise/call/fold):**\\\n- **Raiser range**: `PFR / (1 + sizing_narrow_strength × (raise_ratio - 1))`\\\n- **Reraise**: `score = equity + nutpot_reraise_bonus × nutpot` vs `equity_reraise / looseness^power`\\\n  - **Hard floor**: `min_reraise_equity = 0.42`\\\n  - **Milder looseness**: `reraise_looseness_power = 0.3`\\\n- **Call**: wider range (`vpip × raise_range_factor`), pot-odds-gated\\\n- **AJ shove fold**: call range now narrows by bet sizing (AJs eq dropped 0.606→0.391, correctly folds all-in)\\\n\\\n## Observer Lifecycle\\\n\\\nObserver tracks per-opponent stats (VPIP, PFR, AF, bet frequencies) via EMA. `on_hand_end()` fires on every hand (fixed from showdown-only). Profile persistence via disk loading. Three-tier blend: observed stats → table-level → defaults.\\\n\\\n## Recent Fixes (2026-07-16/17)\\\n- Call-path sizing narrowing, per-opponent PFR\\\n- Board-hit boost (KK on Ace boards)\\\n- Behind-penalty, drawy trap guard\\\n- RaiseBelowMinimum fix (BB rounding clamp), deep-stack overbet allin fix\\\n- Per-player looseness (`aggressor_vpip`)\\\n- Sanity checks passed all 11 gates\\\n\\\n\"],[0,\"## C\"]],\"start1\":3128,\"start2\":3128,\"length1\":1278,\"length2\":8},{\"diffs\":[[0,\"sh_nl_g4\"],[-1,\"8_live\"],[1,\"9\"],[0,\".toml` |\"]],\"start1\":3192,\"start2\":3192,\"length1\":22,\"length2\":17},{\"diffs\":[[0,\"u → \"],[-1,\"**\"],[0,\"g47\"],[-1,\"_equity_preflop** → **g48_formula_postflop** | **Live \"],[1,\" → **g48 + RangeNet (alpha=1.0)** | **Gen 5 sim config (\"],[0,\"prod\"]],\"start1\":3214,\"start2\":3214,\"length1\":67,\"length2\":67},{\"diffs\":[[0,\"oduction\"],[1,\")\"],[0,\"** |\\\n| `\"]],\"start1\":3279,\"start2\":3279,\"length1\":16,\"length2\":17},{\"diffs\":[[0,\" `cash_nl_g4\"],[-1,\"8\"],[1,\"9_live\"],[0,\".toml` | sam\"]],\"start1\":3294,\"start2\":3294,\"length1\":25,\"length2\":30},{\"diffs\":[[0,\"| same, \"],[-1,\"sim\"],[1,\"live\"],[0,\" setting\"]],\"start1\":3319,\"start2\":3319,\"length1\":19,\"length2\":20},{\"diffs\":[[0,\"s | \"],[-1,\"Sim/test\"],[1,\"**Gen 5 live config**\"],[0,\" |\\\n|\"]],\"start1\":3339,\"start2\":3339,\"length1\":16,\"length2\":29},{\"diffs\":[[0,\"sh_nl_g4\"],[-1,\"7\"],[1,\"8\"],[0,\".toml` |\"]],\"start1\":3372,\"start2\":3372,\"length1\":17,\"length2\":17},{\"diffs\":[[0,\"u → \"],[-1,\"**g47_equity_preflop** → g4_adaptive_postflop\"],[1,\"g47 → **g48 (heuristic ranges)**\"],[0,\" | G4\"],[-1,\"7\"],[1,\"8\"],[0,\" with\"],[-1,\" old postflop (fallback) |\\\n| `cash_nl_g45.toml` | ke_hu → short_stack → g45_playability → g4_adaptive_postflop | Previous production (G4.5) |\\\n\\\nLive server default: `cash_nl_g48_live` (in `configs/live_bots.toml`).\"],[1,\"out RangeNet |\\\n| `g48_{fish,station,nit,tag,lag,maniac,reg}.toml` | G48 personality variants | Opponent pool / sanity check |\"],[0,\"\\\n\\\n##\"]],\"start1\":3394,\"start2\":3394,\"length1\":277,\"length2\":176},{\"diffs\":[[0,\"la, \"],[-1,\"value_score with behind-penalty, draw guard\"],[1,\"Gen48Config with range_alpha/model param\"],[0,\"s |\\\n\"]],\"start1\":3696,\"start2\":3696,\"length1\":51,\"length2\":48},{\"diffs\":[[0,\"ions\"],[-1,\", per-opponent PFR, call-path narrowing, Harrington sizing\"],[0,\" |\\\n|\"]],\"start1\":3825,\"start2\":3825,\"length1\":66,\"length2\":8},{\"diffs\":[[0,\"r.rs` | \"],[-1,\"R\"],[1,\"Heuristic r\"],[0,\"ange con\"]],\"start1\":3967,\"start2\":3967,\"length1\":17,\"length2\":27},{\"diffs\":[[0,\"ion \"],[-1,\"with board-hit boost |\\\n| `holdem_bots/src/gen4/adaptive.rs` | AdaptivePostflopGen4 (G45 strategy)\"],[1,\"(Gen 3/4 only, unused when alpha=1.0) |\\\n| `holdem_bots/src/gen4/range_predictor.rs` | `RangePredictor` — loads RangeNet, predicts ranges, `probs_to_hand_range()`, `blend_alpha()`\"],[0,\" |\\\n|\"]],\"start1\":4000,\"start2\":4000,\"length1\":105,\"length2\":186},{\"diffs\":[[0,\"src/\"],[-1,\"cash/rollout_postflop_base.rs` | Shared postflop base (raise min clamps, deep-stack allin fix) |\\\n| `hand_replay/tests/data/{harrington,regression,synthetic}/` | 40 hand replay test hands |\\\n\\\n## Where This Goes Next\\\n\\\n- **Gen5 training**: G48 teacher data collection running (24.1M short-handed tr\"],[1,\"gen4/mod.rs` | `build_ranges_and_equity()` — NN + heuristic blending |\\\n| `holdem_bots/src/cash/rollout_postflop_base.rs` | Shared postflop base |\\\n\\\n## Generation Lineage\\\n\\\n```\\\nGen 1 (static rules) → Gen 2 (EHS rollout) → Gen 3 (range-aware equity)\\\n→ Gen 4 (G45/G47/G48: adaptive observer + formula) → Gen 5 (G48 + RangeNet pure NN)\\\n→ Gen 6 (future: RL self-play)\\\n```\\\n\\\n## Where This Goes Next\\\n\\\n- **Gen 5** (declared 2026-07-31): G48 formula + RangeNet pure NN. Currently in s\"],[0,\"an\"],[-1,\"s\"],[0,\"it\"],[-1,\"ions done, full-ring in progress)\\\n- **Postflop equity matrix**: PEM3 extension to postflop deferred by user — MC rollouts fine for live play\\\n\"],[1,\"y check. See Gen 5 notebook.\\\n- **Gen 5 tuning**: formula parameter sweep with NN ranges, faster NN inference\\\n- **Gen 6** (future): RL self-play for continuous improvement\"]],\"start1\":4370,\"start2\":4370,\"length1\":444,\"length2\":650}]"
metadata_diff: {"new":{},"deleted":[]}
encryption_cipher_text: 
encryption_applied: 0
updated_time: 2026-07-31T18:39:43.239Z
created_time: 2026-07-31T18:39:43.239Z
is_locked: 0
type_: 13