@@ -425,6 +425,58 @@ describe("ProviderCommandReactor", () => {
425425 expect ( thread ?. title ) . toBe ( "Keep this custom title" ) ;
426426 } ) ;
427427
428+ it ( "matches the client-seeded title even when the outgoing prompt is reformatted" , async ( ) => {
429+ const harness = await createHarness ( ) ;
430+ const now = new Date ( ) . toISOString ( ) ;
431+ const seededTitle = "Fix reconnect spinner on resume" ;
432+ harness . generateThreadTitle . mockReturnValue (
433+ Effect . succeed ( {
434+ title : "Reconnect spinner resume bug" ,
435+ } ) ,
436+ ) ;
437+
438+ await Effect . runPromise (
439+ harness . engine . dispatch ( {
440+ type : "thread.meta.update" ,
441+ commandId : CommandId . makeUnsafe ( "cmd-thread-title-formatted-seed" ) ,
442+ threadId : ThreadId . makeUnsafe ( "thread-1" ) ,
443+ title : seededTitle ,
444+ } ) ,
445+ ) ;
446+
447+ await Effect . runPromise (
448+ harness . engine . dispatch ( {
449+ type : "thread.turn.start" ,
450+ commandId : CommandId . makeUnsafe ( "cmd-turn-start-title-formatted" ) ,
451+ threadId : ThreadId . makeUnsafe ( "thread-1" ) ,
452+ message : {
453+ messageId : asMessageId ( "user-message-title-formatted" ) ,
454+ role : "user" ,
455+ text : "[effort:high]\\n\\nFix reconnect spinner on resume" ,
456+ attachments : [ ] ,
457+ } ,
458+ titleSeed : seededTitle ,
459+ textGenerationModel : "gpt-5.4-mini" ,
460+ interactionMode : DEFAULT_PROVIDER_INTERACTION_MODE ,
461+ runtimeMode : "approval-required" ,
462+ createdAt : now ,
463+ } ) ,
464+ ) ;
465+
466+ await waitFor ( ( ) => harness . generateThreadTitle . mock . calls . length === 1 ) ;
467+ await waitFor ( async ( ) => {
468+ const readModel = await Effect . runPromise ( harness . engine . getReadModel ( ) ) ;
469+ return (
470+ readModel . threads . find ( ( entry ) => entry . id === ThreadId . makeUnsafe ( "thread-1" ) ) ?. title ===
471+ "Reconnect spinner resume bug"
472+ ) ;
473+ } ) ;
474+
475+ const readModel = await Effect . runPromise ( harness . engine . getReadModel ( ) ) ;
476+ const thread = readModel . threads . find ( ( entry ) => entry . id === ThreadId . makeUnsafe ( "thread-1" ) ) ;
477+ expect ( thread ?. title ) . toBe ( "Reconnect spinner resume bug" ) ;
478+ } ) ;
479+
428480 it ( "reuses the text generation model for automatic worktree branch naming" , async ( ) => {
429481 const harness = await createHarness ( ) ;
430482 const now = new Date ( ) . toISOString ( ) ;
0 commit comments