v0.1.7 — layered data model + test resilience
Tycoon v0.1.7
Released: 2026-05-25
Headline
v0.1.7 is the layered-architecture release. Tycoon learns the
canonical analytics-warehouse mental model — sources → staging →
intermediate → marts — and surfaces it consistently across the CLI.
The themes worth opening with:
-
Layer-aware data model. A new
tycoon.layersmodule classifies
every table tycoon knows about (raw schemas from dlt + Fivetran,
dbt models from the manifest) into a typedLayerenum. dbt-side
classification flows from the manifest using folder convention
(models/staging/,models/intermediate/,models/marts/) with
per-modelmeta.tycoon_layerand per-folder+meta.tycoon_layer
overrides. Ingestion-side classification flows from the existing
sources:block (dlt) and the Fivetran Metadata API. No new
tycoon.ymlblock — classification authority lives in the tools
that own the objects. -
tycoon data statusbecomes the layered view. The Fivetran and
dlt panels collapse into a unified Sources layer, joined by
Staging, Intermediate, and Marts panels. Projects without
dbt still see all four panels — the non-source ones show empty
states with active hints (no dbt project — set up via tycoon register dbt).
One command, one mental model. -
Knock-on layer awareness.
tycoon semantics scaffoldswitches
from prefix-pattern mart matching totycoon.layers.list_marts().
tycoon doctoradds a "every source has a staging model" health
check.tycoon data historylearns to filter by layer. -
Test resilience second wave. Closes #39 (umbrella) and
#41 (snapshot harness for Rich-rendered CLI output). Pairs
with #44 — non-interactive flags ontycoon data sources add
unblock the README PokéAPI quickstart from being run as an online
recipe doctest.
Acceptance criteria — see #30
Migration notes
No breaking changes. Every behaviour change is either additive or has
a graceful fallback.
tycoon data status
The output shape changed. Old (v0.1.6):
Sources
┃ Name ┃ Type ┃ Last loaded ┃ Runs ┃
│ pokeapi │ rest_api │ 12m ago │ 3 │
New (v0.1.7): four panels — Sources, Staging, Intermediate,
Marts. The Sources panel adds a Vendor column (dlt /
fivetran) and unifies what were previously two separate panels.
Projects without dbt still see all four panels with empty-state
hints pointing at tycoon register dbt.
If you parsed the old text output with grep or awk, those
patterns will need updating. The data underneath (raw.duckdb and
metadata.duckdb) is unchanged — tycoon data history and direct
SQL queries against the metadata DB work the same as before.
tycoon semantics scaffold
Mart discovery changed from prefix matching (mart_* / fct_* /
dim_* / obt_*) to dbt manifest classification. No CLI change;
the same tycoon semantics scaffold invocation produces the same
output file at the same path.
The change is visible only in edge cases:
- Tables with mart-shaped names in
models/staging/(e.g.
fct_legacyyou forgot to rename) are no longer scaffolded as
marts. They classify as staging via the manifest. - Tables with non-conventional names in
models/marts/(e.g.
orders_summary) are now scaffolded as marts. Previously they
were invisible. - When no dbt manifest exists yet (
dbt compilenever run), the
scaffolder falls back to prefix matching with a clear warning so
unmigrated projects keep working.
To override the folder convention (e.g. models/published/ instead
of models/marts/), add +meta.tycoon_layer: mart to the relevant
models: block in dbt_project.yml. See layered architecture
recipe.
tycoon doctor
Adds one new non-fatal row (layer coverage). Skips silently for
transformation: none projects, so v0.1.6 users see no behaviour
change.
Auto-scaffolded observability models
If you've run tycoon data observability scaffold (or accepted the
auto-scaffold during init), the existing stg_tycoon__* and
dim_runs models now carry a tycoon dbt tag. Existing dbt runs
keep working; the only difference is you can now skip them with
dbt run --exclude tag:tycoon when iterating on business logic.
tycoon data sources add
The interactive flow is unchanged. New optional flags
(--no-prompt, --name, --schema, --base-url, --resources,
--connection-string, --path, --config, --force) let you
skip prompts entirely — designed for CI / scripted bootstrap.
Out of scope (deferred)
- Visual lineage rendering. Deferred to a later issue once the
layered data model is stable. - Cross-project source registry. Single project for v1.
- Multi-warehouse classification. Single warehouse for v1.
- Layer-granular backup config.
backup.layers: [marts, intermediate]
deferred to v0.1.8 (#31) — v0.1.7 ships with the simpler
backup.skip_raw: boolshape.