> **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/<version>/stream_table/<oid>/<name>`.
- 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).
