# Stability Boundary After Backtracking (Sweep v2) [hard_regime_boundary_sweep.md](hard_regime_boundary_sweep.md) mapped the Df/kf/σ/N stability boundary under greedy first-fit pairing and was explicitly reserved as the baseline against which a future pairing-choice fix would be benchmarked. This page reports that measurement: an identical grid, identical seeds, and identical trial counts (`configs/boundary_sweep_v2.toml` is a copy of the original config with only the output directory changed), run against the current defaults — backtracking pairing, the overlap-acceptance fix, and mass-based CCA Γ. Overall: 3374/4200 trials succeeded (80.3%), against 3039/4200 (72.4%) before. The aggregate number understates the change, since the grid deliberately extends well past the boundary into regions no pairing strategy can rescue; the informative result is where the boundary moved. ## Results ### σ = 1.9 (the hard polydisperse case) Success rate averaged over N ∈ {64…1024}, old → new. Rows that were 1.00 throughout and remained so are omitted. | Df | kf=0.8 | kf=0.9 | kf=1.0 | kf=1.1 | kf=1.2 | kf=1.3 | kf=1.4 | |---|---|---|---|---|---|---|---| | 2.0 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 0.92→1.00 | | 2.1 | 1.00 | 1.00 | 1.00 | 1.00 | 0.80→1.00 | 0.32→1.00 | 0.08→1.00 | | 2.2 | 1.00 | 0.92→1.00 | 0.52→1.00 | 0.16→0.84 | 0.00→0.64 | 0.00→0.52 | 0.00→0.36 | | 2.3 | 0.56→0.84 | 0.12→0.72 | 0.04→0.44 | 0.00→0.40 | 0.04→0.20 | 0.00→0.16 | 0.00→0.04 | | 2.4 | 0.16→0.44 | 0.00→0.32 | 0.00→0.20 | 0.00→0.12 | 0.00 | 0.00 | 0.00 | | 2.5 | 0.00→0.20 | 0.00→0.12 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | The Df=2.1 row summarizes the change most clearly: it previously collapsed from 1.00 to 0.08 as kf rose from 0.8 to 1.4, and is now uniformly 1.00. The previously-safe ceiling at σ=1.9 was Df≈2.0–2.1; it is now Df≈2.2 across most of the kf range, with non-zero success appearing for the first time at Df=2.4–2.5. ### σ = 1.5 | Df | kf=0.8 | kf=0.9 | kf=1.0 | kf=1.1 | kf=1.2 | kf=1.3 | kf=1.4 | |---|---|---|---|---|---|---|---| | 2.2 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 0.92→1.00 | | 2.3 | 1.00 | 1.00 | 1.00 | 0.84→0.96 | 0.44→0.84 | 0.08→0.72 | 0.04→0.44 | | 2.4 | 0.92→0.96 | 0.60→0.84 | 0.36→0.64 | 0.00→0.44 | 0.00→0.40 | 0.00→0.08 | 0.00→0.04 | | 2.5 | 0.40→0.60 | 0.08→0.40 | 0.04→0.28 | 0.00→0.12 | 0.00 | 0.00 | 0.00 | ### σ = 1.0 (monodisperse) | Df | kf=0.8 | kf=0.9 | kf=1.0 | kf=1.1 | kf=1.2 | kf=1.3 | kf=1.4 | |---|---|---|---|---|---|---|---| | 2.3 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00→0.96 | | 2.4 | 1.00 | 1.00 | 1.00 | 0.88→0.80 | 0.68→0.72 | 0.56→0.72 | 0.36→0.60 | | 2.5 | 0.92 | 0.68→0.80 | 0.60→0.64 | 0.52→0.48 | 0.20→0.40 | 0.04→0.36 | 0.00→0.24 | Gains are smaller in the monodisperse case, as the diagnosis predicts: monodisperse aggregates were never the frustrated case. Two cells move down slightly (Df=2.4/kf=1.1: 0.88→0.80, Df=2.5/kf=1.1: 0.52→0.48). At 25 trials per cell both movements are within sampling noise, and they sit alongside much larger gains in the same rows; they are recorded as observed and do not indicate a regression. ### N dependence The previous sweep found that N does not independently cause failure but sharpens whatever margin Df/kf/σ leaves. Backtracking flattens that sharpening substantially at σ=1.9: | Df, kf | N=64 | N=128 | N=256 | N=512 | N=1024 | |---|---|---|---|---|---| | 2.2, 1.0 | 1.00→1.00 | 0.60→1.00 | 0.60→1.00 | 0.40→1.00 | 0.00→1.00 | | 2.3, 0.8 | 1.00→1.00 | 1.00→1.00 | 0.40→1.00 | 0.40→1.00 | 0.00→0.20 | Df=2.2/kf=1.0 previously degraded monotonically to total failure at N=1024 and is now flat at 1.00 across the whole range. This result carries more practical weight than the averaged tables: large N was where the previous implementation was least usable, and it is where backtracking helps most, since a single unlucky pair no longer discards an entire expensive attempt. ## Cost Backtracking makes infeasible configurations more expensive, not less. Where greedy pairing abandoned an attempt at the first failed pair, backtracking tries several partners per cluster first, and `run_simulation` then retries the whole attempt up to 20 times. The first run of this sweep stalled at roughly 12 trials per five minutes in the Df=2.5 corners despite a nominal 120 s per-trial timeout, because that timeout was only checked between attempts and could not interrupt a long attempt in progress. This has been fixed: `CCAggregator` accepts a wall-clock `deadline`, threaded from `run_simulation`'s `max_runtime_seconds`, and checked inside the round loop and before each additional partner attempt. An infeasible N=512/Df=2.5 configuration given a 20 s budget returns in 20.1 s. Sweeps extending past the boundary should set `trial_timeout`; without it, hard corners are slow to fail. Raw output: `benchmark_results/boundary_sweep_v2/stability_sweeps/`.