ADR: DuckLake Maturity, Publishability, and Compaction Bias
Status
Accepted (2026-07-30). Each decision below is independently reversible and states what evidence would reverse it.
Updated 2026-07-30: DuckLake is now beta. Every criterion of the beta exit
decision below is met: TPC-H SF=1 runs on all four deployment modes each passed data validation, and
support_status in platform_registry.py was changed to beta.
Those runs also tested the reproducibility question the remote-backed results
decision left open. That decision stands. Remote-backed modes were not materially
irreproducible: their run-to-run coefficient of variation was 2-9%, lower
than the 13% seen in local mode. The measurements refute “remote-backed is
irreproducible” but are not precise enough to publish as reproducibility
characteristics.
Date
2026-07-30
Context
The DuckLake adapter shipped as support_status: experimental, which left
three policy questions open:
- What concretely moves DuckLake from
experimentaltobeta? - May results from a remote-backed DuckLake run (PostgreSQL catalog
and/or S3
DATA_PATH) be published, and are they ranking-eligible? - Does the absence of DuckLake compaction/inlining bias cross-engine comparisons, and should that be instrumented or documented?
Nothing in the repository answered any of them. support_status values are
enumerated in
new-platform-acceptance-checklist.md
but no transition criteria exist between them; the provenance vocabulary in
benchbox/core/results/provenance.py classifies results by who ran them, not
by what infrastructure produced them.
Decision: experimental to beta exit criterion
DuckLake moves to beta when all of the following hold, and not before:
- The non-live classes of
tests/integration/test_ducklake_integration.pyrun in a lane on every PR. (Met.) - Both live classes - PostgreSQL catalog and S3
DATA_PATH- have been run green against real infrastructure at least once per minor release, with the run recorded. (First met 2026-07-30: PostgreSQL 18.4 and a real S3 bucket.) - A full TPC-H SF>=1 run completes on each of the four deployment modes with results validated by the standard correctness gate - not just the SF=0.01 smoke coverage that exists today. (Met as of 2026-07-30.)
- Catalog reuse and
--forceare verified against a server-side catalog, not only a local file. (Met 2026-07-30; that verification found and fixed a real defect where--forceleft orphaned Parquet.) - No known-wrong-results defect is open against the adapter.
Basis. Criteria 1-2 and 4 encode failure modes the adapter actually had: coverage that existed but ran nowhere, and reuse/force semantics that were never exercised against the backend they were written for. Criterion 3 was closed by the recorded SF=1 runs across all four deployment modes.
What would reverse this. If beta acquires a repo-wide definition that
conflicts with these, that definition wins and this section should be deleted
rather than reconciled.
Decision: remote-backed results are publishable, and ranking-eligible, but must record their backing
Runs with a PostgreSQL catalog and/or S3 DATA_PATH are publishable under
the same trust labels as any other run, and are not demoted in ranking.
They must, however, carry their catalog backend and storage location in result metadata, and comparisons must not silently mix backings.
Basis. The existing model in provenance.py maps source to trust label
(internal -> maintainer-run -> public-curated -> ranking-eligible). It
deliberately says nothing about infrastructure, and inventing an
infrastructure-based demotion here would fork that model for one platform. The
honest framing is that DuckLake’s catalog backend and storage location are
part of the configuration under test, exactly like a tuning profile or a
scale factor - not a defect in the run.
The real hazard is not publication, it is comparison: a DuckLake-on-S3 number partly measures object-store latency, so ranking it against DuckLake-on-local- disk as though they were the same system is the error. That is a comparison-grouping concern, addressed by recording the backing, not by suppressing the result.
What would reverse this. Evidence that remote-backed numbers are materially
irreproducible run-to-run (rather than merely slower) would justify demoting
them to browse-only. The SF=1 runs required by beta criterion 3 measured this
and did not find it (see Status).
Decision: document the compaction bias; do not instrument yet
BenchBox never invokes DuckLake’s compaction or inlining maintenance
(ducklake_merge_adjacent_files, inlining) - verified by inspection of the
adapter and core. Measured behaviour: 5 separate INSERTs produce 5 Parquet
files, and nothing merges them.
The bias is therefore real, and its direction is against DuckLake: scans hit more, smaller files than a compacted deployment would, so BenchBox’s DuckLake numbers are a floor, not a ceiling. This is documented in the platform guide rather than instrumented.
Basis. Instrumenting means either invoking compaction (changing what is measured, and requiring a policy on whether maintenance time counts toward the run) or reporting file-count/size distributions per run (new result-schema surface). Both are larger than the ambiguity they resolve, and the ambiguity is one-directional - a reader who knows DuckLake numbers are un-compacted can reason about the gap, whereas a reader who does not know may over-read a DuckLake loss.
Load path shape matters here: bulk loading via few large inserts produces few large files and little bias, whereas row-wise loading produces many small ones. Documenting the mechanism lets a reader assess their own configuration.
What would reverse this. A measured cross-engine comparison where DuckLake’s un-compacted file layout accounts for a decisive share of the gap would justify either invoking compaction as part of the load phase or reporting the file layout in results metadata.
Consequences
- The beta criteria are met; DuckLake is now
beta. Future demotion would require new evidence against the reversal conditions above. - Remote-backed publication requires that catalog backend and storage location
reach result metadata. The registry models these as independent axes (four
deployment modes), and each DuckLake result records both in
platform_storage. Comparisons must group by them. - The compaction decision adds a caveat to the DuckLake platform guide. Any future published DuckLake comparison should link it.