BotConfig.starting_chips (None = game default). Table tracks
per-seat starting stacks so reset_bankroll_each_hand restores each
bot to its own depth. Enables asymmetric stack experiments
(hero deep vs opponents short and vice versa).
After each hand, stack above the threshold moves to the bankroll.
Bounds effective depth while keeping natural short-stack dynamics
(losses, rebuy cycles). Needed for realistic deep-stack-safe
benchmarks: the oracle hybrid's EV collapses with stack depth
(+6.9 at 75BB reset vs -33.8 natural), so unbounded natural-stack
snowballs distort candidate evaluation.
Critical fix: complete_hand() now restores seats when run_to_completion()
fails, preventing silent NotEnoughPlayers termination that killed
simulations at random seeds. Wagered chips are refunded before reset to
prevent chip destruction on error path.
Also adds max_raises: Option<usize> to BetLimit::NoLimit, propagated
across all game/bot/tournament construction sites.
NotEnoughPlayers now logs a warning with hand count instead of silently
breaking the simulation loop.
- simulation.rs: RaiseBelowMinimum/InsufficientChips now skip hand
instead of crashing entire simulation. Hands skipped are NOT counted
in total_hands (accurate player stats).
- flock_bot.rs: Premium preflop raise falls back to Call when stack
cannot afford minimum raise, preventing illegal AllIn edge cases.
- Added shutdown(), showdown_event() trait methods to HoldemPlayer.
- Added external_id, table_id to GameInfo/PlayerInfo.
- Strategy trait: added save_state() for graceful profile persistence.
- Rewrite generate_tables() with HashMap-based BFS instead of broken
sentinel-loop sorted array approach. The old generator used a
zero-terminated loop that stopped prematurely when mid-array key
insertions left gaps, producing invalid trie pointers.
- Re-enable auto-generation in load_or_generate() since the generator
now works correctly (verified by exhaustive C(52,5) correctness test).
- Wire HandRunner::showdown() through Evaluator::instance() instead of
calling AlgorithmicEvaluator directly, giving access to the full
3-tier cascade (Supersonic -> Cactus Kev -> Algorithmic).
- Parallelize tournament series loop with rayon for multi-core speedup.
- Remove dead insert_key function and test (unused after generator rewrite).
- Fix tautological benchmark assertion in integration tests.
- Change GameInfo.num_raises to use Meerkat convention where BB counts
as the first raise preflop (subtract 1 for SB only, not 2)
- Add GameInfo::voluntary_raises() for Fixed-Limit cap enforcement
- Update flock_bot, raise_bot, and random_bot to use voluntary_raises()
for can_raise() checks
- Add Evaluator::supersonic() accessor for incremental trie API
- Update documentation across betting.rs, game_info.rs, hand_runner.rs,
and README.md to clarify the two counting conventions
Remove the entire strategy module (StrategyBot, ModularStrategy,
StrategyContext, ActionRecorder, HandAnalyzer, HandHelper) from
holdem_core. Strategy implementations will live in external crates
(e.g., super_marvin) and register via bot_factory::register_bot_type.
- Delete holdem_core/src/game/strategy/ (6 files, ~1900 lines)
- Delete holdem_core/src/game/bots/strategy_bot.rs
- Remove strategy_bot from bots/mod.rs module declarations and re-exports
- Update bot_factory.rs doc example to show generic custom bot pattern
- Add tournament_rake_percentage field to GameConfig (house share of entry fees)
- Convert prize structure from absolute amounts to percentages of prize pool
- Fix finish position calculation for tournament eliminations (was inverted)
- Add batch bustout processing for multi-table tournaments (shared positions)
- Add max_rebuys field and rebuy_count tracking on Seat
- Add PrizeStructure::with_rake() and rake_amount field
- Accumulate stats across tournament series (hands, rake, profit)
- Add best_finish and prize_won fields to PlayerStats
- Replace floating-point prize math with integer arithmetic (chip conservation)
- Add comprehensive tests for prize distribution and finish positions
- Update config examples to use percentage-based prizes with rake
- Add ARCHITECTURE_TOURNAMENT_RAKE.md documentation
- Add RakeConfig with percentage-based rake and per-pot cap
- Add bankroll tracking (reset per hand or auto-refill threshold)
- Add seat randomization with seeded RNG for reproducibility
- Add FlockBot (tight-aggressive) and ChumpBot (loose-passive) bots
- Refactor HandRunner: extract finalize_result, compute_chip_movements, credit_winnings
- Add num_raises to GameInfo for authoritative raise counting
- Record SB/BB as Raise actions (Meerkat convention)
- Update all existing bot tests for new GameInfo fields
- Add ARCHITECTURE_RAKE_BANKROLL_SEATS.md documentation
- Add AlgorithmicEvaluator wrapper for direct hand evaluation without
lookup tables, with proper Result-based error handling
- Replace all println! and #[cfg(debug_assertions)] debug output with
log crate macros (log::info!, log::debug!, log::warn!)
- Fix calculate_flush_value to use base-13 encoding for unique flush
hand values instead of simple linear sum
- Fix is_straight to use cleaner control flow for regular and wheel
straight detection
- Remove jump table HighCard/value=0 guard in evaluate_5_card to
simplify evaluation path
- Add evaluate_n_card_hand_public as pub(crate) for AlgorithmicEvaluator
- Add .gitignore to exclude target/ and .idea/ from version control
- Add comprehensive tests for AlgorithmicEvaluator (14 test cases)
- Update README with new API usage examples
- Add log dependency to Cargo.toml
- Add placeholder modules for future implementations (tables_new,
benchmark_utils, integration_utils, test_utils)