In an inverse sync, when a copy child paired with a main child further
along the main's children, compare-children asked whether the copy
child was the main of the main child, with the arguments of
ctk/is-main-of? reversed. The answer was always no, so the pair took
the swapped callback, which does nothing in an inverse sync, and only
the move ran: the overrides of that copy child never reached the main.
The UI does not let a copy reorder its children, so it only showed
when the order differed for another reason, such as the undo of a
sync reorder.
The inverse branch now asks synced-pair? with the main child first,
as the direct branch does.
Benchmark (lower quantile, ms; baseline / now / ratio):
deepest-edit-through-three-levels 35.2 / 35.5 / 1.01
edit-through-a-chain-of-dependents 68.9 / 66.1 / 0.96
library-update-into-copies 83.1 / 77.0 / 0.93
main-edit-into-10-copies 1.8 / 1.6 / 0.92
main-edit-into-100-copies 15.4 / 16.2 / 1.05
main-edit-into-1000-copies 153.1 / 156.4 / 1.02
variant-switch-into-copies 32.1 / 28.3 / 0.88
AI-assisted-by: claude-opus-5-5