Skip to content

Run workspace CTest in CI; read the SOG primary asset through ArAsset - #45

Merged
piggy-penguin merged 4 commits into
mainfrom
claude/loving-pasteur-rs7itj
Nov 3, 2026
Merged

piggy-penguin merged 4 commits into
mainfrom
claude/loving-pasteur-rs7itj

Conversation

@piggy-penguin

@piggy-penguin piggy-penguin commented Nov 3, 2026 •

Copy link
Copy Markdown
Member

Summary

  • CI: adds three kind: workspace, verify: test cells: workspace-ctest-pr-windows, workspace-ctest-pr-macos-arm64 and workspace-ctest-pr-linux. They use the same digest-pinned runtimes as the bundle cells, run ost build on the composed root tree, then ost test on it. ost-source-ci.yml is regenerated with ost 0.23.19, and scripts/release.py skips workspace cells.
  • gaussianUsd: PXR_INCLUDE_DIRS is now $<BUILD_INTERFACE:...>, so the installed export no longer freezes the build machine's runtime path. This also fixed the first CI run, where CMake refused to export the CI runtime path (.ost-ci-home) because it is "prefixed in the source directory".
  • gaussian-sog: the plugin now reads the primary asset (.sog / meta.json) through ArResolver::OpenAsset instead of the filesystem, so a SOG inside a .usdz opens: scene.usdz[cloud/meta.json], scene.usdz[cloud.sog].
    • The reader gains a USD-free SogPrimaryLoader seam. It probes first, refuses an oversized asset from its reported size, then does the bulk read. The reader holds an injected loader to that contract.
    • The plugin anchors the companions of a packaged meta.json itself. Ar anchors a package-relative anchor on the outer package path, so ./scales.webp would name a file beside the .usdz. The plugin instead joins the innermost packaged directory with the plane name.
  • Docs updated: RESOLVER_MATRIX, current.md, WORKSPACE §8, BUILDING, CHANGELOG.

Why?

This is the 🚧 asset-resolver matrix item in docs/roadmap/current.md. Package-relative and URI-style primary identifiers failed because the primary was read from the filesystem. The CTest suites, including the Windows run of the non-ASCII path tests, ran only in the local gate.

Validation

  • CI on b1ec3ec: all 13 checks green. The workspace-ctest-pr-* cells passed 15/15 CTest suites on Windows (MSVC), macOS arm64, and Linux, including gaussianSog_python_resolver (with the new case_package_relative), gaussianSog_reader_unit (with TestInjectedPrimaryLoader and the non-ASCII path tests), gaussianCore_file_io, and both equivalence tests. RESOLVER_MATRIX records these as observed (673088b).
  • Local, USD-free: the gaussianCore and SOG reader/decoder tests pass on GCC 13, both plain and under ASan/UBSan.
  • ost ci validate reports 12 cells, structure OK. Regenerating from the unchanged manifest reproduces the checked-in workflow byte for byte.
  • scripts/release.py matrix output is byte-identical before and after this change, release.py guard passes, and check_clang_format.py --changed is clean.
  • The gaussianUsd export fix is reproduced in a minimal CMake project: the unwrapped include path fails with the same error, and the wrapped one configures cleanly.

Checklist

  • I linked related context or explained why there is no issue (roadmap item above).
  • I ran the relevant tests and checks, or described what remains.
  • I updated documentation or tests when behavior changed.
  • I did not add private or unlicensed assets.

Reviewer notes

  • The workspace cells are a new CI shape for this repo. On Windows they take about 2 minutes; on macOS the Python smoke tests account for most of the roughly 70-second CTest time.
  • The installed gaussianUsd export no longer carries OpenUSD's include directory. Installed consumers get it from the linked pxr targets and their own find_package(pxr), which every bundle already does; the bundle cells are green with this change.
  • The PLY and SPZ bundles still read their resolved path from the filesystem.
  • Remaining roadmap step: a test resolver plugin for URI-style identifiers and resolver-served companions.

🤖 Generated with Claude Code

https://claude.ai/code/session_01JQZ6z9zq89LhUuzXXQXUq7

The bundle cells run OST's verification pyramid, which never reaches the
repository's own CTest suites: the gaussianCore and gaussianUsd unit tests,
each bundle's reader and decoder tests, the Python smoke and asset-resolver
tests, and the cross-format equivalence tests that exist only in the
composed root build. Those ran only in the local gate, so the Windows run of
the non-ASCII path tests stayed owed.

Add three `kind: workspace`, `verify: test` cells on the same digest-pinned
runtimes. Each runs `ost build` on the root tree and `ost test` on it.
Regenerate ost-source-ci.yml with ost 0.23.19 (regenerating from the
unchanged manifest reproduces the checked-in workflow byte for byte, so the
diff is only the new job). scripts/release.py skips workspace cells: they
name no bundle and ship nothing; the derived release matrix is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JQZ6z9zq89LhUuzXXQXUq7
GaussianSogFileFormat read its resolved path straight from the
filesystem, so a SOG inside a `.usdz` (`scene.usdz[cloud/meta.json]`,
`scene.usdz[cloud.sog]`) or behind a URI-serving resolver could not open.

SogReader gains a primary-asset seam (SogPrimaryLoader) beside the
companion seam: the loader reports the asset's size and serves its first
`limit` bytes. The reader still probes the layout and refuses an oversized
asset before the bulk read, and holds an injected loader to that contract.
The USD-free default keeps reading the filesystem. The plugin injects
LoadPrimaryThroughResolver, which reads through ArResolver::OpenAsset, for
reads and routing alike.

Companions of a packaged meta.json are anchored by the plugin. Ar anchors a
package-relative anchor on its outer package path, so `./scales.webp` would
name a file beside the `.usdz`, the same other-asset import the `./` prefix
exists to prevent. The plugin joins the innermost packaged directory with the
bare plane name instead.

Tests: reader TestInjectedPrimaryLoader (in-memory assets under URI-like
and package-relative names, the probe-then-bulk order, an oversized asset
refused from its reported size, loader errors and contract breaches), and
case_package_relative in the USD resolver suite (root and subdirectory
meta.json, a reference, metadata-only, a missing packaged plane with an
impostor beside the package, a packaged `.sog`). The resolver cases are
recorded as not yet observed until the workspace CTest cells run them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JQZ6z9zq89LhUuzXXQXUq7
The new workspace CTest cells failed at configure on Linux and macOS:

  CMake Error in libs/gaussian-usd/CMakeLists.txt:
    Target "gaussianUsd" INTERFACE_INCLUDE_DIRECTORIES property contains
    path: ".../.ost-ci-home/runtimes/openstrata-cy2026-...-usd/include"
    which is prefixed in the source directory.

In CI, OST_HOME is the checkout's .ost-ci-home, so the runtime's include
directory sits under the source tree, and CMake refuses to install-export a
source-prefixed path. The bundle cells never hit it because they build the
library standalone, outside the composed root.

Wrap PXR_INCLUDE_DIRS in $<BUILD_INTERFACE:...>. The installed export should
not freeze the build machine's runtime path anyway. Installed consumers get
OpenUSD's headers from the linked pxr targets and their own
find_package(pxr), as every bundle already does. A minimal project with
the same layout reproduces the error unwrapped and configures cleanly
wrapped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JQZ6z9zq89LhUuzXXQXUq7
The workspace-ctest-pr-* cells passed 15 of 15 CTest suites on Windows
(MSVC), macOS arm64, and Linux on b1ec3ec. That run observed:

- the non-ASCII path tests (reader TestNonAsciiPath, gaussianCore_file_io,
  and the PLY and SPZ decoder cases) on Windows, so the row moves from
  "Linux only" to verified;
- case_package_relative in gaussianSog_python_resolver on all three
  platforms, so the two package-relative rows move from "not yet observed"
  to verified.

The roadmap item keeps one remaining step: a test resolver plugin for
URI-style identifiers and resolver-served companions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JQZ6z9zq89LhUuzXXQXUq7
@piggy-penguin
piggy-penguin marked this pull request as ready for review November 3, 2026 08:49
@piggy-penguin
piggy-penguin merged commit 9f404cf into main Nov 3, 2026
13 checks passed
@snkmcb
snkmcb deleted the claude/loving-pasteur-rs7itj branch November 3, 2026 08:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants