The P1 cross-check (p_P1.mtz, twin-immune zones, finalist ledger) was merged
after the reflection files were written, serially on the critical path of a
run without --model: in-house protein sets wait 0.3-1.5 s for it after tail
work (tNCS, twinning, Wilson, anisotropy, writing the merged files) that it
shares no data with, and on the largest sets the merge itself is 16-32 s.
It is now started as soon as the final merge is settled and taken where it is
used. What tied it to the main thread was the space group: the engine read it
from the shared experiment, which the caller flipped to P1 around the merge.
Run now takes the group explicitly (RotationScaleMerge::Group() at the 13 sites
that read the experiment's group), so the experiment is left alone. Nothing
between the launch and the join calls the engine, changes the outcomes it was
ingested from, or changes the experiment; the engine writes no per-frame scale
back for this merge. The merge is therefore the one made before, on the same
engine state. The engine's log goes to a held buffer replayed at the join, so
the log keeps one order.
With --model the same merge already ran beside the validation; that is now the
same path, taken before the validation's relabelling is applied.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5K8jvPPbmCrbqnWkddTuB