The issue is that regular commands are not being persisted, at all, under the RO viewer.
This is because I've made it the responsibility of the viewer to get hold of the current Command (using CommandContext#getCommand()) and to update the "Executor" of the Command to be "USER". This is done by the Wicket viewer. And, similarly, in BackgroundCommandExecution adapter the Executor gets set to "BACKGROUND".
But in the RO viewer I've not updated this field, so it remains set to its default, "OTHER". This then causes the initialization of the Command (when the initial action is invoked) to be skipped, resulting in no memberIdentifier.
So, the fix is just for RO viewer to set this field in DomainObjectResourceServerside and DomainServiceResourceServerside.