# Verified snapshot exports

These are derived Parquet results, not original table data files or a browser table reader.
Each export contains the complete logical rows recorded by the corresponding native
fixture verifier. The browser checks the selected export's size and SHA-256, then runs
DuckDB-Wasm SQL over that one result file. It does not discover or execute an Iceberg or
Delta table scan. Arbitrary local table metadata is not accepted by this path.

The manifest records the exact source proof hash, snapshot/version, published metadata
path, schema, logical IDs, export size and export hash. Iceberg equality/position deletes,
same-commit replacement and partition scope come from the native delete proof. Delta
vectors select surviving IDs from the original verified version-1 weather rows; the native
Spark verifier checks those values against the original rows, not just their counts.
Projection over an export cannot accidentally omit a delete key: the native query has
already produced the logical result. It also cannot demonstrate browser table pushdown.

Iceberg's original history deletes observation 3; Delta's original history deletes 13.
They are different histories. Equal row counts do not establish identical tables. The
future common-operation lab is separate. The renamed Iceberg export represents the
current metadata after the rename; historical exports retain their original field names.
Iceberg timestamps remain without a time zone. Delta exports retain UTC timestamps, using
the UTC session in which Spark verified the source values. ISO formatting of the Iceberg
proof is not a claim about real UTC measurements.

From the repository root, using the existing Node 22 / Java 17 / uv setup:

```fish
npm run verify:iceberg
npm run verify:delta
uv run explorer/scripts/tables/snapshots.py --module-output explorer/src/lib/tables/generated.json --verify
```

The first two commands validate the source proofs against native readers and original
artifacts. The export verifier regenerates expected bytes without changing checked-in
files, checks both manifest copies, reads every Parquet export with PyArrow and DuckDB,
and checks all records plus temperature-only projections. It does not change the oracle
to accommodate an export mismatch.

To regenerate after an intentional, reviewed source-proof change, omit `--verify`.
Keep source native verification and export verification together in the release gate.

For a portable export-only reproduction, download `reproduce.py` and place these public
proofs in one folder, preserving their relative paths:

- `iceberg/weather/index.json`
- `iceberg/deletes/proof.json`
- `delta/weather/index.json`
- `delta/native/proof.json`

Then run `uv run reproduce.py --source-root PATH_TO_PROOFS --output PATH_TO_EXPORTS`.
Run again with `--verify` to check the output. This verifies the conversion; rerunning the
underlying native histories additionally requires their published artifacts and recipes.
