# Validation Architecture
Validation is split into three ownership layers.
```mermaid
flowchart LR
Server[server
stores simple settings
binds table fields
enforces writes]
Core[validation-core
owns meaning
resolves recipes
runs pure validation]
Canvas[canvas
editor integration
masking while typing
UI feedback]
Common[common/proto
wire format]
Server --> Core
Canvas --> Core
Server --> Common
Canvas --> Common
```
## Rule
`server` stores dumb, serializable settings. `validation-core` owns what those
settings mean. `canvas` uses the resolved result for editing behavior.
```mermaid
flowchart TD
Settings[ValidationSettings
serializable data]
Recipe[ValidationRecipe
named reusable settings]
Package[ValidationPackage
distributable recipes]
Config[ValidationConfig
resolved runtime config]
Result[ValidationResult]
Package --> Recipe
Recipe --> Settings
Settings --> Config
Config --> Result
```
## Current Data Flow
```mermaid
sequenceDiagram
participant DB as server DB
participant Server as server
participant Core as validation-core
participant Client as client/canvas
DB->>Server: stored field validation settings
Server->>Core: interpret shared validation primitives
Server->>Client: gRPC validation config
Client->>Core: resolve/use shared primitives
Client->>Client: canvas editing, masks, errors
```
## Future Package Flow
```mermaid
flowchart LR
Registry[validation package registry]
Package[phone package]
Recipe[phone.e164 recipe]
Assignment[column assignment]
Stored[server stored settings
recipe ref + resolved config]
Runtime[server/canvas runtime]
Registry --> Package
Package --> Recipe
Recipe --> Assignment
Assignment --> Stored
Stored --> Runtime
```
The server may store both the recipe reference and the resolved settings:
```text
field customer_phone uses phone.e164@1.0.0
resolved settings = {...}
```
That keeps package imports inspectable and versioned while preserving stable
backend enforcement even if a package changes later.