id: 75332a8f491548b79d898be861c9fd5d
parent_id: ba64176cf3d74fb297d1e18aa2bc510d
item_type: 1
item_id: f3c42f4435644e19b186265dd3fbf672
item_updated_time: 1786789294456
title_diff: "[]"
body_diff: "[{\"diffs\":[[0,\"LETE\"],[-1,\" — sanity gates 10/10 pass (3×), live defect fixed, sim-neutral vs g50. Ready for live promotion as \"],[1,\", REVIEWED, COMMITTED (042876b), DEPLOYED LIVE (\"],[0,\"`cas\"]],\"start1\":85,\"start2\":85,\"length1\":108,\"length2\":56},{\"diffs\":[[0,\"51_live`\"],[1,\")\"],[0,\".**\\\n\\\n## \"]],\"start1\":147,\"start2\":147,\"length1\":16,\"length2\":17},{\"diffs\":[[0,\"` (~\"],[-1,\"95\"],[1,\"100\"],[0,\"0 li\"]],\"start1\":220,\"start2\":220,\"length1\":10,\"length2\":11},{\"diffs\":[[0,\"ase)\"],[-1,\" — negligible\"],[0,\"; th\"]],\"start1\":640,\"start2\":640,\"length1\":21,\"length2\":8},{\"diffs\":[[0,\")\\\n- \"],[-1,\"River nutpot = unbeatable indicator; rpot = improved-but-vulnerable\"],[1,\"Early-returns empty on preflop boards (< 3 cards)\"],[0,\"\\\n\\\n##\"]],\"start1\":691,\"start2\":691,\"length1\":75,\"length2\":57},{\"diffs\":[[0,\"bs, \"],[-1,\"all hand-fi\"],[1,\"off by defaul\"],[0,\"t)\\\n-\"]],\"start1\":786,\"start2\":786,\"length1\":19,\"length2\":21},{\"diffs\":[[0,\" 0.40 + \"],[-1,\"size×0.12\"],[1,\"0.12×size\"],[0,\") ∨ draw\"]],\"start1\":835,\"start2\":835,\"length1\":25,\"length2\":25},{\"diffs\":[[0,\"ce (\"],[-1,\"ppot center 0.26+size×0.12\"],[1,\"0.26+0.12×size\"],[0,\") + \"]],\"start1\":868,\"start2\":868,\"length1\":34,\"length2\":22},{\"diffs\":[[0,\"oor 0.12\"],[1,\" (+VPIP floor lift)\"],[0,\"\\\n- Bet/R\"]],\"start1\":922,\"start2\":922,\"length1\":16,\"length2\":35},{\"diffs\":[[0,\"0 + \"],[-1,\"size×0.15\"],[1,\"0.15×size\"],[0,\", dr\"]],\"start1\":977,\"start2\":977,\"length1\":17,\"length2\":17},{\"diffs\":[[0,\"oor 0.20\"],[1,\" (bet_freq-adjusted center)\"],[0,\"\\\n- Check\"]],\"start1\":1033,\"start2\":1033,\"length1\":16,\"length2\":43},{\"diffs\":[[0,\" (af\"],[-1,\"-based, ±0.25 shift on call center — aggressive players' calls mean more), bet_adj (frequent bettors' bets mean less\"],[1,\" ±0.25), bet_adj (BET_FREQ_PIVOT 0.35\"],[0,\"), b\"]],\"start1\":1147,\"start2\":1147,\"length1\":124,\"length2\":45},{\"diffs\":[[0,\"0.10\"],[-1,\" center per extra \"],[1,\"/\"],[0,\"call\"]],\"start1\":1212,\"start2\":1212,\"length1\":26,\"length2\":9},{\"diffs\":[[0,\"ft (\"],[-1,\"call floor \"],[0,\"+0.5\"],[-1,\"×\"],[1,\" × \"],[0,\"max(0,\"],[1,\" \"],[0,\"vpip\"]],\"start1\":1244,\"start2\":1244,\"length1\":30,\"length2\":22},{\"diffs\":[[0,\".35)\"],[-1,\" — loose callers keep junk mass\"],[1,\", cap 0.60\"],[0,\")\\\n- \"]],\"start1\":1268,\"start2\":1268,\"length1\":39,\"length2\":18},{\"diffs\":[[0,\"### \"],[-1,\"Integration\\\n`build_ranges_and_equity` (gen4/mod.rs) after NN blend, before equity MC. Applies to ALL range paths (NN, blended, heuristic). Config: `corr_enabled=true` in `cash_nl_g51.toml` (sim) / `cash_nl_g51_live.toml` (liv\"],[1,\"street_bet_ratios (chip units!)\\\nIn-order wager reconstruction: Raise{total} contributes the full new level, Call contributes current level, preflop starts at BB level. (First draft mixed chips/BB and saturated every ratio at the 3.0 clamp — caught in review, fixed + regression test.)\\\n\\\n### Code review (2026-08-15, before commit)\\\nIndependent review found 15 issues; fixed: chips/BB unit bug (high), corrector+NN-blend accidentally nested inside narrow_enabled gate in build_ranges_and_equity (medium — NN would silently disable with narrowing off), unguarded short boards (medium), inert corr_max_boost knob (removed), per-opponent config clone (removed), magic numbers → named constants, leftover comments; added street_bet_ratios + bet_multiplier tests (9 corrector tests total). Not fixed (documented): empty-range-if-NN-returns-None (pre-existing production path), single-combo percentile edge (unreachabl\"],[0,\"e).\\\n\"]],\"start1\":1351,\"start2\":1351,\"length1\":233,\"length2\":917},{\"diffs\":[[0,\"tion\"],[-1,\" results\"],[0,\"\\\n\\\n##\"]],\"start1\":2278,\"start2\":2278,\"length1\":16,\"length2\":8},{\"diffs\":[[0,\"defect (\"],[-1,\"the \"],[0,\"target) \"]],\"start1\":2300,\"start2\":2300,\"length1\":20,\"length2\":16},{\"diffs\":[[0,\"D\\\nRe\"],[-1,\"play with re\"],[0,\"al p\"]],\"start1\":2322,\"start2\":2322,\"length1\":20,\"length2\":8},{\"diffs\":[[0,\"→0.5\"],[1,\"3\"],[0,\"5\"],[-1,\"2\"],[0,\" (Al\"]],\"start1\":2361,\"start2\":2361,\"length1\":10,\"length2\":10},{\"diffs\":[[0,\"ver \"],[-1,\"hs \"],[0,\"0.611→0.\"],[-1,\"311\"],[1,\"290\"],[0,\" (Ra\"]],\"start1\":2390,\"start2\":2390,\"length1\":22,\"length2\":19},{\"diffs\":[[0,\". Replay\"],[-1,\" test\"],[0,\": `repla\"]],\"start1\":2423,\"start2\":2423,\"length1\":21,\"length2\":16},{\"diffs\":[[0,\"e], \"],[-1,\"4 variants\"],[1,\"heuristic/nn/nn+corr\"],[0,\").\\\n\\\n\"]],\"start1\":2471,\"start2\":2471,\"length1\":18,\"length2\":28},{\"diffs\":[[0,\"ity \"],[-1,\"check \"],[0,\"`cas\"]],\"start1\":2506,\"start2\":2506,\"length1\":14,\"length2\":8},{\"diffs\":[[0,\"10 (\"],[1,\"4 \"],[0,\"run\"],[-1,\" 3×: initial, after bet_adj, after floor_lift\"],[1,\"s total incl. post-review\"],[0,\")\\\nGe\"]],\"start1\":2536,\"start2\":2536,\"length1\":56,\"length2\":38},{\"diffs\":[[0,\" TAG +1.\"],[-1,\"6\"],[1,\"5\"],[0,\", Nit +0\"]],\"start1\":2603,\"start2\":2603,\"length1\":17,\"length2\":17},{\"diffs\":[[0,\"00 —\"],[-1,\" statistically\"],[0,\" ide\"]],\"start1\":2639,\"start2\":2639,\"length1\":22,\"length2\":8},{\"diffs\":[[0,\"50 (\"],[-1,\"5 seeds × 10K hands, 4+5 seat\"],[1,\"200K hand\"],[0,\"s): \"],[-1,\"**\"],[0,\"−0.2\"]],\"start1\":2697,\"start2\":2697,\"length1\":43,\"length2\":21},{\"diffs\":[[0,\"ad heat)\"],[-1,\"**\\\n\"],[0,\"\\\n### Spe\"]],\"start1\":2730,\"start2\":2730,\"length1\":19,\"length2\":16},{\"diffs\":[[0,\"ist \"],[-1,\"fields (9-max eval, 15K hands/opp)\\\ng51 vs g50: Fish 53.4/59.0, Station 54.9/57.4, Tag 10.3/10.9, Lag 66.4/71.0, Nit 1.4/2.2, Maniac 102.3/113.0 (g50 numbers = same-seed control). Small uniform deficit ~1-5 BB/100 vs EXTREME specialist fields. Expected: the NN pool IS RangeNet's training \"],[1,\"9-max fields: small uniform deficit ~1-5 BB/100 (Fish 53.4 vs 59.0, Maniac 102 vs 113) — expected on-\"],[0,\"dist\"]],\"start1\":2750,\"start2\":2750,\"length1\":296,\"length2\":109},{\"diffs\":[[0,\"ion \"],[-1,\"— the\"],[1,\"cost;\"],[0,\" cor\"]],\"start1\":2864,\"start2\":2864,\"length1\":13,\"length2\":13},{\"diffs\":[[0,\"tor \"],[-1,\"cannot beat a well-calibrated prior on-distribution; its value i\"],[1,\"target\"],[0,\"s of\"]],\"start1\":2880,\"start2\":2880,\"length1\":72,\"length2\":14},{\"diffs\":[[0,\"ibution \"],[-1,\"(\"],[0,\"human li\"]],\"start1\":2901,\"start2\":2901,\"length1\":17,\"length2\":16},{\"diffs\":[[0,\"ines\"],[-1,\" like the KK hand)\"],[0,\".\\\n\\\n#\"]],\"start1\":2916,\"start2\":2916,\"length1\":26,\"length2\":8},{\"diffs\":[[0,\"ssue\"],[-1,\" (NOT a corrector regression)\"],[0,\"\\\n`re\"]],\"start1\":2947,\"start2\":2947,\"length1\":37,\"length2\":8},{\"diffs\":[[0,\"mono\"],[-1,\"tone\"],[0,\"-flo\"]],\"start1\":2983,\"start2\":2983,\"length1\":12,\"length2\":8},{\"diffs\":[[0,\" on \"],[-1,\"the **\"],[0,\"NN p\"]],\"start1\":3011,\"start2\":3011,\"length1\":14,\"length2\":8},{\"diffs\":[[0,\"for \"],[-1,\"BOTH \"],[0,\"g50 \"],[-1,\"and\"],[1,\"AND\"],[0,\" g51\"],[-1,\"**\"],[0,\" — \"],[-1,\"pre-existing since range_v17. S\"],[1,\"s\"],[0,\"anit\"]],\"start1\":3023,\"start2\":3023,\"length1\":60,\"length2\":23},{\"diffs\":[[0,\" so \"],[-1,\"it \"],[0,\"never \"],[-1,\"sees the NN path. Fix suggestion: sanity Gate 1 should use `--features holdem_bots/gen5_nn`. Root cause of the hand: turn bet_threshold 0.085 on loose tables (threshold problem, not range).\\\n\\\n## Infra improvements this session\\\n- `scripts/eval_9max.sh`: now parallel (MAX_PARALLEL=8, RAYON_NUM_THREADS=4) — 30 sims concurrent\\\n- `/tmp/kilo/run_ab_parallel.sh`: A/B harness (MAX_PARALLEL=15), usage: `<cand> <opp> <tag> <hands> <seeds...>`\\\n- `table_build_time_is_bounded` bench test in\"],[1,\"tests the production NN path. Root cause: turn bet_threshold 0.085 on loose tables (threshold problem, not range).\\\n\\\n## Commits (2026-08-15)\\\n- 0609ebb feat: bump production to range_v17, switch opponent pool to NN variants\\\n- 35b4fc6 feat: add G51 action-likelihood\"],[0,\" range\"],[-1,\"_\"],[1,\" \"],[0,\"corr\"]],\"start1\":3087,\"start2\":3087,\"length1\":505,\"length2\":284},{\"diffs\":[[0,\"r\\\n- \"],[-1,\"Fixed stale `test_range_feature_dim` (81→85), fixed `test_looseness_factor_cold_start` signature\\\n\\\n## Files\\\n- NEW: `holdem_bots/src/gen4/range_corrector.rs` (XpotTable, curves, reweight_range, street_bet_ratios, config, 7 tests)\\\n- MOD: gen4/mod.rs (integration), range_builder.rs (corr field), formula_postflop.rs (config passthrough + KK variants test), rollout_postflop_gen3.rs (config), Cargo chain\\\n- NEW configs: `cash_nl_g51.toml`, `cash_nl_g51_live.toml`\\\n- live_server REBUILT with final corrector (floor_lift + bet_adj)\\\n\\\n## Open follow-ups\\\n1. Promote g51_live on Torn (live server down since Aug 9; binary ready)\\\n2. Sanity Gate 1 should test NN path (\"],[1,\"042876b refactor: remove abandoned Gen6/PPO code and one-off sweep artifacts (17G freed)\\\n\\\n## Infra\\\n- `scripts/eval_9max.sh` parallel (MAX_PARALLEL=8 × RAYON 4)\\\n- `/tmp/kilo/run_ab_parallel.sh` A/B harness (MAX_PARALLEL=15)\\\n- live_server REBUILT with final corrector; running binary keeps old inode until restart\\\n\\\n## Open follow-ups\\\n1. Sanity Gate 1: \"],[0,\"add \"],[1,\"`\"],[0,\"--fe\"]],\"start1\":3375,\"start2\":3375,\"length1\":669,\"length2\":363},{\"diffs\":[[0,\"5_nn\"],[1,\"` (in progress\"],[0,\")\\\n\"],[-1,\"3\"],[1,\"2\"],[0,\". 4_\"]],\"start1\":3760,\"start2\":3760,\"length1\":11,\"length2\":25},{\"diffs\":[[0,\"rel \"],[-1,\"on loose tables (threshold, affects g50 production too)\\\n4. Curves are hand-fit; offline likelihood fitting from equity_v5_2m4 (19.2M samples) is the principled next step\"],[1,\"fix (bet_threshold on loose tables) — will surface once Gate 1 tests NN\\\n3. Offline likelihood fitting from equity_v5_2m4\"],[0,\" if \"]],\"start1\":3798,\"start2\":3798,\"length1\":177,\"length2\":128},{\"diffs\":[[0,\"s drift\\\n\"],[-1,\"5\"],[1,\"4\"],[0,\". Tier-2\"]],\"start1\":3935,\"start2\":3935,\"length1\":17,\"length2\":17},{\"diffs\":[[0,\"v18:\"],[-1,\" feed\"],[0,\" per\"]],\"start1\":3953,\"start2\":3953,\"length1\":13,\"length2\":8},{\"diffs\":[[0,\"puts\"],[-1,\" (merges corrector into the net\"],[1,\"\\\n5. NN-returns-None fallback (empty range risk in production path\"],[0,\")\"]],\"start1\":4005,\"start2\":4005,\"length1\":36,\"length2\":70}]"
metadata_diff: {"new":{},"deleted":[]}
encryption_cipher_text: 
encryption_applied: 0
updated_time: 2026-08-15T10:25:30.527Z
created_time: 2026-08-15T10:25:30.527Z
is_locked: 0
type_: 13