Biggest thing I shipped in June is a way to stop using us. Full collection export -- every original id, the float32 vector at its original dimension, all metadata, written to a directory of parquet parts you can read with one line of DuckDB or pandas. No size caps, no row limits, no "contact sales for exports over X."

Took most of a week because export touches everything. Storage snapshots a consistent view while writes keep landing. A job orchestrator tracks state so the request survives restarts, with a 7-day retention window before cleanup. REST got job endpoints, the SDK wraps it all in one collections.export() call, and we'll email you when it's ready instead of making you babysit a long export.

Two details I'm fond of. Every export lands with an EXPORT_README.md beside the data -- dimension, metric, row count, a read-it-back snippet -- because a parquet directory with no provenance is landfill in 6 months. And the sidecar files are underscore-prefixed, which sounds trivial until you learn parquet readers skip underscore files by convention. read_parquet('out/') gets one clean table instead of choking on the README.

An 8-scenario e2e diffs the exported parquet against what was ingested. The empty-collection case was broken the first time. Of course it was.