Skip to content

Server & output (server)

Where source describes where the data comes from, the server block describes the target/output connection context — the warehouse or object store a run binds to, and how the run behaves against it (most importantly, whether it runs as a Quality Gate (validate) or performs Raw-to-Bronze movement (ingest)).

server:
  type: warehouse            # the target server / warehouse kind
  format: parquet            # output format (default: parquet)
  path: "s3://lake/orders"   # target location (path / URI)
  mode: validate             # validate — Quality Gate (default) | ingest — Raw-to-Bronze movement
  cast_to_string: false      # read every column as string (bronze pattern) — bad types quarantine downstream
  schema_policy:             # how schema drift is handled at the target
    evolution: allow
    unknown_fields: allow
  post_ingestion:            # what happens to the consumed input after a run
    action: retain
    archive_path: "s3://lake/_archive/orders"
    cleanup_is_blocking: false

Fields

Field Type Default What it does
type string The target server / warehouse kind this run binds to.
format string parquet Output format written at the server.
path string Required. Target location (path / URI).
mode string validate validate — Quality-Gate mode (run schema + quality checks); ingest — Raw-to-Bronze movement (move raw input into bronze). Default validate.
cast_to_string boolean false Read every column as string (the bronze pattern), so malformed values quarantine downstream instead of failing the read.
schema_policy object How schema drift is absorbed at the target — same shape as schema policy elsewhere.
post_ingestion object What happens to the consumed input after a successful run. See Post-Ingestion Lifecycle.

schema_policy — how schema drift is absorbed

evolution — what to do when the incoming schema differs from the contract (default allow):

Value What it does Use it when
strict Reject any schema change — the incoming schema must match the contract exactly, or the run fails. Locked / regulated tables where drift must be a hard error.
compatible Allow only backward-compatible changes (add nullable columns, widen types); reject breaking ones. Evolving contracts with live consumers — the safe non-trivial setting.
append Add new columns; leave existing columns untouched. Additive sources that gain optional fields over time.
merge Add new columns and reconcile compatible type changes. Schemas that both gain columns and shift types.
overwrite Replace the target schema with the incoming one. Full-refresh tables where the source is authoritative.
allow (default) Accept any change — most permissive. Bronze / landing, where you take whatever arrives and resolve it downstream.

unknown_fields — what to do with columns present in the data but not declared in the contract (default allow):

Value What it does Use it when
quarantine Route rows carrying undeclared columns to quarantine, kept with the reason. Catch unexpected columns without silently losing data.
drop Silently drop undeclared columns — project the output to the contract's shape. Enforce a clean, exact output schema.
allow (default) Keep undeclared columns as-is (passthrough). Bronze / flexible ingestion where extra columns are fine.

post_ingestion — what happens to the consumed input

Cleanup of the input files, expressible at both the source and the server level.

action (default retain):

Value What it does Use it when
retain (default) Leave the input in place. Reprocessing, audit, idempotent re-runs.
delete Delete the input after a successful run. Data minimization / reclaiming space. Pair with cleanup_is_blocking: true to guarantee it's gone before the run reports success (e.g. a compliance requirement).
archive Move the input to archive_path. Keep a cold copy for audit while clearing the landing zone.
Field Type Default
archive_path string Where input lands when action: archive.
cleanup_is_blocking boolean false Whether cleanup must finish before the run is considered complete.

The write side (strategy, format, location) is in Materialization & Storage; the same delete / archive / retain behaviour is covered in depth in Post-Ingestion Lifecycle.