It clearly knows about the versions, but it strips them away for
whatever reason, which I don't understand, since if I want at least a
certain version of something, I don't really care what the exact name of
the package is.

There is no magic crystal ball involved which tells the system that
the substituted packages use the same versioning scheme.

There doesn't need to be one in 99% of cases. If I want KDE libraries at
least version 4.2, it doesn't matter if the package is called libkde4,
kdelibs or kdelibs4, the required version is always 4.2 or more.

In those 1% cases that possibly might need it the magic crystal ball can be
the packager who can handle it manually if the need arises. There's no need
to break this for the majority just because it might possibly break. It may
break this way too.

If you really want the versions, don't rely on the substitute
feature.

What is the point of it then? I can then do the substituting myself as well.
This middle ground makes no sense and just takes away the convenience of
having one .spec for all rpm distributions.