handleSend's pre-flight check rejected #<topicId> sends because the target wasn't matched by @group / * / pubkey, so it fell into the "direct" branch and looked for a peer with that pubkey. Topic targets need their own class — delivery happens via topic_member, not by matching connected peers. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>