The "resolve effective_d_min (manual override, else the auto CC1/2 cutoff
unless for_search) then erase merged reflections beyond it" block was
copy-pasted in three places - RotationScaleMerge::MergeAndStats, the stills
merge in Rugnux.cpp and the offline --scale path in rugnux_cli.cpp - and had
already started to diverge (the CLI copy had dropped the for_search guard and
the "no cut" log line). Move it into ResolutionCutoff::ApplyResolutionCutoff
so there is one implementation.
No behaviour change to the cutoff policy: the two full-analysis paths are
identical to before, and the CLI path keeps its semantics (for_search is
always false when re-scaling a stored _process.h5) - it only gains the same
"keeping the full resolution range" info line the other two already logged.
RotationScaleMerge still recomputes its own d_min/d_max span after the trim.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>