One write path for every answer
People answer questions in a lot of places: daily questions, community questions, games, and polls shared into a chat. If any of those kept its own table, every comparison in the app would drift from the truth by however much people played that game.
So every answer goes through a single method, QueueService.answer(), which writes the response together with a snapshot of the person's communities at the moment they answered. An earlier version didn't take that snapshot, which made comparing communities after the fact impossible. That lesson shaped this design.
QueueService.answer() ├─ users/{uid}/queue/… // marks it answered ├─ contentAnswers/…/{uid} // response + communities at answer time ├─ users/{uid}/answers/… // the person's ledger └─ users/{uid}.identity.* // becomes a matching axis
A new game is a new screen, not a new data model, and comparisons stay correct wherever people answer.