@@ -394,24 +394,48 @@ for round-trip fidelity.
394394
395395PLM systems assign stable identifiers -- part numbers, revision codes,
396396serial 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
408418In 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
416440If these identifiers are encoded into prim names, characters like hyphens and
417441periods 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+
6366805 . ** 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+
6477046 . ** 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.**
678754Domains register source identifiers as sub-dictionaries within ` assetInfo ` ,
679755with 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
697772systems in concrete schemas rather than multi-apply instance names, but
698773requires ` 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+
700783The 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:
912995The draft was refined through multiple rounds of internal review. Key
913996editorial 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
9601029A prompt-level drafting log has been archived separately.
0 commit comments