Mid-June was a run of ingest bugs with the same lesson: real files are weirder than the fixtures you wrote to test them.
The best one: a CSV with vectors wide enough that a single row overflowed the schema detector's read buffer. The detector sampled the front of the file, never saw a complete row, and shrugged instead of confirming the schema — so the upload sat there waiting for a human to describe a file we should have understood. The fix taught the taster to notice "this row is bigger than my buffer" and size accordingly, and wide-vector CSVs now auto-confirm like everything else. Same sweep taught the detector about .npy and .npz, which had been quietly falling into describe-it-yourself land too.
The subtlest one: tiny collections that never became queryable. We buffer very small inline writes before flushing them to queryable storage, and a collection that stopped below the buffer threshold — say, ten rows, then silence — just stayed buffered. Forever. Upload succeeded, count said ten, queries said nothing. An idle-flush now sweeps sub-threshold collections out of the dead zone, and there's a regression test that uploads ten rows and insists on getting them back.
And the overdue one: metadata values can be lists now, round-tripping through every write path — bulk files and inline upserts both. Tags were always the obvious use; there was no principled reason a value had to be scalar, just code paths that assumed it.
None of these were exotic. All of them were sitting in the gap between "works on the files we generate" and "works on the files people actually have." The follow-up — wiring the full format matrix into CI so that gap stays closed — got its own post.
