Hi Eric, thanks for the questions (feel free to make a new post too if you want).
Let me address a few of them one-by-one:
1. it is true that for this state (up+dn) the *expected value* of Sz is zero. But it is not an eigenstate of Sz, so it doesn't have a well-defined total Sz quantum number (Sz is not a "good" quantum number of the state). QN conserving ITensors are only for working with tensors that have well-defined quantum numbers of various types.
2. regarding how to turn on quantum number conservation, it actually happens in a few stages. The "under the hood" view is that you first make, or obtain Index objects which have QN subspace information. Then you make ITensors which carry such indices. Then if you do operations like summations or contractions of these ITensors, the code will guarantee that QNs are properly conserved and give you the associated speed benefits etc. You can print out Index and ITensor objects to see if they carry QN information, and also call the function `hasQNs` on them to test this.
3. "ConserveSz" and related named arguments like "ConserveQNs" are arguments that can be passed to site set constructors, such as SpinHalf, SpinOne, Electron. These objects are basically just arrays of Index objects (in our Julia version that is literally what they are), and all setting "ConserveQNs" or "ConserveSz" to true does is to say "please include QN subspace information in the Index objects when making them."
Ok hope that helps, since it could be explained better on our website and documentation. Feel free to ask some more questions about it.