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
7 changes: 6 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,12 @@ Current schema contract version: **1**.
the plain lane. It checks the build graph and needs no build. It fails on:
- a source tree of another repository (`add_subdirectory` out of the repo,
`FetchContent`, `ExternalProject`);
- a `usd-motion-plugins` identity built here;
- an identity that left for `usd-motion-plugins` or `motion-connectors`
coming back, under the name it had here or the one it has there. That
covers a member directory, a target or target prefix
(`motionCore_tests`), any file under `adapters/` or `profiles/motion/`,
and a source that opens one of their namespaces (`openstrata`, `motion`,
`vrmAdapter*`, …). This is MIG-5's mechanical check;
- the root resolving a consumed package;
- a member reaching a package that WORKSPACE.md §2 does not allow it. The
VRM importer may reach no motion package, and the `.vrma` importer may
Expand Down
18 changes: 10 additions & 8 deletions docs/architecture/PACKAGE_CONTRACT.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,16 +76,18 @@ true.
descriptor does not declare would put WORKSPACE.md §2 and this file in
disagreement, and §2 wins. Both left with MIG-3; the rule did not.
4. **A platform dependency belongs to the library that uses it, not to its
consumers.** `liveTransport` links `ws2_32` (Windows) or `Threads::Threads`
(elsewhere) `PUBLIC` and its config resolves `Threads` itself; the three
adapters that link it declare neither. `ws2_32` needs no `find_dependency`
consumers.** `liveTransport` linked `ws2_32` (Windows) or `Threads::Threads`
(elsewhere) `PUBLIC` and its config resolved `Threads` itself; the three
adapters that linked it declared neither. `ws2_32` needs no `find_dependency`
because it is a raw library name rather than an imported target — which is
also why it is the half of [#113](https://github.com/animu-sphere/usd-vrm-plugins/issues/113)
that a Windows run cannot check.
also why it was the half of [#113](https://github.com/animu-sphere/usd-vrm-plugins/issues/113)
that a Windows run cannot check. All four left with MIG-4; the rule did not,
and no package here has a platform dependency today.
5. **Two libraries with no edge between them bring nothing for each other.**
WORKSPACE.md §2 forbids an edge between `liveTransport` and `osc` in both
directions, so a consumer of both resolves both. `vrmAdapterVmc`'s config
does exactly that, in two separate guarded blocks.
WORKSPACE.md §2 forbade an edge between `liveTransport` and `osc` in both
directions, so a consumer of both resolved both. `vrmAdapterVmc`'s config
did exactly that, in two separate guarded blocks. All three left with MIG-4;
the rule did not.

### 3.1 A `requires` range between two releases

Expand Down
880 changes: 169 additions & 711 deletions docs/architecture/WORKSPACE.md

Large diffs are not rendered by default.

15 changes: 8 additions & 7 deletions docs/roadmap/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -173,15 +173,16 @@ Where things stand, as of 2026-09-19:
bake agreeing on 414 598 values, every one `==`
([release record](../releases/v0.9.0.md)).
- **Current priority: the [motion migration](motion-foundation-split.md).**
MIG-0 started on 2026-09-19. Both destinations are being scaffolded, and
MIG-1 moves `motionCore` once `usd-motion-plugins` has a tree that can
receive it. Carried beside it: operator evidence for both input halves, the
MIG-0..MIG-4 are done on this side (2026-09-19..24): every generic motion
identity and every live input left, and this repository consumes what it
still uses by digest. What is left is MIG-5's release-artifact proof and
its cross-repository test ([current.md](current.md)). Carried beside it: operator evidence for both input halves, the
Workspace Phase 5 packaging P0, and the build machine's RPATH in packaged
POSIX binaries ([current.md](current.md#carried-out-of-v090)).
- **The recorded half's second format family waits behind three tracks**, and
its boundary is already built: NPZ / AMASS enters through `motionSource`
exactly as BVH does. Whether that is one identity (`motionNpz`) or two
(`motionNpz` + `motionAmass`) is a **measurement, not a preference**
- **The recorded half's second format family left with the layer it extends**:
it is no longer this repository's. NPZ / AMASS enters through `motionSource`,
which is `usd-motion-plugins`' since MIG-3, and whether it is one identity
(`motionNpz`) or two (`motionNpz` + `motionAmass`) is measured there
([the recorded track](recorded-motion-sources.md) §13).
- The display slice is **re-scoped** (2026-07-29). OpenUSD 26.08 resolves exec
prim adapters from a hard-coded list, so a skinned VRM avatar cannot be
Expand Down
83 changes: 37 additions & 46 deletions docs/roadmap/current.md
Original file line number Diff line number Diff line change
Expand Up @@ -182,46 +182,39 @@ steps **Migration Phase A–F**.

It starts after v0.9.0, on purpose: the OpenExec foundation's findings are the
API defects the move fixes on arrival, and they only exist once its nodes do.
**MIG-0 is done (2026-09-19)** ([the track §2](motion-foundation-split.md#2-mig-0--preparation-)).
`motionCore` (MIG-1) and `motionRuntime` (MIG-2's first item, as
`motionSampling` and `motionRecording`) have arrived in `usd-motion-plugins`
with their history, and so have `vrmRetarget`'s generic half, `motionUsd`'s
authoring half and the recorded sources (MIG-3). **MIG-1 and MIG-2's library half is done too (2026-09-21).** `motionCore` and
`motionRuntime` are consumed packages: `motionCore`, `motionSampling` and
`motionRecording` from `usd-motion-plugins` v0.5.0, pinned by digest per target
in five descriptors, with the whole suite green against them.
**So is the retarget (2026-09-23)**: `vrmRetarget`'s generic half is the
consumed `motionRetarget`, both builder copies are calls to it, every parity
row came out identical, and what stayed is `vrmRig`
([the track §4](motion-foundation-split.md#4-mig-2--sampling-retarget-usd-bridge-)).
**And so is `motionUsd`'s reading half (2026-09-23)**: `motion_retarget`
reads the clip through the consumed `ReadMotionStage` and keeps only the
`vrm:` tracks, the first edge here that only a tool declares — what `ost`
0.23.3 made materializable
([report 44](../reports/ost/44-2026-09-23-v0.23.2-a-tool-edge-reaches-nothing-and-a-tree-keeps-its-runtime.md)).
**MIG-3 is done too (2026-09-23)**: `motionSource`, `motionBvh`, the BVH tools
and the profiles are deleted here, their non-ASCII path cases having moved
first, and the suites that baked a real capture read a clip the published
converter wrote. What is left of the consuming side is one thing: `execMotion`,
which that repository published in v0.5.0 and which no descriptor here can
name — `requires.bundles` takes no artifact pin in `ost` 0.23.3 (report 45) —
so the parity rows cannot yet be re-run against the consumed package before
the copy here is deleted.

**MIG-4 is done on both sides (2026-09-21).** All six connector-bound
identities arrived in `motion-connectors` — the two leaves, the tracker layer
and the three adapters with their recorders — and this repository deleted its
copies in one change, under [WORKSPACE.md §9.2](../architecture/WORKSPACE.md#92-moving-rules)
rule 7. `ost` 0.23.2 is what made the cross-repository edge declarable
([report 43](../reports/ost/43-2026-09-20-v0.23.1-the-root-build-cannot-see-an-external-library.md)),
so MIG-1..MIG-3's consuming change — this repository resolving `motionCore` and
the rest as installed packages — is unblocked and is the next thing the track
owes. MIG-4's other half, `motion_capture`, followed on 2026-09-23. It is
`usd-motion-plugins`' `motion_record`, and `motion_retarget`'s suite bakes a
clip the published recorder wrote
([the migration track](motion-foundation-split.md#6-mig-4--recording-and-live-input-) §6).
Until an identity moves, it takes fixes and the work v0.9.0 owes, and **no new
generic capability** ([WORKSPACE.md §9.1](../architecture/WORKSPACE.md#91-destination-of-every-identity)).

**MIG-0..MIG-4 are done (2026-09-19..24), and this repository builds no
generic motion code.** Every identity
[WORKSPACE.md §9.1](../architecture/WORKSPACE.md#91-destination-of-every-identity)
sends elsewhere arrived there with its history, and this repository either
consumes it by digest or no longer uses it:

- `motionCore`, `motionSampling`, `motionRetarget` and `motionUsd`'s reading
half are consumed packages. What stayed of `vrmRetarget` is `vrmRig`.
- The recorded-file layer and `motion_capture` are deleted here. Suites that
baked a real capture read a clip the published converter or recorder wrote.
- The six connector-bound identities left in one change (MIG-4).
- `execMotion` is the published bundle, pinned in `execVrm`'s
`requires.bundles`. The parity rows were re-run against it before the copy
was deleted, with divergence 0 (2026-09-24).

Each step's record is in [the track](motion-foundation-split.md).

**What is left is MIG-5, "nothing left behind"** ([the track §7](motion-foundation-split.md#7-mig-5--nothing-left-behind-)):

- ✅ No generic motion source file remains, checked mechanically by
`workspace_cmake_boundaries` (2026-09-24).
- ✅ WORKSPACE.md §1 and §2 describe the reduced tree and §9 is a record;
`PACKAGE_CONTRACT.md` lists only what this workspace installs (2026-09-24).
- ⬜ The aggregate product installs and opens a `.vrm` and a `.vrma` from
release artifacts, with the shared core resolved as a dependency. That is
the next release's dry run.
- ⬜ The cross-repository test — VRMA → `MotionClip` → a target VRM — runs by
default somewhere, and here until an integration repository exists.

A new generic motion feature is proposed in `usd-motion-plugins`, and a new
device or protocol input in `motion-connectors`
([WORKSPACE.md §9.1](../architecture/WORKSPACE.md#91-destination-of-every-identity)).

What becomes of [boundary consolidation](boundary-consolidation.md):

Expand Down Expand Up @@ -294,12 +287,10 @@ the workspace layout, the output structure, and the import/runtime boundary.*
(design policy §15, §17-P0)

- 🚧 Describe `vrmSchema`, `usdVrmFileFormat`, `usdVrmPackageResolver`,
`usdVrmaFileFormat`, `execMotion` and `execVrm` as separate bundles;
`vrmContainer`, `motionCore`, `motionRuntime`, `vrmRetarget`, `motionSource`,
`motionBvh`, `motionTracking`, `liveTransport`, `osc` and the three
`vrmAdapter*` leaves as plain libraries; `motion_retarget`, `motion_capture`,
`motion_bvh_convert` and the `*_record` tools as CLIs; and `usdVrm` as the
aggregate product name only.
`usdVrmaFileFormat` and `execVrm` as separate bundles; `vrmContainer` and
`vrmRig` as plain libraries; `motion_retarget` as a CLI; the
`usd-motion-plugins` packages and the `execMotion` bundle as consumed, not
built; and `usdVrm` as the aggregate product name only.
- 🚧 Unify phase notation to **Product P0–P6**, **Workspace Phase 0–8**, and
**Motion Phase A–H** — three sequences, never a bare "Phase N".
- 🚧 Align build / test / install examples with what CI actually runs.
Expand Down
52 changes: 40 additions & 12 deletions docs/roadmap/motion-foundation-split.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Motion migration — generic motion to `usd-motion-plugins`, input to `motion-connectors`

**Status:** ✅ MIG-0; ✅ MIG-3 — `motionSource`, `motionBvh`, the BVH tools and the profiles deleted here on 2026-09-23; 🚧 MIG-1 and MIG-2 — **consumed here since 2026-09-21: `motionCore`, `motionSampling`, `motionRecording`, and since 2026-09-23 `motionRetarget` and `motionUsd`**, with what stayed of `vrmRetarget` renamed `vrmRig`; and since 2026-09-24 `execMotion`, the last generic motion code this repository built; **every sending half of MIG-2 has arrived** — `motionRetarget` 2026-09-19, `execMotion` and `motionUsd`'s reading half 2026-09-20; **✅ MIG-4 on the connector side** — all six identities arrived in `motion-connectors` 2026-09-19..21 and left here in one change on 2026-09-21; `motion_capture` arrived in `usd-motion-plugins` as `motion_record` (2026-09-20) and was deleted here on 2026-09-23 · **Target:** after the OpenExec foundation ·
**Status:** ✅ MIG-0..MIG-4 on this side — every identity [WORKSPACE.md §9.1](../architecture/WORKSPACE.md#91-destination-of-every-identity) sends elsewhere arrived there with its history (2026-09-19..21) and is consumed or deleted here (2026-09-21..24), `execMotion` last; what MIG-4 still owes is `motion-connectors`' (recorded evidence, ARDY); 🚧 MIG-5 — the mechanical check and the reduced contract are done, the release-artifact proof and the cross-repository test are not · **Target:** after the OpenExec foundation ·
**Structure:** [architecture/WORKSPACE.md §9](../architecture/WORKSPACE.md#9-destinations-under-the-motion-architecture) ·
**Policy:** the `usd-motion-plugins` design policy §37, and
[design/INTEGRATION_SCOPE_POLICY.md](../design/INTEGRATION_SCOPE_POLICY.md) §13 ·
Expand Down Expand Up @@ -117,7 +117,7 @@ repository's, and needs nothing from this one.
Boundary suites (`*_boundaries`) travel too, and they are rewritten there
for that repository's edges rather than reproduced.

## 3. MIG-1 — the core 🚧
## 3. MIG-1 — the core ✅

- ✅ `motionCore` arrives in `usd-motion-plugins` under the same identity, with its
history, renamed to the shared names, under `openstrata::motion`
Expand All @@ -140,13 +140,15 @@ repository's, and needs nothing from this one.
([WORKSPACE.md §9.2](../architecture/WORKSPACE.md#92-moving-rules), rule 1).
Adapting code here to the renamed types was acceptable during migration
(motion-plugins policy §37); keeping two cores was not.
- ⬜ The `.vrma` stage does not change: `/Animation`, `HumanoidSkeleton`,
- ✅ The `.vrma` stage does not change: `/Animation`, `HumanoidSkeleton`,
`BodyAnimation`, the `vrma` custom data. A standalone motion stage in
`usd-motion-plugins`' shape is a separate decision, not a side effect.
Held across the whole move: no `usdVrmaFileFormat` golden changed from
2026-09-18 to MIG-2's last deletion on 2026-09-24.

## 4. MIG-2 — sampling, retarget, USD bridge 🚧
## 4. MIG-2 — sampling, retarget, USD bridge ✅

- 🚧 `motionRuntime` arrives as `motionSampling` and `motionRecording`, with
- ✅ `motionRuntime` arrives as `motionSampling` and `motionRecording`, with
the exec findings fixed on arrival: a status-carrying `SampleClip`, a
stateless `PoseFilter` step, `ConditionRootMotion` as a free function, an
N-way blend that can answer *nothing to blend*.
Expand Down Expand Up @@ -178,7 +180,7 @@ repository's, and needs nothing from this one.
The two behaviours that changed with the package — `BlendPoses`'
`std::nullopt` and a NaN weight counting as none — are read, not
predicted, by `execMotion` here.
- 🚧 The generic retarget arrives as `motionRetarget`, with a
- ✅ The generic retarget arrives as `motionRetarget`, with a
`SkeletonDescriptor` built from joint tokens and rest matrices — the
finding `execVrm` and `motion_retarget` both carry a copy of today.
- ✅ Arrived with its history (2026-09-19,
Expand Down Expand Up @@ -223,7 +225,7 @@ repository's, and needs nothing from this one.
[WORKSPACE.md §9.5](../architecture/WORKSPACE.md#95-the-line-through-vrmretarget)'s
line is held after the cut rather than only drawn before it. MIG-0's
vocabulary check retired in the same change, its last headers gone.
- 🚧 `motionUsd`. The authoring half arrived on 2026-09-19
- ✅ `motionUsd`. The authoring half arrived on 2026-09-19
([usd-motion-plugins #7](https://github.com/animu-sphere/usd-motion-plugins/pull/7)). Its source was
`motion_capture`'s `ClipWriter`, not `StageIo`. `StageIo` reads a clip and
bakes it onto a VRM, and that writing half is VRM-specific and stays here.
Expand Down Expand Up @@ -363,7 +365,7 @@ repository's, and needs nothing from this one.
because `execVrm`'s boundary check had imported them from the bundle's
tree. The schema partition is now read from the consumed bundle's
`plugInfo.json`.
- 🚧 What stays is re-read as a consumer: the VRM humanoid map,
- ✅ What stays is re-read as a consumer: the VRM humanoid map,
`ExpressionResolver`, `LookAtEvaluator`, `motion_retarget` as a VRM CLI,
`execVrm`. The OpenExec parity values are re-run against the consumed
packages before anything here is deleted — done for the retarget on
Expand Down Expand Up @@ -537,11 +539,37 @@ repository's, and needs nothing from this one.
- ⬜ The ARDY adapter is created there, behind the generator interface
`usd-motion-plugins` specifies; Motion Phase F does not start here.

## 7. MIG-5 — nothing left behind ⬜
## 7. MIG-5 — nothing left behind 🚧

- ⬜ No generic motion source file remains here, checked mechanically.
- ⬜ WORKSPACE.md §1 and §2 describe the reduced tree, §9 becomes a record,
and `PACKAGE_CONTRACT.md` drops the packages that left.
- ✅ No generic motion source file remains here, checked mechanically
(2026-09-24). `scripts/check_cmake_boundaries.py`
(`workspace_cmake_boundaries`, and first in the plain-CMake lane) fails
when an identity [WORKSPACE.md §9.1](../architecture/WORKSPACE.md#91-destination-of-every-identity)
sent elsewhere comes back. It checks every name the identity has had, here
and in its destination. A member directory fails, and so does a target or
target prefix (`execMotion_blend_tests`), any file under `adapters/` or
`profiles/motion/`, and a source that *opens* one of their namespaces.
Using them (`openstrata::motion::MotionPose`) is the point of consuming
them, and passes. The tree passes today. Before this, the check knew only
`usd-motion-plugins`' current names, so none of the connector identities,
`motionRuntime` or `vrmRetarget` could have failed it.
- ✅ WORKSPACE.md §1 and §2 describe the reduced tree, §9 becomes a record,
and `PACKAGE_CONTRACT.md` drops the packages that left (2026-09-24).
- WORKSPACE.md lost about 700 lines. §1 lists what this workspace builds,
and names what it consumes rather than tabulating it. §2's edges are the
ones the descriptors declare, and the graph gate reports
`5 bundle(s), 3 bundle edge(s), 2 libraries, 13 library edge(s), 1 tool(s)`
on `ost` 0.23.6. §5 keeps the product-membership rule — no product name,
and nothing that opens a transport — with the adapters and the BVH layer
it was argued over gone. §9 opens with the moves done and dates every
row.
- The reasoning each removed section held about identities that left is
the v0.9.0 copy of the document, the last release that built them, and
the document says so rather than keeping it.
- `PACKAGE_CONTRACT.md` §4 had already dropped each package in the change
that moved it. What was left was two §3 rules stated over `liveTransport`,
`osc` and the adapters in the present tense, now in the past with the
rule kept.
- ⬜ The aggregate product still installs and opens a `.vrm` and a `.vrma`,
with the shared core resolved as a dependency, from release artifacts.
- ⬜ The cross-repository test — VRMA → `MotionClip` → a target VRM — runs
Expand Down
Loading
Loading