yah-mesofact-bundle 0.8.20

W272 mesofact bundle format: content-addressed manifest + digest types, and a feature-gated R2 blob store (publish / node-side materialize / LRU cache).
Documentation

The W272 mesofact bundle format — the content-addressed unit a mesofact app distributes as, plus (behind the store feature) the R2 blob store that publishes and materializes it.

A bundle is one immutable, content-addressed directory shape:

<bundle>/
  manifest.toml                     # identity + runtime selection
  app/                              # routes/config + built TS/assets
  bins/<triple>/serve               # ONLY when runtime = "self"
# manifest.toml
schema_version = 1
name    = "yah-marketing"
runtime = "mesofact/0.8.18"   # vanilla: resolve stock runtime from node cache
# runtime = "self"            # custom: bins/<triple>/serve ships in the bundle

[content]
"app/mesofact.routes.ts" = "b3f1…"   # path → blake3, one row per file

There is exactly one format; "vanilla" is the degenerate case where runtime = "mesofact/<ver>" and no bins/ are carried. Immutability is the whole coherence story: any change produces a new [BundleManifest::digest], "update" is publish-new-digest + drain-old, and rollback is a pointer flip.

This crate is deliberately light: the default feature set is serde + blake3

  • toml only, so the mesofact-build subcamp (R599-F2, a separate Cargo workspace) can link it to emit manifests without dragging the object-store / reqwest stack across the boundary. The store feature adds that surface for the cloud publish path (R599) and kamaji node materialize (R599-F4).

Home of R599-F1 (the W272 bundle format + store) — the canonical @yah: ticket annotation lives in oss/yubaba/crates/cloud/src/release_manifest.rs to keep one block per ID; see W272 for the design.