- Add a core sparse array edit value family to
layerstack. - Preserve enough property declaration metadata to resolve typed array edits.
- Refactor value resolution so sparse array opinions compose over weaker opinions, including time samples.
- Extend
layerstack_usdato parse and emit authorededit(...)values. - Extend
layerstack_usdcbehind an explicit cargo feature for experimental sparse array edit decoding/assembly. - Keep the work as a sequence of clean, coherent commits.
- Generalize the new resolver to every possible future sparse value family in the first slice.
- Add new production dependencies.
- Implement stable public serialization for experimental USDC sparse array edits without a feature gate.
- Public API changes are expected in
layerstack:Valuewill gain a sparse array edit variant.- Property declaration metadata will be preserved in the core document model.
- Stage resolution semantics for array-valued fields will broaden from strongest-wins to composed sparse resolution.
- Data model foundation
- Add property declaration metadata to the core document model and composition index.
- Add sparse array edit kernel types and instruction semantics.
- Resolution
- Move composed-array resolution into a dedicated resolver module.
- Integrate fallback seeding and time-sampled sparse composition.
- USDA
- Parse
edit(...)as an authored value and emit it into the core model.
- Parse
- USDC
- Add experimental sparse array edit decoding/assembly behind a cargo feature.
- Validation
- Add focused unit/integration tests and run fmt/clippy/test slices.
- Property type information is currently discarded; sparse array edits require it for
minsize/resize. - Schema fallback is currently bolted on after authored resolution; sparse composition needs fallback as part of the weakest opinion chain.
- USDC support is inherently provisional until the proposal settles on stable wire encoding details.
Stageno longer knows about arrays as a special sparse-resolution case.- Sparse-family detection and strong-over-weak folding live in an internal resolver module.
- Default-valued and time-sampled sparse resolution flow through the same internal family pipeline.
- Arrays remain the only shipped sparse family in this branch, but the internal
seam is ready for another family without reopening
Stage.
- Extract
- Move sparse array resolution out of
stage.rsintolayerstack/src/value_resolution.rs.
- Move sparse array resolution out of
- Centralize
- Make
Stagecall the resolver module rather than array-specific helpers.
- Make
- Generalize internally
- Introduce an internal sparse-family discriminator and family-owned composition API.
- Unify sampled/default folding
- Route default and time-sampled sparse resolution through a shared internal fold model.
- Add invariant tests
- Assert dense termination, sparse-over-sparse associativity, fallback seeding, and blocking behavior.
- Stop there
- Do not force a second sparse family into this branch unless one is genuinely ready.
Path owns concrete prim namespace paths. It explicitly does not own
variant-qualified opinion provenance or implicit arc targets; those belong to a
separate spec-identity layer and to reference/payload target resolution.
- Add a first-class
SpecPathidentity model for composed opinion sources. - Separate provenance identity from the concrete prim path used to look up
authored
PrimSpecdata. - Preserve variant-qualified source identities through
Stageinspection APIs and conformance tests. - Model references/payloads with an explicit authored target kind so omitted
prim targets remain distinguishable from explicit
</Foo>or/. - Add
defaultPrimlayer metadata to USDA/USDC ingestion and compose omitted reference/payload targets through it.
- Generalize
Pathinto a universal spec/property/variant path syntax type. - Implement relocates or value clips in this branch.
- Add a plugin-style provenance system.
- Public API changes are expected in
layerstack:OpinionKey::spec_pathandStage::prim_stack()will exposeSpecPathIdinstead ofPathId.Stagewill expose composedSpecPathinspection helpers.Reference/payload arc targets will move from always-concretePathIdto an explicit authored target enum that can represent implicitdefaultPrim.Layerwill preservedefault_primmetadata.
- Spec identity foundation
- Add
spec_path.rswithSpecPath,SpecPathId, andSpecPathInterner. - Thread a concrete lookup prim path separately from spec provenance through
OpinionKey.
- Add
- Composition integration
- Intern spec identities while composing local, variant, inherit, reference, payload, and specializes opinions.
- Update
Stageinspection APIs and conformance harnesses to use the new spec identities directly.
- Arc target modeling
- Add an explicit reference target enum for authored prim-path vs implicit
defaultPrim. - Preserve
defaultPrimmetadata on layers.
- Add an explicit reference target enum for authored prim-path vs implicit
- USDA + USDC
- Parse/emit layer
defaultPrimmetadata in USDA. - Decode USDC pseudo-root
defaultPrimand omitted arc targets into the new model.
- Parse/emit layer
- Validation
- Unignore the variant-qualified source identity conformance cases.
- Add focused
defaultPrimtests and reduce ignored composition cases to narrower remaining gaps.
- Variant provenance is currently intertwined with actual prim lookup paths in
OpinionKey; this refactor touches most composition entry points. defaultPrimbehavior must preserve the authored distinction between an omitted target and an explicit prim path.- USDC pseudo-root metadata is currently only partially assembled, so
defaultPrimsupport has to fit that code path cleanly.
- Variant-qualified opinion provenance retains the host path for every variant selection, including nested selections and repeated variant-set names.
SpecPathcan represent multi-host variant qualification along one concrete prim path instead of only one host-path insertion point.- Composition forwarding sites build provenance through one shared helper
rather than ad hoc
variant_spec_path(...)calls. - The remaining ignored PCP composition tests that only require propagated variant-qualified provenance are unignored and passing.
- Preserve host-aware outer selection context in
VariantSpec. - Centralize spec-path construction/remapping for local, variant, reference, payload, inherit, and specializes forwarding.
- Unblock the current ignored PCP cases around nested variants and variant-qualified prim-stack/source provenance.
- Implement fallback variant selection supplied externally by the AOUSD PCP test harness.
- Implement unrelated missing features like relocates or value clips in the same branch.
- Public API changes are expected in
layerstack:- Variant provenance metadata in the document model will carry host-aware
selection sites instead of plain
(set, variant)pairs. - Internal spec-path construction helpers will move from single-host builders to a more general provenance context.
- Variant provenance metadata in the document model will carry host-aware
selection sites instead of plain
- Provenance model
- Add a host-aware variant selection site type.
- Store outer/required variant context using that type in the document model.
- Spec-path construction
- Extend
SpecPathwith multi-host construction from a concrete prim path plus ordered selection sites. - Add focused tests for nested hosts and repeated set names.
- Extend
- USDA emission
- Record nested variant context with host paths when emitting
VariantSpecs, including repeated set names on different hosts.
- Record nested variant context with host paths when emitting
- Composition integration
- Replace ad hoc variant provenance builders in
compose.rswith shared helpers that preserve host context across arc forwarding.
- Replace ad hoc variant provenance builders in
- Validation
- Unignore the remaining provenance-related PCP cases.
- Add targeted regression tests for nested references, payloads, inherits, specializes, and remapped descendants carrying variant-qualified sources.
- Existing
VariantSpec::mergebehavior currently collapses nested contexts that share the same set/variant names; the host path must become part of the identity without making merge order unstable. - Provenance propagation appears in many code paths; partial conversion could easily produce mixed single-host and multi-host behavior.
- Forwarded arc composition resolves variant selections against the correct selection root even when the source provenance path and the strongest selection live on different remapped ancestors.
- Prim-stack provenance for forwarded inherits/specializes/reference/payload opinions retains the variant-qualified source path expected by the remaining PCP fixtures.
- The remaining provenance-related ignored PCP cases are reduced to the known external-fallback and payload-through-subroot gaps.
- Replace ad hoc
dest_pathvssource_pathselection lookups with one explicit selection-root model. - Distinguish three paths during forwarding: destination path, source authored path, and selection-root path.
- Unblock the remaining PCP cases around ancestral selections, weaker remapped selections, and forwarded prim-stack provenance under inherits/specializes.
- Implement the AOUSD PCP harness's external fallback selections.
- Implement nested payload-through-subroot or self-payload semantics.
- Failure triage
- Reproduce the six remaining provenance failures and group them by shared selection-root behavior.
- Selection-root model
- Add a small helper/context type for forwarded opinions that carries the destination path, source path, and selection-root path separately.
- Forwarding integration
- Route inherits, specializes, references, and payloads through the shared selection-root helper.
- Validation
- Unignore the newly passing PCP cases and keep the known non-goals ignored.
- Some remaining cases may depend on ancestor remapping that differs between value resolution and prim-stack/source provenance.
- Payload forwarding may still expose the older subroot gap; selection-root cleanup should not accidentally blur that boundary.
path.rs owns concrete scene-namespace identities such as prim and property
paths. It explicitly does not own variant-qualified provenance; that remains in
spec_path.rs.
layerstackhas a first-classPropertyPathfor concrete authored property identity.- Property-path parsing/formatting lives in one core implementation instead of ad hoc string splitting in USDA/USDC code.
Stagecan answer common queries directly from a parsed property path.SpecPathstays provenance-oriented, but gains calmer integration points with concrete property identity.
- Introduce a universal path algebra that merges prim paths, property paths, target paths, and variant-qualified provenance into one type.
- Change list-op target storage away from
PathIdin this branch. - Implement relocates or target/connection-path syntax in the same slice.
- Public API changes are expected in
layerstack:PropertyPathwill be added and re-exported from the crate root.InMemoryStoreandStagewill gain property-path-based helpers in addition to the existing prim-plus-field APIs.- Internal USDA/USDC property-path parsing will move to the shared core parser.
- Core path model
- Add
PropertyPathparsing, formatting, and construction inpath.rs. - Keep
Pathas the concrete prim-path type.
- Add
- Stage/query integration
- Add
Stagehelpers that resolve/explain values viaPropertyPath. - Add
InMemoryStoreconvenience parsing for property paths.
- Add
- File-format integration
- Replace local property-path splitters in USDA/USDC assembly with the shared core type where the path is concrete rather than provenance-only.
- Validation
- Add focused path parsing/display tests and query tests.
- Run workspace verification and note remaining identity gaps for later slices (target paths, richer spec identities, relocates).
- Concrete target identity
- Add a first-class
TargetPathfor relationship/connection targets. - Replace fake dotted
PathIdtargets with structured prim-or-property identity across doc/storage, USDA/USDC parsing, and composition remapping.
- Add a first-class
- Public API follow-through
- Add
PropertyPath-based query helpers for typed property resolution. - Add
Layerediting helpers that author property fields viaPropertyPathinstead of separate prim/token inputs.
- Add
- USDC currently mixes concrete property paths and variant-qualified spec paths in a few helper functions; the branch must keep those responsibilities separate.
- It is easy to over-generalize into a too-clever path abstraction; this slice should stay concrete and boring.