> **Plain-language companion:** [v0.67.0.md](v0.67.0.md) ## v0.67.0 — DuckLake Phase 3b: View Registration, Provenance & Ecosystem **Status: Released.** --- ### Implementation Status | ID | Feature | Status | |----|---------|--------| | F-6 | DuckLake view registration | ✅ Done | | INT-11 | Snapshot provenance & audit trails | ✅ Done | | Tutorial 3 | The Modern Data Stack in One Box | ✅ Done | | Tutorial 4 | Streaming PostgreSQL to a Data Lake without Kafka | ✅ Done | | INT-10 | pg-tide DuckLake pipeline tutorial | ✅ Done | | Demo C | Multi-engine leaderboard | ✅ Done | | Demo E | OLTP-to-lake loop | ✅ Done | --- ### Correctness - **F-6** upserts a `ducklake_view` row on `create_stream_table` and `alter_stream_table` when `sink='ducklake'`; removes it on `drop_stream_table` or when sink is disabled. - **INT-11** populates `ducklake_snapshot.created_by` with `pg_trickle//stream_table//`. - When `ducklake_view` is absent (DuckLake not installed), all F-6 operations are silently skipped — no error propagation. ### Stability - F-6 and INT-11 operations are best-effort: failures are logged as warnings and never block the next scheduled refresh. - `pgt_ducklake_provenance` inserts never fail the refresh cycle even under concurrent load. ### Performance - `ducklake_view_table_exists()` uses `information_schema.tables` with indexed lookup; overhead is one SPI round-trip per create/alter/drop call. - Provenance inserts are a single `INSERT` with no aggregation or join. ### Scalability No change to the refresh hot path. ### Ease of Use Three new tutorials and two demos make Phase 3 accessible to data engineers with no pg_trickle background. ### Test Coverage - `test_ducklake_provenance_table_exists` — schema presence - `test_ducklake_provenance_table_has_required_columns` — column completeness - `test_ducklake_provenance_row_insert_and_query` — basic CRUD - `test_ducklake_provenance_multiple_rows_per_stream_table` — multi-cycle accumulation - `test_ducklake_view_not_created_by_pgtrickle` — ownership boundary - `test_ducklake_view_registration_with_stub_table` — create + drop lifecycle - `test_ducklake_view_deregistered_when_sink_disabled` — alter sink=none lifecycle --- ### Exit Criteria (all satisfied) - [x] View registration tested: create and drop with `sink='ducklake'` correctly manages `ducklake_view` entry. - [x] Provenance table is populated; multiple consecutive rows per stream table are stored correctly. - [x] Tutorials 3 and 4 are complete with runnable SQL examples. - [x] Both demos have `docker-compose.yml`, init SQL, and generator scripts. - [x] `just lint` passes with zero warnings. - [x] Integration tests pass (ducklake_integration_tests.rs).