@@ -798,6 +798,77 @@ describe("SupervisorManager cycle triggers", () => {
798798 expect ( deps . supervisorRepo . findById ( supervisor . id ) ?. objective ) . toBe ( "Initial objective" ) ;
799799 } ) ;
800800
801+ it ( "preserves a pause request while a target reset update is still persisting" , async ( ) => {
802+ const supervisor = await manager . create ( {
803+ sessionId : "sess-objective-reset-pause-race" ,
804+ workspaceId : "ws-1" ,
805+ objective : "Initial objective" ,
806+ evaluatorProviderId : "codex" ,
807+ } ) ;
808+
809+ let releaseReset : ( ( ) => void ) | null = null ;
810+ deps . targetStore . resetTargetFiles . mockImplementation (
811+ async ( ) =>
812+ await new Promise < void > ( ( resolve ) => {
813+ releaseReset = resolve ;
814+ } )
815+ ) ;
816+
817+ const updatedPromise = manager . update ( supervisor . id , {
818+ objective : "New objective" ,
819+ } ) ;
820+
821+ await waitFor ( ( ) => {
822+ expect ( deps . targetStore . resetTargetFiles ) . toHaveBeenCalledTimes ( 1 ) ;
823+ expect ( releaseReset ) . not . toBeNull ( ) ;
824+ } ) ;
825+
826+ const paused = await manager . pause ( supervisor . id ) ;
827+ releaseReset ?.( ) ;
828+
829+ const updated = await updatedPromise ;
830+
831+ expect ( paused . state ) . toBe ( "paused" ) ;
832+ expect ( updated . state ) . toBe ( "paused" ) ;
833+ expect ( updated . objective ) . toBe ( "New objective" ) ;
834+ expect ( manager . get ( supervisor . id ) ?. state ) . toBe ( "paused" ) ;
835+ } ) ;
836+
837+ it ( "does not resurrect a supervisor deleted during target reset persistence" , async ( ) => {
838+ const supervisor = await manager . create ( {
839+ sessionId : "sess-objective-reset-delete-race" ,
840+ workspaceId : "ws-1" ,
841+ objective : "Initial objective" ,
842+ evaluatorProviderId : "codex" ,
843+ } ) ;
844+
845+ let releaseReset : ( ( ) => void ) | null = null ;
846+ deps . targetStore . resetTargetFiles . mockImplementation (
847+ async ( ) =>
848+ await new Promise < void > ( ( resolve ) => {
849+ releaseReset = resolve ;
850+ } )
851+ ) ;
852+
853+ const updatedPromise = manager . update ( supervisor . id , {
854+ objective : "New objective" ,
855+ } ) ;
856+
857+ await waitFor ( ( ) => {
858+ expect ( deps . targetStore . resetTargetFiles ) . toHaveBeenCalledTimes ( 1 ) ;
859+ expect ( releaseReset ) . not . toBeNull ( ) ;
860+ } ) ;
861+
862+ await manager . delete ( supervisor . id ) ;
863+ releaseReset ?.( ) ;
864+
865+ await expect ( updatedPromise ) . rejects . toMatchObject ( {
866+ code : "supervisor_not_found" ,
867+ } ) ;
868+ expect ( manager . get ( supervisor . id ) ) . toBeUndefined ( ) ;
869+ expect ( deps . supervisorRepo . findById ( supervisor . id ) ) . toBeUndefined ( ) ;
870+ } ) ;
871+
801872 it ( "preserves a pause request while an objective change abort is in flight" , async ( ) => {
802873 const supervisor = await manager . create ( {
803874 sessionId : "sess-objective-pause-race" ,
0 commit comments