FLUIDFLUID
  • Introduction
  • Quickstart
  • Why FLUID
  • FAQ
  • What FLUID Is
  • Core Principles
  • Agentic-Native Layer
  • FLUID vs ODCS / ODPS
  • Reference Implementation
  • Anatomy
  • Cheatsheet
  • Minimal Contract
  • Specification
  • Versions
  • Changelog
  • JSON Schema 0.7.5 (stable) ↗
  • Reference 0.7.5 (HTML) ↗
  • Preview: 0.7.6
Examples
How-to
What's New
Deck
  • Contributing
  • Governance ↗
  • Conformance Corpus ↗
  • Vision
GitHub
GitHub
  • Introduction
  • Quickstart
  • Why FLUID
  • FAQ
  • What FLUID Is
  • Core Principles
  • Agentic-Native Layer
  • FLUID vs ODCS / ODPS
  • Reference Implementation
  • Anatomy
  • Cheatsheet
  • Minimal Contract
  • Specification
  • Versions
  • Changelog
  • JSON Schema 0.7.5 (stable) ↗
  • Reference 0.7.5 (HTML) ↗
  • Preview: 0.7.6
Examples
How-to
What's New
Deck
  • Contributing
  • Governance ↗
  • Conformance Corpus ↗
  • Vision
GitHub
GitHub
  • Schema Reference

    • Schema Reference
    • Schema Anatomy
    • Schema Cheatsheet
    • FLUID Specification
    • Minimal Contract & FLUID at a Glance
    • Schema Versions
    • Changelog

Schema Cheatsheet

One row per field of the latest stable schema, 0.7.5: a one-line meaning, whether it is required, and the version it first appeared in. Rows marked 🧪 are in the 0.7.6 preview only; a contract needs fluidVersion: "0.7.6" to use them, and they can still change.

🧭 For a guided tour with context per block, read the Schema Anatomy. 📚 For the exhaustive field-by-field reference, see specs/0.7.5/fluid-spec.html (stable) or specs/0.7.6/fluid-spec.html (preview).

"Since" is the version from which the field has been in the schema without interruption; where a member of the same name existed earlier and was removed, the row says so. Contracts before 0.5.7 had a different overall shape (see the Changelog), so for those blocks the current shape is newer than the name.


Top-level fields

The root object is closed: a top-level key not listed here makes the document invalid.

FieldPurposeRequiredSinceType
fluidVersionThe schema version this document declares; it selects the schema the document is validated against. 0.7.5 accepts "0.7.3", "0.7.4", "0.7.5" — but see Choosing fluidVersion.✅0.0.1enum
kindDataProduct | MLPipeline.✅0.0.1enum
idGlobally unique product id — the product's public address.✅0.0.1identifier
nameHuman-readable display name.✅0.0.1string
metadataOwner, layer, product type, business context.✅0.0.1object
exposesPorts this product publishes.✅0.0.1object[]
descriptionBusiness-facing summary.0.0.1string
domainOwning business domain.0.0.1string
consumesUpstream FLUID products this product reads.0.0.1object[]
buildHow the product is produced (pattern + engine + properties).0.0.1object
buildsSeveral builds for one product, same shape as build.0.5.7object[]
tagsLower-case categorization tags (^[a-z0-9][a-z0-9-]*[a-z0-9]$).0.5.7string[]
labelsKey/value labels.0.5.7map<string,string>
lineagegranularity, upstream[] (with fieldMappings), downstream[].0.5.7object
schemaEvolutionstrategy and compatibility of the product's schema changes.0.5.7object
machineLearningenabled, framework, models[].0.5.7object
environmentsPer-environment overrides of metadata and exposes.0.5.7map<string,object>
lifecyclestate, retention, deprecationPolicy.0.5.7object
docshomepage, runbook, dictionary, changeLog.0.5.7object
sovereigntyJurisdiction and data residency.0.7.1object
accessPolicyAccess grants for the product. (A different accessPolicy existed from 0.0.1 to 0.4.0.)0.7.1object
orchestrationScheduling and workflow-engine settings. Open object — see below.0.7.2object
retentionISO-8601 TTLs for run state, run logs, lineage events and DLQ records.0.7.3object
governanceAccount-wide AWS Lake Formation settings: admins, tagDefinitions. (A different governance existed from 0.0.1 to 0.4.0.)0.7.3object
extensionsVendor- or plugin-namespaced configuration. Open object. (Also in 0.0.1; absent from 0.1.0 to 0.7.2.)0.7.3object
🧪 packagingContainer ownership: mode (isolated | shared), pool, poolManifest, containers.0.7.6object
🧪 consumersDeclared downstream artifacts: name and type required; label, owner, url, maturity, exposeIds.0.7.6object[]

metadata (required) fields

metadata is required, and inside it only owner is. The schema requires no member of owner, so owner: {} validates; name at least a team.

FieldPurposeRequiredSince
metadata.ownerOwner object: team, email, slack, oncall.✅0.0.1
metadata.layerLayer label. Free-form string — Bronze/Silver/Gold is convention, not enum.0.0.1
metadata.productTypeSDP (source-aligned) | ADP (aggregated) | CDP (consumption-aligned).0.7.3
metadata.classificationpublic | internal | confidential | restricted. (A classification also existed in 0.0.1.)0.7.3
metadata.experimentalExperimental features the contract opts into.0.7.3
metadata.businessContextdomain, subdomain, businessCapability, valueStream.0.5.7
metadata.tagsTags on the metadata. (Also existed from 0.0.1 to 0.4.0.)0.7.2
metadata.createdAtCreation time (format: date-time, an annotation).0.5.7
metadata.provenanceGeneration envelope written by tooling.0.7.2

exposes[] fields

Each entry requires exposeId, kind, contract and binding, and is closed.

FieldPurposeRequired
exposes[].exposeIdStable id of this port within the product.✅
exposes[].kindtable | view | api | file | stream | topic | feature_store | model | vector | graph | time_series | other.✅
exposes[].contractThe data's shape and promises. Must contain schema or openapiRef.✅
exposes[].bindingWhere it lives — platform, format, location (all three required).✅
exposes[].policySibling of contract, not inside it: authn, authz, privacy, classification, agentPolicy.
exposes[].title, exposes[].descriptionDisplay name and description of the port (description since 0.7.2; it also existed from 0.1.0 to 0.4.0).
exposes[].versionSemver of this port.
exposes[].contract.schema[]Columns: name and type required; required, description, sensitivity, semanticType, businessName, businessDefinition, validationRules, tags, labels.(one of)
exposes[].contract.openapiRefReference to an OpenAPI document (for kind: api).(one of)
exposes[].contract.dq.rules[]Declarative quality assertions (below).
exposes[].contract.schemaPolicystrict | discover_and_freeze | evolve_safe | evolve_all (since 0.7.3).
exposes[].contract.schemaSignaturesha256: + 64 hex — a digest of the schema.
exposes[].qosavailability (a percentage string such as "99.9%"), freshnessSLO, latencyP95 (ISO-8601 durations), dataLossSLO, completenessTarget, errorBudget.
exposes[].semanticsEntities, measures, dimensions, metrics (since 0.7.2; a semantics member with a different shape existed from 0.1.0 to 0.4.0).
exposes[].mcpServe the port to AI agents over MCP (since 0.7.4): sampling.maxRows (integer ≥ 1), classification.dataClass (public | internal | confidential | restricted).
exposes[].lifecycle, exposes[].observability, exposes[].docsPer-port lifecycle, observability (metrics, onBreach, defaultSLIs, alert) and docs.
exposes[].binding.platformgcp | aws | azure | snowflake | databricks | kafka | confluent (0.7.5) | local | kubernetes | postgres (0.7.4) | pgvector (0.7.5) | other.✅
exposes[].binding.formatbigquery_table | snowflake_table | snowflake_view | iceberg | delta_table | parquet | csv | json | http_api | grpc_api | kafka_topic | pubsub_topic | gcs_file | s3_file | redshift_table | redshift_serverless | redshift_external_schema | postgres_table (0.7.4) | athena_table (0.7.4) | glue_table (0.7.4) | pgvector_table (0.7.5) | other.✅
exposes[].binding.locationPlatform address; no member is required by the schema. 0.7.5 adds environment_id, kafka_cluster_id, confluent_role_arn (Tableflow), catalog, warehouse, uri, partitionBy (Iceberg catalogs), namespace, workgroup, iam_role_arn, external_schema, glue_database (Redshift Serverless), stream (Kinesis).✅
exposes[].binding.icebergConfigIceberg table settings when format: iceberg (since 0.7.2).
exposes[].binding.vectorConfigVector output port for pgvector (since 0.7.5): dimensions (required, 1–16000), embeddingModel, vectorType, indexType, distanceMetric, hnsw, ivfflat, table, sourceKeyColumn.
exposes[].binding.governancePer-resource AWS Lake Formation settings: registerLocation, grants[], tags, rowFilter (since 0.7.3). Account-wide settings live in the top-level governance block.
🧪 exposes[].binding.encryption.kmsproduct | none | an AWS KMS alias or ARN | a Cloud KMS key name.
🧪 exposes[].binding.principalsLogical principal → identity (or list) on this platform.
🧪 exposes[].binding.packagingPer-binding override of packaging.
🧪 exposes[].binding.governance.lakeFormation.bucketPolicycross-account (default) | none | all-grantees. Authoritative — an emitted bucket policy replaces every other statement on the bucket; see the 0.7.6 notes.
🧪 exposes[].lifecycle.expiretrue deletes data older than retention (default false).
exposes[].tags, exposes[].labelsPort-level categorization.

contract.dq.rules[] fields

FieldPurposeRequired
dq.rules[].idRule id.✅
dq.rules[].typefreshness | completeness | uniqueness | valid_values | accuracy | schema | anomaly_detection | drift_detection.✅
dq.rules[].severityinfo | warn | error | critical.✅
dq.rules[].selectorPredicate or column the rule applies to (e.g. "amount > 0").
dq.rules[].thresholdNumeric threshold for the operator.
dq.rules[].operator>= | > | <= | < | == | !=.
dq.rules[].windowISO-8601 duration window (e.g. PT15M).

build / builds[] fields

A build is closed and has no required member.

FieldPurposeRequired
build.idBuild id; give one to each entry of builds[].
build.patternhybrid-reference | embedded-logic | multi-stage | acquisition (0.7.3). Selects the shape of properties.
build.enginedbt | sql | python | spark | glue | custom | duckdb | airbyte | meltano | dlt | kafka-connect | debezium (the last six since 0.7.3), or dbt-<adapter> such as dbt-databricks (since 0.7.2).
build.capabilitiesWhat the build asks of its runner: full_refresh, incremental_append, incremental_dedup, incremental_merge, cdc, streaming, schema_discovery, schema_evolution, dlp_scan, at_most_once, at_least_once, exactly_once (since 0.7.3).
build.propertiesPattern-specific settings. hybrid-reference requires model; embedded-logic requires sql; acquisition requires source (below).
build.execution.triggertype: schedule | event | manual | dependency | dataset | schedule_and_dataset | timetable, plus schedule, cron, timezone, …
build.execution.runtimeWhere it runs: platform, resources, image, executor, serviceAccount, timeout.
build.execution.retriesmaxAttempts, backoffStrategy (fixed | exponential | linear), initialDelay, maxDelay.
build.execution.notifications[]type (email | slack | webhook | pagerduty), target, condition (success | failure | always). Closed since 0.7.2.
build.execution.orchestrationThe same shape as top-level orchestration.
build.outputsThe exposeIds this build produces.
build.repositoryWhere referenced code lives.

build.properties when pattern: acquisition fields

When pattern: acquisition (0.7.3+), the schema validates properties against the acquisition shape below. (For the other patterns it uses the hybrid-reference, embedded-logic and multi-stage shapes.)

Field (under build.properties)PurposeRequired
source.kindSource system — a free string, e.g. postgres, kafka, salesforce.✅
source.modefull_refresh | incremental_append | incremental_dedup | incremental_merge | cdc | streaming.✅
source.cursor_fieldColumn used as the incremental cursor.
source.connectionConnection details (open object). secretRef must be a URI matching <scheme>://…; the schema's description names vault://, aws://, gcp://, azure:// and env://.
source.streamsStreams / tables / objects to ingest.
sink.formaticeberg | delta | parquet | csv | json | snowflake_table | bigquery_table | redshift_table | duckdb_table.
sink.catalogrest | glue | nessie | unity | snowflake-managed | hive.
sink.partitionByArray of strings (function form, e.g. ["day(ingested_at)"]) — not the object form of binding.icebergConfig.partitionSpec.
delivery.guaranteeat_most_once | at_least_once (default) | exactly_once.
delivery.idempotencyKeyKey template (default {run_id}:{stream}:{record_pk}).
delivery.dlqenabled (default true), sink.format (parquet | json | ndjson), sink.location, maxRecordsBeforeAbort (default 10000), alertOn (pii_classification_failed | schema_violation | destination_write_failed | quality_gate_failed).
schemaEvolution.policystrict (default) | discover_and_freeze | evolve_safe | evolve_all.
schemaEvolution.onAddedColumn / onRemovedColumn / onTypeChangeinclude | warn | fail / drop | warn | fail / cast | warn | fail.
schemaEvolution.sourceFingerprintrequired (default) | optional | disabled.
preLandHook chain: dlp_scan, tokenize_pii, quality_gate, emit_lineage_input.
qualityPre-land quality gates[] (rule, severity required), onError, anomalies[].
cost.budgetmonthly (rows, bytes, computeMinutes) and onExceed (warn (default) | abort).
cost.chargebackteam, project, costCenter.
catalog.registerdatahub, openmetadata, datamesh_manager, unity, glue, snowflake_horizon (the last three since 0.7.4).
concurrency.lockscope (product (default) | build), timeout, onContended (abort | queue | replace).
lineage.emitEmit lineage events (default true).
<engine> (duckdb | airbyte | meltano | dlt | kafka-connect | debezium)Engine-specific settings.
<engine>.deployment.modeembedded (default) | bring-your-own | managed; with managed, managed.target is docker | kubernetes | terraform | opentofu.
<engine>.image_signatureverifier (cosign), publicKey, slsaProvenance (required | optional (default) | disabled).
kafka-connect.iceberg_sink_enabled, sink_topics, streamingSink, iceberg_catalog_overridesOpt-in Iceberg streaming sink (since 0.7.5).

exposes[].policy fields

FieldPurposeRequired
exposes[].policy.authnoidc | oauth2 | api_key | none | custom | iam | jwt.
exposes[].policy.authz.readers / writersPrincipals with read / write access.
exposes[].policy.authz.columnRestrictions[]principal, columns, access (allow | deny). 🧪 The 0.7.6 schema defines its meaning: a column named in any restriction is restricted; deny removes access; allow limits the columns to the principals an allow names; deny beats allow; a restriction never grants access.
exposes[].policy.privacy.masking[]{column, strategy} required; strategy is mask | hash | tokenize | encrypt | k_anonymity; params is open. 🧪 0.7.6 types params: keepFirst, keepLast (mask), saltEnv (hash), keyEnv (tokenize, encrypt).
exposes[].policy.privacy.rowLevelPolicy.expressionProvider-specific row filter predicate (required inside rowLevelPolicy).
exposes[].policy.classificationPublic | Internal | Confidential | Restricted.
exposes[].policy.agentPolicyAI-consumer policy (below).

exposes[].policy.agentPolicy (0.7.1) fields

⚠️ Location. agentPolicy is per-expose, under exposes[].policy.agentPolicy. It is not a top-level property.

0.7.4 — runtime enforcement. When the same expose carries an mcp block, an MCP gateway that implements 0.7.4 enforces the model and use-case lists on every read; the reference implementation's gateway does. The shape is unchanged.

FieldPurposeDefault
…agentPolicy.allowedModelsModel ids allowed to read the expose (lower-case ids such as gpt-4, claude-3-opus).
…agentPolicy.deniedModelsModel ids denied.
…agentPolicy.maxTokensPerRequest / maxTokensPerDayToken caps (integers ≥ 1).
…agentPolicy.allowedUseCases / deniedUseCasesFrom a fixed vocabulary: inference | reasoning | analysis | summarization | classification | embedding | search | qa | code_generation | fine_tuning | training | rag. Other strings are invalid.
…agentPolicy.canReasonAllow multi-step reasoning over the data.false
…agentPolicy.canStoreAllow caching or persisting the data.false
…agentPolicy.retentionPolicymaxRetentionDays (≥ 0), requireDeletion.requireDeletion: true
…agentPolicy.auditRequiredLog AI consumption.true
…agentPolicy.purposeLimitationFree-text purpose statement.

consumes[] fields

FieldPurposeRequired
consumes[].productIdUpstream product id.✅
consumes[].exposeIdUpstream port.✅
consumes[].versionConstraintSemver range, e.g. ^2.0.0.
consumes[].qosExpectationsfreshnessMax, maxStaleness (durations), minCompleteness (0–1).
consumes[].requiredPoliciesPolicies the upstream must carry.
consumes[].purposeWhy this product reads the upstream.
🧪 consumes[].upstreamWorkspaceThe other mesh that owns the upstream. Requires upstreamDigest.
🧪 consumes[].upstreamDigestsha256: + 64 lowercase hex — the upstream contract this product was composed against.

sovereignty (0.7.1) fields

FieldPurpose
sovereignty.jurisdictionEU | US | UK | CA | AU | JP | CN | IN | BR | Global | Multi-Region.
sovereignty.allowedRegions / deniedRegionsCloud regions allowed / denied.
sovereignty.dataResidencyBoolean — must data stay within the jurisdiction?
sovereignty.crossBorderTransferBoolean — is cross-border transfer permitted?
sovereignty.transferMechanismsSCCs | BCRs | Adequacy | DPF | Consent | Derogation.
sovereignty.regulatoryFrameworkGDPR | CCPA | CPRA | HIPAA | PIPEDA | LGPD | PDPA | POPIA | DPA | APPI.
sovereignty.enforcementModestrict | advisory | audit.
sovereignty.validationRequiredWhether bindings are checked against this block.

accessPolicy (0.7.1) fields

Each grant requires only principal, and is closed.

FieldPurposeRequired
accessPolicy.grants[].principalThe principal, e.g. group:analysts@example.com.✅
accessPolicy.grants[].permissionsread | select | query | write | insert | update | delete | create (0.7.2) | admin | manage.
accessPolicy.grants[].resourcesStrings selecting the exposes in scope, e.g. JSONPath.
accessPolicy.grants[].conditionsOpen object for conditional access (IP ranges, time windows).

governance (0.7.3) fields

FieldPurpose
governance.lakeFormation.adminsIAM ARNs. Authoritative: applying it replaces the account's Lake Formation admin list, so list every admin, including the identity that applies it. The schema's description adds that applying it also clears the account's create-database and create-table default permissions, trusted resource owners and parameters, and that destroying the emitted aws_lakeformation_data_lake_settings resource empties the admin list and resets CROSS_ACCOUNT_VERSION to 1.
governance.lakeFormation.tagDefinitionsLF-tag key → allowed values.

retention (0.7.3) fields

FieldPurposeDefault (schema description)
retention.runStateHow long run state is kept.P30D
retention.runLogsHow long run logs are kept.P90D
retention.lineageHow long emitted lineage events are kept.P365D
retention.dlqHow long DLQ records are kept.P180D

All values are ISO-8601 durations. retention covers operational records, not the product's data; for data, see lifecycle.retention (and, 🧪 in 0.7.6, exposes[].lifecycle.expire).


orchestration fields

FieldPurposeRequired
orchestration.engineairflow | dagster | prefect | kubeflow | custom | none.✅
orchestration.modegenerated | manual | hybrid.
orchestration.generateOnChangeRegenerate the workflow when the contract changes.
orchestration.airflow.dagIdDAG id; required when airflow is present.
orchestration.airflow.dagConfigschedule, startDate, catchup, maxActiveRuns, …
orchestration.airflow.tasks[].taskIdTask id (lower-case).✅
orchestration.airflow.tasks[].typeprovider_action | fluid_validate | fluid_plan | fluid_apply | fluid_execute | fluid_verify | fluid_dq_check | bash | python | branch_python | sensor | email | http | snowflake_query | bigquery_query | bigquery_job | glue_job | databricks_job | custom.
orchestration.airflow.tasks[].operatorOperator name. Set it — see the note below.
orchestration.airflow.tasks[].providerFor provider_action: aws | gcp | azure | snowflake | databricks | kafka | kubernetes | local | custom.(provider_action)
orchestration.airflow.tasks[].actionFor provider_action: <service>.<action>, e.g. s3.ensure_bucket.(provider_action)
orchestration.airflow.tasks[].paramsAction parameters (open object).(provider_action)
orchestration.airflow.tasks[].dependenciesUpstream task ids.
orchestration.airflow.tasks[].buildStepRefReference into a build step.

⚠️ orchestration.tasks is not validated. orchestration is an open object up to 0.7.6, so a top-level orchestration.tasks list is accepted without any check. Its keys are implementation-defined: the reference implementation's AWS and GCP code generators read params and dependsOn there, and its Snowflake Airflow generator reads parameters.

Name each Airflow task's operator. In the 0.7.1 to 0.7.6 schemas the conditional rules for fluid_execute, bash and python tasks also match a task with no operator, so a task that has no operator and carries params must satisfy all three at once and is in practice rejected. A provider_action task always carries params, so it is always affected. A task with neither operator nor params validates.


lifecycle values

lifecycle.state ∈ preview | active | deprecated | retired — the state of the product, unrelated to preview schema versions. Other members: retention (ISO-8601 duration) and deprecationPolicy (noticePeriod, contact, replacement).


Where each field is exhaustively documented

The auto-generated reference at specs/0.7.5/fluid-spec.html renders every field's exact type, enum values and validation rules from the schema.

Edit this page on GitHub
Last Updated: 10/5/26, 9:55 AM
Contributors: fas89, Claude Opus 4.7 (1M context), Claude Opus 4.8
Prev
Schema Anatomy
Next
FLUID Specification