tl;dr - It would be nice to have a more consistent knowledge where OpTypeBool are allowed
in OpTypeBool it says
only with non-externally visible shader Storage Classes: Workgroup, CrossWorkgroup, Private, Function, Input, and Output.
but other Storage Classes such as Generic, CallableDataKHR, etc would also be "non-externally visible"
Also it seems that according to spirv-val the BuiltIn decoration also matters if it is "external", but I can't find that wording anywhere in the spec
Last thing, It also says
they must only be used with logical addressing operations, not physical
but is that suppose to just mean anything without OpMemoryModel Logical as the spec doesn't define any operations that are logical, just the model