Hey Mark,
Note that if you use the C++ wrapper you don't need to set the ::Undefined values, they are set for you.
The mental model is that a render pass has a separate region of memory it uses to operate on attachment. That's how tiler GPUs work: they have a region of memory that's close to the ALUs and contains attachment data, so at the beginning of the render pass they need to initialize that region of memory either by loading from the attachment or clearing it to something, then at the end of the render pass they need to do something with the data, either discard it or store it to the attachment. That's why the spec says "load the value in the render pass" although it could be a bit more clear.
There are other loadOp and storeOp that could be added in the future, for example expanding the resolveTarget 1x MSAA to a 4x MSAA attachment, or something else so that's why it isn't booleans.
These
old slides could maybe help explain in more detail.
Cheers,
Corentin