So the convention I am adopting in more-speech is to allow users to type @ which will be translated into #[n] references and appropriate "p" tags. They can also type @ which will be translated into #[n] tags and either "p" or "e" tags as appropriate. They will be transmitted to relays with the #[n] tags in place. More-speech will do nothing with the "nostr:" tokens. They will be transmitted as normal text without any #[n] tags.
Upon receiving a note from a relay more-speech will render #[n] references with "p" tags by looking up the profile of the user and replacing the #[n] with @. If the profile is not found, or if the tag is "e" it will render the #[n] as @. In both cases the rendering will be clickable to either bring up the profile of the user, or bring up the referenced event.
More speech will also look for "nostr:" tokens within the incomming notes and will render them as either @ or as @ depending on whether the bech32 refers to a user with a profile or a note. They too will be clickable.
Since more-speech also displays a tree list of the received notes, along with one line of abbreviated contents, it will translate any "nostr:" tokens in that single line into appropriate @<...> tokens.
So there.