In my opinion, there is an issue in FIX regarding the session reject (35=3). This message defines a list of standard reject reasons like:
1=Required Tag Missing
2=Tag not defined for this message type
3=Undefined tag
5=Value is incorrect (out of range) for this tag
6=Incorrect data format for value
13=Tag appears more than once
14=Tag specified out of required order
15=Repeating group fields out of order
16=Incorrect NumInGroup count for repeating group
18=Invalid/Unsupported Application Version
However these reasons also apply to applications without FIX session because these reasons are applicative reasons. So to me, these reasons should be moved or should be at least duplicated in 35=j.
@xavierbruyet, I agree with your assessment. “FIX classic” was originally specified as a monolithic standard covering application layer semantics, message encoding, and session layer. Therefore, the rejection message spans all layers.
Nevertheless, the FIX session layer standard has been updated to state:
As a rule, messages should be forwarded to the trading application for business level rejections whenever possible instead of being rejected at the session layer.
More recent FIX protocols, including SBE and FIXP, have attempted to keep a clean separation between protocol layers.