Validation Everywhere¶
ETLantic models ETL with validation at every meaningful boundary.
This is not a new acronym, a fourth contract family, or an instruction to add handwritten validation transformations between every pair of steps. Validation is a cross-cutting control layer derived from the existing data, transformation, and pipeline contracts.
It also makes the project name concrete: ETL remains the recognizable extract-transform-load flow, while ETLantic is that flow surrounded by typed contracts, validation, planning, and evidence from source to publication. The name describes an ETL system with a validation envelope, not a replacement for ETL.
The Validation Envelope¶
The envelope has two complementary parts.
Before execution¶
ETLantic validates the model and resolved environment before mutation:
- definitions and identities
- contract documents and supported versions
- graph references, cycles, ports, and contract compatibility
- portable transformation expressions
- profile bindings and resources
- backend and compiler capabilities
- plugin trust and production allowlists
These checks do not read datasets, invoke transformations, resolve secrets, or write outputs. They answer whether the declared pipeline can be executed safely with the selected profile.
During execution¶
Runtime values are checked where data crosses a contract or ownership boundary:
- Extract boundary. Confirm that source data presented to the pipeline
satisfies the extracted
Datacontract according to validation policy. - Transformation input boundary. Confirm that each implementation receives
values compatible with its declared
Input[T]ports. - Transformation output boundary. Confirm that valid, invalid, and side outputs match their declared ports before downstream consumption.
- Engine and interchange boundary. Preserve contract fidelity when data changes engine, representation, ownership, or materialization strategy.
- Load boundary. Validate the value being published and enforce declared write intent before mutation.
- Publication evidence. Record the outcome, artifact identity, schema observation, diagnostics, and backend evidence available after publication.
The same value may cross several logical boundaries inside one fused physical region. A backend may avoid redundant materialization only when it can preserve the required validation semantics and logical attribution.
Validation Is Policy-Driven¶
Not every boundary requires the same physical operation. Depending on the profile, contract, backend, and declared policy, ETLantic may:
- fail the step or run
- reject or quarantine invalid rows when the plugin supports separation
- emit a warning or structured diagnostic
- compare normalized schemas
- verify counts, freshness, reconciliation, or other declared evidence
- rely on a transactional backend acknowledgement
- record that a stronger verification was unavailable and fail closed when it was required
ETLantic must not silently downgrade a mandatory validation requirement merely because the selected engine lacks the capability.
Validation Is Not Repeated Work by Default¶
“Validation at every boundary” describes semantic coverage, not mandatory full-row rescans.
Validation can be satisfied by contract-aware construction, backend-native schema checks, fused predicates, constrained writes, transactional results, or previously established evidence when those mechanisms are truthful for the declared policy. Plans should expose where validation occurs, whether it materializes or scans data, and what evidence it produces.
A post-load check does not imply that ETLantic always reads the sink back. Some providers can return strong publication evidence; others can only confirm that the write request completed. If read-after-write verification is required, it must be declared, supported, planned, and reported explicitly.
Why It Matters¶
Traditional ETL often treats validation as a final quality task. That permits bad source data, implementation mistakes, lossy engine conversions, or unsafe writes to travel too far before discovery.
ETLantic instead keeps one chain of typed evidence:
declared contract
↓
validated logical edge
↓
validated runtime boundary
↓
planned artifact and write intent
↓
publication and run evidence
This makes failures attributable to the boundary that introduced them and keeps validation portable across local Python, Polars, Pandas, SQL, PySpark, and orchestration targets.
Design Rules¶
- Validate structure and capabilities before data work begins.
- Validate runtime values before they cross into the next contract boundary.
- Validate or constrain writes before external mutation.
- Preserve validation semantics through fusion and optimization.
- Record what was checked, how it was checked, and what could not be checked.
- Never put source rows or resolved secrets into plans, diagnostics, schema history, or validation evidence.
- Fail closed when a required validation guarantee cannot be preserved.