Reader negotiation?
HTTP has a concept of content negotiation, where clients tell servers what formats they understand so the server can give different clients the same data in different formats. This works through the Accept: header and the Content-Type: header. For example, a browser might ask a server for the HTML version of a web page by including Accept: text/html in its request, while a python script might ask for the JSON version using Accept: application/json. Then the server tells the client which format it chose by including Content-Type: application/json (or text/html) in its response.
Can we design something similar for working with source code in different surface syntaxes? Maybe by extending the way the reader submodule works with #lang, or by looking for some negotiator submodule instead of the reader submodule? That could be how we extend languages with tools for converting them from one surface syntax to another in places like scribble documentation or command-line scripts for migrating code.