For those who only need the timer to be 1 .reps this fix is working, however it doesn't work when the .reps parameter is 0 or greater than 1.

It appears that -P is sorta working, and there's an additional bug with -p not reported earlier, which also affects -P. On the 1st .rep the -P functions as expected, but on later reps the interval varies for both -p and -P. Also there's a ghost value reported for the timer's .secs value after it ceases to exist.

On the 2nd -p interval, it tries to change the interval for that timer so it's aligned with one of the execution points that would have been used if the -p had not been used. It then goes back to using the original .delay for all later intervals. And some of this behavior is affecting -P too.

On the 2nd -P interval, it looks like the timer is trying to do the same thing, but doesn't always get it right. But then for the 3rd and later intervals, even though $timer().delay continues to report the original delay, -P's actual delay is counting down from N, where N was the .secs value when the -P was issued.

This alias below waits until the time is hh:nn:00 to make things easier to see. The X1 target timer executes 4 times at 15 second intervals.

/test_timer_P 7 20 -p

at nn:07 seconds X1 pauses, then resumes at nn:25, when it executes immediately because .secs counted down to zero while paused. However that next interval is only 5 secs long because X1 tries to have the next interval at the nn:30 time, which was the 2nd execution point had the timer not paused. All intervals after that are original 15 secs.

/test_timer_P 7 25 -p

This pauses X1 at nn:07 with .secs at 8, and .secs remains at 8 until it resumes at nn:28 instead of nn:15 due to being paused for 13 secs. X1 decides the 2nd interval should be 4 secs, and counts down until the 2nd execution at nn:32. The interval then changes to be the 8 value of .secs when the -P was issued, so this interval of 8 secs causes the 3rd execution to be at nn:40 and the 4th interval at nn:48, which is sooner than it would have happened if the timer hadn't been paused.

I'm guessing the 4 comes from a calculation of 4xxx milliseconds between nn:30 when the timer was supposed to execute next vs the few ticks after nn:25 when the timer was resumed.

When using -p and -P, within 1 second of the timer halting it always reports to an external observer that $timer(x1).secs is the delay used by the final .rep even though $timer(x1) and $timer(x1).reps and $timer(x1).delay are all $null.

Even if the timer is paused and restarted N seconds later which is before the 1st .rep executes, the 2nd interval is lowered by N-1 seconds and the 3rd and later intervals are lowered to be whatever the .secs was when paused.

Code:
alias test_timer_P {
  var %pause_at 5 , %resume_at 20
  if ($1 isnum 5-) var -s %pause_at  $int($1)
  if ($2 isnum 6-) var -s %resume_at $int($2)
  if (%resume_at <= %pause_at) { echo -a "resume_at" must be greater than "pause_at": /test_timer_P pause_at resume_at -P|-p | return }
  var %paused_for %resume_at - %pause_at

  if ( $asctime($ctime,s) isnum 1-55) { echo -a waiting for seconds to reach zero $asctime | .timerx0 1 $calc(57- $v1) test_timer_P $1 $2 $3 | return }
  while ($asctime($ctime,s) != 0) noop

  echo -a pause_at %pause_at
  echo -a resume_at %resume_at
  echo -a paused_for %paused_for $iif($3 == -P,$3,-P)

  var %rep1 $asctime($calc($ctime + 15 + %paused_for))
  var %rep2 $asctime($calc($ctime + 30 + %paused_for))
  var %rep3 $asctime($calc($ctime + 45 + %paused_for))
  var %rep4 $asctime($calc($ctime + 60 + %paused_for))

  echo -a without pause/resume, green timers display at :15 / :30 / :45 / :00 secs
  var %i 1 | while (%i isnum 1-4) {
    echo -a with pause at launch+ $+ %pause_at and resume at launch + $+ %resume_at $+ , rep $+ %i should display at: $asctime($calc($ctime + 15*%i + %paused_for) )
    inc %i
  }

  echo 4 -a launch $asctime
  timerx? off
  timerx1 4 15 echo 3 -a X1: .reps= $!asctime reps= $!timer(x1).reps .delay= $!timer(x1).delay .secs= $!timer(x1).secs
  .timerx2 0 1 echo -a $!time x2 sees $!timer($timer(x1)) reps= $!timer(x1).reps secs= $!timer(x1).secs $(|) if (!$timer(x1)) timerx2 off
  .timerx3 1 %pause_at  timerx1 $iif($3 == -P,$3,-P)
  .timerx4 1 %resume_at timerx1 -r
  timerx?
}