widget-exactly-one-source-triple-invariant

Widget data source exclusivity (semantic vs SQL, exactly one) is enforced at three independent layers: Pydantic validator on the schema, a Postgres CHECK constraint in the migration, and a domain error raised at the service layer. Any one layer catching the violation is sufficient; all three together prevent silent data corruption across API, ORM, and raw-SQL paths.