Skip to content

Template context reference

Every template DeltaVault renders is handed one context object. This reference documents that contract: which top-level variables (roots) each template family receives, every field on every root, and when a conditional field is present. Use it to write your own templates against the same data the built-in templates read.

Rendering is the same everywhere it happens: a project Build writing artifacts, the Preview tab on a catalog table, and the template playground all assemble a context the same way. Three steps decide what a template sees. One example end to end: the path databricks/staging/sql/combined_load.jinja names the staging-family contract, the family names its builder, and the builder assembles this, source, sources, target, and the rest of the declared roots.

The path names the family. Every template path resolves to exactly one context family. A family is the contract: it declares which roots a template of that shape is handed at render time, and which preview sources are honest for it. Templates in the same family always receive the same roots, whatever platform folder they live in.

The family names the builder. Each family maps to one context builder, the code that reads your catalog (tables, columns, connections, layers, naming patterns) and assembles the declared roots. One family, one builder: there is exactly one answer to “what does this table’s context look like for this template”.

The builder reports gaps instead of guessing. When data a root needs is missing (an unlinked source, a missing system-column role), the builder either raises the gap as an error (a Build) or renders anyway and reports the gap as a diagnostic (a preview). It never silently invents values.

Resolution runs in two steps, exact match first.

1. Exact path. Every built-in template path is listed in the engine’s registry and wins outright.

2. Folder prefix, where a rule is registered. A template you author into a folder carrying a prefix rule inherits that folder’s family: drop a fork into snowflake/staging/ and it is a staging-family template. The longest matching prefix wins. A template that matches neither step resolves to no family and previews with an explicit unknown-family diagnostic instead of a guessed context.

A rule is registered only for folders that host exactly one family, but the converse does not hold: hosting one family does not earn a folder a rule. Two kinds of folder have none. Folders that host more than one family, such as databricks/landing/ and fabric/staging/notebook/, cannot have one. And databricks/orchestration/ deliberately does not have one even though control.jinja is the only template in it today, so that a later stray dropped into that folder gets the unknown-family diagnostic rather than silently inheriting the control notebook’s contract.

Folder prefixFamily
_base/, _helpers/helper
adf/_platform/datasets/adf-dataset
adf/_platform/linked_services/adf-linked-service
adf/_platform/triggers/adf-trigger
adf/orchestration/adf-orchestration
adf/staging/adf-pipeline
databricks/_platform/resources/pieces/bundle-job-task
databricks/ci/ci-workflow
databricks/deploy/ddl-runner
databricks/landing/pieces/ingest-piece
databricks/persistent_staging/step-notebook
databricks/staging/staging-family
databricks/tests/data-tests
fabric/_platform/fabric-platform-file
fabric/orchestration/workflow
fabric/staging/warehouse/staging-family
snowflake/orchestration/workflow
snowflake/persistent_staging/staging-family
snowflake/staging/staging-family

Every family, its roots, and how it previews. A root marked conditional is present only under that family’s presence rule: read the family’s section for it. “Sample” preview means the playground renders a curated sample context; “live” means it assembles the real context from a subject you pick, and the kind in parentheses is what you pick.

A family name that links has a field-by-field section in this reference. A name that does not is indexed here with its real roots and preview kind, and its detailed section is still to be written.

FamilyLayerProvided rootsPreview
ingest-pipelineLandingworkflow, this, connection, source, sources, ingest, dvlive (landing table) + sample
ingest-notebookLandingthis, connection, source, sources, environment, extract, dvlive (landing table) + sample
ingest-workflowLandingworkflow, dvlive (workflow) + sample
ingest-pieceLandingthis, source, sources, connection, environment, extract, ingest, dvlive (landing table) + sample
lakeflow-entryLandingthis, source, sources, connectionlive (landing table) + sample
staging-familyStagingthis, source, target, refs, extraction, behavior, dvlive (staging table) + sample
step-notebookStagingworkflow, step, source, sources, this, methodologylive (table) + sample
fabric-with-loggingStagingthis, source, sources, pipelinelive (staging notebook) + sample
vault-entityData Vaultthis, cdc, source, sources, hubHashKeys, dependentChildColumns, ghostlive (table) + sample
vault-controlData Vaultsource, tiers, threadCountlive (table) + sample
vault-load-keyedData VaultkindLabel, this, keyColumn, source, sources, ghost, ghostHashKeyColumns, sequenceColumn, recordSourceColumnlive (table) + sample
vault-load-versionedData VaultkindLabel, this, source, sources, keyColumns, sequenceColumnlive (table) + sample
vault-load-referenceData Vaultthis, codeColumn, source, sourceslive (table) + sample
vault-load-bridgeData Vaultthis, bridgelive (table) + sample
vault-load-pitData Vaultthis, pitlive (table) + sample
vault-combined-loadData Vaultsource, tiers, load, behaviorlive (table) + sample
vault-piece-hubData Vaultobjectlive (table) + sample
vault-piece-linkData Vaultobjectlive (table) + sample
vault-piece-satelliteData Vaultobjectlive (table) + sample
vault-piece-link-satelliteData Vaultobjectlive (table) + sample
mart-dimensionData Martthis, cdc, source, sourceslive (table) + sample
mart-factData Martthis, excludedColNames, dimRefs, source, sourceslive (table) + sample
viewViewsviewlive (table) + sample
derived-history-viewViewsview, columns, base, partition_keys, effective_from, effective_to, default_end_datelive (table) + sample
ddl-tableShared DDLtable, options, buildlive (any table) + sample
schema-ddlShared DDLschemalive (table) + sample
data-testsTestsworkflow, step, source, sources, this, methodology, tests, connectionlive (test) + sample
workflowOrchestrationworkflowlive (workflow) + sample
workflow-rollupOrchestrationrollup, dvlive (workflow) + sample
adf-orchestrationOrchestrationpipeline, workflowsample
adf-pipelineOrchestrationpipeline, table, connectionlive (table) + sample
adf-datasetOrchestrationdatasetlive (table) + sample
adf-linked-serviceOrchestrationconnectionlive (connection) + sample
adf-triggerOrchestrationtriggersample
bundle-rootPlatformproject, databricksTargets, build, dvsample
bundle-pipelinesPlatformlandingPipelines, target, tables, connections, project, dv, ingestionRuntimes, vaultTableCountsample
bundle-lakeflowPlatformworkflow, dvsample
bundle-workflowsPlatformdvlive (workflow) + live (project) + sample
bundle-workflow-pipelinePlatformworkflowsample
bundle-job-taskPlatformtasksample
ci-workflowPlatformbundlePath, targetEnvironmentsample
ddl-runnerPlatformproject, catalogs, schemas, ddlStatements, dvsample
fabric-platform-filePlatformartifactType, displayName, logicalIdsample
helperPlatform(none)never previewed

Several families declare a root named dv. It is the linked model: the project, its workflows, its tables and the edges between them, reachable as one object graph rather than as the flat roots beside it. A body that has to join across two of those, a task to the table it loads for example, walks dv instead of asking for another flat root. Where a linked node points back at its parent, the back edge is a followable reference string rather than a repeated object, so the graph can be read in the Context tab without looping.

vault-combined-load and the four vault-piece-* families render the combined load, which emits one artifact per source instead of one per vault object. The families and their templates are real and you can preview them today. The generated artifact is not yet routed into a build, so nothing you change in them reaches a deployed pipeline until that wiring ships.

The functional layer of the table you are generating for decides which families apply. Layer-filtered preview kinds only offer tables from the matching layers; a table with no stamped layer stays visible under every filter.

LayerFamilies that write itTable picker filter
Landingingest-pipeline, ingest-notebook, ingest-workflow, ingest-piece, lakeflow-entry, ddl-tablelanding tables only
Stagingstaging-family, fabric-with-logging, ddl-tablestaging + persistent staging
Persistent stagingstaging-family, step-notebook, ddl-tablestaging + persistent staging
Data Vaultvault-entity, vault-control, vault-load-* (5 load families), vault-combined-load, vault-piece-* (4 piece families), ddl-table, view, derived-history-viewunfiltered (generic table kind)
Data Martmart-dimension, mart-fact, view, ddl-tableunfiltered (generic table kind)
Any (orchestration)workflow, workflow-rollup, adf-orchestration, data-testsnot table-grained
Project-widebundle-*, ci-workflow, ddl-runner, fabric-platform-filenot table-grained

Three conventions repeat across every family. Conditional means absent, not empty: when a rule says a root or field is conditional, the builder omits it entirely, so a template guard takes the same branch a real Build would. Counts accompany arrays: wherever a template needs to branch on emptiness, the context carries a precomputed count, because an empty array is truthy in the template language. Serialized companions carry the finished byte: a field with a Literal, Escaped, or Json suffix is the same value already quoted for the document it lands in (a JSON body, a Python formatted string, a SQL literal); emit it as is, never re-quote it.