id: 2f5dbf129a4846e28d12bf05a69eecd7
parent_id: ba787f867e464ac0b2aefdff458e39b6
item_type: 1
item_id: 659da65d964344fc89e6b4eafac0098c
item_updated_time: 1783540442190
title_diff: "[]"
body_diff: "[{\"diffs\":[[0,\"26-0\"],[-1,\"6-2\"],[1,\"7-0\"],[0,\"8.\\\n\\\n\"]],\"start1\":42,\"start2\":42,\"length1\":11,\"length2\":11},{\"diffs\":[[0,\"\\\n## \"],[-1,\"Strategy Registry (20 types)\\\n\\\n| Registration | Gen | Description |\\\n|---|---|---|\\\n| `g1_short_stack_preflop` | 1 | Push/fold preflop (≤25 BB) |\\\n| `g1_big_stack_preflop` | 1 | Hand-grouping preflop (≥25 BB) |\\\n| `g1_short_stack_preflop_sng` | 1 | SNG-specific push/fold |\\\n| `g1_fold_micro_stack` | 1 | Fold when micro-stacked in SNG |\\\n| `g1_steal_from_inactive` | 1 | Steal blinds from sitting-out players |\\\n| `g1_sage_endgame` | 1 | Nash HU push/fold (13×13 tables) |\\\n| `g1_postflop_rules` | 1 | Static rules postflop |\\\n| `ng_preflop` | 2/3 | 169-hand ranking table preflop (Java \"],[1,\"Production Config Chain (2026-07-08)\\\n\\\n**G48 Live** (`configs/bots/cash_nl_g48_live.toml`):\\\n```\\\nvoting_mode = \\\"first_applicable\\\"\\\n\\\n1. g47_equity_preflop     → preflop: PEM2 matrix equity (zero MC, pure lookup)\\\n                            unified score: equity + ppot_w×ppot + nutpot_w×nutpot - npot_w×npot\\\n                            position-based thresholds, stack-depth sigmoid\\\n\\\n2. g48_formula_postflop   → postflop: formula score + observer-based range equity\\\n                            value_score = hs×(1-npot_w×n\"],[0,\"po\"],[-1,\"r\"],[0,\"t) \"],[-1,\"|\\\n| `g2_postflop_rollout` | 2 | Original EHS postflop baseline |\\\n| `g2_postflop_rollout_v4` | 2 | Nut-aware MC\"],[1,\"+ nutredraw_w×nutpot×(1-hs)\\\n                            call_threshold with\"],[0,\" multi\"],[-1,\"-\"],[0,\"way po\"],[-1,\"stflop (previous production) |\\\n| `g2_nash_icm` | 2 | Nash/ICM push/fold for SNG |\\\n| `g2_ke_hu_nash` | 2 | KEHU20BB Nash HU equilibrium (19 tables, Java port) |\\\n| `g3_postflop_rollout` | 3 | Range-aware equity postflop |\\\n| `g4_adaptive_preflop` | 4 | VPIP-adaptive NG preflop looseness |\\\n| `g4_adaptive_postflop` | 4 | R\"],[1,\"t-odds cap\\\n                            MC budget: 40,000 (divided by opp count, floor 8K)\\\n```\\\n\\\n**G47 Live** (`configs/bots/cash_nl_g47_live.toml`) — fallback:\\\n```\\\n1. g47_equity_preflop     → preflop: PEM2 matrix equity\\\n2. g4_adaptive_postflop   → postflop: observer-driven r\"],[0,\"ange\"],[-1,\"-\"],[1,\" \"],[0,\"narr\"]],\"start1\":536,\"start2\":536,\"length1\":1039,\"length2\":897},{\"diffs\":[[0,\"ing \"],[-1,\"+ observer-driven postflop — **current produc\"],[1,\"→ Gen 3 equity\\\n```\\\n\\\n## G48 Key Parameters (live)\\\n\\\n| Parameter | Value | Descrip\"],[0,\"tion\"],[-1,\"**\"],[0,\" |\\\n|\"],[-1,\" `gen5_collect` | 5 | RL data collector (Gen3 teacher + transition recorder) |\\\n| `chump_bot` | Baseline | Calling station test opponent |\\\n| `flock_bot` | Baseline | Tight-aggressive test opponent |\\\n| `sng` | Legacy | Legacy SNG composite bot |\\\n\\\n## Production Config Chain\\\n\\\n`cash_nl_g4_live.toml` (live production):\\\n```\\\nvoting_mode = \\\"first_applicable\\\"\\\n\\\n1. g2_ke_hu_nash          → HU, 15-25 BB: Nash equilibrium\\\n2. g1_short_stack_preflop  → ≤25 BB: push/fold chart\\\n3. g4_adaptive_preflop     → >25 BB: NG preflop + VPIP looseness\\\n4. g4_adaptive_postflop    → postflop: observer-driven range narrowing → Gen 3 equity → threshold decision\\\n```\"],[1,\"-----------|-------|-------------|\\\n| `sizing_base` | 0.33 | Base bet/raise fraction of pot |\\\n| `bet_base` | 0.08 | Minimum bet fraction (unraised 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| `call_bs_weight` | 0.12 | Board-strength adjustment to call threshold |\\\n| MC samples | 40,000 | Divided by opponent count, floor 8,000 |\\\n\\\n## Multiway Call Margin\\\n\\\n```\\\ncap = required_equity × (1 + margin)\\\n  margin = 0.28/√opp  (non-river)   [was 0.35, relaxed 2026-07-08]\\\n  margin = 0.15/√opp  (river)\\\n```\\\n\\\nAlso bounded by: `required_equity × 0.5` (floor) and `required_equity + 0.15` (ceiling).\"],[0,\"\\\n\\\n##\"]],\"start1\":1435,\"start2\":1435,\"length1\":703,\"length2\":806},{\"diffs\":[[0,\"s` (\"],[-1,\"488 lines, \"],[0,\"27 m\"]],\"start1\":2333,\"start2\":2333,\"length1\":19,\"length2\":8},{\"diffs\":[[0,\"\\\n- `\"],[-1,\"determine_bet_fraction()` — sizing logic\\\n- `compute_potential_mc()` — MC hand potential\\\n\\\nGen 3 adds: range-aware equity (`Gen3Equity` with `range_width`)\\\nGen 4 adds: adaptive ranges (observer-driven) + config overrides\\\n\\\n## Equity Computation\\\n\\\n| Situation | Method |\\\n|---|---\"],[1,\"push_when_calling()` — AllIn guard when facing bet with deep stack\\\n- `remaining_stack_share()` — fraction of bankroll committed\\\n\\\nKey functions for G48:\\\n- `build_ranges_and_equity()` in `gen4/mod.rs` — shared range-building (G45 + G48)\\\n- `compute_equity_with_ranges()` in `rollout_postflop_gen3.rs` — MC equity vs predicted ranges\\\n\\\n## Equity Computation\\\n\\\n| Situation | Method |\\\n|---|---|\\\n| **Preflop (G47)** | PEM2 matrix lookup (zero MC) |\\\n| **Postflop (G48)** | Monte Carlo vs observer-predicted ranges \"],[0,\"|\\\n| \"]],\"start1\":2471,\"start2\":2471,\"length1\":282,\"length2\":512},{\"diffs\":[[0,\"eads-up \"],[1,\"exact \"],[0,\"| Exhaus\"]],\"start1\":2984,\"start2\":2984,\"length1\":16,\"length2\":22},{\"diffs\":[[0,\"on (\"],[-1,\"exact, \"],[0,\"trie\"]],\"start1\":3020,\"start2\":3020,\"length1\":15,\"length2\":8},{\"diffs\":[[0,\"lti-way \"],[1,\"MC \"],[0,\"| Monte \"]],\"start1\":3046,\"start2\":3046,\"length1\":16,\"length2\":19},{\"diffs\":[[0,\"\\\n\\\n##\"],[-1,\"# MC Paramet\"],[1,\" Observer & Range Building\\\n\\\n### Cold-start defaults (new play\"],[0,\"ers\"],[1,\")\"],[0,\"\\\n- \"],[-1,\"`mc_samples`: 10k (tests) → 20k (sweeps) → 50k (production/live)\\\n- `mc_seed`: 42 (reproducibility in sweeps)\\\n- `mc_time_budget_ms`: 5k (sim) → 10k (live)\"],[1,\"VPIP: 0.30, PFR: 0.15, AF: 1.0, threebet: 0.05\\\n- fold_to_bet: 0.50, cbet_freq: 0.45, wtsd: 0.10\\\n- call_raise_freq: 0.15 (#[serde(default)] for backward compat)\\\n\\\n### Three-tier blend\\\n1. **Player stats** (per-seat EMA with half-life)\\\n2. **Table stats** (aggregate EMA)\\\n3. **Cold-start defaults** (for unknown players)\\\n\\\nWeight transitions from table → player as `hands_observed` grows (10-hand blend start, 100-hand full weight).\\\n\\\n### Range narrowing\\\n`build_opponent_range_v2()` uses:\\\n- VPIP/PFR/threebet/call_raise_freq for preflop range width\\\n- In-hand actions (bet, raise, call, check) for postflop narrowing\\\n- Bet-sizing ratio for additional tightening\\\n- Position for range width adjustment\"],[0,\"\\\n\\\n##\"]],\"start1\":3352,\"start2\":3352,\"length1\":179,\"length2\":767},{\"diffs\":[[0,\"sh_nl_g4\"],[1,\"8\"],[0,\"_live\\\"\\\nv\"]],\"start1\":4206,\"start2\":4206,\"length1\":16,\"length2\":17},{\"diffs\":[[0,\"= \\\"g\"],[-1,\"2_ke_hu_nash\"],[1,\"47_equity_preflop\"],[0,\"\\\"\\\n\\\n[\"]],\"start1\":4276,\"start2\":4276,\"length1\":20,\"length2\":25},{\"diffs\":[[0,\"pe = \\\"g4\"],[-1,\"_adaptive\"],[1,\"8_formula\"],[0,\"_postflo\"]],\"start1\":4317,\"start2\":4317,\"length1\":25,\"length2\":25},{\"diffs\":[[0,\"s = \"],[-1,\"5\"],[1,\"4\"],[0,\"0000\\\n\"],[-1,\"bet_turn\"],[1,\"sizing\"],[0,\"_bas\"]],\"start1\":4375,\"start2\":4375,\"length1\":22,\"length2\":20},{\"diffs\":[[0,\"= 0.\"],[-1,\"58\"],[1,\"33\"],[0,\"\\\n# ... \"],[-1,\"80+ configurabl\"],[1,\"many mor\"],[0,\"e pa\"]],\"start1\":4397,\"start2\":4397,\"length1\":32,\"length2\":25},{\"diffs\":[[0,\"``\\\n\\\n\"],[-1,\"Configs are loaded via `register_bot_from_config(path)` and registered by name.\\\n\\\n\"],[0,\"## W\"]],\"start1\":4432,\"start2\":4432,\"length1\":89,\"length2\":8},{\"diffs\":[[0,\"urnament\"],[1,\"/sanity\"],[0,\" scripts\"]],\"start1\":4847,\"start2\":4847,\"length1\":16,\"length2\":23},{\"diffs\":[[0,\"pts\\\n\"],[-1,\"└\"],[1,\"├\"],[0,\"── p\"]],\"start1\":4867,\"start2\":4867,\"length1\":9,\"length2\":9},{\"diffs\":[[0,\"gnored)\\\n\"],[1,\"└── data/                 # PEM2 matrix binary (gitignored)\\\n```\\\n\\\n## Userscript (separate project)\\\n\\\n```\\\n/home/jan/WebstormProjects/super-marvin-userscripts/\\\n├── torn/                 # Torn-specific script\\\n│   ├── src/              # TypeScript source\\\n│   ├── dist/             # Built output (torn.user.js)\\\n│   └── meta.json         # Version (v0.1.10)\\\n└── shared/               # Shared HTTP client\\\n\"],[0,\"```\"]],\"start1\":4932,\"start2\":4932,\"length1\":11,\"length2\":411}]"
metadata_diff: {"new":{},"deleted":[]}
encryption_cipher_text: 
encryption_applied: 0
updated_time: 2026-07-16T07:16:43.476Z
created_time: 2026-07-16T07:16:43.476Z
type_: 13