id: 7a8247d0fabc4d1880ca0fbff727646c
parent_id: 16c0272531e146f890c987a5e408cfab
item_type: 1
item_id: 0f0e106e3da94b75a2223dd2b22aafca
item_updated_time: 1787838369015
title_diff: "[]"
body_diff: "[{\"diffs\":[[0,\"uity\"],[-1,\" (State of the Art)\\\n\\\n> **Current state, 2026-07-31.** Core postflop engine used by 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)\"],[1,\"\\\n\\\n> **FROZEN FINAL, 2026-08-27.** Gen3 ist final kalibriert und eingefroren (Commits 0e8227c, 2f47157). Struktur-Anpassung an Gen2 (Fork-Architektur) + 8-Runden-Sweep-Kalibrierung abgeschlossen. **Bekannte, akzeptierte Limitation:** Ring (t3/9-max) ~−2.0 BB/100 gegen Gen2 (Triple-Combo lag mit +0.59 im Tie-Band → keine Adoption per Protokoll). HU und OTB stark\"],[0,\".\\\n\\\n#\"]],\"start1\":24,\"start2\":24,\"length1\":270,\"length2\":370},{\"diffs\":[[0,\"er\\\n\\\n\"],[-1,\"**Identical to Gen 2** — uses the same shared components:\\\n\\\n\"],[0,\"| Pr\"]],\"start1\":711,\"start2\":711,\"length1\":67,\"length2\":8},{\"diffs\":[[0,\"HU, \"],[-1,\"15-\"],[1,\"≤\"],[0,\"25 B\"]],\"start1\":784,\"start2\":784,\"length1\":11,\"length2\":9},{\"diffs\":[[0,\" >25 BB \"],[-1,\"|\"],[1,\"— **mit HU-Fork** (`hu_*`-Knobs, num_players==2): hu_open=1.0, hu_limp=1.0, hu_call_raise=0.40, hu_reraise=0.80 |\\\n\\\nHU-Kalibrierung: monoton steigende Kurven über 4 Runden; hu_reraise 0.60→0.70→0.80 jeweils besser gegen Gen1/Gen2/Mirror. 1.0-Endpunkt bewusst nicht verfolgt (immer-3-betten = degeneriertes, unrealistisches Sparring-Profil).\"],[0,\"\\\n\\\n## Pos\"]],\"start1\":859,\"start2\":859,\"length1\":17,\"length2\":355},{\"diffs\":[[0,\"t`\\\n\\\n\"],[-1,\"The key innovation: \"],[0,\"**\"],[-1,\"r\"],[1,\"R\"],[0,\"ange\"]],\"start1\":1269,\"start2\":1269,\"length1\":31,\"length2\":11},{\"diffs\":[[0,\"ty**\"],[-1,\". Instead of computing equity vs random opponent hands, Gen 3 predicts a range of likely opponent holdings and computes equity against that range.\\\n\\\n**Decision flow:**\\\n1. **Range prediction**: Use a static `PlayerModel` (26 probability fields) to predict the opponent's range width\\\n2. **Range construction**: Build a weighted range of hands consistent with the opponent's actions so far this hand\\\n3. **Equity computation**: Monte Carlo using only hands within the predicted range\\\n4. **Decision**: Threshold-based logic (calls use `win_prob`, bets/raises use `hs`)\"],[1,\": statisches `PlayerModel` → gewichtete Range → MC gegen Range → Threshold-Entscheidung (Calls: `win_prob`, Bets/Raises: `hs`).\\\n\\\n**Fork-Architektur (Gen2-analog, 2026-08-26):** `is_short_handed` (dealt-in ≤6, gleiche Gate-Semantik wie Gen2) gabelt die 3 Threshold-Funktionen — OTB: flache Knobs (bet_otb_flop=0.18, raise_otb=0.73, bet_otb_turn/river, call_otb), linear, ohne M-Terme/Multiway-Floors. Ring: Formeln mit M-Skalierung + Modell-Modifier. Action-Tree geteilt (Unterschied zu Gen2, das den ganzen Tree gabelt — dokumentierte bewusste Entscheidung).\\\n\\\n**Ring-final:** call_base=0.65, bet_flop_base=0.30 (monotone Sweep-Kurven R6), fold_freq_multiplier=0.75 (0.25 killte alle Bluff-Pfade — restauriert 2026-08-25).\"],[0,\"\\\n\\\n\"],[-1,\"#\"],[0,\"## \"],[-1,\"The `Gen3Equity` Struct\\\n\\\n```rust\\\npub struct Gen3Equity {\\\n    hs: f64,           // Hand strength vs predicted range\\\n    ppot: f64,         // Positive potential\\\n    npot: f64,         // Negative potential\\\n    nutpot: f64,       // Nut potential\\\n    rpot: f64,         // Robustness\\\n    win_prob: f64,     // EHS = hs*(1-npot) + (1-hs)*ppot\\\n    range_width: f64,  // Effective range width\\\n}\\\n```\"],[1,\"Finale Messwerte (deterministisch, sweep_mode=true, 5 Seeds × 50K)\\\n\\\n| | Duel | t3 | 5v4 | 4v5 |\\\n|---|---|---|---|---|\\\n| vs Gen1 | **+161** | −1.7 | +3.7 | +3.2 |\\\n| vs Gen2 (final) | **+150** (mit hr=0.80: +163) | −1.9 | −1.9 | −2.4 |\\\n| vs Gen4/G48 | nicht gemessen (Gen3 ist Vorgänger) | | | |\\\n\\\nHead-to-Head final vs pre-calibration: **+97 Duel**.\\\n\\\n**KRITISCHE Messregel:** `cash_nl.toml` hat `sweep_mode=false` (Live-Entropie) → Einzelzell-Messungen schwanken −3 bis −308 BB/100. ALLE Gen3-Messungen mit `sweep_mode=true`-Kopien fahren (Restrauschen ~0.02 BB/100, Thread-Reihenfolge).\"],[0,\"\\\n\\\n##\"]],\"start1\":1291,\"start2\":1291,\"length1\":970,\"length2\":1319},{\"diffs\":[[0,\"in |\"],[-1,\" Notes |\"],[0,\"\\\n|--\"]],\"start1\":2634,\"start2\":2634,\"length1\":16,\"length2\":8},{\"diffs\":[[0,\" |\\\n|---|---|\"],[-1,\"---|\"],[0,\"\\\n| `cash_nl.\"]],\"start1\":2636,\"start2\":2636,\"length1\":28,\"length2\":24},{\"diffs\":[[0,\"_preflop\"],[1,\" (hu_*)\"],[0,\" → g3_po\"]],\"start1\":2692,\"start2\":2692,\"length1\":16,\"length2\":23},{\"diffs\":[[0,\"out \"],[-1,\"| Gen 3 baseline (non-adaptive) |\\\n\\\nUsed as a sanity-check opponent (neutral pool).\"],[1,\"(OTB + Ring) |\"],[0,\"\\\n\\\n##\"]],\"start1\":2726,\"start2\":2726,\"length1\":90,\"length2\":22},{\"diffs\":[[0,\" Gen\"],[-1,\" 3 s\"],[1,\"3-S\"],[0,\"trateg\"],[-1,\"y + Gen3Config + `compute_equity_with_ranges` (used by Gen 4/5) |\\\n| `holdem_bots/src/cash/thresholds.rs` | PostflopThresholds (80+ fields) |\\\n| `holdem_bots/src/common/player_model.rs` | Static PlayerModel (26 probability fields) |\\\n\\\n## Open Issues (all addressed by Gen 4/5)\\\n\\\n- **Static player model**: Fixed by Gen 4 (dynamic observer replaces static model)\\\n- **Cold-start problem**: Fixed by Gen 4 (profile persistence + three-tier blend) and Gen 5 (NN predicts from default stats + context)\\\n- **Single range per opponent**: Addressed by\"],[1,\"ie + OTB-Fork + Fixes (i_am_last_to_act, capped-raise-Rundung, conti_bet-Multiplier, decision_rng-Salt) |\\\n| `holdem_bots/src/cash/ng_preflop.rs` | NG-Preflop + HU-Fork (hu_*-Knobs, SB-Steal-Misfire-Fix) |\\\n| `holdem_bots/src/common/player_model.rs` | Static PlayerModel |\\\n| `scripts/gen3_sweep.sh` | Sweep-Referenz (deterministische Mess-Config mit sweep_mode=true patchen!) |\\\n\\\n## Verifikation (finale Adoption)\\\n\\\n- Harrington: 4 pre-existing Failures (jj_4bet, 55_shortstack, 99_turn, kqs) — Double-Run-Determinismus-Filter, keine neuen\\\n- 1000-Hände-Selbstplay: 0 Panics, 0 Guardrails\\\n\\\n## Open Issues\\\n\\\n- Ring ~−2 BB/100 vs Gen2: dokumentiert, Tie-Band-Kalibrierung ausgeschöpft (R7: alle Kandidaten +0.4-0.8 mean, g2 ±0). Ein echtes Schließen bräuchte range-narrowing oder formel-strukturelle Änderungen —\"],[0,\" Gen\"],[-1,\" \"],[0,\"4/\"],[-1,\"5 (per-opponent ranges)\\\n\\\n## Where This Goes Next\\\n\\\nGen 3 is stable. The\"],[1,\"G48-Territorium, nicht Gen3.\\\n- Harrington-KQs-Case: pre-existing (Call statt Raise, Multiway-Limp-Pot) — Gen3-typische vorsichtige Range-Equity.\\\n-\"],[0,\" `co\"]],\"start1\":2840,\"start2\":2840,\"length1\":633,\"length2\":973},{\"diffs\":[[0,\"es` \"],[-1,\"function is shared i\"],[1,\"bleibt geteilte I\"],[0,\"nfrastru\"],[-1,\"c\"],[1,\"k\"],[0,\"tur\"],[-1,\"e used by Gen 4 and Gen 5. The heuristic range builder is retained\"],[0,\" f\"],[-1,\"o\"],[1,\"ü\"],[0,\"r Gen \"],[-1,\"3/4 but unused in Gen 5 (pure NN, alpha=1.0)\"],[1,\"4/5\"],[0,\".\"]],\"start1\":3835,\"start2\":3835,\"length1\":156,\"length2\":46}]"
metadata_diff: {"new":{},"deleted":[]}
encryption_cipher_text: 
encryption_applied: 0
updated_time: 2026-08-27T13:51:10.280Z
created_time: 2026-08-27T13:51:10.280Z
is_locked: 0
type_: 13