I suspected as much....the page doesn't clearly indicate that 4.0 is the reference version. Oh well. From what I understand, coding a custom engine is not a trivial process.
I retract my claim that this is a bug, but it seems to me that it would not take much to implement in 3.x. Basically, when you access the page catalog, if the getMessage() fails, just look for an application catalog. Maybe just a few lines of IO code. This would allow me to have a master application catalog, and small page catalog that could override a few messages and add a few new messages.
I coded a workaround in my own code with custom ValidFields and such, but it's really not an acceptable way to go about it. It requires my fellow devs to do too much, and is a maintenance quagmire.
If the fix/enhancement is simple (I suspect so), this would be a great improvement to Tapestry 3 (as we can see in Tapestry 4).