Operate & govern

Templates that don't surprise you.

A template captures a starting shape — entities, relations, providers, federation, surfaces, agents. Adopting a template is an explicit, audited, lineage-tracked operation. Vadyl computes the diff, runs the DDL inside a transaction, records a migration journal entry with Source = TemplateAdoption, appends a TemplateLineageRecord, bumps the runtime publication. Templates never auto-upgrade — version adoption is always explicit.

The adoption flow

Diff. Preview. Adopt. All audited.

Templates as projects

A template is just a Vadyl project published in a starting shape — its own branchable history, its own version lineage. No special template type. Same canonical state.

Diff-driven adoption

ITemplateAdoptionService loads the template, deserializes the schema, computes the diff against the consumer project via SchemaDiffEngine. Preview through PreviewAsync — no DDL runs.

Transactional execution

DDL runs in one transaction. Migration journal entry (Source = TemplateAdoption), lineage record append, runtime publication bump — all inside a separate atomic transaction. TOCTOU-safe.

TemplateLineageRecord

Adoption history separate from the project's migration journal. Which template? Which version? When adopted? By whom? Every adoption gets a row, never edited, always queryable.

Never auto-upgrade

Templates ship new versions; adopting them is explicit. Vadyl will not silently move you to a newer template version. Adoption always crosses an audit boundary.

Branchable + sandbox-able

Adopt a template into a sandbox first. Validate. Run agents over it. Cut over to production when green. Template adoption is a manifest domain like every other branching domain.

Explicit
Always

No auto-upgrade

Diff-driven
Preview-then-adopt

See changes before they run

Lineage-tracked
Per adoption

Audit the history

Transactional
Adoption

DDL + journal + bump atomic

Start from a known shape. Never get surprised by it.

Templates are sandbox-able, branchable, audited. Adoption is always explicit and always reversible through the same branching DAG that holds your schema.