Answer
In some framework versions, a custom event tied to a Custom Field Table (CFT) that contains only that one field won't fire at all when the field is null, because no CFT row gets created to trigger the event in the first place — this has been fixed in later framework updates. Until then, a workaround is to add a second custom field to the same CFT with a default value (even something trivial like a single space) — this guarantees a CFT row always exists, which lets the null-check custom event on the original field actually fire and enforce the mandatory validation as intended.