At this point, as near as I can figure, the problem may be related to the version of JSF that comes with GlassFish v2 ur2 ().
What happens during a redirect is that JSF forwards to the new page (e.g. error.iface) and the JSF lifecycle is run for that page. However, it appears that the some errors/events are being "remembered" from the previous page (the one that threw the error intially). Here's a snippet of a stack trace for illustration:
javax.faces.el.EvaluationException: java.lang.RuntimeException: from action [RuntimeException with message]
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:91)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
at javax.faces.component.UICommand.broadcast(UICommand.java:383)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:447)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:752)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
at com.icesoft.faces.webapp.http.core.JsfLifecycleExecutor.apply(JsfLifecycleExecutor.java:16)
The UICommand.broadcast indicates that the button in the test case that was used to throw the Exception is re-broadcasting. This does not happen with ICEfaces 1.7 but it also doesn't happen with other app servers using newer versions of JSF.
A couple of points to note. The failure appears to occur if either of the following two conditions is met: