Even with date revisions, the right mental model is feature detection, not version sniffing. The handshake's capabilities object is the source of truth for what the other side supports. Branching on revision numbers ("if version >= 2025-11-25 then …") is fragile; branching on advertised capability ("if 'sampling' in capabilities then …") survives every revision.
This shows up the most in transitional features. Async tasks landed in the 2025-11-25 revision; hosts that want to call long-running tools should check whether the server advertises the asyncTasks capability before picking the async path. A server that knows about async tasks but cannot run them in the current deployment can simply not advertise the capability — clients adapt without knowing the deployment story.
The same shape applies to client capabilities. A server that wants to use sampling MUST check whether the host advertised sampling before sending a sampling request. Sending one without the capability is a protocol violation; the host is allowed to drop the connection. Treat the capabilities object like a feature bitmap; treat version numbers as audit trail.