First of all, I donβt think you are simplifying this too much. This is a simple concept.
Teams tell your application to do something.
Events tell the world that you did something.
If your application cannot do what they are told (due to business rules or for some other reason), it does not. And, in turn, does not announce anything. If he does something, he announces it through an event.
If someone has subscribed to these events and cares about when they happen, then they can update their application with the data in the event.
In practice, this usually means that your readable model subscribes to events and updates them accordingly.
Take the user creation. You issue a User_CreateCommand that contains information about the user. Then the command handler will create a new object, this object will be the user, and save it in the repository. Creating a user launches User_CreatedEvent, which will be processed by your reading model, and the reading model will be updated. Any other listening system can also update itself.
The part that requires a bit of study is that when you save the user to the repository, you actually do not save the user object, as you think. In fact, you save a User_CreatedEvent that contains all the data about the user.
Later, when you need a custom object, you will call something like _repo.GetById (1);
Then all events related to this user will be played back and create a custom object.
Hope that helps :)