Resolve untrusted input using defaults, then validate a shallow-frozen snapshot.
Undefined input means no update. The assertion must validate every field and
throw on failure; thrown errors propagate. Always returns a fresh object.
Nested references are shared; the validator must not mutate nested values.
Resolve untrusted input using defaults, then validate a shallow-frozen snapshot. Undefined input means no update. The assertion must validate every field and throw on failure; thrown errors propagate. Always returns a fresh object. Nested references are shared; the validator must not mutate nested values.