Release-Blocking Decisions#

Summary of the decisions that shape the first release.

Title

Status

Release impact

Resolver registration mode

Accepted

Blocking. Registers as a URI resolver; local paths delegate to OpenUSD’s default filesystem behavior.

ovstorage bridge / configuration contract

Accepted

Blocking. Host-provided bridge factory with explicit isolation key and trace sink; no process-global raw handle in the product API.

OpenUSD flavor and ABI target

Accepted

Blocking. First plugin target is Kit OpenUSD 25.11.kit.4-gl.21081; source core stays portable, plugin binaries are flavor-specific.

ovstorage release dependency

Accepted

Final release requires ovstorage 0.3.0. Candidates record the exact tested revision; a development revision is provisional until qualification against the released tag. CMake also checks the required API surface.

Native s3:// release posture

Accepted with live-conformance gate

Blocking. Bridge, CLI, and plugInfo uriSchemes ship native s3://; the 0.1 read/composition claim is qualified against AWS S3 and depends on the env-var-gated live_s3_stage smoke passing there. MinIO, R2, B2, and custom endpoint profiles remain inherited ovstorage capabilities unless separately qualified.

Legacy resolver coexistence

Accepted

Blocking. One owner per URI scheme; build registration, runtime enablement and ovstorage routing must agree. Duplicate ownership has no supported precedence contract.

Search-path semantics

Accepted

Blocking. Explicit remote roots only; bare root assets remain local/default-owned; relative dependencies from explicit remote layers anchor to the remote layer.

CLI name and command set

Accepted

Non-blocking for the resolver runtime; blocking if the CLI ships. Binary name is ovstorage-usd-resolver; commands are doctor, resolve, materialize, trace, put, and benchmark; JSON output at schema version 1.

Python runtime scope

Accepted, amended September 22

Optional local Python package. Explicit StackConfig construction and thread-scoped binding through the ctypes bootstrap; no pxr bindings or second USD runtime.

Platform matrix

Accepted, amended September 22

SDK-backed claims require full-stack evidence on the selected Linux x86_64/aarch64 or Windows x86_64 target; macOS arm64 remains core/CLI source portability only. Local wheel tests do not imply publication.

Distribution channels

Accepted

Source consumption; no resolver wheels are published to PyPI or elsewhere for this release. ovstorage publishes its own packages. Local native installation does not establish an archive/Conan delivery commitment.

_Resolve existence check

Accepted, amended

Blocking. Scheme-only resolution remains the generic default. ResolverOptions::resolveVerifiesExistence adds bounded, context-owned legacy-compatible provider probing for hosts that require Resolve() to prove existence. Only authoritative NotFound returns empty, and _ResolveForNewAsset() never probes.

Context-creation family

Accepted

Blocking. _CreateContextFromString populates when a runtime is registered; _CreateDefaultContext is empty when no runtime is registered. The portable ergonomic path registers a process-wide runtime with setDefaultResolverRuntime, then creates a thread-local ScopedDefaultContext on every thread that performs OpenUSD work.

_GetModificationTimestamp failure sentinel

Accepted

Non-blocking. Returns invalid ArTimestamp{} on every failure path, matching OpenUSD’s documented convention.

Write support scope

Accepted, shipped in 0.1

Blocking. Writes ship for routes whose configured ovstorage backend advertises write support; writability is a backend/capability property, not a URI-scheme property. Native s3:// is the first live target.

Write concurrency mode

Accepted, shipped in 0.1

Blocking. Per-write precondition on StorageWriteRequest::precondition: Overwrite (last-writer-wins, the default), Fail (create-only), and MatchEtag(etag) (strict IfMatch). The CLI put command exposes --overwrite (Overwrite) and --if-none-match (Fail). An existing OpenUSD Update uses MatchEtag only when the selected route supports If-Match and coherent materialization supplies a nonempty ETag. A capable route fails closed on a missing or empty ETag; a route without If-Match uses Overwrite regardless of ETag presence. A refused conditional close is never retried as overwrite.

Materialization cache vs. ovstorage lease

Accepted

Blocking. The resolver holds no on-disk cache; every materialize call routes through the storage bridge, which hands back an opaque lease over the local file.

Bridge topology and construction paths

Accepted, shipped in 0.1

Blocking. Two bridge construction paths (host-provided LayerHandle, and ovstorage StackConfig via configPath / loadDefaultConfig), both landing on the same LayerHandle; plugin-provided kinds come from a generic caller-trusted directory, aggregate capabilities derive from address roots, and live routing remains ovstorage-owned.

URI scheme list source of truth

Accepted, shipped in 0.1

Blocking. Advertised uriSchemes and the compiled claim gate share a single build-time source (OVS_USD_RESOLVER_URI_SCHEMES CMake variable, default s3;http;https;hf). Adding an ovstorage-backed scheme is a configure-time knob, not a source edit.

Hugging Face default support

Accepted with live-conformance gate

Blocking. hf:// is advertised by default and remains native through the resolver. Ovstorage owns Hub routing, authentication, and redirect handling through its read-only Hugging Face plugin; an offline StackConfig smoke and pinned public live-stage smoke provide release evidence.

API stability posture

Accepted

Blocking. Public C++ headers and trace events remain preview with no source or binary ABI promise; CLI JSON schema 1, documented error taxonomy, and exit meanings are stable within 0.1.x.