I'd hope that PostgreSQL would infer a "timestamp" type here or reply with an error that it couldn't infer the parameter type. Why does it default to type "text" and then effectively say the query is invalid?
Because no one has gotten a patch approved (not sure when/if there was a last attempt for this specific situation) to make the system “smarter”.
I can cast my parameter in the query to get around this but am submitting the bug because inferring "text" seems wrong.
Maybe, but the failure to be more intelligent in this area is not itself a bug, and the rules for unknown literal resolution defaulting to text are documented.