This is a spec bug. The sentence "If the parameter instance is detached, then JDOUserException is thrown." should be read as part of the previous paragraph that describes the behavior if a transaction is not active. In this case, detached and transient instances cannot be made persistent before detach because makePersistent requires an active transaction.
The operative behavior is "If a detachCopy method is called with an active transaction, the parameter Collection of instances is first made persistent, and the reachability algorithm is run on the instances. "
I'd like to resolve this issue as invalid, since the intent is to only throw an exception if detached and transient instances in the reachability graph cannot be made persistent (if there is no active transaction). The maintenance release will clarify the intent.