# Deep CFR Regret Fallback Audit, 2026-05-07 Goal: test whether all-negative regret matching fallback is a plausible source of early over-opening in Lost Cities Deep CFR. ## Code Changes - Added traversal audit metrics for regret matching fallback decisions. - Default behavior remains unchanged: `regret_matching.all_negative_fallback: uniform`. - Added optional fallback mode: `argmax_tiebreak`. - Added CLI override: `--regret-fallback uniform|argmax_tiebreak`. Key metrics: - `traversal_regret_matching_decisions` - `traversal_regret_fallback_count` - `traversal_regret_fallback_rate` - `traversal_regret_fallback_avg_depth` - `traversal_regret_fallback_depth_bucket_` - `traversal_regret_fallback_opened_colors_count_` - `traversal_regret_fallback_action_open_new` - `traversal_regret_fallback_open_new_selected` - `traversal_regret_fallback_open_new_selected_rate` - `traversal_regret_fallback_legal_actions_mean` - `traversal_regret_fallback_legal_open_new_mean` - `traversal_regret_fallback_legal_discard_mean` - `traversal_regret_fallback_legal_draw_deck_mean` - `traversal_regret_fallback_legal_draw_pile_mean` - `traversal_regret_fallback_open_new_available_rate` - `traversal_regret_fallback_open_new_selection_over_availability` - `traversal_regret_fallback_avg_opened_colors_before_action` - `traversal_regret_fallback_argmax_tie_rate` - `traversal_regret_fallback_argmax_tie_size_mean` - `traversal_regret_fallback_argmax_full_tie_rate` - `traversal_regret_fallback_open_new_available_color_` - `traversal_regret_fallback_open_new_selected_color_` Implementation note: fallback policy state is captured immediately after the network policy is computed. This avoids child recursion overwriting the traversal-level fallback flag before the decision is recorded. ## Runs Baseline long run, analyzed after it had reached iteration 210: - `runs/deep_cfr/2026-05-07_legacy_align_full_depth_slot_playability` Short comparison runs: - `runs/deep_cfr/2026-05-07_regret_fallback_uniform_20iter` - `runs/deep_cfr/2026-05-07_regret_fallback_argmax_tiebreak_20iter` Both short runs used the same base config and seed: - `configs/deep_cfr/deep_cfr_selfplay_full_depth_slot_playability.yaml` - `seed: 79` - `iterations: 20` - `save_latest_only` The 20-iteration runs below were collected before the expanded fallback timing, legal-action composition, and tie diagnostics were added. They should be treated as the first historical audit snapshot. New paired runs are needed to compare the expanded metrics. Instrumentation smoke run: - `runs/deep_cfr/2026-05-07_regret_fallback_metrics_smoke_1iter_v2` This run confirms the expanded metrics are emitted to `metrics.jsonl`. ## Iteration 20 Snapshot | metric | uniform | argmax_tiebreak | |---|---:|---:| | traversal_regret_matching_decisions | 39,358 | 49,296 | | traversal_regret_fallback_count | 18,362 | 7,588 | | traversal_regret_fallback_rate | 0.4665 | 0.1539 | | traversal_regret_fallback_open_new_selected | 641 | 164 | | traversal_regret_fallback_open_new_selected_rate | 0.0349 | 0.0216 | | traversal_regret_fallback_avg_opened_colors_before_action | 4.4325 | 4.6118 | | eval_random_avg_opened_colors | 2.48 | 2.16 | | eval_random_5_color_open_count | 49 | 35 | | eval_safe_heuristic_avg_opened_colors | 2.50 | 2.44 | | eval_safe_heuristic_5_color_open_count | 50 | 44 | | eval_passive_discard_avg_opened_colors | 2.33 | 2.32 | | eval_passive_discard_5_color_open_count | 39 | 41 | | eval_random_avg_score_diff0 | 42.46 | 33.58 | | eval_safe_heuristic_avg_score_diff0 | -52.65 | -58.25 | ## Read The audit confirms that uniform fallback fires frequently in the early run. At iteration 20, almost half of traversal regret-matching decisions use fallback under `uniform`. `argmax_tiebreak` sharply reduces fallback frequency and absolute fallback open-new selections in this 20-iteration comparison. It also lowers 5-color counts against random and safe heuristic opponents at iteration 20. The effect is not uniform across every opponent in this very short run. This is diagnostic evidence, not enough to promote `argmax_tiebreak` as the default. A longer 50-100 iteration paired run is still needed before deciding whether this fixes the plateau without hurting policy quality.