Thank you for your response. I switched to a source-built version of the engine and debugged the PossessedBy function. It appears that SetAutonomousProxy(true) never runs, so I gathered more information and observed this behavior. In theory, NetMode == NM_DedicatedServer and IsLocalController() == true should never coincide, right?
My settings are still “Play As Client” with Number of Players set to 1. I’m using the correct GameMode class (a subclass of GameModeBase with no overrides), and I’ve configured the proper DefaultPawnClass and PlayerController. There are no Character instances placed in the level, and the spawned Character and its PlayerController are correct—I can even open widgets via the PlayerController.
Thank you again for your reply.