APT handles this by priorities (000 to 999), an implementation based on prios is not hard, more flexible, and IMHO more understandable than "shadowing" (i.e. in the end, a binary prio 0/1).

Why is implementation (likely) easy? Just use the prio as an epoch to the version, i.e. prepend it to the versions. All other processing stays the same. Default prio would be 500, and prios would be an index attribute.