Hi Eric, that's a good question, but your understanding is not quite correct. Here is the correct understanding:
1. setting {"ConserveQNs=",true} produces a set of Index objects stored in sites which carry QN information. This QN information does not yet specify that Sz=0, as indeed there are not yet even any tensors which have been created. What it does do is record that the quantum number of the states of an individual spin correspond to Sz=+1 for spin up and Sz=-1 for spin down. (We use units of +1 in ITensor corresponding to +1/2 in physics so we can store quantum numbers as integers.)
2. when the ITensor psi is made, it still doesn't have a well-defined quantum number because it starts out as being zero
3. finally, when setting the first non-zero element of the ITensor psi, (the line psi.set(s(1)(1),s(2)(2), 1.0/Sqrt2); ), it is detected that this element is in a block that corresponds to a total Sz=0 combination of the indices of psi. So from that point onward, psi has a QN "flux" of QN("Sz",0) and only elements which preserve or conserve that same QN flux are allowed to be set to a non-zero value.
So it is really in step 3 above (the .set command to set elements of psi) that a QN value is automatically detected.
Yes, evolving tensors with a specific total QN (total flux) will preserve the total to be Sz=0 if by evolving you mean acting with operators which themselves are zero flux. One example of operators which are always zero flux are unitary operators. Another example is a Hamiltonian which conserves Sz, or exponentials of individual terms of that Hamiltonian.
Hope that helps!
Miles