@@ -184,28 +184,31 @@ import Testing
184184 #expect( manager. _test_gatewayTalkUsesRealtimeRelay ( ) )
185185 }
186186
187- @Test func classifiesRealtimeAuthFailureForDisplay ( ) {
188- let issue = TalkRuntimeIssue . classify (
187+ @Test func buildsGenericRealtimeFallbackIssueForDisplay ( ) {
188+ let issue = TalkRuntimeIssue . realtimeUnavailable (
189189 message: " OpenAI API key rejected with 401 " ,
190190 provider: " openai " ,
191191 model: " gpt-realtime-2 " ,
192192 transport: " gateway-relay " ,
193193 phase: " start " )
194194
195- #expect( issue. code == . credentialInvalid )
195+ #expect( issue. code == . realtimeUnavailable )
196196 #expect( issue. displayMessage == " OpenAI API key rejected with 401 " )
197197 #expect( issue. diagnosticSummary. contains ( " provider: openai " ) )
198198 #expect( issue. diagnosticSummary. contains ( " model: gpt-realtime-2 " ) )
199199 #expect( issue. fallbackStatusText == " Listening (iOS Speech fallback) " )
200200 #expect( issue. fallbackBannerTitle == " Using iOS Speech fallback " )
201- #expect( issue. fallbackBannerOwnerLabel == " Fix on gateway " )
202- #expect( issue. technicalDetails. contains ( " code: credential_invalid " ) )
201+ #expect( issue. fallbackBannerOwnerLabel == " Fallback active " )
202+ #expect( issue
203+ . fallbackBannerMessage ==
204+ " Realtime voice did not start. Talk is running with iOS speech recognition and TTS. " )
205+ #expect( issue. technicalDetails. contains ( " code: realtime_unavailable " ) )
203206 }
204207
205208 @Test func nativeFallbackKeepsRealtimeIssueVisible( ) {
206209 let manager = TalkModeManager ( allowSimulatorCapture: true )
207210 let issue = TalkRuntimeIssue (
208- code: . providerClosedBeforeReady ,
211+ code: . realtimeUnavailable ,
209212 message: " Realtime closed before it became ready. " ,
210213 provider: " openai " ,
211214 model: " gpt-realtime-2 " ,
@@ -229,7 +232,7 @@ import Testing
229232 message: " Error: OpenAI API key rejected with 401 " ,
230233 details: [
231234 " talkIssue " : AnyCodable ( [
232- " code " : " credential_invalid " ,
235+ " code " : " realtime_unavailable " ,
233236 " message " : " OpenAI API key rejected with 401 " ,
234237 " provider " : " openai " ,
235238 " model " : " gpt-realtime-2 " ,
@@ -240,7 +243,7 @@ import Testing
240243
241244 let issue = manager. _test_realtimeIssue ( from: error, phase: " start " )
242245
243- #expect( issue. code == . credentialInvalid )
246+ #expect( issue. code == . realtimeUnavailable )
244247 #expect( issue. displayMessage == " OpenAI API key rejected with 401 " )
245248 #expect( issue. provider == " openai " )
246249 #expect( issue. model == " gpt-realtime-2 " )
@@ -251,7 +254,7 @@ import Testing
251254 @Test func relayStartupIssueSurvivesUntilReadyStatus( ) {
252255 let manager = TalkModeManager ( allowSimulatorCapture: true )
253256 let issue = TalkRuntimeIssue (
254- code: . credentialInvalid ,
257+ code: . realtimeUnavailable ,
255258 message: " OpenAI API key rejected with 401 " ,
256259 provider: " openai " ,
257260 model: " gpt-realtime-2 " ,
@@ -288,7 +291,7 @@ import Testing
288291 @Test func relayRetryClearsStaleFallbackTriggerButKeepsLastIssueVisible( ) {
289292 let manager = TalkModeManager ( allowSimulatorCapture: true )
290293 let issue = TalkRuntimeIssue (
291- code: . providerClosedBeforeReady ,
294+ code: . realtimeUnavailable ,
292295 message: " Realtime closed before it became ready. " ,
293296 provider: " openai " ,
294297 model: " gpt-realtime-2 " ,
0 commit comments