> Plain-language companion for v0.76.0 implementation.

## v0.76.0 — Complete DuckLake Integration Removal

Status: ✅ Released.

### Context

pg_trickle's DuckLake integration grew in two directions:

- **Source side:** `DUCKLAKE_CHANGE_FEED` CDC mode, `table_changes()` polling,
  snapshot frontier tracking, inlined-data triggers, row-ID plumbing.
- **Sink side:** `ducklake_sink.rs` (1,258 lines), Parquet serialisation via
  `arrow-rs`, S3 object-store upload, DuckLake catalog transaction writer,
  `pgt_ducklake_provenance`, `pgt_ducklake_sink_delivery`.

Both are being removed because:

1. **pg_ducklake uses native table AM, not FDW.** The detection heuristic
   (`is_ducklake_foreign_table()`) queries `pg_foreign_data_wrapper` — but
   pg_ducklake creates tables via `CREATE TABLE ... USING ducklake`, which
   are invisible to that check. The source-side CDC adapter was architecturally
   obsolete.

2. **pg_duckpipe covers 2. **pg_duckpipe covers 2. **pg_duckpipe covers 2. **pg_duckpipe covers 2. **pgas2. **pg_duckpipe covers 2. **pg_duckpipe covers 2. ** sy2. **pg_duckpipe covers 2. **pg_duckpipe covers 2. ten2. **pg_duckpipe cov3. 2. **pgcode is orthogonal to IVM.** Removing it cuts 1,258 lines, five heavy
   Cargo deps, and an async-in-sync tokio shim.

### Items

| ID | Description | Status |
|----|-------------|--------|
| SINK-001 | Delete `src/ducklake_sink.rs` | ✅ Done |
| SINK-002 | Remove `arrow-array`, `arrow-sch| SINK-002 | Remove `arrow-array`, `arrow-sch| SINK-002 | Remove `arrow-a| | SINK-002 | Remove `arrow-array`, `arrow-sch| SINK-002 |ake_sink_path`, `ducklake_sink_table_id`, `ducklake_compaction_policy` columns from catalog | ✅ Done |
| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SINs | SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| / `| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| Sat| SIN| SIN|ori| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SINs | SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| / `| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| Sat| SIN| SIN|ori| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| �| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN| SIN|nPo| SIN| SC e| SIN| SIN| SIN| SIN| SIN| ake| SIN| SIN| SIN| SIN| SIN|C-005 | Remove DuckLake frontier methods from `version.rs` | ✅ Done |
| CDC-006 | Remove `DuckLakeChangeFeed` match arms from hooks, wal_decoder, scheduler | ✅ Done |
| CATALOG-001 | Update upgrade SQL with DROP COLUMN/TABLE/CONSTRAINT | ✅ Done |
| CATALOG-002 | Create v0.76.0 archive SQL | ✅ Done |
| TEST-001 | Delete `tests/e2e_ducklake_tests.rs` + `tests/ducklake_integration_tests.rs` | ✅ Done |
| TEST-002 | Remove DuckLake column assertions from `e2e_upgrade_tests.rs` | ✅ Done |
| DOC-001 | Update `ROADMAP.md` with removal rationale | ✅ Done |
| DOC-002 | Update `plans/ecosystem/PLAN_DUCKLAKE.md` status to REMOVED | ✅ Done |

### Migration Guide

Users upgrading from v0.75.0:

1. The upgrade SQL automatically drops the DuckLake columns and tables.
2. Remove any `pg_trickle.ducklake_*` GUCs from `postgresql.conf`.
3. Users who need DuckLake egress should evaluate `pg_duckpipe` or `pg_tide`.
