diff --git a/NucleicRemote/NucleicRemote/Views/SessionDetailView.swift b/NucleicRemote/NucleicRemote/Views/SessionDetailView.swift index d431fad..5617f14 100644 --- a/NucleicRemote/NucleicRemote/Views/SessionDetailView.swift +++ b/NucleicRemote/NucleicRemote/Views/SessionDetailView.swift @@ -408,14 +408,24 @@ struct SessionDetailView: View { // than being sent and silently ignored. set: { on in if on { store.setSessionOrchestra(sessionID) } }), catalog: store.intelligenceCatalog, - enabled: store.connectivity.isLive && !summary.archived, + // Locked once the chat is in Orchestra, matching the Mac's composer: from + // there its model is the supervisor configured on the host, not a stop on + // this rail, and the host refuses a level for it anyway + // (`setSessionIntelligence`) — so the rail parks on the node rather than + // offering moves that would bounce. + enabled: store.connectivity.isLive && !summary.archived && !sessionOrchestra, // Always offered — no Nucleic Control gate. See the new-chat composer. orchestraAvailable: store.intelligenceCatalog.orchestraAvailable, composerText: draft, routeDescription: sessionRouteDescription, unavailableReason: summary.archived ? "This chat is archived." - : (store.connectivity.isLive ? nil : "The Mac that owns this chat is offline."), + : !store.connectivity.isLive + ? "The Mac that owns this chat is offline." + : (sessionOrchestra + ? "This chat runs Orchestra — its supervisor model is set on the " + + "Mac and stays fixed for the life of the chat." + : nil), onPreviewChanged: { intelligencePreview = $0 }) IntelligenceRouteLine( level: level,