Join with code
The MVP uses a mocked user identity for now, so the flow stays simple until auth is ready.