Note that this process is iterative: usually we aren't able to exactly identify all knowing and doing responsibilities right at the beginning. Later, when we're mentally simulating the program, we will usually discover new knowing and doing responsibilities that we need to add to our list. Often we will just be able to include them in classes that we've already designed, but in some cases we might have to create new classes.
The upshot is that we should take the specification, identify and assign responsibilities as well as possible, mentally simulate, identify and assign responsibilities, mentally simulate, identify and assign responsibilities, and so on. This process should observe the guidelines about knowing and doing responsibilities above, and should end when we have described all the knowing and doing responsibilities in sufficient detail that we could then give our design to someone else, and they could translate it into code.