The migration design making object storage THE deployment model: a sealed
ClusterStore interface (object_store-backed) replaces every raw-fs call in
the cluster crate; cluster.yaml gains a storage: root (s3://... — state
ledger via conditional-put CAS, cross-machine locking, catalog/sidecars/
approvals as objects, derived graph roots as engine-native S3 URIs); the
server takes --cluster s3://... and cluster deployments become stateless
(bucket, no volume). Config files stay in the working tree — Terraform's
config-local/state-remote split. Local FS is demoted, not deleted: one
interface, file:// as an explicit dev/test backend, S3-first everywhere in
docs, storage: required at the v0.9 boundary.
Grounded: conditional writes (If-None-Match and If-Match) verified live
against RustFS 1.0.0-beta.8 — both probes pass; Lance 6 already commits via
S3 conditional writes; Omnigraph::init/open accept S3 URIs today. Staged
A-D with sizes and the migrate-storage cutover tool.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>