Answer
Direct variable substitution inside the Failure End Event's own message text doesn't reliably work — instead, create a projection custom action wrapping Error_SYS.Appl_General (or equivalent), call that action from the workflow as an IFS API step, and pass your dynamic message as the action's parameter using variable substitution there; this reliably surfaces the actual computed message text to the user, in a way that setting it directly on the Failure End Event does not.