Am I right in thinking that without something like this it will be impossible to know if a route did not match because a match doesn't exist for that path (404 probably), or because a route does not exist for that protocol (302 forward probably) or because a route does not exist for that method (405 probably).

Regardless of all the long words like "paradigms" and "encapsulate" - without the userland developer being able to know WHY matching has failed, the router is broken.