v0.2.61
THREE SURFACES, ONE LIVE CATALOG
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.
FIXED
- ▸A suite left running from an older dvt-core kept serving after an upgrade, so the catalog showed dbt's pristine manifest with no engine types or connections. dvt serve records each suite's version and restarts a suite of another version in one line; a changed suite_port still refuses rather than restarting.
- ▸dvt docs generate wrote DVT's theme over target/index.html, breaking dbt docs serve. dbt's index.html and manifest.json are now left byte-for-byte as dbt wrote them; DVT's theme is served from the package by dvt docs serve and by the suite.
- ▸Every DVT warning printed twice in a run: once by DVT and once by the root logger that dbt's tracking library installs at import. DVT's loggers now own their console and never re-emit through root.
- ▸DVT's federation phase stamped local time while dbt's phase stamped UTC, so one run showed two clocks three hours apart. Every DVT console line now stamps UTC, dbt's clock.
- ▸A federated landing on Snowflake warned that nearly every integer and uuid column landed with another type. Both are the loader's own crossings — integers land NUMBER(38,0), uuids land VARCHAR(36) — measured on a production estate and now documented, so they count faithful.
- ▸uv sync -U moved the sling wrapper to a version DVT had not proven (debug: sling timeout after 60s) because dvt-core declared an uncapped floor. The wrapper is pinned to the ring-proven version in dvt-core's dependencies and the release gate checks the pin; the unused --sling-version flag is gone.
- ▸uv sync removed the Oracle and Snowflake drivers dvt sync had installed, because the extras were never recorded in the project. In a uv-managed project sync now runs uv add for the adapter extras so the lock keeps them; anywhere else nothing changes.
- ▸dvt docs generate abandoned a 20-schema, 4820-table Oracle after its 120-second budget: one query per schema, each with UPPER() on the indexed owner column. The catalog now asks each connection one question for all its schemas, with names spelled the way the engine stores them.
- ▸dbt 1.12 deprecates a top-level meta: on sources and tables. Every sources.yml DVT writes now uses config.meta.connection; files written the old way still read.
- ▸A sling fatal that named its own cause — 'could not connect to database … connection refused' — was reported as a SIGSEGV crash with advice to retry. A fatal sling states itself is now reported as that fatal; only a real signal death, or an exit with not one error word, is called a crash.
- ▸dvt docs generate printed its warnings through the root logger's bare format (WARNING:dvt.cli.docs:…). It now owns its console like every other DVT verb.
ADDED
- ▸dvt docs serve: DVT's catalog alone — themed, engine-aware, live — on port 8080 like dbt's, in the foreground, stopped by Ctrl+C or dvt kill.
- ▸target/dvt_manifest.json follows dbt's manifest after every graph verb, and pinned models carry their target by name (dvt_target) so a model page shows where it lands.
Get it: pip install dvt-core==0.2.61 · wheels on PyPI for macOS (arm64 + x86_64) and Linux x86_64, Python 3.10–3.14 — the full platform matrix.