enterWeaving
Transition Woven → Weaving. Held until recover or tear is called.
No-op if already SeamState.Weaving or SeamState.Torn.
Publishes the state before _peers so that the delegate-peers collector, on its next emission, sees SeamState.Weaving and skips — narrowing the roster dual-write window.
The state write itself goes through SeamStateGate.update, so a concurrent tear can no longer be clobbered by this transition on any dispatcher: once tear latches, this update is a no-op. That is the whole of #2633; what remains is the narrower _peers window described in the constructor, which is about the roster and not about the terminal state.
onEnterWeaving returns its argument identically for every non-transition — already SeamState.Weaving, or terminal SeamState.Torn — so next !== current narrows next to SeamState.Weaving and SeamStateGate.update's Torn rejection is unreachable here by construction, not by convention.