@@ -511,6 +511,25 @@ func Test_ErrorRemovesPartialMessage(t *testing.T) {
511511 require .Len (t , messages , 1 , "partial agent message should be removed on error" )
512512 assert .Equal (t , screentracker .ConversationRoleUser , messages [0 ].Role )
513513 assert .Equal (t , "test" , messages [0 ].Message )
514+
515+ // First exchange allocated IDs 0 (user) and 1 (agent, now removed).
516+ assert .Equal (t , 0 , messages [0 ].Id )
517+
518+ // Send a second message — IDs must not reuse the removed agent message's ID (1).
519+ mock .mu .Lock ()
520+ mock .writeErr = nil
521+ mock .writeBlock = nil
522+ mock .writeStarted = nil
523+ mock .mu .Unlock ()
524+
525+ err := conv .Send (screentracker.MessagePartText {Content : "retry" })
526+ require .NoError (t , err )
527+
528+ messages = conv .Messages ()
529+ require .Len (t , messages , 3 , "first user + second user + second agent" )
530+ assert .Equal (t , 0 , messages [0 ].Id , "original user message keeps its ID" )
531+ assert .Equal (t , 2 , messages [1 ].Id , "new user message skips removed ID 1" )
532+ assert .Equal (t , 3 , messages [2 ].Id , "new agent message continues sequence" )
514533}
515534
516535func Test_LateChunkAfterError_DoesNotCorruptUserMessage (t * testing.T ) {
0 commit comments