Issue #3605419: Offer 'Fire timer now' only on live tokens

Follow-up fix for the "Fire timer now" action added in this issue.

A token keeps the last deadline it carried even after it goes terminal (consumed or cancelled), so the instance trace offered Fire timer now on rows where it does nothing: a cancelled or consumed token can no longer fire a timer. The cron sweep only fires parked or waiting tokens, so the operator action should match.

This gates both the trace-page link and the controller action on the token still being parked or waiting (the same statuses the sweep fires). The link no longer appears on terminal rows, and a stale link that is followed warns instead of reporting a misleading "fired" success. The engine path was already a no-op on a non-parked token, so this is a UI and feedback fix, not a behavior change to firing itself.

What is included

  • Gate the "Fire timer now" link in the trace on a parked or waiting token carrying a deadline.
  • Gate the fire action the same way, so a stale link warns rather than reporting a false success.
  • A controller guard test: a cancelled token that still carries a deadline warns and reports no success.

phpcs (Drupal, DrupalPractice) and cspell are clean; the new guard test passes.

Merge request reports

Loading