widget-data-source-invariant-enforced-at-three-layers

The exactly-one-source invariant on Widget (semantic vs SQL) is enforced at three independent layers: Pydantic validator at request ingress, Postgres CHECK constraint at persistence, and service-layer domain error at business logic. Removing any one layer silently degrades the guarantee — treat all three as required.