THE MASTER MODEL
Teamcenter Data-Model Mapping
Every element in the neutral bundle lands in Teamcenter as a first-class business object with its native type — not a blob attached to a dataset, not a property bag. This page is the exact map: bundle element to Teamcenter type, the nested Logical BOM that carries four domains in one tree, and the identity rules that make every re-publish an update instead of a duplicate.
Why real types matter
We could have stamped each publish into Teamcenter as an opaque file and called it integration. We deliberately did not. Every publish materializes typed items, typed relations, and real BOM occurrences — and that decision pays three ways:
Searchable. Objects we create come back through Active Workspace global search with correct type facets — during bring-up a single test round returned its objects faceted as System Block Revision, Function Revision, Logical Connection Revision, and Exchange Item Revision, with Teamcenter's own function icons. No custom index, no side database.
Viewable. Active Workspace renders our structure with its stock views: the Content tree walks the LBOM occurrences, Teamcenter auto-draws an Architecture diagram of nested System Blocks, GDE ports surface in the Interfaces views, and Seg0Allocate edges appear in the Relations graph. We wrote no viewer for any of that.
Survives us. Because the objects are native, Teamcenter's own business rules bind them — naming rules, GRM rules, structure rules. That is occasionally restrictive (see the error-46147 story below), but it is exactly why the data is trustworthy: any downstream consumer — change management, workflows, another integration — sees ordinary Teamcenter data. If our middleware disappeared tomorrow, the master model stands.
The mapping table
Every row below was created, re-published, and read back live on Capital 2512 ⇄ Teamcenter 2506 proven live. Types are configuration, not code: tc-service/config.json keys under teamcenter.* select them, so an instance that prefers the Arcadia/Capella family swaps Fnd0LogicalBlock for Sys0LogicalComp without touching a line of the pipeline.
| Bundle element | Teamcenter type | How it attaches | Notes |
|---|---|---|---|
components[] | Fnd0LogicalBlock (config componentType; Sys0LogicalComp for Arcadia instances) | Item + occurrence in the LBOM | Item id = the bundle id; ensure-then-create is idempotent |
functions[] | Functionality (config functionType; Sys0LogicalFunc alternate) | Item | Related to blocks via allocations; never LBOM occurrences of their own |
allocations[] | Seg0Allocate | Revision level: block revision ← function revision | The GRM rule demands revisions — item-level is rejected (error 89020) |
components[].ports | Fnd0LogicIntrfce | GDEs attached as GDELine occurrences in the component's own structure | This is precisely what feeds AW's Interfaces views |
| function ports | Network_Port | GDE under the owning Functionality | Direction = fnd0Direction, LOV values fnd0Input / fnd0Output / fnd0Bidirectional — plain "Output" is rejected; read via dbValues, not uiValues |
signals[] | Signal | Item | The E/E payload |
| signal exchanges (derived, one per routed signal) | Network (Item > PSConnection) | Trace-linked to its Signal and both Network_Port endpoints at revision level | Gives every flow a directed, port-anchored edge |
networks[] (carriers) | Fnd0LogicConn (config carrierType) | Item | Signal-to-carrier assignment recorded as Seg0Allocate connection rev ← exchange rev |
connections[] | Fnd0LogicConn | FND_TraceLink to both endpoint blocks | Seg0Allocate connection rev ← carrier rev when a carrier implements the edge; names derived human-readable ("COMP2 - COMP1 via Carrier 1") |
| interface contracts | Seg0Interface + Seg0IntfSpec | One Seg0Interface (contract) per connection, one Seg0IntfSpec (exchange item) per signal | Bound via Seg0ExchangeAllocation, Seg0InterfaceAssignment (offering Provided/Required — creatable only through createObjects with tagProps) and Seg0Implements |
requirementLinks[] | Requirement + IMAN_requirement relations | Relations only — never LBOM occurrences. Primary = the satisfying element revision, secondary = the requirement revision (item-level fallback if the GRM rule rejects) | The type enforces the id naming rule "REQ-"nnnnnn (six digits): REQ-123 is rejected, REQ-000123 passes |
| logic devices / connectors | componentType items with revision seg0Kind = LogicDevice / LogicConnector | Devices nest under the platform component they realize; connectors under the LBOM root | Why not a dedicated type — see the callout below |
| conductors (logic nets/wires) | Fnd0LogicConn | Trace-linked to their endpoint device and component items | Round-trips: the extractor rebuilds them with device-level endpoints |
Sys0LogicalComp fails. So detail items stay componentType, and the device/connector distinction rides on the revision's native seg0Kind attribute. Two hard-won mechanics: seg0Kind is multi-valued (send stringArrayProps, not stringProps), and it must be stamped at creation via createObjects compound create input — property updates are a silent no-op on the 2506 JSON gateway (every setProperties variant returns success and writes nothing; probe-verified).The effective type map, as deployed:
"teamcenter": {
"componentType": "Fnd0LogicalBlock",
"functionType": "Functionality",
"allocationRelation": "Seg0Allocate",
"portType": "Fnd0LogicIntrfce",
"functionPortType": "Network_Port",
"signalType": "Signal",
"networkType": "Network",
"carrierType": "Fnd0LogicConn",
"requirementType": "Requirement", // code default, overridable
"requirementRelation": "IMAN_requirement", // code default, overridable
"runTag": "",
"legacyRunTags": ["T7"]
}
One nested LBOM, four domains
The structural backbone is a single root Fnd0LogicalBlock named <PROJECT>-LBOM. Everything beneath it is a real Fnd0LogicalBOMLine parent-child occurrence — native BOM structure that Active Workspace rolls up on its own, not a web of trace links.
With contract v1.2, the MIL-STD-1808 logical spine becomes the parent skeleton: UAV is the root's single top occurrence, the chapter nodes (24 Electrical Power, 28 Fuel) and chapter groups hang beneath it, and every domain-authored element nests under the spine node named by its parentId. Logic devices nest one level further — under the platform component they realize. The result is one tree spanning what four tools authored: the SysML spine sysml and its architect additions sysml-add, Capital's platform schematic elec and new electrical elements elec-add, and NX fuel equipment fuel-add — each element carrying its provenance and effectivity as stamped properties.
How a published component becomes an occurrence in that tree:
We look the bundle id up in Teamcenter (getItemFromId) and create the typed item only if it is missing. Existing items are adopted, never re-minted.
The hub resolves parentId first among items created in the same push, then live in Teamcenter — so a fuel publish can nest under a spine node the SysML seed created weeks earlier. An unresolvable parent is reported in summary.errors and the element falls back to the LBOM root: a visible failure, never silent wrong-nesting.
ensure_structure opens the parent's BOM window, diffs existing children, adds only what is missing, and saves. Re-publishing the same structure adds zero occurrences.
TC_PROVENANCE, TC_EFFECTIVITY, and the MIL-address properties ride on the object (demo semantics: stamped properties, not Teamcenter unit effectivity — we say so out loud).
Proven on the UAV Platform: the full spine push landed with nested_parents = 15, occurrences_added = 25, errors = [] proven live, and the live step-7 beat — a breaker drawn in Systems Architect — created one item and one occurrence nested under LOG-ACFSCB with zero errors. Requirements deliberately stay out of this tree: they connect by relation only, keeping the root → UAV structure pristine.
Identity: item ids are the join key
One id follows an element through every tool. The Teamcenter item id is the bundle id is the Element ID property in Capital. When the hub materializes Teamcenter data into a Capital project, every function and component carries <property name="Element ID"> = its TC item id — the same slot the Cameo bridge uses for SysML GUIDs. When Capital publishes back, external-id resolution runs TC_ID property → Element ID property → Capital UID. That chain is what closed the round trip at Wildfire scale: TC-author → materialize in Capital → publish back = 0 items created, 134 existing, 199 relations existing, 0 errors.
Names are never identity — a rename changes a mutable display property, never the id. And because regenerating a logical design mints all-new Capital-internal UIDs, the logic publisher derives stable ids from what survives regeneration:
| Element | Item-id convention | Example |
|---|---|---|
| Spine node | MIL-<address, spaces→hyphens>[-SLUG] | MIL-28-10-STORAGE-INVERTED |
| Logic device | <component id>-DEV (keyed on the device's Component_Base_ID back-link) | T7WF-CMP-ECN-DEV |
| Logic connector | <PROJ>-LC-<name> (bundle id owner-qualified: LC-<ownerKey>-<name>) | WILDFIRE_PLATFORM-LC-P4 |
| Logic net / wire | LNET-<name> / LWIRE-<name>, uniquified in document order | LNET-COND1 |
| Requirement | "REQ-"nnnnnn (native TC naming rule) | REQ-000123 |
| LBOM root | <PROJECT>-LBOM | UAV_PLATFORM-LBOM |
runTag namespacing. During bring-up, every test round prefixed all created ids and names with a tag (T1…T7) — disposable namespaces inside a shared instance. Production runs with runTag = "", and that is mandatory: cross-publish parent resolution looks spine ids up untagged, so a lingering tag silently breaks nesting. Estates minted under an older tag are not stranded — teamcenter.legacyRunTags lets the push adopt those ids instead of re-minting (production mode only). The Wildfire T7 estate was adopted exactly this way: the publish-back reported zero creates.
What Active Workspace shows
Because the mapping targets native types, Active Workspace is a working client of this data with no customization. Opening <PROJECT>-LBOM in Content renders the nested logical structure exactly as published: one child UAV, the 1808 chapters beneath, and fuel, electrical, and logic-detail elements nested under their logical parents.

Fnd0LogicalBOMLine occurrences.The port GDEs we attach are the exact objects AW's Interfaces views read — Fnd0LogicIntrfce and Network_Port GDELine occurrences surface as interfaces on the block occurrences. The Relations graph shows Seg0Allocate edges from any revision node. And requirements navigate both ways: open REQ-000123 and its IMAN_requirement relations fan out to the seven inverted-flight function revisions (satisfies) and the two architecture adds (derives); open any function revision and the relation points back.

REQ-000123 "Sustain 5 minutes of inverted flight at full power" — nine live trace relations, zero LBOM occurrences.TC_Connected_To appearance-path relations), which item-level trace links don't feed — enabling that wiring is a Teamcenter-admin work item on the handoff list, not a contract change. Everything else on this page renders in stock AW today.