# Publish governed meaning into dbt

> Meaning has nowhere to live in dbt. Govern it once, and let it reach the warehouse column comment.

- Page: https://coremodels.io/recipe/publication-contract
- JSON: https://coremodels.io/recipe/publication-contract.json
- Connector: [dbt](https://coremodels.io/connector/dbt) (Import)
- [Start with this recipe →](https://go.coremodels.io/app/new/dbt/publication-contract) No warehouse credential. No dbt Cloud token. Read-only.

dbt emits one artifact class — tables in one warehouse — and gives governed meaning nowhere to live: description is free text, meta is unvalidated, and accepted_values is a string list duplicated into every model that touches the field. This recipe closes that loop. Import the artifacts dbt already produces, govern meaning on top (descriptions, a named vocabulary behind an enum, an ontology term a human binds), then generate the contracts back as one property file per model, colocated beside each model's own .sql. One governed vocabulary generates accepted_values in every model that uses that field; a bound ontology term rides out both structurally (meta.coremodels.maps_to) and in the column description, which persist_docs carries into the warehouse column comment. Generation is deterministic, so a re-run with no meaning change is an empty diff. CoreModels returns files — your own PR flow lands them.

## What you do

1. Govern the meaning in the grid; generate one property file per model, colocated beside its .sql.
2. The bound term rides in the column description (the field persist_docs pushes to the warehouse comment) and in meta.
3. Every run hands you a loss report. No meaning change means no diff.

## Guides for this recipe

### Strategy

- [The Ticket Nobody Files](https://coremodels.io/connector/dbt/h2-outcomes)

### Engineering

- [Manifest In, Contracts Out: A dbt Round Trip in Five Steps](https://coremodels.io/connector/dbt/t1-quickstart)

All dbt recipes: https://coremodels.io/connector/dbt#recipes
