Skills
TC Traceability Matrix
Skill
tc-traceability-matrix. Generate and COUNT a Teamcenter Trace Link Matrix, in Active Workspace and headlessly over SOA, including RFP Section 4 verification matrices. Covers the two ways to get an empty matrix with no error (direction is enforced, and the trace link type filter silently matches nothing), the undeclared response shape, the fact that a generated matrix is a transient view that is lost unless saved, and how a Product Configurator context makes the same matrix configurable per product variant. Use for any traceability or verification matrix, coverage figure, or "the matrix looks empty" investigation.
A matrix that renders is not a matrix that is right. Over a structure missing rows it draws a smaller grid and looks perfectly healthy. Always compare the cell count against an independent count of the links, from a different instrument.
Run status: EXERCISED on vm2606 (TC 2606) 2026-08-15. 22 rows, 37 cells, matching an
independent GRM-walk count of 37. Reference implementation:
se-process-skills/demos/jpo-f35/stage1b-verification-matrix/run_matrix.py.
Prerequisite that is usually the real problem
The matrix reads occurrences, not the IMAN_specification attachment relation. A
specification whose requirements are only attached, never placed, produces an empty
matrix while its Relations tab looks complete. Get tc-requirement-spec-content right
first; most "empty matrix" investigations end there.
In Active Workspace
- Global search, select both structures (ctrl-click). Banner must read 2 Selected. Accepts specifications, items, folders or parameter projects.
- More Commands (...) > New > Generate Trace Link Matrix.
- Matrix Type:
- Quick - only direct links between the two selected objects. Between two specs that is usually nothing, because the links live on their children.
- Full-Rollup - rolls up the children. This is the one you want. Runs in the background and notifies when done.
- Dynamic - all connections regardless of structure.
- The matrix opens in a NEW BROWSER TAB. ★★ This is the single most confusing thing about the feature. It does not appear in the work area you launched it from, and the "Traceability Matrix Generated" notification is a job-finished message that is not a link and reopens nothing. Looking for it in the original tab, in Newstuff, or via the notification all fail, and each failure looks like the matrix was never produced. Check your browser tabs.
- Press Save on the result, name it, and it becomes a real
Awp0TraceabilityMatrixobject you can reopen. Until then it is a transient view and navigating away discards it.
★★ Reopening a SAVED matrix, which is harder than saving it
A saved Awp0TraceabilityMatrix is not where you would look for it. Measured on vm2606
2026-08-16:
- It lands in Newstuff, not in the work area you generated it from.
- Global search cannot find it. Filtering the Type facet on "Trace" returns No results found, so the type is not searchable. Searching its exact name returns 8690 other things and not the matrix.
#/showObject?uid=...does not exist on this tier; it returns "Missing Page".
The route that works, read off the address bar after clicking through Explorer:
#/com.siemens.splm.clientfx.tcui.xrt.showObject?pageId=tc_xrt_Traceability&s_uid=<parent folder>&uid=<matrix>
pageId=tc_xrt_Navigate is accepted and rewritten to tc_xrt_Traceability for this type.
⚠ Run the control before concluding the type is the problem. #/showObject failing on the
matrix looks exactly like "a traceability matrix has no summary page". The same route fails
identically on a plain FOLDER, which certainly has one, and that is what proves the route was
wrong rather than the type being special.
⚠ Full-Rollup runs in the BACKGROUND, so the new tab may take a while to appear. Quick Matrix renders immediately, and once both structures have occurrences a Quick Matrix over two specifications draws the full grid, so prefer Quick while iterating.
Headless, which is also how you count it
Internal-Requirementsmanagement-2012-10-RequirementsManagement/getTraceabilityMatrix
{"inputs":[{"clientId":"c1",
"sourceLine":{"uid":"<BOMLine>"},
"targetLine":{"uid":"<BOMLine>"},
"filterTypes":[],
"filterFormat":"NO_FILTER"}]}
sourceLine and targetLine are BOMLines, not objects. Get them from
Cad-2019-06-StructureManagement/createOrReConfigureBOMWindows (see tc-bom-structure
for that struct, every member required, NULLTAGs not omissions).
★★ Two ways to get an empty matrix with NO error
Both return output: [{"clientId": ""}] with no fault and no partial errors, which
reads exactly like "this matrix has no trace links":
- Direction is enforced. Source must be the from side of the links. For a
Section 3 x Section 4 verification matrix that is requirements as
sourceLineand verification requirements astargetLine. Swap them and you get the empty body. - The type filter silently matches nothing.
filterTypes: ["IAV0ReqmtEBOMOccTL"]withDO_FILTERorDO_FILTER_SUBTYPEreturns the empty body, whileNO_FILTERover the identical lines returns the real map. The spelling the filter wants is not known. Default toNO_FILTERand do not turn the filter on until someone finds the right spelling AND proves it against a known-good count.
★ The response shape, which the XSD does not declare
output[0].traceabilityMap is a two-element structure, not a list of cells:
traceabilityMap[0] -> the row BOMLines (e.g. 22 requirements)
traceabilityMap[1] -> a PARALLEL list of per-row cell lists
Cell count is sum(len(c) for c in traceabilityMap[1]). A first implementation walked
the whole payload counting anything with a uid and returned 0, because it never
reached the nested lists. Counting a structure you have not pinned is how you publish a
confident wrong number.
What a good run looks like
rows : 22
rows with >=1 trace link : 22 <- no uncovered requirements
TOTAL CELLS : 37
links per row : {1: 9, 2: 11, 3: 2}
Cross-check the 37 against a count obtained a different way, for example walking
expandGRMRelationsForPrimary outward from each source requirement. Two instruments
agreeing is the evidence; one instrument is a number.
Product Configurator: the matrix and the configurator are the same thing
CreateWindowsInfo3 carries a configContext member alongside the revision rule,
and getOccurrences4's config carries variantRules. So the configurator is not
a second feature bolted onto the matrix: it is the configuration of the window the
matrix is computed over.
Open both structure windows with a configurator context and a variant rule, regenerate,
and the matrix redraws over the configured lines. Run run_matrix.py --config-context <id> once per variant; the cell counts must differ, and the difference must match
the variant conditions you wrote. A matrix that merely looks different is not
evidence that filtering happened.
Variant conditions attach to occurrences (select occurrences > Variant Conditions tab), which is the second reason a folder-based matrix is a dead end: a folder has
members, not occurrences, so it can never be variant-configured. Set them with
InternalConfigurator-2015-10-ConfiguratorManagement/setVariantExpressions.
⚠ A child with no variant condition shows regardless of the applied variant. That is the correct default for version-independent rows, and it also means "the row is still there" is not proof your condition works. Prove it with a row that should disappear.
The VCRM is a different artefact, and the shipped LOV is built for it
A Verification Cross Reference Matrix (MIL-STD "Table 4-1") is not the trace link matrix. Both are wanted and neither substitutes:
| Trace Link Matrix | VCRM | |
|---|---|---|
| columns | the verification requirements | a FIXED method vocabulary, N I A g f L G F |
| cells | link counts | X |
| role | the evidence that the claim is real | the deliverable that goes in the proposal |
★★ IAV0VerifMethodLOV is already a VCRM legend. Six of the eight columns map to a
shipped value exactly: N/A, Inspection, Analysis, Lab Test, Ground Test,
Flight Test. Not a coincidence, since iav0verificationmanagement is the aerospace
certification module. Choose verification methods FROM the legend when you assign
them, or the VCRM cannot be populated later without re-doing the assignment.
⚠ g (ground demonstration) and f (flight demonstration) BOTH map to the single
shipped value Demo. Populating both needs two site LOV values or the flavour on the
method description. This is the only place the vocabulary is short of the legend.
Assign per requirement, not per technique. A blanket technique-to-method map collapses the columns and produces a VCRM that is technically correct and says nothing. A 15-year supplier availability horizon is verified by INSPECTION of a written commitment; random vibration survival is a LAB TEST because no model settles solder joint life. That per-requirement judgement is the difference between a lookup table and a verification plan.
★ State why an empty column is empty. An unmarked column is either a decision or a gap and they look identical. Record the reason next to the mapping and print it with the matrix, so "no flight test rows" reads as scope rather than as an omission.
Related
tc-requirement-spec-content (the prerequisite), tc-bom-structure,
tc-relations-traceability, tc-capture-awc-calls, diagnose-silent-failure.
Generated from skills/tc-traceability-matrix/SKILL.md in the tc-automation-skills library, which is the canonical copy and also serves as the agent skill set for Teamcenter work.