@@ -96,16 +96,18 @@ final class AppState {
9696 // MARK: - Connection Management
9797
9898 @MainActor
99− func connect(to connection: ServerConnection) async {
100− guard !isConnecting else { return }
99+ @discardableResult
100+ func connect(to connection: ServerConnection) async -> Bool {
101+ guard !isConnecting else { return false }
101102
102103 if !isNetworkAvailable {
103104 self.errorMessage = "No internet connection. Check your network and try again."
104105 self.showError = true
105− return
106+ return false
106107 }
107108
108109 isConnecting = true
110+ defer { isConnecting = false }
109111 errorMessage = nil
110112
111113 // When switching to a different server, clear stream-specific state
@@ -126,6 +128,11 @@ final class AppState {
126128 // Test connection — throws on non-200 or network failure
127129 try await newClient.checkHealth()
128130
131+ // If the task was cancelled while awaiting (e.g. user clicked
132+ // Disconnect during auto-reconnect), bail before installing the
133+ // client so we don't resurrect a connection disconnect() just cleared.
134+ if Task.isCancelled { return false }
135+
129136 self.client = newClient
130137 self.activeConnection = connection
131138 self.isConnected = true
@@ -137,15 +144,30 @@ final class AppState {
137144 async let streamList = newClient.listStreams()
138145 async let filterList = newClient.listFilters()
139146
140− self.serverAbout = try? await about
141− self.filters = (try? await filterList) ?? []
147+ let aboutResult = try? await about
148+ let filterResult = (try? await filterList) ?? []
149+ let streamResult: Result<[LogStream], Error>
142150 do {
143− self.streams = try await streamList
144− self.streamLoadError = nil
151+ streamResult = .success(try await streamList)
145152 } catch {
153+ streamResult = .failure(error)
154+ }
155+
156+ // Re-check after the loads above: a disconnect could have landed
157+ // while awaiting, in which case committing these would show stale data.
158+ if Task.isCancelled { return false }
159+
160+ self.serverAbout = aboutResult
161+ self.filters = filterResult
162+ switch streamResult {
163+ case .success(let list):
164+ self.streams = list
165+ self.streamLoadError = nil
166+ case .failure(let error):
146167 self.streams = []
147168 self.streamLoadError = ParseableError.userFriendlyMessage(for: error)
148169 }
170+ return true
149171 } catch {
150172 // If the task was cancelled (e.g. user clicked Disconnect during
151173 // auto-reconnect), skip the error alert — disconnect() already
@@ -164,9 +186,8 @@ final class AppState {
164186 self.serverAbout = nil
165187 self.filters = []
166188 }
189+ return false
167190 }
168−
169− isConnecting = false
170191 }
171192
172193 @MainActor