yah-object-store 0.8.29

Object-store trait + InMemory impl. R2ObjectStore lives here once F2 lands; today scryer + cloud reconciler consume it.
Documentation

Object-store trait (put/get/head/delete/list_prefix + conditional put_if) shared by scryer's long-tier Parquet shard storage, the cloud reconciler's R2 mirror publish, turso-backup's WAL→R2 sink, and the yah cloud bucket CLI + data-tab bucket viewer.

Lifted from scryer::long_tier in R498-F1. R2ObjectStore landed in F2. put_if / etag (linearizable compare-and-swap on a single object) added for the W243 global tenant→cell pointer — see .yah/docs/working/ W243-multi-cell-tenant-mobility.md.

@yah:ticket(R498-F1, "lift ObjectStore trait + InMemoryObjectStore into crates/yah/object-store/") @yah:at(2026-06-09T03:37:49Z) @yah:status(review) @yah:parent(R498) @yah:handoff("Lifted ObjectStore trait + InMemoryObjectStore from scryer::long_tier into new crates/yah/object-store/ crate (yah-object-store package, yah_object_store lib). Trait gained head() with default impl over get(), and delete() (idempotent). Generic Error enum (NotFound/Io/Auth/Backend) replaces the old LongTierError::ObjectStore(String) error path. scryer/long_tier.rs now does pub use yah_object_store::{Error as ObjectStoreError, InMemoryObjectStore, ObjectStore} — every existing call site keeps working unchanged. LongTierError gained #[from] ObjectStoreError variant. cargo check --workspace exit 0; 5/5 object-store unit tests pass. NOTE: scryer's full lib test target was already broken on main (pre-existing missing-.await calls in adapters/journald.rs, adapters/containerd_logs.rs, service.rs — touching 20+ sites) — those are NOT introduced by F1; isolated long_tier tests cannot be run until that gets cleaned up separately.")