Here's a simpler implementation approach: Create a management pack that contains a new "delay activity" class inherited from System.WorkItem.Activity. Give that class an "InProgress" datetime property and a "DelayForDays" integer
property.
Next, you'll need two workflows.
Create a powershell based workflow that triggers when an activity of your new class goes in progress. This workflow will set the "InProgress" property to the current date/time.
Next, create a powershell workflow that runs once a day. This workflow retrieves all activities of your class that are in progress. For each activity, the workflow compares the current date/time to the "InProgress" date/time plus the
number of days in "DelayForDays". If the current date/time meets or exceeds InProgress+DelayForDays, set the activity status to completed.
Now you can create an Activity template based on your new activity class. Set the "DelayForDays" value to 90. Insert that activity into your service request template.
So now when your activity goes in progress, your first workflow will set the date/time that it went in progress. After that, your other workflow will examine that activity every day to see if the 90 days has passed since it went in progress and, if it has,
set the activity to completed.
Here are the caveats: This is, of course, one of the simplest delay activity implementations and will have some compromises. For instance, if your activity is rerun, then the timestamp is essentially reset. This implementation does not respect work days
or holidays or anything like that (a slightly more complicated problem, believe it or not). This implementation is limited to a daily granular level. If you want something more granular, like hours or minutes, you would have to adjust the logic and the 2nd
workflow's frequency accordingly.
The advantages to this implementation is that it's pretty straight-forward to implement. It's also light-weight in that a workflow will only run once per day plus the number of times one of your activities goes in progress.