Skip to content

Commit 2cc91d8

Browse files
aslukclaude
andcommitted
Incorporate PLM feedback and sharpen likely direction
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 87fe3e3 commit 2cc91d8

1 file changed

Lines changed: 138 additions & 69 deletions

File tree

  • proposals/identifier_separation_of_concerns

proposals/identifier_separation_of_concerns/README.md

Lines changed: 138 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -394,24 +394,48 @@ for round-trip fidelity.
394394

395395
PLM systems assign stable identifiers -- part numbers, revision codes,
396396
serial numbers -- that must persist across the lifecycle of a physical
397-
product and its digital twin.
398-
399-
- A **part number** like `A-0000-12345-Rev.C` identifies the *design* of a
400-
component. Multiple instances of that component in an assembly share this
401-
identifier.
397+
product and its digital twin. These identifiers are often composite, with
398+
distinct fields serving different roles:
399+
400+
- A **part number** like `A-0000-12345` identifies the *design* of a
401+
component as a generic reference. Multiple instances of that component
402+
in an assembly share this identifier, and searching for a part number
403+
may return multiple revisions.
404+
- A **revision** identifies a specific version of that design. Revisions
405+
may take the form of a human-readable suffix (e.g., `Rev.C`) or an
406+
opaque system handle (e.g., Windchill's `OR:wt.part.WTPart:4697800`,
407+
which resolves to a specific revision internally).
402408
- A **serial number** like `SN-2025-00847` identifies a specific *physical
403409
instance* of that component.
404410
- A **BOM (Bill of Materials)** is generated by traversing an assembly and
405411
collecting part numbers -- a workflow that requires source identifiers to be
406412
discoverable and unambiguous.
413+
- **Alternative and equivalent identifiers** are common: OEM part numbers,
414+
replacement part numbers, and service part numbers may all refer to the
415+
same form/fit/function item under different schemes. A single component
416+
may legitimately carry multiple identifiers that coexist without conflict.
407417

408418
In complex configuration-managed systems, the identifier may not be a
409-
human-readable part number at all. PLM systems may use composite URIs or
410-
opaque system keys -- meaningful only to the originating system's asset
411-
resolver -- where a "part" is an abstract container whose concrete identity
412-
depends on configuration rules and context. These opaque, vendor-specific
413-
identifiers must survive a round-trip through USD without loss, just as
414-
human-readable strings do.
419+
human-readable part number at all. PLM systems may use opaque system
420+
handles -- meaningful only to the originating system's resolver -- where a
421+
"part" is an abstract container whose concrete identity depends on
422+
configuration rules and context. These opaque, vendor-specific identifiers
423+
must survive a round-trip through USD without loss, just as human-readable
424+
strings do.
425+
426+
#### Configurable products and composite keys
427+
428+
PLM systems also manage **configurable products** whose structure depends
429+
on context. A product's Bill of Materials may change dramatically based on
430+
**navigation criteria** -- the rules used to traverse and resolve the
431+
sub-structure for a specific configuration. Navigation criteria may
432+
themselves be opaque objects (e.g., Windchill's
433+
`OR:wt.filter.NavigationCriteria:7608531`) or encoded strings (URLs,
434+
JSON). The result is that a single primary identifier may not suffice to
435+
identify the specific item referenced in USD; the combination of part
436+
identifier and navigation criteria (or other context keys) forms a
437+
composite key. This reinforces the need for source identifier metadata
438+
that can carry multiple fields per system, not just a single value.
415439

416440
If these identifiers are encoded into prim names, characters like hyphens and
417441
periods are lost or transcoded, making BOM generation from the USD stage
@@ -633,6 +657,26 @@ of fragmented workarounds.
633657
external identifiers are needed on prims at all levels of the hierarchy
634658
and the mechanism must not be artificially limited to model roots.
635659

660+
In manufacturing, an asset
661+
may collapse internal product structure for visualization, but
662+
individual meshes within the asset still need to trace back to the
663+
source parts they represent -- identifiers that differ from the model
664+
root's own identifier. An assembly (e.g., a rack) may contain
665+
components (e.g., trays) whose visual prims carry their own source
666+
identifiers even though they are not model roots.
667+
668+
However, broadening scope introduces a **discoverability cost**. Today,
669+
the model hierarchy (via `Usd.PrimIsModel` and `Kind`) provides a cheap
670+
way to find "things that have identity" -- you walk the model hierarchy
671+
and stop. If any prim in a stage can carry source identifiers, "find me
672+
all prims with identifiers" becomes a full stage traversal, which on
673+
large scenes (millions of prims) is a meaningful performance difference.
674+
The design should consider whether the model hierarchy remains the
675+
primary discovery path (with sub-model identifiers accessed only when
676+
drilling into a known subtree), or whether an additional indexing
677+
mechanism is needed (e.g., a collection or relationship at the model
678+
root that enumerates identified sub-prims).
679+
636680
5. **Namespacing of identifiers.**
637681
If a prim carries identifiers from multiple external systems, how should
638682
they be organized? The namespacing convention must accommodate the full
@@ -644,10 +688,26 @@ of fragmented workarounds.
644688
`sourceId:ifc`) or a family of single-apply schemas that include a
645689
common base.
646690

691+
An alternative model is to encode vendor identity *inside* the
692+
identifier value itself (e.g., `"com.ptc.windchill:part:xyz"`) rather
693+
than in the key or namespace. This is attractive for its simplicity --
694+
a single "primary identifier" field can carry multi-system values if
695+
it accepts an array -- and it enables non-destructive composition
696+
(adding an identifier does not remove an existing one). However, it
697+
trades schema enforceability for encoding flexibility: tooling must
698+
parse a string convention rather than inspect typed schema fields, and
699+
fallback values, GUI discoverability, and schema-driven validation
700+
become unavailable for the structured portions of the identifier. The
701+
tension between these approaches is a key design decision for the
702+
solution proposal.
703+
647704
6. **Relationship to `displayName`.**
648-
How does the source identifier relate to the prim's `displayName`? In some
649-
workflows the display name *is* the source identifier; in others they
650-
differ. When multiple instances share a source identifier, deriving
705+
`displayName` is a UX convenience; the source identifier is the
706+
authoritative link to the originating system. While a display name
707+
*may* be derived from information in the source record, it has no
708+
semantic relationship to the identifier itself -- the identifier is the
709+
source of truth, and `displayName` should have no influence on it.
710+
When multiple instances share a source identifier, deriving
651711
`displayName` from it may be confusing for presentation (e.g., 30 doors
652712
all displaying the same catalog number). `displayName` substitution
653713
patterns -- as used for symmetry in rigging and for multiple instances of
@@ -670,21 +730,36 @@ of fragmented workarounds.
670730

671731
### Likely direction
672732

673-
TAC discussion has identified two candidate approaches, each with distinct
674-
trade-offs. The next phase of this work will evaluate both before committing
675-
to one.
733+
#### Emerging consensus
734+
735+
Discussion and review feedback have converged on several points:
736+
737+
- **Multi-field, not single-value.** Source identifiers are metadata
738+
packages, not atomic strings. Part numbers, revisions, serial numbers,
739+
and navigation criteria serve different roles and must be separable.
740+
Every domain that has contributed feedback confirms this.
741+
- **Multiple systems per prim.** A single prim may carry identifiers from
742+
more than one external system (e.g., Windchill and SAP). The mechanism
743+
must support this without collision.
744+
- **Any prim, with cost-aware discovery.** Identifiers are needed below
745+
model roots, but discovery must not require full stage traversal on
746+
large scenes (see [open question 4](#open-questions-for-discussion)).
747+
748+
#### Remaining design choice: mechanism
749+
750+
TAC discussion has identified two candidate approaches. The next phase
751+
will evaluate both before committing to one.
676752

677753
**Approach A: Extend `assetInfo` with stratified sub-dictionaries.**
678754
Domains register source identifiers as sub-dictionaries within `assetInfo`,
679755
with applied API schemas providing convenience access (following the
680756
`UsdMediaAssetPreviewsAPI` precedent).
681757

682758
**Approach B: Applied schema (likely multi-apply) with typed properties.**
683-
Applied schemas are a well-established USD mechanism; the question is
684-
whether to direct them at the cross-domain identifier problem as a
685-
standards framework. Source identifiers would be expressed as properties on
686-
an applied API schema, with each external system represented as a schema
687-
instance.
759+
Source identifiers are expressed as properties on an applied API schema,
760+
with each external system represented as a schema instance (e.g.,
761+
`sourceId:windchill`, `sourceId:ifc`). Each instance carries typed fields
762+
(part number, revision, etc.) with fallback values.
688763

689764
| | Approach A (`assetInfo` dictionary) | Approach B (applied schema) |
690765
|---|---|---|
@@ -697,10 +772,18 @@ schemas that include the base and add their own extensions. This encodes
697772
systems in concrete schemas rather than multi-apply instance names, but
698773
requires `UsdSchemaRegistry` query enhancements.
699774

775+
A third option -- encoding vendor and structure inside a single string or
776+
array field (e.g., `identifier=["windchill:x","sap:y"]`) -- has been
777+
raised. This trades schema structure for simplicity and is attractive for
778+
ad-hoc adoption, but collapses the per-system typed fields that both
779+
approaches above preserve. It may be useful as a lightweight fallback but
780+
is unlikely to serve as the primary mechanism given the multi-field
781+
consensus.
782+
700783
The remaining open questions above are intended to resolve which approach
701-
best serves the community, including scope (any prim vs. model roots),
702-
namespacing conventions, and how adjacent use cases (including authorship
703-
traceability) should be accommodated.
784+
best serves the community, including namespacing conventions and how
785+
adjacent use cases (including authorship traceability) should be
786+
accommodated.
704787

705788
### Risks
706789

@@ -912,49 +995,35 @@ The following materials were provided as input context for drafting:
912995
The draft was refined through multiple rounds of internal review. Key
913996
editorial decisions included:
914997

915-
- Explicitly naming the two distinct problems (unencumbered source identifier
916-
field vs. improved prim name ergonomics) based on reviewer feedback, and
917-
positioning this proposal as addressing the first without foreclosing the
918-
second.
919-
- Compressing and reframing the GUIDs discussion to serve the proposal's
920-
argument (GUIDs-as-primary-identifiers pressure is a symptom of the missing
921-
separation of concerns) rather than reading as a defensive digression.
922-
- Augmenting `assetInfo` analysis with `UsdModelAPI` and
923-
`UsdMediaAssetPreviewsAPI` as potential prototypes for a source identifier
924-
mechanism.
925-
- Correcting the IFC GlobalId characterization (GlobalIds are per-instance, not
926-
per-type) based on fact-checking against the IFC specification.
927-
- Adding external queryability as a design principle and cross-system
928-
resolution as an open question, based on reviewer feedback that the
929-
practical utility of source identifiers depends on the ability to resolve
930-
them from outside USD -- with the consumer responsible for building indexes
931-
on top of the mechanism.
932-
- Incorporating TAC feedback: adding authorship traceability as a related
933-
use case, updating next steps to reflect consensus trajectory, and adding
934-
PR submission as the first next step.
935-
- Incorporating TAC feedback on applied schema limitations: tempering the
936-
`UsdMediaAssetPreviewsAPI` pattern's characterization, presenting the case
937-
for true applied schemas (multi-apply or single-apply with base) as an
938-
alternative to the `assetInfo` dictionary approach, and restructuring the
939-
"Likely direction" section to compare both approaches with their trade-offs.
940-
- Adding vendor extensibility as a design principle, referencing cross-industry
941-
precedent (Khronos, IETF, W3C) for vendor-first deployment with a path to
942-
standardization.
943-
- Adding Khronos glTF and the W3C web platform as co-equal vendor extension
944-
precedents alongside Khronos graphics APIs and IETF: glTF as a 3D data
945-
interchange format whose extension model governs properties on objects;
946-
the W3C model for its consensus-driven staged maturity path (Community
947-
Group → Working Group → Recommendation) and its freeform/governed
948-
distinction (`data-*` attributes vs. standard attributes). Explicitly
949-
deferring vendor extension governance details (prefix conventions,
950-
registration process, promotion criteria) to the follow-up solution
951-
proposal.
952-
- Clarifying that a "vendor extension" is a specification-level concept (a
953-
schema, identifier scheme, or set of conventions) distinct from an OpenUSD
954-
plugin, which is a runtime implementation detail. This distinction follows
955-
the precedent set by the AOUSD Core Specification 1.0, which specifies
956-
schemas without prescribing a plugin or schema registry. Expanded the
957-
solution proposal next step to include the vendor extensibility model
958-
(prefix conventions, naming rules, registration, promotion criteria).
998+
- **Two-problem framing** -- named source-identifier and prim-name-ergonomics
999+
as distinct problems; positioned this proposal on the first without
1000+
foreclosing the second.
1001+
- **GUIDs discussion** -- reframed as a symptom of missing separation of
1002+
concerns, not a defensive digression.
1003+
- **`assetInfo` analysis** -- added `UsdModelAPI` and
1004+
`UsdMediaAssetPreviewsAPI` as prototype precedents.
1005+
- **IFC GlobalId correction** -- GlobalIds are per-instance, not per-type.
1006+
- **External queryability** -- added as a design principle and open question:
1007+
- Consumer-side indexing; mechanism must make this tractable.
1008+
- **TAC feedback (authorship, next steps)** -- authorship traceability as a
1009+
related use case; consensus-driven next steps; PR submission step.
1010+
- **TAC feedback (applied schemas)** -- tempered `UsdMediaAssetPreviewsAPI`
1011+
characterization; restructured "Likely direction" to compare dictionary
1012+
vs. applied-schema approaches with trade-offs.
1013+
- **Vendor extensibility** -- added as a design principle:
1014+
- Cross-industry precedent: Khronos (glTF, OpenGL/Vulkan), W3C, IETF.
1015+
- glTF `extensions`/`extras` parallels schema vs. `customData`.
1016+
- W3C staged maturity path; `data-*` vs. governed attributes.
1017+
- Governance details deferred to solution proposal.
1018+
- **Vendor extension vs. plugin** -- clarified as specification-level vs.
1019+
runtime distinction, citing AOUSD Core Spec 1.0 precedent.
1020+
- **PLM feedback (Steve Ghee, PTC)** -- expanded manufacturing section:
1021+
- Part number separated from revision; opaque handles; alternative
1022+
identifiers (OEM, replacement, service).
1023+
- New subsection: configurable products and composite keys.
1024+
- Scope open question: sub-model-root use cases + discoverability cost.
1025+
- Namespacing open question: vendor-in-value vs. key-level namespacing;
1026+
tension with schema enforceability.
1027+
- `displayName` open question: asserted independence from identifiers.
9591028

9601029
A prompt-level drafting log has been archived separately.

0 commit comments

Comments
 (0)