7341ab578e
ManagedInferenceRouter owns a live @Volatile pin (decision D1): swap(modelId) makes a model resident and pins it; clearPin() releases it. Pin is highest precedence in route() (pin > stage.modelId > capability > default). New SwapModel/ClearModelPin client messages handled in GlobalStreamHandler via ServerModule.modelSwapper (null on the static path). ServerMessage.ModelChanged (model.changed) mapped from ModelLoadedEvent/ModelUnloadedEvent — the swap's load event surfaces to clients through streamGlobal, so the handler doesn't push it directly. Tests: pin precedence + swap/clear, Model* -> ModelChanged. Plan: docs/plans/2026-05-31-model-lifecycle-management.md (slice 3 of 5).