The recursive PURIS path is a partner-to-partner traversal for anonymized PURIS aspect models.
The root caller starts a recursive job with a globalAssetId, an openingId, the recursive PURIS use case and the anonymized aspect bundle.
This use case is different from the ESS recursive investigation described in the adjacent ESS runtime section.
The supported use case is PURIS_ITEM_STOCK_ANONYMIZED_RECURSIVE.
It traverses SingleLevelBomAsPlanned version 3.0.0 and collects anonymized PURIS payloads.
Only the asPlanned lifecycle is supported.
Participants
| Participant | Responsibility |
|---|---|
Root caller |
Starts the recursive job and reads the final aggregated result. |
Local IRS |
Validates the chain opening grant, resolves the local digital twin, reads the local BOM, filters direct children by grant and coordinates child requests. |
Child IRS |
Receives a recursive REQUEST, validates the same chain opening, processes its direct children and returns a recursive RESPONSE to the parent. |
EDC |
Provides catalog, contract negotiation, data transfer and notification transport between partners. |
Digital Twin Registry |
Provides shell descriptors and submodel descriptors for BOM, PartTypeInformation and anonymized payload aspects. |
Submodel provider |
Provides the BOM and anonymized PURIS aspect payloads through the EDC data plane. |
Overall flow
Processing steps
The sequence diagram shows the technical message flow. The following table summarizes it as ten business processing phases.
| Phase | Actor | Action |
|---|---|---|
1 |
Root caller |
Starts a recursive job via |
2 |
IRS |
Validates the request, resolves default values and validates the local chain opening grant before creating the root job. |
3 |
IRS |
Looks up the root shell in the Digital Twin Registry and selects the supported |
4 |
IRS |
Reads the BOM submodel through the EDC submodel access flow and filters direct children by the local chain opening grant. Filtered partners are not exposed to the caller. |
5 |
IRS |
Creates and persists one direct child branch per valid, grant-allowed BOM child. |
6 |
IRS |
Sends recursive REQUEST notifications to allowed direct children through EDC. |
7 |
Child IRS |
Performs the same processing for its own direct children. It collects its own anonymized aspect payloads unless it is the root job. |
8 |
Child IRS |
Remains in |
9 |
Child IRS |
Aggregates its local node, child nodes and tombstones and sends a recursive RESPONSE to its parent. |
10 |
Root IRS |
Aggregates all received direct child results and exposes the final result via |
BOM descriptor handling
The recursive PURIS path supports exactly SingleLevelBomAsPlanned version 3.0.0.
If no SingleLevelBomAsPlanned descriptor is present, the current asset is a leaf and no child branches are created.
If a SingleLevelBomAsPlanned descriptor is present with an unsupported version, the branch fails with a sanitized tombstone.
The branch also fails with a sanitized tombstone when the supported descriptor is ambiguous or does not expose a usable EDC endpoint.
For a root job, these descriptor errors fail the root job itself because there is no parent branch.
Grant boundary
The recursive path does not discover and traverse the complete BOM without an explicit chain opening grant. Every hop validates a grant before it can continue. The grant only contains direct child partners for the local hop. This means a tier knows:
-
the parent that called it
-
its own direct children from its BOM
-
the direct children allowed by the local grant
It does not know the full upstream or downstream chain. Grant-filtered partners are local information and must not be represented in parent-facing tombstones or counters.
Payload boundary
Productive recursive PURIS jobs use anonymized PURIS aspect models. The IRS does not transform non-anonymized PURIS payloads into anonymized payloads. Instead, it requests only the allowed anonymized aspect semantic IDs from the provider.
The result model contains a material tree:
-
childItemsfor BOM child nodes -
materialNumberandmaterialNamefrom PartTypeInformation, if available -
quantityfrom the BOM relationship -
itemsfor collected anonymized aspect payloads at the material node -
tombstonesfor sanitized errors associated with the material node
Root-level tombstones are used for failures that cannot be assigned to a specific material node.
Timeouts
The root job has one overall deadline. Each child receives an expected response timestamp before that deadline. The safety buffer gives each tier time to aggregate and send its response upstream.
If a child does not answer before the child response deadline, the parent marks the child branch as timed out and continues aggregation. A timeout therefore results in a terminal response with a partial or failed business result instead of an indefinitely running job.
Job phases
The recursive path stores its own job phase and maps it to the generic IRS job state in the API response.
| Recursive phase | API job state | Meaning |
|---|---|---|
|
|
The request and local chain opening grant have been accepted. BOM resolution, partner filtering and local processing are queued or running. |
|
|
Child requests were sent and the job waits for all expected child responses or for the child response deadline. |
|
|
The recursive job is terminal and a recursive result is available. The business result can still be |
|
|
The recursive job is terminal because validation, grant handling, traversal, persistence or deadline handling failed the job. |
Result status
| Status | Meaning |
|---|---|
|
The aggregation finished without tombstones. The material tree can still be empty, for example when the requested root asset is a leaf and root payload collection is not part of the supported PURIS use case. |
|
At least one tombstone is present and the material tree still contains usable data. |
|
No usable material tree could be produced, or the job was failed by validation or deadline handling. |
The technical job state and the business result status are intentionally separate.
A job can be technically COMPLETED while its result.resultStatus is FAILED.
Operational limits
The recursive job store has no API delete operation, so persisted jobs must be removed through the configured blob-store retention. For MinIO this requires a lifecycle rule on the jobs bucket. The recursive path should be operated with one IRS replica unless an external mechanism serializes updates to the same persisted recursive job. Large chains can create large result trees because no recursive tree-size or payload-size limit is enforced by the recursive aggregation. The notification endpoint also has no recursive request-size limit; large incoming notifications should be limited by the surrounding runtime or ingress setup.
Cross-cutting contracts
State consistency, message correlation, notification validation, privacy and restart recovery apply across all recursive processing steps. They are described in Recursive IRS concepts.