Command line interface for accessing the Open Web Index shards and slices.

feat(summarize): observed vs declared, provenance, and no more write churn master

M0-M2 of the summarize/integrity plan, in the order the plan set. Additive throughout: stats.json keeps its shape and every current reader is unaffected. M0 provenance -- computed_at and owilix_version. stats.json had none; the fields the plan credited it with are remote doctor output from another command. Pulled ahead of the index because rows that cannot say when they were computed reintroduce the ambiguity below at a larger scale. M0 honest empties -- parquet_files_found and materialised separate "measured, empty" from "nothing measured". The generator returned an identical {"values": {}} for both, which is the same mistake that told visitors 586 collections were mirrored when 4 held data. M1 observed vs declared -- declared from the sidecar, observed from the store. fileCount/objectCount/size describe the *upstream* dataset and survive a transfer that failed after the sidecar was written, so a dataset holding nothing looked identical to one that completed. observed reports 0 rather than null when the listing succeeded: zero is a measurement, and only declared can be unknown. M2 content-addressed writes -- --force rewrote every README and stats object with byte-identical content. That is not wasted I/O alone: a rewritten object invalidates a long-lived fsspec dircache ETag, and until v5.9.0 a stale ETag was enough to turn a listing into an empty success, so the tool describing the mirror could break reading it. stats.json is compared ignoring computed_at and nothing else, or the timestamp would defeat the fix; an unreadable existing object is rewritten rather than assumed unchanged. Verified on the fixture used to schedule the plan: the dataset declaring 567 files over an empty directory now records observed 0 and materialised false, and a second --force pass performs zero writes where it previously rewrote everything. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017phbSd6D8u4iEQsCAPEw6s