exactly-one-source-invariant-on-widget-requires-three-layer-enforcement
Widget data source exclusivity (semantic vs SQL, exactly one active) requires enforcement at three layers: Pydantic validator (API input rejection), Postgres CHECK constraint (DB-level enforcement), and service-layer domain error (business logic layer). Single-layer enforcement creates gaps — Pydantic is bypassed by direct DB writes, DB constraints don’t produce user-friendly errors, and service layer alone can be bypassed by migration scripts.
Related
- widget-exactly-one-source-triple-invariant
- widget-exactly-one-source-invariant-enforced-three-layers
- widget-exactly-one-source-triple-enforcement-pattern
- widget-exactly-one-source-invariant-enforced-at-three-layers
- widget-data-source-invariant-enforced-at-three-layers
- triple-layer-invariant-enforcement-pydantic-postgres-service