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.
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.
No auto-upgrade
See changes before they run
Audit the history
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.