According to the EJB 3.2 specification (see below), a stateful session bean is supposed to throw a NoSuchEJBException if the client tries to use a stateful session bean that has timed out or had his @Remove annotated business method called.
This is true if the method invoked after the bean has timed out or been explicitly removed, is declared on the session bean class. However, if the method invoked was a method declared on a superclass (annotation free) that the stateful bean extended, the exception is not thrown. Instead, subsequent calls to the bean is honored.
Section "126.96.36.199 Session Bean Superclasses" does not explain whether or not an inherited method is a business method of the inheriting class. It does say that superclasses "represents a conventient use of implementation inheritance".
My testing that showed this error has used the no-interface view of a stateful bean. And that's it, i'm done with the problem description. Quotes from the specification follows.
EJB 3.2 specification, page 85:
"When the client calls a business method of the bean that has been designated as a Remove method on the bean class or a remove method on the home or component interface, the container invokes PreDestroy lifecycle callback interceptor methods, if any, for the bean instance after the Remove method completes. This ends the life of the session bean instance and the associated session object. If a client subsequently attempts to invoke a method on the bean's business interface, the container will throw the javax.ejb.NoSuchEJBException."
EJB 3.2 specification, page 43:
"If a stateful session bean has been removed, attempted invocations on the stateful session bean business interface result in the javax.ejb.NoSuchEJBException."
EJB 3.2 specification, page 57:
"It is invalid to reference a session object that does not exist. Attempted invocations on a stateful session object that does not exist result in javax.ejb.NoSuchObjectLocalException."