RELEASES

Every version, every change — the same transparency we apply to the engine. pip install --upgrade dvt-core gets you the latest.

v0.2.61THREE SURFACES, ONE LIVE CATALOG2026-09-19

Everything in this release came out of the founder running 0.2.60 on his own project the day it shipped. The catalog first: dbt docs serve hosts dbt's catalog exactly as it always has, because DVT no longer writes anything over dbt's index.html or manifest.json; dvt docs serve is back and hosts DVT's catalog alone — the themed one, with the engine under every node, the target and engine of every model on a custom target, and the source, database, schema, table and connection of every source; and the suite's /catalog is the same catalog. Both DVT fronts are live the way dbt's is: the manifest they serve is DVT's view of dbt's current manifest, built on request, so a refresh after any run or parse shows the new graph. dvt serve now knows which dvt-core a running suite is, and restarts one left over from another version instead of quietly reusing it. The run log reads as one log: every DVT line on dbt's clock, every warning printed once. Snowflake's two loader crossings — integers landing NUMBER(38,0), uuids landing VARCHAR(36) — are measured and documented, so a Snowflake landing no longer warns on every model. uv projects keep their drivers, because sync records the adapter extras where uv can see them; the sling wrapper is pinned in dvt-core's own dependencies so no upgrade can drift it; the catalog asks each connection one question for all its schemas instead of one per schema; and sources.yml files DVT writes put meta where dbt 1.12 wants it.

v0.2.59ONE NAME, ONE TYPE2026-09-16

Two classes of drift closed by the same method — measure the whole matrix, then decide once in one place — plus the flip's one lane and the federated snapshot. Casing first: six rulings had fixed identifier case one hop at a time, each a fold predicted from a table meeting a real engine. A casing gauntlet measured an identifier corpus across every live engine, every way a relation is created and read (232 cells), and three laws replaced the predictions. Then types, the same way: a column crosses type systems twice on the federation path and every door re-inferred it — decimals widening to (24,6), timestamps with time zone landing as plain datetimes, Oracle booleans landing as strings, watermarks losing their microseconds. One type home now carries every column as Arrow, pins every column DVT can type on every engine, pins declared shapes on extraction, renders literals with precision, and documents the crossings an engine forces instead of fighting them. The metadata store gained DVT's own world: what every lane declared for every landed column and what the engine's catalog reports, verified after each load and exported as Landed and Mapping sheets. The flip has exactly one translator now — the AI lane, machine-judged, engine-compiled; the deterministic transpiler is gone. f_snapshot joins f_table and f_incremental as the federated type-2 snapshot. And the ring that judges all of it grew: client-owned fixtures, a source that moves between builds, hooks audited, landed types verified on every hop.