@@ -212,4 +212,48 @@ describe("memory manager self-heal missing identity with FTS-only chunks", () =>
212212 expect ( statusAfter . custom ?. indexIdentity ) . toEqual ( { status : "valid" } ) ;
213213 expect ( statusAfter . dirty ) . toBe ( false ) ;
214214 } ) ;
215+
216+ it ( "preserves pending memory and session dirty work when replacement refresh clears missing identity" , async ( ) => {
217+ await seedChunksWithNoMeta ( ) ;
218+ const memoryManager = await createManager ( { provider : "none" , vectorEnabled : false } ) ;
219+ const dirtyState = memoryManager as unknown as {
220+ dirty : boolean ;
221+ memoryFullRetryDirty : boolean ;
222+ sessionsDirty : boolean ;
223+ sessionsDirtyFiles : Set < string > ;
224+ sessionsFullRetryDirty : boolean ;
225+ } ;
226+
227+ expect ( indexIdentityStatus ( memoryManager ) ) . toBe ( "missing" ) ;
228+ dirtyState . dirty = true ;
229+ dirtyState . memoryFullRetryDirty = true ;
230+ dirtyState . sessionsDirty = true ;
231+ dirtyState . sessionsDirtyFiles . add ( "session-a.jsonl" ) ;
232+ dirtyState . sessionsFullRetryDirty = true ;
233+
234+ const cliResult = await getMemorySearchManager ( {
235+ cfg : createCfg ( { provider : "none" , vectorEnabled : false } ) ,
236+ agentId : "main" ,
237+ purpose : "cli" ,
238+ } ) ;
239+ if ( ! cliResult . manager ) {
240+ throw new Error ( cliResult . error ?? "cli manager missing" ) ;
241+ }
242+ const cliManager = cliResult . manager as unknown as MemoryIndexManager ;
243+ try {
244+ await cliManager . sync ( { reason : "cli" , force : true } ) ;
245+ } finally {
246+ await cliManager . close ?.( ) ;
247+ }
248+
249+ const statusAfter = memoryManager . status ( ) ;
250+
251+ expect ( statusAfter . custom ?. indexIdentity ) . toEqual ( { status : "valid" } ) ;
252+ expect ( statusAfter . dirty ) . toBe ( true ) ;
253+ expect ( dirtyState . dirty ) . toBe ( true ) ;
254+ expect ( dirtyState . memoryFullRetryDirty ) . toBe ( true ) ;
255+ expect ( dirtyState . sessionsDirty ) . toBe ( true ) ;
256+ expect ( dirtyState . sessionsDirtyFiles . has ( "session-a.jsonl" ) ) . toBe ( true ) ;
257+ expect ( dirtyState . sessionsFullRetryDirty ) . toBe ( true ) ;
258+ } ) ;
215259} ) ;
0 commit comments