- Interoperability. ODCS is a Linux Foundation project. Soda, Great Expectations, and dbt speak it. Your contract isn’t a proprietary blob.
- No lock-in. Click Export, get a directory of YAML. Import it into whichever tool you pick next. No rewrite required.
- Version control. Contracts diff cleanly in Git. Reviewers see which validity rule changed in a PR, not a screenshot of a settings page.
ODCS-native vs ODCS-extended
ODCS covers the core concepts every tool agrees on: schema, column quality rules, freshness SLAs, ownership. We use its sanctionedcustomProperties extension mechanism for the AnomalyArmor-specific concepts ODCS doesn’t have a native slot for.
| Native ODCS (any tool reads these) | Extended (under customProperties.anomalyarmor) |
|---|---|
apiVersion, id, name, version, status, domain, tags | Schema drift monitoring (ODCS has no schema-change concept) |
schema[] with properties[] + physicalType | ML distribution drift (PSI, KS, chi-squared) |
quality[] metric library (nullValues, invalidValues, duplicateValues, rowCount) | Row-count anomaly detection with rolling baselines |
quality[] custom SQL | Alert rules and routing |
slaProperties[] (latency, frequency) | Destinations (Slack, email, PagerDuty, Linear, webhooks) |
team[] | Operating schedules and blackout windows |
customProperties is exactly how Soda and Great Expectations handle the same tension: industry-standard, not a workaround.
Portability modes
Two export modes control what gets written to the YAML.extended (default)
Full round-trip fidelity. Includes customProperties.anomalyarmor.<domain> blocks with every AA-specific configuration knob (drift thresholds, monitoring modes, alert routing, etc.). Use this for version control, backup, and re-import into AnomalyArmor.
odcs-pure
Strips every customProperties.anomalyarmor block. The resulting YAML contains only the ODCS-native subset that any ODCS tool can read and act on: schema, quality rules, freshness SLAs, team. You lose the AA-extended features (drift, alert routing, blackouts) but gain maximum portability for the interop case.
Pick odcs-pure when you want to hand the contract to a Soda or Great Expectations customer. Pick extended everywhere else.
CLI
One asset to stdout
yq or redirect to a file.
One asset to a file
Whole warehouse as a zip
Every contract in your account
Filtering
Include or exclude specific config domains:schema, freshness, validity, metrics, row_count, drift_monitors, schema_drift, alert_rules, destinations, blackouts.
ODCS-pure mode
REST API
Three endpoints power the CLI. All authenticated via your API key.Single-asset export (synchronous)
application/x-yaml with a Content-Disposition: attachment header.
Bulk export (asynchronous)
{"job_id": "<uuid>"}. Poll with:
status, progress_percent, and asset_count. When status is completed, download:
application/zip with the laid-out {warehouse}/{schema}/{table}.yaml archive.
Round-trip example
armor contract apply) is in active development. Contracts exported today will apply cleanly when it ships.
Coming from Soda?
Soda ships ODCS export as of 2024. Runsoda export --odcs on your existing Soda project and the resulting YAML imports directly into AnomalyArmor once the import flow ships.
What’s not supported yet
- Import (
armor contract apply). Export-only today; import ships in the next milestone. - Per-table granularity. One contract covers the whole warehouse; per-table will land with the import PR.
- S3 artifact storage for huge bulk exports. Jobs today inline the zip bytes in the status response, which is fine for hundreds of tables; company-wide exports with thousands of tables should use multiple scope-warehouse jobs until S3 storage lands.
