@@ -89,6 +89,12 @@ const writerStoreFileStats = new WeakMap<
8989 Record < string , SessionEntry > ,
9090 ReturnType < typeof getFileStatSnapshot > | null
9191> ( ) ;
92+ let serializedPromptRefKeyCache :
93+ | {
94+ serialized : string ;
95+ keys : Set < string > ;
96+ }
97+ | undefined ;
9298
9399function loadSessionArchiveRuntime ( ) {
94100 sessionArchiveRuntimePromise ??= import ( "../../gateway/session-archive.runtime.js" ) ;
@@ -365,12 +371,40 @@ function buildSingleEntrySerializedStore(params: {
365371 } ;
366372}
367373
368- function storeHasUntouchedHydratedSkillPrompts (
374+ function collectSerializedPromptRefKeys ( serialized : string ) : Set < string > {
375+ if ( serializedPromptRefKeyCache ?. serialized === serialized ) {
376+ return serializedPromptRefKeyCache . keys ;
377+ }
378+ const keys = new Set < string > ( ) ;
379+ try {
380+ const parsed = JSON . parse ( serialized ) as Record < string , SessionEntry > ;
381+ for ( const [ key , entry ] of Object . entries ( parsed ) ) {
382+ if ( entry ?. skillsSnapshot ?. promptRef ) {
383+ keys . add ( key ) ;
384+ }
385+ }
386+ } catch {
387+ // Malformed serialized cache cannot prove prompt refs are already durable.
388+ }
389+ serializedPromptRefKeyCache = { serialized, keys } ;
390+ return keys ;
391+ }
392+
393+ function storeHasUnsafeUntouchedHydratedSkillPrompts (
394+ storePath : string ,
369395 store : Record < string , SessionEntry > ,
370396 changedSessionKey : string ,
371397) : boolean {
398+ const currentSerialized = getSerializedSessionStore ( storePath ) ;
399+ const serializedPromptRefKeys = currentSerialized
400+ ? collectSerializedPromptRefKeys ( currentSerialized )
401+ : undefined ;
372402 for ( const [ key , entry ] of Object . entries ( store ) ) {
373- if ( key !== changedSessionKey && typeof entry . skillsSnapshot ?. prompt === "string" ) {
403+ if (
404+ key !== changedSessionKey &&
405+ typeof entry . skillsSnapshot ?. prompt === "string" &&
406+ ! serializedPromptRefKeys ?. has ( key )
407+ ) {
374408 return true ;
375409 }
376410 }
@@ -620,7 +654,11 @@ async function saveSessionStoreUnlocked(
620654 if (
621655 opts ?. singleEntryPersistence &&
622656 ! maintenanceChangedStore &&
623- ! storeHasUntouchedHydratedSkillPrompts ( store , opts . singleEntryPersistence . sessionKey )
657+ ! storeHasUnsafeUntouchedHydratedSkillPrompts (
658+ storePath ,
659+ store ,
660+ opts . singleEntryPersistence . sessionKey ,
661+ )
624662 ) {
625663 const normalizedEntry = store [ opts . singleEntryPersistence . sessionKey ] ;
626664 const singleEntrySerialized = buildSingleEntrySerializedStore ( {
0 commit comments