Design BOM Ingestion
RTMify Live ingests hardware Design BOMs from CSV exports, grouped Design BOM workbooks, and optional read-only Design BOM Sync sources. SolidWorks is one supported export source. The resulting graph anchors each product to a DesignBOM, its BOMItem tree, and any explicit requirement or test references declared on those BOM rows.
Design BOM is not an as-built record
This page describes the product design-intent structure: the named hardware BOM attached to a Product in the Live graph. It is distinct from an as-built BOM, device history record, or production history record, which would capture what was actually manufactured, serialized, substituted, or reworked in a specific build. Live uses the Design BOM to answer engineering traceability, coverage, and where-used questions; it is not a manufacturing execution log.
What Live supports now
| Source | Path | Notes |
|---|---|---|
| CSV export from SolidWorks, Altium, PLM, or ERP | Inbox drop or POST /api/v1/bom | Best fit for one BOM per submission. Same path also accepts hardware JSON, CycloneDX JSON, and SPDX JSON. |
| Design BOM workbook (.xlsx) | Inbox drop or POST /api/v1/bom/xlsx | Workbook must contain an exact Design BOM tab. Groups are split by full_product_identifier + bom_name and processed independently. |
| Secondary Design BOM Sync | Dashboard Settings → Design BOM Sync | Optional read-only secondary source. Supports Google Sheets, Excel Online, or a local XLSX file. |
Product prerequisite
Every hardware Design BOM is anchored to a Product by exact identifier. In the primary RTM workbook, the programmatically provisioned Product tab is:
assembly,
revision,
full_identifier,
description,
Product Status,
RTMify Status.
Exact match still matters
For single-file CSV and JSON ingest, a missing product still fails with BOM_NO_PRODUCT_MATCH. Grouped workbook/XLSX ingest is softer: missing-product groups are reported as warnings and do not abort the whole workbook.
Lifecycle semantics
Obsolete products are hidden from default Design BOM list, tree, item, usage, and impact views. Superseded and EOL remain queryable, but BOM gap views exclude them by default. Unknown nonblank Product Status values write back as PRODUCT_UNKNOWN_STATUS on the Product tab.
Column mapping
These are the hardware Design BOM columns Live understands today.
| Column | Required | Notes |
|---|---|---|
| bom_name | Yes | One named Design BOM within a product. CSV/JSON expect one bom_name per submission. Workbook/XLSX ingest can contain multiple groups. |
| full_identifier or full_product_identifier | Yes | Exact Product.full_identifier anchor. Workbook/XLSX ingest groups by this field plus bom_name. |
| parent_part | Yes | Parent item part number. |
| parent_revision | Optional | Blank or absent values default to "-". |
| child_part | Yes | Current row part number. |
| child_revision | Optional | Blank or absent values default to "-". |
| quantity | Yes | Occurrence quantity on the CONTAINS edge. |
| ref_designator | No | Preserved on the containment edge. |
| description | No | Stored on the BOMItem. |
| supplier | No | Stored on the BOMItem and preserved on the CONTAINS edge. |
| category | No | Stored on the BOMItem. |
| requirement_ids / requirement_id | No | Comma-, semicolon-, or pipe-separated requirement IDs. |
| test_ids / test_id | No | Comma-, semicolon-, or pipe-separated test or test-group IDs. |
| Notes / RTMify Status | Ignored for ingest | Accepted on workbook/XLSX input and ignored by Design BOM parsing. |
Critical operational detail: derive parent_part when the export is flat
SolidWorks and other flat BOM exports often need one reshape step before ingest. If you want a nested Design BOM tree, derive parent_part from the item-number hierarchy or assembly structure in the source export. The downloadable Design BOM workbook already uses the target column names.
Requirement and test trace fields
Requirement and test identifiers are first-class Design BOM trace input. Export them as BOM columns and map them to the dedicated trace columns below.
Requirement IDs
Map your source data to requirement_ids or requirement_id. Live stores the declared values on the BOMItem and creates REFERENCES_REQUIREMENT edges for exact matches to Requirement nodes.
Test IDs
Map your source data to test_ids or test_id. Live resolves exact IDs to Test first, then TestGroup, and creates REFERENCES_TEST edges for resolved matches.
Unresolved refs stay visible
If an ID does not resolve, the Design BOM still ingests. The raw IDs remain on the BOMItem, and the ingest response includes BOM_UNRESOLVED_REQUIREMENT_REF or BOM_UNRESOLVED_TEST_REF warnings instead of failing the ingest.
Ingest paths
Inbox drop
Drop .csv, .json, or .xlsx into the Live inbox. Successful BOM ingests move to processed/; failures move to rejected/.
cp design_bom.xlsx ~/.rtmify/inbox/
Warning-only BOM ingests still land in processed/; Live mirrors those warnings into runtime diagnostics.
HTTP API
Use POST /api/v1/bom for hardware CSV and hardware JSON. Use POST /api/v1/bom/xlsx for grouped Design BOM workbooks. Lifecycle-aware GET routes accept include_obsolete=true or include_inactive=true when you explicitly want non-current products.
curl -X POST http://127.0.0.1:8000/api/v1/bom/xlsx \ -H "Authorization: Bearer <token>" \ -F "file=@RTMify_Design_BOM_Template.xlsx"
The workbook route returns per-group status, warnings, and row counts instead of one all-or-nothing result.
Design BOM Sync
The dashboard settings expose an optional read-only secondary source named Design BOM Sync. That source is separate from the primary RTM workbook and supports Google Sheets, Excel Online, or a local XLSX file.
- —
GET /api/design-bom-sync - —
POST /api/design-bom-sync/validate - —
POST /api/design-bom-sync - —
DELETE /api/design-bom-sync
This source is read-only. Live ingests it but never writes status back into that workbook.
Replacement semantics
Same product + BOM name replaces the prior Design BOM
Design BOM replacement is keyed by (full_product_identifier, bom_type, bom_name). Re-uploading the same hardware BOM key replaces the prior Design BOM subtree for that product and name. If you want multiple hardware inventories to coexist, give them distinct bom_name values.
Graph shape
Product (full_identifier = "ASM-1000-REV-C")
└─[HAS_DESIGN_BOM]→ DesignBOM (bom_name = "pcba", bom_type = "hardware", bom_class = "design")
├─[CONTAINS qty=1]→ BOMItem (part = "PCB-SUB-001", revision = "A")
│ ├─[CONTAINS qty=4]→ BOMItem (part = "C0805-10UF", revision = "B")
│ │ ├─[REFERENCES_REQUIREMENT]→ Requirement (REQ-010)
│ │ └─[REFERENCES_TEST]→ Test or TestGroup (TG-007)
│ └─[CONTAINS qty=12]→ BOMItem (part = "R0402-10K", revision = "-")
└─[CONTAINS qty=2]→ BOMItem (part = "CONN-DF12-6P", revision = "A") The Design BOM hangs off the same Product node as requirements, risks, tests, serial numbers, and code evidence, so BOM-centered impact and coverage questions stay on the same graph.
How to query it
The key MCP affordances include:
get_bomandget_bom_itemfor tree and item drill-down, withinclude_obsoleteonget_bomlist_design_boms,find_part_usage,bom_gaps, andbom_impact_analysis, each with lifecycle override flags where relevant- the
design-bom://<full_product_identifier>/<bom_name>resource - prompts such as
inspect_bom_item_traceability,eol_impact,bom_coverage, andcomponent_substitute
Dashboard report availability
The Reports group in the dashboard includes a product-scoped Design BOM report in PDF, Markdown, and DOCX. Software inventory listings such as list_software_boms span both manual SOUP registers and automated CycloneDX/SPDX ingests.
Exporting from SolidWorks
Which BOM export to use
Use the assembly BOM export that gives you one row per child occurrence with part number, revision, quantity, and any custom property columns you need to preserve. Live ingests exported BOM rows, not the native SolidWorks assembly model.
Map custom properties to trace columns
If SolidWorks stores requirement or test identifiers in custom properties, export them as columns and rename them to requirement_ids and test_ids before ingest.
Reshape flat exports
If the export is flat, derive parent_part from the item-number hierarchy so Live can build a nested tree. Keep the final CSV aligned to the supported column schema.
Expected final CSV shape
The final exported file should look like any other hardware Design BOM CSV: one bom_name, one exact full_product_identifier, and the standard parent/child/quantity columns plus any optional trace fields.
Exporting from other sources
SolidWorks is only one source path. Altium or other EDA exports, PLM/ERP exports, and hand-built CSV or XLSX workbooks all work as long as the final artifact matches the supported hardware Design BOM column schema.
Known limits
| Limit | Current behavior |
|---|---|
| SolidWorks configuration semantics | Live ingests exported BOM rows, not the full SolidWorks model. Suppressed components or alternate configurations only appear if they are present in the exported BOM or workbook. |
| Unmapped CAD properties | Only mapped Design BOM columns are preserved. Other custom properties do not enter the graph. |
| Grouped workbook product missing | Workbook/XLSX ingest warns per group and continues. Single-file CSV/JSON ingest still hard-fails if the Product anchor is missing. |
| Design-history / chain semantics | BOM trace links are visible and queryable, but they do not yet change profile-chain gap logic or design-history semantics. |
Error and warning reference
- —
BOM_NO_PRODUCT_MATCH— single-file CSV or JSON targeted a Product that does not exist - —
NO_DESIGN_BOM_TAB— workbook upload did not contain aDesign BOMtab - —
BOM_UNRESOLVED_REQUIREMENT_REF— a declared requirement ID did not resolve - —
BOM_UNRESOLVED_TEST_REF— a declared test or test-group ID did not resolve - —
BOM_CIRCULAR_REFERENCE— ingest detected a cycle in the BOM tree - —Workbook/XLSX grouped ingest reports missing-product groups as warnings rather than aborting the whole upload
- —Invalid workbook bytes return
invalid_xlsxfromPOST /api/v1/bom/xlsx