Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 0 additions & 54 deletions .github/workflows/ost-source-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -200,60 +200,6 @@ jobs:
host_python: "3.13"
host_packages_apt: "libx11-dev libxt-dev libxext-dev libgl1-mesa-dev"
host_packages_brew: ""
- name: httpresolver-pr-windows
lane: pull_request
runtime_artifact: sha256:c3ed40122756ea118166e1619efcaec463e7d2a42f6d978fe4e20b6b774c4b03
target_trust: local
minimum_trust: local
require_evidence: all
evidence_flags: "--require-sbom --require-provenance"
platform: cy2026
profile: usd
up_to: 4
runs_on: ["windows-2022"]
hosted: true
runner_profile: windows-hosted
bundle: plugins/httpresolver
runtime_remote: "oci://ghcr.io/animu-sphere/openstrata-runtime-cy2026-usd@sha256:07cb84412017ece911adaed1175a6373865d863bc40124081cfc20c52de7f0d9"
host_python: ""
host_packages_apt: ""
host_packages_brew: ""
- name: httpresolver-pr-macos-arm64
lane: pull_request
runtime_artifact: sha256:a9bb847ab5c7eb29d7425ff9acfb05b01c1751054d6a70628e48b06f8409a4a8
target_trust: local
minimum_trust: local
require_evidence: all
evidence_flags: "--require-sbom --require-provenance"
platform: cy2026
profile: usd
up_to: 5
runs_on: ["macos-15"]
hosted: true
runner_profile: macos-arm64-hosted
bundle: plugins/httpresolver
runtime_remote: "oci://ghcr.io/animu-sphere/openstrata-runtime-cy2026-usd@sha256:dc0c980b868f91fe33e6f35a67a2bc5693b89f0243141c55ecb068ab225b0f3e"
host_python: "3.13"
host_packages_apt: ""
host_packages_brew: ""
- name: httpresolver-pr-linux
lane: pull_request
runtime_artifact: sha256:03f7d4ef263abb50511d17237e7cbdbe1b83dee02cff8b8f901f0484c7a7898e
target_trust: local
minimum_trust: local
require_evidence: all
evidence_flags: "--require-sbom --require-provenance"
platform: cy2026
profile: usd
up_to: 5
runs_on: ["ubuntu-24.04"]
hosted: true
runner_profile: linux-hosted
bundle: plugins/httpresolver
runtime_remote: "oci://ghcr.io/animu-sphere/openstrata-runtime-cy2026-usd@sha256:367a32bd1985ca9b07e8f7e64f95c1ded8dba16d68f17e0bffb09cec0b9dc3f6"
host_python: "3.13"
host_packages_apt: "libx11-dev libxt-dev libxext-dev libgl1-mesa-dev"
host_packages_brew: ""
- name: pointcloud-ply-pr-windows
lane: pull_request
runtime_artifact: sha256:c3ed40122756ea118166e1619efcaec463e7d2a42f6d978fe4e20b6b774c4b03
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
**/build/
**/.strata/
plugins/*/lib/
tests/plugins/*/lib/
CMakeUserPresets.json

# CI and release scratch.
Expand Down
38 changes: 29 additions & 9 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@ All notable changes to this project are documented here.
no-secrets rule, and the Tier 1 / Tier 2 test split.
- Stated that no resolver implementation is a build-time dependency, and that
`usd-http-resolver` is one compatible implementation composed at runtime.
- Marked `plugins/httpresolver` explicitly as an integration-test double whose
removal or relocation to a test-only path is v0.10.0 work.
- Staged v0.10.0 around the pre-implementation `usd-http-resolver` repository:
repository-local identity and cache tests proceed first, while external
interoperability and test-double disposition wait for its first released
resolver implementation.
- Relocated the repository-local resolver test double to
`tests/plugins/httpresolver` and documented that it is excluded from the
product surface and release matrix.
- Updated the Tier 2 plan for the released
[`usd-http-resolver`](https://github.com/animu-sphere/usd-http-resolver)
implementation and its resolver-neutral `ArAssetInfo` identity contract.
- Added an OpenStrata 0.22.2 dogfooding record for the external resolver
skeleton; it identifies repository setup work, not an OpenStrata defect.

Expand All @@ -32,9 +32,29 @@ All notable changes to this project are documented here.
- Added resolver identity conversion tests and cache-key invalidation coverage
for changed opaque validation tokens.

The OpenUSD-facing resolver adapter is now centralized in the shared authoring
cache bridge. Complete generated-cache generation, diagnostics, and external
resolver interoperability remain planned.
The OpenUSD-facing resolver adapter is centralized in the shared authoring
cache bridge. Stable-identity generated-cache reuse and recovery are complete;
diagnostic completion and recorded external interoperability remain planned.

### Changed

- Removed standalone `httpresolver` product CI cells. The relocated test double
is built transitively by the COPC Tier 1 integration test in the root build,
keeping the local gate independent of external resolver repositories. Note
that Tier 1 is not yet part of the CI matrix: every declared cell builds a
single plugin bundle, where `USDGEO_BUILD_TESTS` is undefined, so neither the
fixture nor `pointcloudCopc_tests` is compiled there. Wiring Tier 1 into CI
is tracked as follow-up work.
- Added a shared cache-layout construction entry point so producer and
consumer tests derive resolver-backed cache entries from the same descriptor
contract.

### Fixed

- Resolver cache Tier 1 coverage now verifies cache hits, incomplete and
corrupted entry invalidation, and validation-token changes through cache
artifacts instead of process-local counters that are not shared across a
FileFormat DLL boundary on Windows.

## [0.9.0] - 2026-08-15

Expand Down
1 change: 0 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ if(USDGEO_BUILD_USD)
add_subdirectory(tools/usd-pointcloud-convert)
add_subdirectory(plugins/pointcloud-las)
add_subdirectory(plugins/pointcloud-laz)
add_subdirectory(plugins/httpresolver)
add_subdirectory(plugins/pointcloud-copc)
add_subdirectory(plugins/pointcloud-ply)
endif()
13 changes: 7 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,11 +76,12 @@ the selected resolver implementation, not by this repository. The plugins
consume the resolved `ArAsset` and never learn which resolver opened it.

An external resolver is runtime composition: install it alongside these
bundles and register both through `PXR_PLUGINPATH_NAME`. `usd-http-resolver` is
one compatible implementation, not a required dependency — this repository
builds and tests without it. The bundled `plugins/httpresolver` is an
integration-test double that serves a local fixture in memory; it is not a
network transport.
bundles and register both through `PXR_PLUGINPATH_NAME`.
[`usd-http-resolver`](https://github.com/animu-sphere/usd-http-resolver) is one
compatible implementation, not a required dependency — this repository builds
and tests without it. The repository-local
`tests/plugins/httpresolver` fixture is a Tier 1 test double that serves a local
fixture in memory; it is not a network transport or product bundle.

Generated-USDC cache reuse for resolver-backed sources requires stable source
identity and stays disabled when the resolver cannot supply it. The boundary,
Expand Down Expand Up @@ -349,7 +350,7 @@ plugins/pointcloud-las/ LAS OpenUSD FileFormat Plugin
plugins/pointcloud-laz/ LAZ OpenUSD FileFormat Plugin
plugins/pointcloud-copc/ COPC OpenUSD FileFormat Plugin
plugins/pointcloud-ply/ PLY OpenUSD FileFormat Plugin
plugins/httpresolver/ Resolver test double for the COPC integration test, not a transport
tests/plugins/httpresolver/ Tier 1 resolver fixture, excluded from product discovery
docs/ See docs/README.md for the documentation index
```

Expand Down
26 changes: 14 additions & 12 deletions docs/architecture/RESOLVER_SOURCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -241,11 +241,11 @@ pointcloud-copc
`usd-http-resolver` is one compatible implementation, not a required
dependency. Registration is in [INSTALL.md](../guides/INSTALL.md).

## 6. Testing tiers — Planned (`v0.10.0`)
## 6. Testing tiers — In progress (`v0.10.0`)

**Tier 1 — repository-local contract tests.** They run with no external
resolver repository, using fake or memory-backed test assets, and remain the
required CI gate. Coverage: resolver-backed random access, partial reads,
required local gate; CI wiring is outstanding. Coverage: resolver-backed random access, partial reads,
short-read diagnostics, stable / unstable / unavailable identity, miss-to-hit
behavior, invalidation on validation-token change, corruption recovery,
`TilePlan` compatibility in cache keys, and deterministic diagnostics.
Expand All @@ -259,21 +259,23 @@ and tested by the resolver repository. Tier 2 is reproducible through
OpenStrata workspace composition without making this repository structurally
dependent on the resolver repository.

`usd-http-resolver` is the designated first Tier 2 implementation, but is
pre-implementation as of 2026-08-16: it has no resolver bundle, backend, cache,
or release yet. Therefore Tier 1 is the v0.10.0 implementation gate in this
repository. Tier 2 becomes a release gate only after that repository publishes
its first resolver implementation and its OpenStrata build and test workflow.
[`usd-http-resolver`](https://github.com/animu-sphere/usd-http-resolver) is the
designated first Tier 2 implementation. Its `v0.2.0` release provides the HTTP
backend and OpenUSD resolver bundle, exposes stable resolver-neutral identity
through `ArAssetInfo`, and is tested through its own OpenStrata workflow. Tier
1 remains this repository's required local gate; Tier 2 is now ready to be
composed and recorded as the `v0.10.0` release gate.

## 7. Test-double resolver

`plugins/httpresolver` is an integration-test double: it serves a configured
`tests/plugins/httpresolver` is an integration-test fixture: it serves a configured
local fixture as an in-memory `ArAsset` for `http://memory.copc` and
`https://memory.copc`. It is not a network transport and is not part of the
point-cloud product surface.

It remains in place until equivalent external integration coverage exists.
After that coverage is recorded, `v0.10.0` either removes it or relocates it
under an explicitly test-only path such as `tests/plugins/httpresolver/`. It
must not be presented as equivalent to a production point-cloud bundle. See
The test double remains as the external-dependency-free Tier 1 fixture. It is
built only with the COPC integration tests and has no product bundle manifest
or install rule, so it is excluded from plugin discovery, release metadata,
packaging, and standalone CI cells. It must not be presented as equivalent to
a production resolver bundle. See
[WORKSPACE.md](WORKSPACE.md).
25 changes: 14 additions & 11 deletions docs/architecture/WORKSPACE.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ modules implement is fixed in
| `pointcloud-laz` | `plugins/pointcloud-laz` | OpenStrata plugin bundle (`usd-fileformat`) | implemented | The same adapter shape for `.laz`, using `LazReader` and the laz-perf codec integration. Owns its `LAZxxx` diagnostic codes. |
| `usdCopc` | `libs/usd-copc` | plain CMake/OpenStrata static library | implemented (source-backed) | COPC Info and hierarchy validation, project-owned random-access source integration, selective point-data range decoding through the shared LAZ chunk decoder, and native hierarchy streaming. It remains OpenUSD- and transport-independent. |
| `pointcloud-copc` | `plugins/pointcloud-copc` | OpenStrata plugin bundle (`usd-fileformat`) | implemented (resolver-backed read) | Resolver-opened `ArAsset` adaptation, metadata-only and non-tiled reads, and native hierarchy tiled COPC authoring through shared `usdLod`. Remote tiled reads require a local payload directory; source point ranges remain unsupported. |
| `httpresolver` | `plugins/httpresolver` | OpenStrata plugin bundle (`usd-asset-resolver`) | test-only, disposition pending in `v0.10.0` | OpenUSD `ArResolver` bundle for `http://memory.copc` and `https://memory.copc`, serving a configured local fixture as an in-memory `ArAsset` for resolver-backed COPC integration tests. It implements no network transport and is not part of the product surface. `v0.10.0` either removes it once equivalent external integration coverage exists, or relocates it to an explicitly test-only path such as `tests/plugins/httpresolver/`. |
| `httpresolver` | `tests/plugins/httpresolver` | test-only OpenUSD `ArResolver` fixture | Tier 1 fixture | OpenUSD `ArResolver` test double for `http://memory.copc` and `https://memory.copc`, serving a configured local fixture as an in-memory `ArAsset`. It has no network transport or product bundle manifest, is built only with COPC integration tests, and is excluded from product discovery and release matrices. |
| `usdPointCloudTiling` | `libs/usd-pointcloud-tiling` | plain CMake/OpenStrata static library | implemented | Format-independent fixed-grid partitioning, spill-backed bounded-memory routing, deterministic tile and LOD ordering, validated tile manifest serialization, spool validation, and cleanup contracts. See the [streaming and tiling plan](../roadmap/streaming-and-tiling.md). |
| `usdGeoCache` | `libs/usd-geo-cache` | plain CMake/OpenStrata static library | implemented | Descriptor-based stable cache keys, deterministic USDC root/payload layout, machine-readable lookup states, process-local lookup statistics, and entry invalidation. The conversion tool owns generation and atomic publication; direct FileFormat adapters reuse committed entries through `USDGEO_CACHE_ROOT`. |
| `usdPly` | `libs/usd-ply` | plain CMake/OpenStrata static library | implemented | PLY 1.0 header inspection, scalar vertex decoding, source filters, and explicit georeference conversion into shared point-cloud assets. |
Expand Down Expand Up @@ -267,7 +267,10 @@ Every structural or format change preserves these invariants:

`openstrata.ci.yaml` is the source of truth; the GitHub workflow is generated
by `ost ci generate github`. The declared PR matrix runs every production
bundle on every host and validates the HTTP resolver bundle separately:
bundle on every host. Every cell is a per-plugin bundle build, so the Tier 1
resolver test double has no product-bundle cell and is not built by CI; it is
built by the root `ost build` in the local gate below, where
`USDGEO_BUILD_TESTS` defaults to `ON`:

| Host | Target | OST level |
| --- | --- | --- |
Expand All @@ -284,24 +287,24 @@ ost test
ost plugin build plugins/pointcloud-las
ost plugin build plugins/pointcloud-laz
ost plugin build plugins/pointcloud-copc
ost plugin build plugins/httpresolver
ost plugin test plugins/pointcloud-las --up-to 4
ost plugin test plugins/pointcloud-laz --up-to 4
ost plugin test plugins/pointcloud-copc --up-to 4
ost plugin test plugins/httpresolver --up-to 4
```

The LAS, LAZ, COPC, and PLY bundles declare OST smoke fixtures and run the L3
`usdcat.read` and L4 `python.stage_open` checks. The `httpresolver` bundle has
no standalone fixture because its functional path is exercised by the COPC
integration test; its PR cells validate resolver-bundle structure, runtime
compatibility, and plugin discovery. The COPC bundle follows the same runtime
matrix as LAS and LAZ.
`usdcat.read` and L4 `python.stage_open` checks. The test-only `httpresolver`
bundle has no standalone fixture or CI matrix cell; its functional path is
exercised by the COPC Tier 1 integration test in the root build, which the
local gate runs and CI does not. The COPC bundle follows the
same runtime matrix as LAS and LAZ.

The gate must stay passable without any external resolver repository. From
`v0.10.0`, repository-local resolver contract tests (Tier 1) are the required
CI gate, and cross-repository integration against an external resolver
implementation (Tier 2) is composed separately; see
*local* gate; wiring them into the CI matrix is still outstanding, since the
declared cells build plugin bundles individually rather than the repository
root. Cross-repository integration against an external resolver implementation
(Tier 2) is composed separately; see
[RESOLVER_SOURCE.md](RESOLVER_SOURCE.md).

## 10. Delivery status
Expand Down
14 changes: 8 additions & 6 deletions docs/compatibility/OPENUSD.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,11 @@ runtime:
```

`pointcloud-las`, `pointcloud-laz`, `pointcloud-copc`, and `pointcloud-ply` are
`usd-fileformat` bundles and require the `usd-stage-read` capability.
`httpresolver` is a `usd-asset-resolver` test-double bundle for the resolver
path used by COPC integration tests. It is not part of the product surface and
provides no network transport; a production resolver is a separate project.
`usd-fileformat` bundles and require the `usd-stage-read` capability. The
`tests/plugins/httpresolver` fixture is an external-dependency-free Tier 1 test
double, not part of the product surface. Production network transport is
provided by a separately installed resolver such as
[`usd-http-resolver`](https://github.com/animu-sphere/usd-http-resolver).

| Item | Value |
| --- | --- |
Expand Down Expand Up @@ -134,8 +135,9 @@ remain static `SDF_FORMAT_ARGS`. See [ADR-0003](../adr/0003-dynamic-file-format.
detect which resolver opened an asset. `usd-http-resolver` is one compatible
implementation; register it alongside these bundles through
`PXR_PLUGINPATH_NAME`.
- The repository's `httpresolver` bundle is an integration-test double only;
it does not provide network transport or production HTTP behavior.
- The repository's `tests/plugins/httpresolver` fixture is a Tier 1 integration-
test double only; it does not provide network transport or production HTTP
behavior and is excluded from the product matrix.

The boundary is stated in full in the
[resolver-backed source contract](../architecture/RESOLVER_SOURCE.md).
18 changes: 10 additions & 8 deletions docs/guides/INSTALL.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,16 +61,17 @@ transport, authentication, retries, and raw byte caching belong to the resolver
implementation, not to these plugins, so remote sources need a resolver that
resolves the identifier and serves an `ArAsset` with efficient range reads.

An external resolver is runtime composition. Install it beside the point-cloud
bundles and register both:
An external resolver is runtime composition. For example, build or install
[`usd-http-resolver`](https://github.com/animu-sphere/usd-http-resolver), place
its bundle beside `pointcloud-copc`, and register both resource roots:

```powershell
$env:PXR_PLUGINPATH_NAME =
"C:\path\to\pointcloud-copc\plugin\resources\;C:\path\to\resolver\plugin\resources\"
"C:\path\to\pointcloud-copc\plugin\resources\;C:\path\to\http-resolver\plugin\resources\httpResolver"
```

```bash
export PXR_PLUGINPATH_NAME=/path/to/pointcloud-copc/plugin/resources/:/path/to/resolver/plugin/resources/
export PXR_PLUGINPATH_NAME=/path/to/pointcloud-copc/plugin/resources/:/path/to/http-resolver/plugin/resources/httpResolver
```

OpenUSD then composes them:
Expand All @@ -80,10 +81,11 @@ usdview https://example.org/data.copc
-> ArResolver -> external resolver -> ArAsset -> pointcloud-copc
```

`usd-http-resolver` is one compatible implementation. It is not required, and
these bundles are built and tested without it. The repository's
`plugins/httpresolver` bundle is an integration-test double that serves a local
fixture in memory; do not deploy it as a transport. See the
`usd-http-resolver` is optional and is never linked by these bundles. Its
`ArAsset::Read` implementation supplies bounded remote reads, while its
transport cache remains separate from the generated-USDC cache owned here. The
repository's `tests/plugins/httpresolver` fixture remains only as an external-
dependency-free Tier 1 test double; do not deploy it as a transport. See the
[resolver-backed source contract](../architecture/RESOLVER_SOURCE.md).

Generated-USDC cache reuse for resolver-backed sources requires stable source
Expand Down
Loading
Loading