From 8d37bc1dd27b034bed7315bf4a1b121951ec4cf6 Mon Sep 17 00:00:00 2001 From: FScholPer Date: Fri, 4 Jul 2025 07:16:11 +0200 Subject: [PATCH 001/214] docs: added nonipc feature(#916) --- docs/features/non-ipc/index.rst | 120 +++++++++++++++ docs/features/non-ipc/requirements/index.rst | 146 +++++++++++++++++++ docs/requirements/stakeholder/index.rst | 10 ++ 3 files changed, 276 insertions(+) create mode 100644 docs/features/non-ipc/index.rst create mode 100644 docs/features/non-ipc/requirements/index.rst diff --git a/docs/features/non-ipc/index.rst b/docs/features/non-ipc/index.rst new file mode 100644 index 00000000000..b698b3ffd2c --- /dev/null +++ b/docs/features/non-ipc/index.rst @@ -0,0 +1,120 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +.. _non-ipc_feature: + +NonIPC Communication +#################### + +.. document:: NonIPC Communication + :id: doc__nonipc + :status: valid + :safety: ASIL_B + :tags: feature_request + + +.. toctree:: + :maxdepth: 2 + + ./requirements/index + + +Feature flag +============ + +To activate this feature, use the following feature flag: + +``experimental_nonipc_com`` + +Abstract +======== + +This feature provides mechanisms for communication and data exchange between processes without using IPC. +It includes two classes of communication/data-exchange: + +1. One-way data sharing into a VM for (vehicle) state read-only for the VM (snapshot state) + - Read-only for consumer (VM) + - Support for consistent data-sets (consumer must be able to get a consistent version of related data items) + - Consistent access must be lock-free + - Producer time stamps shall be available for related data-sets + +2. Streamed data based on shared queues (stream of events or data) + - Queues shall be configurable by client (VM) (number of elements etc..) + - Size of a queue + - Allocation of buffers for the data elements + - Queues shall support lock-free access to data elements + - Support for bi-directional communication via writable data elements by the client + - Asynchronous bi-directional support via multiple queues + +Motivation +========== + +NonIPC communication mechanisms are essential to ensure efficient and reliable data exchange between processes, especially in scenarios where IPC may not be suitable or desired. + +Rationale +========= + +These communication mechanisms are developed to address specific needs for data sharing and streaming in a VM environment, ensuring consistent and lock-free access to data. + +Specification +============= + +The NonIPC communication feature consists of the following mechanisms: + +- **One-way data sharing**: Allows read-only access to vehicle state data in a VM, ensuring consistency and lock-free access. +- **Streamed data**: Utilizes shared queues for streaming events or data, configurable by the client, supporting bi-directional communication. + +General requirements: +--------------------- + +- Multiple chunks of shared memory shall be supported to allow required access control. +- Notifications for data updates shall be available (virtual IRQs in a VM). +- Notifications shall be configurable by consumers of data (using flags or watermarks in shared memory from client to producer). + +Backwards Compatibility +======================= + +As this is a new feature, there are no backwards compatibility concerns. + +Security Impact +=============== + +NonIPC communication mechanisms present varying security risks as vulnerabilities could affect multiple components simultaneously. +Each mechanism requires individual security impact analysis based on its functionality and usage patterns. + +Safety Impact +============= + +- Due to wide usage of these communication mechanisms throughout the platform, extra care is needed in design, implementation, and testing to minimize safety impact. +- Mechanisms are developed at various integrity levels from QM (non-safety) up to ASIL-B, depending on their intended use cases. + +License Impact +============== + +The NonIPC communication mechanisms are licensed under Apache License 2.0. + +How to Teach This +================= + +Each mechanism is expected to have a user manual that includes an API reference and usage examples where necessary. + +Rejected Ideas +============== + +There are no rejected ideas related to the NonIPC communication feature at this time. + +Open Issues +=========== + +There are currently no open issues related to the NonIPC communication feature. diff --git a/docs/features/non-ipc/requirements/index.rst b/docs/features/non-ipc/requirements/index.rst new file mode 100644 index 00000000000..6af5831dfef --- /dev/null +++ b/docs/features/non-ipc/requirements/index.rst @@ -0,0 +1,146 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +Requirements +############ + +.. feat_req:: One-way data sharing into a VM + :id: feat_req__nonipc__one_way_sharing + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__vm + :status: valid + + The system shall support one-way data sharing into a VM for vehicle state read-only for the VM (snapshot state). + +.. feat_req:: Read-only access for VM + :id: feat_req__nonipc__readonly_vm + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__vm + :status: valid + + The consumer (VM) shall have read-only access to the shared data. + +.. feat_req:: Consistent data-sets + :id: feat_req__nonipc__consistent_data + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__vm + :status: valid + + The system shall support consistent data-sets, allowing the consumer to obtain a consistent version of related data items. + +.. feat_req:: Lock-free access + :id: feat_req__nonipc__lock_free_access + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__vm + :status: valid + + Consistent access to data must be lock-free. + +.. feat_req:: Producer time stamps + :id: feat_req__nonipc__producer_timestamps + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__vm + :status: valid + + Producer time stamps shall be available for related data-sets. + +.. feat_req:: Streamed data based on shared queues + :id: feat_req__nonipc__streamed_data + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__vm + :status: valid + + The system shall support streamed data based on shared queues (stream of events or data). + +.. feat_req:: Configurable queues + :id: feat_req__nonipc__configurable_queues + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__vm + :status: valid + + Queues shall be configurable by the client (VM), including the number of elements and buffer allocation. + +.. feat_req:: Lock-free queue access + :id: feat_req__nonipc__lock_free_queue + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__vm + :status: valid + + Queues shall support lock-free access to data elements. + +.. feat_req:: Bi-directional communication + :id: feat_req__nonipc__bi_directional_comm + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__vm + :status: valid + + The system shall support bi-directional communication via writable data elements by the client. + +.. feat_req:: Asynchronous support + :id: feat_req__nonipc__async_support + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__vm + :status: valid + + The system shall provide asynchronous bi-directional support via multiple queues. + +.. feat_req:: Shared memory chunks + :id: feat_req__nonipc__shared_memory + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__vm + :status: valid + + The system shall support multiple chunks of shared memory to allow required access control. + +.. feat_req:: Data update notifications + :id: feat_req__nonipc__data_notifications + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__vm + :status: valid + + Notifications for data updates shall be available (virtual IRQs in a VM). + +.. feat_req:: Configurable notifications + :id: feat_req__nonipc__config_notifications + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__vm + :status: valid + + Notifications shall be configurable by consumers of data (using flags or watermarks in shared memory from client to producer). diff --git a/docs/requirements/stakeholder/index.rst b/docs/requirements/stakeholder/index.rst index 3e5571085e8..3bbacae115c 100644 --- a/docs/requirements/stakeholder/index.rst +++ b/docs/requirements/stakeholder/index.rst @@ -457,6 +457,16 @@ Communication The platform shall support intra-process communication. +.. stkh_req:: Non-Intra-process Communication + :id: stkh_req__communication__vm + :reqtype: Functional + :security: NO + :safety: QM + :rationale: Application software typically maps software building blocks into the same process. + :status: valid + + The platform shall support not only IPC but also intra VM communication. + .. stkh_req:: Stable application interfaces :id: stkh_req__communication__stable_app_inter :reqtype: Functional From 0762b22f25969a912c70fbd35855f47e4489fe30 Mon Sep 17 00:00:00 2001 From: FScholPer Date: Tue, 8 Jul 2025 08:14:10 +0200 Subject: [PATCH 002/214] fix: renamed dir (#916) --- docs/features/{non-ipc => nonipc}/index.rst | 0 docs/features/{non-ipc => nonipc}/requirements/index.rst | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename docs/features/{non-ipc => nonipc}/index.rst (100%) rename docs/features/{non-ipc => nonipc}/requirements/index.rst (100%) diff --git a/docs/features/non-ipc/index.rst b/docs/features/nonipc/index.rst similarity index 100% rename from docs/features/non-ipc/index.rst rename to docs/features/nonipc/index.rst diff --git a/docs/features/non-ipc/requirements/index.rst b/docs/features/nonipc/requirements/index.rst similarity index 100% rename from docs/features/non-ipc/requirements/index.rst rename to docs/features/nonipc/requirements/index.rst From 91da41e6d7c2fff83d92aaee5657ce2e8a2659a6 Mon Sep 17 00:00:00 2001 From: FScholPer Date: Tue, 8 Jul 2025 09:10:13 +0200 Subject: [PATCH 003/214] fix: removed idents as this leads to strage errors(#916) --- docs/features/nonipc/index.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/features/nonipc/index.rst b/docs/features/nonipc/index.rst index b698b3ffd2c..3c94d866c45 100644 --- a/docs/features/nonipc/index.rst +++ b/docs/features/nonipc/index.rst @@ -51,8 +51,9 @@ It includes two classes of communication/data-exchange: 2. Streamed data based on shared queues (stream of events or data) - Queues shall be configurable by client (VM) (number of elements etc..) - - Size of a queue - - Allocation of buffers for the data elements + - Size of a queue + - Allocation of buffers for the data elements + - Queues shall support lock-free access to data elements - Support for bi-directional communication via writable data elements by the client - Asynchronous bi-directional support via multiple queues From 2c68e085dff91f9fa0d54639db41f4989b9ea1b9 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres Date: Wed, 6 Aug 2025 14:13:17 +0200 Subject: [PATCH 004/214] switched to new name and changed wording somethimes --- .gitignore | 4 +++ .../crossvm}/index.rst | 30 +++++++++---------- .../crossvm}/requirements/index.rst | 26 ++++++++-------- docs/features/communication/index.rst | 1 + docs/requirements/stakeholder/index.rst | 6 ++-- 5 files changed, 36 insertions(+), 31 deletions(-) rename docs/features/{nonipc => communication/crossvm}/index.rst (77%) rename docs/features/{nonipc => communication/crossvm}/requirements/index.rst (87%) diff --git a/.gitignore b/.gitignore index c95b6c59b7a..4b5e075791d 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,7 @@ __pycache__/ # Mac .DS_Store + +# IDE +/.clwb +/.idea diff --git a/docs/features/nonipc/index.rst b/docs/features/communication/crossvm/index.rst similarity index 77% rename from docs/features/nonipc/index.rst rename to docs/features/communication/crossvm/index.rst index 3c94d866c45..01ad8e0e106 100644 --- a/docs/features/nonipc/index.rst +++ b/docs/features/communication/crossvm/index.rst @@ -12,16 +12,16 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -.. _non-ipc_feature: +.. _crossvm_feature: -NonIPC Communication +Cross Virtual Machine Communication #################### -.. document:: NonIPC Communication - :id: doc__nonipc +.. document:: Cross-VM Communication + :id: doc__com_crossvm :status: valid :safety: ASIL_B - :tags: feature_request + :tags: feature_modification_request .. toctree:: @@ -35,12 +35,12 @@ Feature flag To activate this feature, use the following feature flag: -``experimental_nonipc_com`` +``experimental_crossvm_com`` Abstract ======== -This feature provides mechanisms for communication and data exchange between processes without using IPC. +This feature provides mechanisms for communication and data exchange between processes in different Virtual Machines (VM). It includes two classes of communication/data-exchange: 1. One-way data sharing into a VM for (vehicle) state read-only for the VM (snapshot state) @@ -53,7 +53,6 @@ It includes two classes of communication/data-exchange: - Queues shall be configurable by client (VM) (number of elements etc..) - Size of a queue - Allocation of buffers for the data elements - - Queues shall support lock-free access to data elements - Support for bi-directional communication via writable data elements by the client - Asynchronous bi-directional support via multiple queues @@ -61,7 +60,7 @@ It includes two classes of communication/data-exchange: Motivation ========== -NonIPC communication mechanisms are essential to ensure efficient and reliable data exchange between processes, especially in scenarios where IPC may not be suitable or desired. +Cross-VM communication mechanisms are essential to ensure efficient and reliable data exchange between VMs. Rationale ========= @@ -71,7 +70,7 @@ These communication mechanisms are developed to address specific needs for data Specification ============= -The NonIPC communication feature consists of the following mechanisms: +The Cross-VM communication feature consists of the following mechanisms: - **One-way data sharing**: Allows read-only access to vehicle state data in a VM, ensuring consistency and lock-free access. - **Streamed data**: Utilizes shared queues for streaming events or data, configurable by the client, supporting bi-directional communication. @@ -86,12 +85,12 @@ General requirements: Backwards Compatibility ======================= -As this is a new feature, there are no backwards compatibility concerns. +It should be shure that both Cross-VM and normal IPC work seamlessly together Security Impact =============== -NonIPC communication mechanisms present varying security risks as vulnerabilities could affect multiple components simultaneously. +Cross-VM communication mechanisms present varying security risks as vulnerabilities could affect multiple components simultaneously. Each mechanism requires individual security impact analysis based on its functionality and usage patterns. Safety Impact @@ -99,11 +98,12 @@ Safety Impact - Due to wide usage of these communication mechanisms throughout the platform, extra care is needed in design, implementation, and testing to minimize safety impact. - Mechanisms are developed at various integrity levels from QM (non-safety) up to ASIL-B, depending on their intended use cases. +- Freedom from Interference has to be taken into account when different VMs License Impact ============== -The NonIPC communication mechanisms are licensed under Apache License 2.0. +The Cross-VM communication mechanisms are licensed under Apache License 2.0. How to Teach This ================= @@ -113,9 +113,9 @@ Each mechanism is expected to have a user manual that includes an API reference Rejected Ideas ============== -There are no rejected ideas related to the NonIPC communication feature at this time. +There are no rejected ideas related to the Cross-VM communication feature at this time. Open Issues =========== -There are currently no open issues related to the NonIPC communication feature. +There are currently no open issues related to the Cross-VM communication feature. diff --git a/docs/features/nonipc/requirements/index.rst b/docs/features/communication/crossvm/requirements/index.rst similarity index 87% rename from docs/features/nonipc/requirements/index.rst rename to docs/features/communication/crossvm/requirements/index.rst index 6af5831dfef..1dc501730c3 100644 --- a/docs/features/nonipc/requirements/index.rst +++ b/docs/features/communication/crossvm/requirements/index.rst @@ -16,7 +16,7 @@ Requirements ############ .. feat_req:: One-way data sharing into a VM - :id: feat_req__nonipc__one_way_sharing + :id: feat_req__crossvm__one_way_sharing :reqtype: Functional :security: NO :safety: QM @@ -26,7 +26,7 @@ Requirements The system shall support one-way data sharing into a VM for vehicle state read-only for the VM (snapshot state). .. feat_req:: Read-only access for VM - :id: feat_req__nonipc__readonly_vm + :id: feat_req__crossvm__readonly_vm :reqtype: Functional :security: NO :safety: QM @@ -36,7 +36,7 @@ Requirements The consumer (VM) shall have read-only access to the shared data. .. feat_req:: Consistent data-sets - :id: feat_req__nonipc__consistent_data + :id: feat_req__crossvm__consistent_data :reqtype: Functional :security: NO :safety: QM @@ -46,7 +46,7 @@ Requirements The system shall support consistent data-sets, allowing the consumer to obtain a consistent version of related data items. .. feat_req:: Lock-free access - :id: feat_req__nonipc__lock_free_access + :id: feat_req__crossvm__lock_free_access :reqtype: Functional :security: NO :safety: QM @@ -56,7 +56,7 @@ Requirements Consistent access to data must be lock-free. .. feat_req:: Producer time stamps - :id: feat_req__nonipc__producer_timestamps + :id: feat_req__crossvm__producer_timestamps :reqtype: Functional :security: NO :safety: QM @@ -66,7 +66,7 @@ Requirements Producer time stamps shall be available for related data-sets. .. feat_req:: Streamed data based on shared queues - :id: feat_req__nonipc__streamed_data + :id: feat_req__crossvm__streamed_data :reqtype: Functional :security: NO :safety: QM @@ -76,7 +76,7 @@ Requirements The system shall support streamed data based on shared queues (stream of events or data). .. feat_req:: Configurable queues - :id: feat_req__nonipc__configurable_queues + :id: feat_req__crossvm__configurable_queues :reqtype: Functional :security: NO :safety: QM @@ -86,7 +86,7 @@ Requirements Queues shall be configurable by the client (VM), including the number of elements and buffer allocation. .. feat_req:: Lock-free queue access - :id: feat_req__nonipc__lock_free_queue + :id: feat_req__crossvm__lock_free_queue :reqtype: Functional :security: NO :safety: QM @@ -96,7 +96,7 @@ Requirements Queues shall support lock-free access to data elements. .. feat_req:: Bi-directional communication - :id: feat_req__nonipc__bi_directional_comm + :id: feat_req__crossvm__bi_directional_comm :reqtype: Functional :security: NO :safety: QM @@ -106,7 +106,7 @@ Requirements The system shall support bi-directional communication via writable data elements by the client. .. feat_req:: Asynchronous support - :id: feat_req__nonipc__async_support + :id: feat_req__crossvm__async_support :reqtype: Functional :security: NO :safety: QM @@ -116,7 +116,7 @@ Requirements The system shall provide asynchronous bi-directional support via multiple queues. .. feat_req:: Shared memory chunks - :id: feat_req__nonipc__shared_memory + :id: feat_req__crossvm__shared_memory :reqtype: Functional :security: NO :safety: QM @@ -126,7 +126,7 @@ Requirements The system shall support multiple chunks of shared memory to allow required access control. .. feat_req:: Data update notifications - :id: feat_req__nonipc__data_notifications + :id: feat_req__crossvm__data_notifications :reqtype: Functional :security: NO :safety: QM @@ -136,7 +136,7 @@ Requirements Notifications for data updates shall be available (virtual IRQs in a VM). .. feat_req:: Configurable notifications - :id: feat_req__nonipc__config_notifications + :id: feat_req__crossvm__config_notifications :reqtype: Functional :security: NO :safety: QM diff --git a/docs/features/communication/index.rst b/docs/features/communication/index.rst index f432f03ba7e..73c1efbdab4 100644 --- a/docs/features/communication/index.rst +++ b/docs/features/communication/index.rst @@ -30,6 +30,7 @@ Communication docs/**/index ipc/index + crossvm/index Feature flag ============ diff --git a/docs/requirements/stakeholder/index.rst b/docs/requirements/stakeholder/index.rst index 447e686f159..b5f634ff197 100644 --- a/docs/requirements/stakeholder/index.rst +++ b/docs/requirements/stakeholder/index.rst @@ -462,15 +462,15 @@ Communication The platform shall support intra-process communication. -.. stkh_req:: Non-Intra-process Communication +.. stkh_req:: Cross-VM Communication :id: stkh_req__communication__vm :reqtype: Functional :security: NO :safety: QM - :rationale: Application software typically maps software building blocks into the same process. + :rationale: Different VMs in a system involved. Somethimes they interact. :status: valid - The platform shall support not only IPC but also intra VM communication. + The platform shall support not only IPC but also intra Virtual Machine communication. .. stkh_req:: Stable application interfaces :id: stkh_req__communication__stable_app_inter From ff295d3d4dfb44bd8fec55c6de97b17aec8b42cc Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres Date: Wed, 6 Aug 2025 14:30:19 +0200 Subject: [PATCH 005/214] fixed warning --- docs/features/communication/crossvm/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/communication/crossvm/index.rst b/docs/features/communication/crossvm/index.rst index 01ad8e0e106..3183402674c 100644 --- a/docs/features/communication/crossvm/index.rst +++ b/docs/features/communication/crossvm/index.rst @@ -15,7 +15,7 @@ .. _crossvm_feature: Cross Virtual Machine Communication -#################### +################################### .. document:: Cross-VM Communication :id: doc__com_crossvm From 7436c4dac1d102a57b21f999fee4853c50a2f9f5 Mon Sep 17 00:00:00 2001 From: "Frank Scholter Peres(MBTI)" <145544737+FScholPer@users.noreply.github.com> Date: Thu, 7 Aug 2025 08:21:11 +0200 Subject: [PATCH 006/214] Update docs/features/communication/crossvm/index.rst Co-authored-by: ThomasHahn <83017581+hth9fe@users.noreply.github.com> Signed-off-by: Frank Scholter Peres(MBTI) <145544737+FScholPer@users.noreply.github.com> --- docs/features/communication/crossvm/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/communication/crossvm/index.rst b/docs/features/communication/crossvm/index.rst index 3183402674c..b99cb14ccbd 100644 --- a/docs/features/communication/crossvm/index.rst +++ b/docs/features/communication/crossvm/index.rst @@ -85,7 +85,7 @@ General requirements: Backwards Compatibility ======================= -It should be shure that both Cross-VM and normal IPC work seamlessly together +It should be sure that both Cross-VM and normal IPC work seamlessly together Security Impact =============== From 6046bd6037362ce11acbc6e8d5d7bd428539667f Mon Sep 17 00:00:00 2001 From: "Frank Scholter Peres(MBTI)" <145544737+FScholPer@users.noreply.github.com> Date: Thu, 7 Aug 2025 08:21:33 +0200 Subject: [PATCH 007/214] Update docs/features/communication/crossvm/requirements/index.rst Co-authored-by: ThomasHahn <83017581+hth9fe@users.noreply.github.com> Signed-off-by: Frank Scholter Peres(MBTI) <145544737+FScholPer@users.noreply.github.com> --- docs/features/communication/crossvm/requirements/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/communication/crossvm/requirements/index.rst b/docs/features/communication/crossvm/requirements/index.rst index 1dc501730c3..9c79ea1d739 100644 --- a/docs/features/communication/crossvm/requirements/index.rst +++ b/docs/features/communication/crossvm/requirements/index.rst @@ -23,7 +23,7 @@ Requirements :satisfies: stkh_req__communication__vm :status: valid - The system shall support one-way data sharing into a VM for vehicle state read-only for the VM (snapshot state). + The system shall support one-way data sharing into a Virtual Machine (VM) for vehicle state read-only for the VM (snapshot state). .. feat_req:: Read-only access for VM :id: feat_req__crossvm__readonly_vm From 3bb7e41c208a72d8c220d18cd930952bc5bca241 Mon Sep 17 00:00:00 2001 From: "Frank Scholter Peres(MBTI)" <145544737+FScholPer@users.noreply.github.com> Date: Thu, 7 Aug 2025 08:21:48 +0200 Subject: [PATCH 008/214] Update docs/requirements/stakeholder/index.rst Co-authored-by: ThomasHahn <83017581+hth9fe@users.noreply.github.com> Signed-off-by: Frank Scholter Peres(MBTI) <145544737+FScholPer@users.noreply.github.com> --- docs/requirements/stakeholder/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements/stakeholder/index.rst b/docs/requirements/stakeholder/index.rst index b5f634ff197..ee81b0f7c90 100644 --- a/docs/requirements/stakeholder/index.rst +++ b/docs/requirements/stakeholder/index.rst @@ -470,7 +470,7 @@ Communication :rationale: Different VMs in a system involved. Somethimes they interact. :status: valid - The platform shall support not only IPC but also intra Virtual Machine communication. + The platform shall support not only IPC but also intra Virtual Machine (VM) communication. .. stkh_req:: Stable application interfaces :id: stkh_req__communication__stable_app_inter From 9ab19f3c88bb140e904181503c7a18de6744f854 Mon Sep 17 00:00:00 2001 From: "Frank Scholter Peres(MBTI)" <145544737+FScholPer@users.noreply.github.com> Date: Thu, 7 Aug 2025 08:22:01 +0200 Subject: [PATCH 009/214] Update docs/features/communication/crossvm/index.rst Co-authored-by: ThomasHahn <83017581+hth9fe@users.noreply.github.com> Signed-off-by: Frank Scholter Peres(MBTI) <145544737+FScholPer@users.noreply.github.com> --- docs/features/communication/crossvm/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/communication/crossvm/index.rst b/docs/features/communication/crossvm/index.rst index b99cb14ccbd..464bd115897 100644 --- a/docs/features/communication/crossvm/index.rst +++ b/docs/features/communication/crossvm/index.rst @@ -14,7 +14,7 @@ .. _crossvm_feature: -Cross Virtual Machine Communication +Cross Virtual Machine (VM) Communication ################################### .. document:: Cross-VM Communication From a69af69e07420343dd12752a2af1b96ad10c79b2 Mon Sep 17 00:00:00 2001 From: "Frank Scholter Peres(MBTI)" <145544737+FScholPer@users.noreply.github.com> Date: Thu, 7 Aug 2025 08:22:18 +0200 Subject: [PATCH 010/214] Update docs/features/communication/crossvm/index.rst Co-authored-by: ThomasHahn <83017581+hth9fe@users.noreply.github.com> Signed-off-by: Frank Scholter Peres(MBTI) <145544737+FScholPer@users.noreply.github.com> --- docs/features/communication/crossvm/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/communication/crossvm/index.rst b/docs/features/communication/crossvm/index.rst index 464bd115897..fae42202dab 100644 --- a/docs/features/communication/crossvm/index.rst +++ b/docs/features/communication/crossvm/index.rst @@ -15,7 +15,7 @@ .. _crossvm_feature: Cross Virtual Machine (VM) Communication -################################### +######################################## .. document:: Cross-VM Communication :id: doc__com_crossvm From ab94351f842ca3cb694c7016c6108072e7f580e2 Mon Sep 17 00:00:00 2001 From: "Frank Scholter Peres(MBTI)" <145544737+FScholPer@users.noreply.github.com> Date: Thu, 7 Aug 2025 11:24:50 +0200 Subject: [PATCH 011/214] Update docs/requirements/stakeholder/index.rst Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Frank Scholter Peres(MBTI) <145544737+FScholPer@users.noreply.github.com> --- docs/requirements/stakeholder/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements/stakeholder/index.rst b/docs/requirements/stakeholder/index.rst index ee81b0f7c90..c4257a9eb85 100644 --- a/docs/requirements/stakeholder/index.rst +++ b/docs/requirements/stakeholder/index.rst @@ -467,7 +467,7 @@ Communication :reqtype: Functional :security: NO :safety: QM - :rationale: Different VMs in a system involved. Somethimes they interact. + :rationale: Different VMs in a system involved. Sometimes they interact. :status: valid The platform shall support not only IPC but also intra Virtual Machine (VM) communication. From f61c42661e87f34969db9d03978fce32c611b00e Mon Sep 17 00:00:00 2001 From: "Frank Scholter Peres(MBTI)" <145544737+FScholPer@users.noreply.github.com> Date: Thu, 7 Aug 2025 11:25:03 +0200 Subject: [PATCH 012/214] Update docs/features/communication/crossvm/index.rst Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Frank Scholter Peres(MBTI) <145544737+FScholPer@users.noreply.github.com> --- docs/features/communication/crossvm/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/communication/crossvm/index.rst b/docs/features/communication/crossvm/index.rst index fae42202dab..a6f1898fe5f 100644 --- a/docs/features/communication/crossvm/index.rst +++ b/docs/features/communication/crossvm/index.rst @@ -85,7 +85,7 @@ General requirements: Backwards Compatibility ======================= -It should be sure that both Cross-VM and normal IPC work seamlessly together +It should be ensured that both Cross-VM and normal IPC work seamlessly together Security Impact =============== From 9af771ab5e3bdd709025a47cba4290cc33284942 Mon Sep 17 00:00:00 2001 From: "Frank Scholter Peres(MBTI)" <145544737+FScholPer@users.noreply.github.com> Date: Thu, 7 Aug 2025 11:25:23 +0200 Subject: [PATCH 013/214] Update docs/features/communication/crossvm/index.rst Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Frank Scholter Peres(MBTI) <145544737+FScholPer@users.noreply.github.com> --- docs/features/communication/crossvm/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/communication/crossvm/index.rst b/docs/features/communication/crossvm/index.rst index a6f1898fe5f..aeed928bee8 100644 --- a/docs/features/communication/crossvm/index.rst +++ b/docs/features/communication/crossvm/index.rst @@ -98,7 +98,7 @@ Safety Impact - Due to wide usage of these communication mechanisms throughout the platform, extra care is needed in design, implementation, and testing to minimize safety impact. - Mechanisms are developed at various integrity levels from QM (non-safety) up to ASIL-B, depending on their intended use cases. -- Freedom from Interference has to be taken into account when different VMs +- Freedom from Interference has to be taken into account when different VMs with different integrity or safety levels communicate or share resources, to ensure that faults or failures in one VM do not adversely affect others. License Impact ============== From dd69693a75e6343fbfa5402580f7403c8b9cc0c8 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres Date: Wed, 10 Sep 2025 12:51:09 +0200 Subject: [PATCH 014/214] fix: removed cross-vm section --- docs/features/communication/crossvm/index.rst | 121 --------------- .../crossvm/requirements/index.rst | 146 ------------------ .../communication/docs/requirements/index.rst | 13 ++ 3 files changed, 13 insertions(+), 267 deletions(-) delete mode 100644 docs/features/communication/crossvm/index.rst delete mode 100644 docs/features/communication/crossvm/requirements/index.rst diff --git a/docs/features/communication/crossvm/index.rst b/docs/features/communication/crossvm/index.rst deleted file mode 100644 index aeed928bee8..00000000000 --- a/docs/features/communication/crossvm/index.rst +++ /dev/null @@ -1,121 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2025 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -.. _crossvm_feature: - -Cross Virtual Machine (VM) Communication -######################################## - -.. document:: Cross-VM Communication - :id: doc__com_crossvm - :status: valid - :safety: ASIL_B - :tags: feature_modification_request - - -.. toctree:: - :maxdepth: 2 - - ./requirements/index - - -Feature flag -============ - -To activate this feature, use the following feature flag: - -``experimental_crossvm_com`` - -Abstract -======== - -This feature provides mechanisms for communication and data exchange between processes in different Virtual Machines (VM). -It includes two classes of communication/data-exchange: - -1. One-way data sharing into a VM for (vehicle) state read-only for the VM (snapshot state) - - Read-only for consumer (VM) - - Support for consistent data-sets (consumer must be able to get a consistent version of related data items) - - Consistent access must be lock-free - - Producer time stamps shall be available for related data-sets - -2. Streamed data based on shared queues (stream of events or data) - - Queues shall be configurable by client (VM) (number of elements etc..) - - Size of a queue - - Allocation of buffers for the data elements - - Queues shall support lock-free access to data elements - - Support for bi-directional communication via writable data elements by the client - - Asynchronous bi-directional support via multiple queues - -Motivation -========== - -Cross-VM communication mechanisms are essential to ensure efficient and reliable data exchange between VMs. - -Rationale -========= - -These communication mechanisms are developed to address specific needs for data sharing and streaming in a VM environment, ensuring consistent and lock-free access to data. - -Specification -============= - -The Cross-VM communication feature consists of the following mechanisms: - -- **One-way data sharing**: Allows read-only access to vehicle state data in a VM, ensuring consistency and lock-free access. -- **Streamed data**: Utilizes shared queues for streaming events or data, configurable by the client, supporting bi-directional communication. - -General requirements: ---------------------- - -- Multiple chunks of shared memory shall be supported to allow required access control. -- Notifications for data updates shall be available (virtual IRQs in a VM). -- Notifications shall be configurable by consumers of data (using flags or watermarks in shared memory from client to producer). - -Backwards Compatibility -======================= - -It should be ensured that both Cross-VM and normal IPC work seamlessly together - -Security Impact -=============== - -Cross-VM communication mechanisms present varying security risks as vulnerabilities could affect multiple components simultaneously. -Each mechanism requires individual security impact analysis based on its functionality and usage patterns. - -Safety Impact -============= - -- Due to wide usage of these communication mechanisms throughout the platform, extra care is needed in design, implementation, and testing to minimize safety impact. -- Mechanisms are developed at various integrity levels from QM (non-safety) up to ASIL-B, depending on their intended use cases. -- Freedom from Interference has to be taken into account when different VMs with different integrity or safety levels communicate or share resources, to ensure that faults or failures in one VM do not adversely affect others. - -License Impact -============== - -The Cross-VM communication mechanisms are licensed under Apache License 2.0. - -How to Teach This -================= - -Each mechanism is expected to have a user manual that includes an API reference and usage examples where necessary. - -Rejected Ideas -============== - -There are no rejected ideas related to the Cross-VM communication feature at this time. - -Open Issues -=========== - -There are currently no open issues related to the Cross-VM communication feature. diff --git a/docs/features/communication/crossvm/requirements/index.rst b/docs/features/communication/crossvm/requirements/index.rst deleted file mode 100644 index 9c79ea1d739..00000000000 --- a/docs/features/communication/crossvm/requirements/index.rst +++ /dev/null @@ -1,146 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2025 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -Requirements -############ - -.. feat_req:: One-way data sharing into a VM - :id: feat_req__crossvm__one_way_sharing - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__communication__vm - :status: valid - - The system shall support one-way data sharing into a Virtual Machine (VM) for vehicle state read-only for the VM (snapshot state). - -.. feat_req:: Read-only access for VM - :id: feat_req__crossvm__readonly_vm - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__communication__vm - :status: valid - - The consumer (VM) shall have read-only access to the shared data. - -.. feat_req:: Consistent data-sets - :id: feat_req__crossvm__consistent_data - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__communication__vm - :status: valid - - The system shall support consistent data-sets, allowing the consumer to obtain a consistent version of related data items. - -.. feat_req:: Lock-free access - :id: feat_req__crossvm__lock_free_access - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__communication__vm - :status: valid - - Consistent access to data must be lock-free. - -.. feat_req:: Producer time stamps - :id: feat_req__crossvm__producer_timestamps - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__communication__vm - :status: valid - - Producer time stamps shall be available for related data-sets. - -.. feat_req:: Streamed data based on shared queues - :id: feat_req__crossvm__streamed_data - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__communication__vm - :status: valid - - The system shall support streamed data based on shared queues (stream of events or data). - -.. feat_req:: Configurable queues - :id: feat_req__crossvm__configurable_queues - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__communication__vm - :status: valid - - Queues shall be configurable by the client (VM), including the number of elements and buffer allocation. - -.. feat_req:: Lock-free queue access - :id: feat_req__crossvm__lock_free_queue - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__communication__vm - :status: valid - - Queues shall support lock-free access to data elements. - -.. feat_req:: Bi-directional communication - :id: feat_req__crossvm__bi_directional_comm - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__communication__vm - :status: valid - - The system shall support bi-directional communication via writable data elements by the client. - -.. feat_req:: Asynchronous support - :id: feat_req__crossvm__async_support - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__communication__vm - :status: valid - - The system shall provide asynchronous bi-directional support via multiple queues. - -.. feat_req:: Shared memory chunks - :id: feat_req__crossvm__shared_memory - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__communication__vm - :status: valid - - The system shall support multiple chunks of shared memory to allow required access control. - -.. feat_req:: Data update notifications - :id: feat_req__crossvm__data_notifications - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__communication__vm - :status: valid - - Notifications for data updates shall be available (virtual IRQs in a VM). - -.. feat_req:: Configurable notifications - :id: feat_req__crossvm__config_notifications - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__communication__vm - :status: valid - - Notifications shall be configurable by consumers of data (using flags or watermarks in shared memory from client to producer). diff --git a/docs/features/communication/docs/requirements/index.rst b/docs/features/communication/docs/requirements/index.rst index eaed4cf5bad..2e70daafdca 100644 --- a/docs/features/communication/docs/requirements/index.rst +++ b/docs/features/communication/docs/requirements/index.rst @@ -284,6 +284,19 @@ Mixed-Criticality safety systems Consumers with lower criticality shall not be able to drop data before it is consumed by partners with higher criticality. +Cross VM Communication +^^^^^^^^^^^^^^^^^^^^^^ + +.. feat_req:: Cross VM + :id: feat_req__cross__vm + :reqtype: Functional + :security: YES + :safety: ASIL_B + :satisfies: stkh_req__communication__vm + :status: valid + + The communication framework show allow to communicate between different vms over shared memory + Performance ^^^^^^^^^^^ From 0eba3139e452efb80367962eed5cc24532167de6 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres Date: Wed, 10 Sep 2025 12:53:49 +0200 Subject: [PATCH 015/214] fix: removed crossvm index --- docs/features/communication/index.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/features/communication/index.rst b/docs/features/communication/index.rst index 3dcd28b5160..5270d68d46b 100644 --- a/docs/features/communication/index.rst +++ b/docs/features/communication/index.rst @@ -31,7 +31,6 @@ Communication docs/**/index ipc/index some_ip_gateway/index - crossvm/index Feature flag ============ From 979dad0c7420072707816a29ab8e6f2b290ca5d6 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres Date: Wed, 10 Sep 2025 12:59:11 +0200 Subject: [PATCH 016/214] fix: typo --- docs/features/communication/docs/requirements/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/communication/docs/requirements/index.rst b/docs/features/communication/docs/requirements/index.rst index 2e70daafdca..ac61d4f0e08 100644 --- a/docs/features/communication/docs/requirements/index.rst +++ b/docs/features/communication/docs/requirements/index.rst @@ -295,7 +295,7 @@ Cross VM Communication :satisfies: stkh_req__communication__vm :status: valid - The communication framework show allow to communicate between different vms over shared memory + The communication framework shall allow to communicate between different VMs over shared memory Performance From 02a5b3044961a8d433c303ac06c48f4bfbbd39d9 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres Date: Wed, 10 Sep 2025 13:06:26 +0200 Subject: [PATCH 017/214] fixed: id --- docs/features/communication/docs/requirements/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/communication/docs/requirements/index.rst b/docs/features/communication/docs/requirements/index.rst index ac61d4f0e08..339ec593b7b 100644 --- a/docs/features/communication/docs/requirements/index.rst +++ b/docs/features/communication/docs/requirements/index.rst @@ -288,7 +288,7 @@ Cross VM Communication ^^^^^^^^^^^^^^^^^^^^^^ .. feat_req:: Cross VM - :id: feat_req__cross__vm + :id: feat_req__com__cross__vm :reqtype: Functional :security: YES :safety: ASIL_B From 1dd3db7a00a955520298e6b05ae35a0ad1a9b3b5 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres Date: Wed, 10 Sep 2025 13:14:02 +0200 Subject: [PATCH 018/214] fixed: id #2 --- docs/features/communication/docs/requirements/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/communication/docs/requirements/index.rst b/docs/features/communication/docs/requirements/index.rst index 339ec593b7b..e94a1d9cbb1 100644 --- a/docs/features/communication/docs/requirements/index.rst +++ b/docs/features/communication/docs/requirements/index.rst @@ -288,7 +288,7 @@ Cross VM Communication ^^^^^^^^^^^^^^^^^^^^^^ .. feat_req:: Cross VM - :id: feat_req__com__cross__vm + :id: feat_req__com__cross_vm :reqtype: Functional :security: YES :safety: ASIL_B From 02254ce2577c6d7037ce39fdaf3534ac567ad617 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres Date: Tue, 21 Oct 2025 10:16:41 +0200 Subject: [PATCH 019/214] docs: added until flags --- docs/features/communication/docs/requirements/index.rst | 4 +--- docs/requirements/stakeholder/index.rst | 1 + 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/features/communication/docs/requirements/index.rst b/docs/features/communication/docs/requirements/index.rst index d6fe72cc88f..ea138c8e949 100644 --- a/docs/features/communication/docs/requirements/index.rst +++ b/docs/features/communication/docs/requirements/index.rst @@ -294,6 +294,7 @@ Cross VM Communication :safety: ASIL_B :satisfies: stkh_req__communication__vm :status: valid + :valid_from: v1.0.0 The communication framework shall allow to communicate between different VMs over shared memory @@ -636,6 +637,3 @@ Safety Impact .. needextend:: docname is not None and "communication/ipc/requirements" in docname :+tags: ipc - - - diff --git a/docs/requirements/stakeholder/index.rst b/docs/requirements/stakeholder/index.rst index c8f488a9886..9cbc411d051 100644 --- a/docs/requirements/stakeholder/index.rst +++ b/docs/requirements/stakeholder/index.rst @@ -481,6 +481,7 @@ Communication :safety: QM :rationale: Different VMs in a system involved. Sometimes they interact. :status: valid + :valid_from The platform shall support not only IPC but also intra Virtual Machine (VM) communication. From b905c12128e15b29e143cb61e73cec03d0e6174c Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres Date: Tue, 21 Oct 2025 10:22:26 +0200 Subject: [PATCH 020/214] fix: valid block --- docs/requirements/stakeholder/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements/stakeholder/index.rst b/docs/requirements/stakeholder/index.rst index 9cbc411d051..f494185c083 100644 --- a/docs/requirements/stakeholder/index.rst +++ b/docs/requirements/stakeholder/index.rst @@ -481,7 +481,7 @@ Communication :safety: QM :rationale: Different VMs in a system involved. Sometimes they interact. :status: valid - :valid_from + :valid_from: v1.0.0 The platform shall support not only IPC but also intra Virtual Machine (VM) communication. From cfe95bc14474e4fdafdbd362026f65549efc77ac Mon Sep 17 00:00:00 2001 From: Tibor Zavartkay Date: Thu, 13 Nov 2025 17:30:09 +0100 Subject: [PATCH 021/214] Improvements for persistency feature requirements --- .../architecture/_assets/kvs_dyn_builder.puml | 0 .../_assets/kvs_dyn_check_value_default.puml | 0 .../_assets/kvs_dyn_delete_data_key.puml | 0 .../kvs_dyn_flush_local_repr_to_file.puml | 0 .../_assets/kvs_dyn_read_data_key.puml | 0 .../kvs_dyn_read_file_into_local_repr.puml | 0 .../_assets/kvs_dyn_restore_snapshot.puml | 0 .../_assets/kvs_dyn_write_data_key.puml | 0 .../architecture/_assets/kvs_interface.puml | 0 .../architecture/_assets/kvs_static_view.puml | 0 .../{kvs => }/architecture/index.rst | 12 +- docs/features/persistency/index.rst | 124 ++++- docs/features/persistency/kvs/index.rst | 141 ----- .../persistency/kvs/requirements/index.rst | 340 ------------ .../requirements/chklst_req_inspection.rst | 0 .../persistency/requirements/index.rst | 514 ++++++++++++++++++ .../{kvs => }/safety_analysis/dfa.rst | 0 .../{kvs => }/safety_analysis/fmea.rst | 0 .../{kvs => }/safety_planning/index.rst | 10 +- .../kvs/docs/requirements/index.rst | 40 +- docs/requirements/stakeholder/index.rst | 2 +- 21 files changed, 665 insertions(+), 518 deletions(-) rename docs/features/persistency/{kvs => }/architecture/_assets/kvs_dyn_builder.puml (100%) rename docs/features/persistency/{kvs => }/architecture/_assets/kvs_dyn_check_value_default.puml (100%) rename docs/features/persistency/{kvs => }/architecture/_assets/kvs_dyn_delete_data_key.puml (100%) rename docs/features/persistency/{kvs => }/architecture/_assets/kvs_dyn_flush_local_repr_to_file.puml (100%) rename docs/features/persistency/{kvs => }/architecture/_assets/kvs_dyn_read_data_key.puml (100%) rename docs/features/persistency/{kvs => }/architecture/_assets/kvs_dyn_read_file_into_local_repr.puml (100%) rename docs/features/persistency/{kvs => }/architecture/_assets/kvs_dyn_restore_snapshot.puml (100%) rename docs/features/persistency/{kvs => }/architecture/_assets/kvs_dyn_write_data_key.puml (100%) rename docs/features/persistency/{kvs => }/architecture/_assets/kvs_interface.puml (100%) rename docs/features/persistency/{kvs => }/architecture/_assets/kvs_static_view.puml (100%) rename docs/features/persistency/{kvs => }/architecture/index.rst (79%) delete mode 100644 docs/features/persistency/kvs/index.rst delete mode 100644 docs/features/persistency/kvs/requirements/index.rst rename docs/features/persistency/{kvs => }/requirements/chklst_req_inspection.rst (100%) create mode 100644 docs/features/persistency/requirements/index.rst rename docs/features/persistency/{kvs => }/safety_analysis/dfa.rst (100%) rename docs/features/persistency/{kvs => }/safety_analysis/fmea.rst (100%) rename docs/features/persistency/{kvs => }/safety_planning/index.rst (94%) diff --git a/docs/features/persistency/kvs/architecture/_assets/kvs_dyn_builder.puml b/docs/features/persistency/architecture/_assets/kvs_dyn_builder.puml similarity index 100% rename from docs/features/persistency/kvs/architecture/_assets/kvs_dyn_builder.puml rename to docs/features/persistency/architecture/_assets/kvs_dyn_builder.puml diff --git a/docs/features/persistency/kvs/architecture/_assets/kvs_dyn_check_value_default.puml b/docs/features/persistency/architecture/_assets/kvs_dyn_check_value_default.puml similarity index 100% rename from docs/features/persistency/kvs/architecture/_assets/kvs_dyn_check_value_default.puml rename to docs/features/persistency/architecture/_assets/kvs_dyn_check_value_default.puml diff --git a/docs/features/persistency/kvs/architecture/_assets/kvs_dyn_delete_data_key.puml b/docs/features/persistency/architecture/_assets/kvs_dyn_delete_data_key.puml similarity index 100% rename from docs/features/persistency/kvs/architecture/_assets/kvs_dyn_delete_data_key.puml rename to docs/features/persistency/architecture/_assets/kvs_dyn_delete_data_key.puml diff --git a/docs/features/persistency/kvs/architecture/_assets/kvs_dyn_flush_local_repr_to_file.puml b/docs/features/persistency/architecture/_assets/kvs_dyn_flush_local_repr_to_file.puml similarity index 100% rename from docs/features/persistency/kvs/architecture/_assets/kvs_dyn_flush_local_repr_to_file.puml rename to docs/features/persistency/architecture/_assets/kvs_dyn_flush_local_repr_to_file.puml diff --git a/docs/features/persistency/kvs/architecture/_assets/kvs_dyn_read_data_key.puml b/docs/features/persistency/architecture/_assets/kvs_dyn_read_data_key.puml similarity index 100% rename from docs/features/persistency/kvs/architecture/_assets/kvs_dyn_read_data_key.puml rename to docs/features/persistency/architecture/_assets/kvs_dyn_read_data_key.puml diff --git a/docs/features/persistency/kvs/architecture/_assets/kvs_dyn_read_file_into_local_repr.puml b/docs/features/persistency/architecture/_assets/kvs_dyn_read_file_into_local_repr.puml similarity index 100% rename from docs/features/persistency/kvs/architecture/_assets/kvs_dyn_read_file_into_local_repr.puml rename to docs/features/persistency/architecture/_assets/kvs_dyn_read_file_into_local_repr.puml diff --git a/docs/features/persistency/kvs/architecture/_assets/kvs_dyn_restore_snapshot.puml b/docs/features/persistency/architecture/_assets/kvs_dyn_restore_snapshot.puml similarity index 100% rename from docs/features/persistency/kvs/architecture/_assets/kvs_dyn_restore_snapshot.puml rename to docs/features/persistency/architecture/_assets/kvs_dyn_restore_snapshot.puml diff --git a/docs/features/persistency/kvs/architecture/_assets/kvs_dyn_write_data_key.puml b/docs/features/persistency/architecture/_assets/kvs_dyn_write_data_key.puml similarity index 100% rename from docs/features/persistency/kvs/architecture/_assets/kvs_dyn_write_data_key.puml rename to docs/features/persistency/architecture/_assets/kvs_dyn_write_data_key.puml diff --git a/docs/features/persistency/kvs/architecture/_assets/kvs_interface.puml b/docs/features/persistency/architecture/_assets/kvs_interface.puml similarity index 100% rename from docs/features/persistency/kvs/architecture/_assets/kvs_interface.puml rename to docs/features/persistency/architecture/_assets/kvs_interface.puml diff --git a/docs/features/persistency/kvs/architecture/_assets/kvs_static_view.puml b/docs/features/persistency/architecture/_assets/kvs_static_view.puml similarity index 100% rename from docs/features/persistency/kvs/architecture/_assets/kvs_static_view.puml rename to docs/features/persistency/architecture/_assets/kvs_static_view.puml diff --git a/docs/features/persistency/kvs/architecture/index.rst b/docs/features/persistency/architecture/index.rst similarity index 79% rename from docs/features/persistency/kvs/architecture/index.rst rename to docs/features/persistency/architecture/index.rst index 750dbdfc11b..a00147a0a40 100644 --- a/docs/features/persistency/kvs/architecture/index.rst +++ b/docs/features/persistency/architecture/index.rst @@ -12,7 +12,7 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -.. _feature_architecture_PersistencyKvs: +.. _feature_architecture_persistency: Architecture ============ @@ -62,7 +62,7 @@ Static Architecture :security: YES :safety: ASIL_B :includes: logic_arc_int__persistency__interface - :fulfils: feat_req__persistency__default_value_get,feat_req__persistency__default_values,feat_req__persistency__events,feat_req__persistency__integrity_check,feat_req__persistency__persist_data,feat_req__persistency__persistency,feat_req__persistency__snapshots,feat_req__persistency__support_datatype_keys,feat_req__persistency__support_datatype_value,feat_req__persistency__variant_management,feat_req__persistency__default_value_file,feat_req__persistency__config_file,feat_req__persistency__async_api,feat_req__persistency__access_control,feat_req__persistency__intra_process_comm + :fulfils: feat_req__persistency__default_value_get,feat_req__persistency__default_values,feat_req__persistency__async_completion,feat_req__persistency__integrity_check,feat_req__persistency__store_data,feat_req__persistency__load_data,feat_req__persistency__snapshot_create,feat_req__persistency__support_datatype_keys,feat_req__persistency__support_datatype_value,feat_req__persistency__variant_management,feat_req__persistency__default_value_file,feat_req__persistency__cfg,feat_req__persistency__async_api,feat_req__persistency__access_control,feat_req__persistency__concurrency :status: valid .. uml:: _assets/kvs_static_view.puml @@ -82,7 +82,7 @@ Dynamic Architecture :id: feat_arc_dyn__persistency__delete_key :security: YES :safety: ASIL_B - :fulfils: feat_req__persistency__events + :fulfils: feat_req__persistency__support_datatype_keys,feat_req__persistency__support_datatype_value :status: valid .. uml:: _assets/kvs_dyn_delete_data_key.puml @@ -91,7 +91,7 @@ Dynamic Architecture :id: feat_arc_dyn__persistency__flush :security: YES :safety: ASIL_B - :fulfils: feat_req__persistency__persist_data,feat_req__persistency__persistency,feat_req__persistency__snapshots,feat_req__persistency__integrity_check,feat_req__persistency__snapshots + :fulfils: feat_req__persistency__store_data,feat_req__persistency__snapshot_create,feat_req__persistency__integrity_check,feat_req__persistency__snapshot_restore :status: valid .. uml:: _assets/kvs_dyn_flush_local_repr_to_file.puml @@ -109,7 +109,7 @@ Dynamic Architecture :id: feat_arc_dyn__persistency__read_from_storage :security: YES :safety: ASIL_B - :fulfils: feat_req__persistency__persist_data,feat_req__persistency__persistency,feat_req__persistency__integrity_check,feat_req__persistency__snapshots + :fulfils: feat_req__persistency__load_data,feat_req__persistency__integrity_check,feat_req__persistency__snapshot_restore :status: valid .. uml:: _assets/kvs_dyn_read_file_into_local_repr.puml @@ -127,7 +127,7 @@ Dynamic Architecture :id: feat_arc_dyn__persistency__snapshot_restore :security: YES :safety: ASIL_B - :fulfils: feat_req__persistency__snapshots,feat_req__persistency__persist_data,feat_req__persistency__persistency + :fulfils: feat_req__persistency__snapshot_restore,feat_req__persistency__store_data :status: valid .. uml:: _assets/kvs_dyn_restore_snapshot.puml diff --git a/docs/features/persistency/index.rst b/docs/features/persistency/index.rst index 32e439f92b1..de1fa38bfcd 100644 --- a/docs/features/persistency/index.rst +++ b/docs/features/persistency/index.rst @@ -15,19 +15,36 @@ Persistency ########### +.. document:: Persistency + :id: doc__persistency + :status: valid + :safety: ASIL_B + :security: NO + :realizes: wp__feat_request + :tags: feature_request, persistency + .. toctree:: - :maxdepth: 1 - :glob: - :titlesonly: + requirements/index.rst + architecture/index.rst + requirements/chklst_req_inspection.rst + safety_analysis/fmea.rst + safety_analysis/dfa.rst + safety_planning/index.rst + + +Feature flag +============ + +To activate this feature, use the following feature flag: - */index +``persistency`` Abstract ======== Persistency is a critical feature that ensures the long-term storage and -retrieval of data within the S-CORE. It provides a reliable mechanism for +retrieval of data within S-CORE. It provides a reliable mechanism for preserving information, allowing the application to maintain its state and data integrity over time. This feature is essential for enabling the system to resume operations seamlessly, even in the event of unexpected shutdowns or @@ -35,3 +52,100 @@ system failures. By implementing robust persistence mechanisms, the application can guarantee the persistence of user-generated content, configuration settings, and other vital data, ensuring a consistent and reliable user experience. + +This feature request describes the key-value storage (KVS) that is needed by +applications to store either temporary or permanent data in an easy way that +conforms to most programming languages that provide a hash, hashmap, dictionary, +or similar data structure. Access to the KVS is possible from any supported +language through language-specific interfaces. + +In the scope of S-CORE, an application can range from a system service to an +end-user visible UI. The application uses the KVS as an external memory store +to read and persist data as needed. For example, an application that controls +the air conditioning system in a car could use the KVS to store the current +temperature setting. When the car is started again, the application can +retrieve the temperature setting from the persistent KVS storage, providing a +seamless user experience by restoring the previous state. + + +Motivation +========== + +The current solutions available mostly don't meet the specific needs of the +S-CORE project like storing specific datatypes without a BASE64 conversion or +having no rollback/replay feature. Also the integration into analysis tools is +simpler when the solution grows with the needs instead having to adapt existing +data structures through wrappers. Especially in the focus of security it will +be possible to build a system that integrates the layers from scratch and +provide them as API to any language whilst still using Rust as the backend. + +A main USP of the solution will be the integration of a tracing framework that +allows to understand how events also in the context of other events interact. + +A key-value storage is used within many applications to store e.g. +configuration data and is therefore seen crucial for the Eclipse S-CORE +platform. + + +Rationale +========= + +1. | Requirement 1: Multiple key-value storages per application + | Solution: Allow each application to have multiple key-value storages (KVS) to enable data separation and different levels of security. +2. | Requirement 2: Update mechanism for KVS versions + | Solution: Implement an update mechanism to ensure compatibility through updates and rollbacks of different KVS versions. +3. | Requirement 3: Language-agnostic KVS interface + | Solution: Design a flexible interface that allows the KVS to be read and written from multiple programming languages, including C++, Rust, and others. +4. | Requirement 4: Default values for KVS + | Solution: Configure the KVS to store default values for all keys, returning either the default value or an error if the key needs to be written first. +5. | Requirement 5: Simple data representation for KVS + | Solution: Utilize a simple data representation, such as JSON or Cap'n Proto, that supports versioned up- and downgrading and is easily debuggable by developers. +6. | Requirement 6: KVS integrity checking + | Solution: Ensure the KVS maintains a consistent state, providing either the currently stored data or the previous snapshot if data retrieval is not possible. + + +Backwards Compatibility +======================= + +The API for the specific language tries to represent the language specific +implementation like hashmaps or dictionaries to be mostly backwards compatible +to already existing key-value-storage usage cases. Access without a safe error +handling path, like the array-operator in Rust which can panic, must be +avoided. + + +Security Impact +=============== + +Access to the key-value-storage would allow a malicious user to control the +behavior of the device, so it must be secured to prevent unauthorized access. +To achieve this, debug access should only be provided when a debug firmware +image is installed. + + +Safety Impact +============= + +The expected ASIL level is ASIL-B. To reach this goal we will apply the S-CORE +development process. Key elements of it are listed in the process descriptions +of safety management and safety analysis. In the safety analysis we will +analyze the impact of the feature. + +:need:`doc__persistency_fmea` + +We use an iterative development process and apply results from the next steps +back to the feature request. For TinyJSON we will perform a software component +classification. + +:need:`doc__persistency_component_classification` + +To ensure the freedom of interference the feature key-value storage should not +be used within different processes. + + +License Impact +============== + +.. note:: + The key-value storage itself uses the Apache-2.0 license. Licenses of + used libraries are need to be checked. diff --git a/docs/features/persistency/kvs/index.rst b/docs/features/persistency/kvs/index.rst deleted file mode 100644 index 895c7392838..00000000000 --- a/docs/features/persistency/kvs/index.rst +++ /dev/null @@ -1,141 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2025 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -Key-Value-Storage -################# - -.. document:: Persistency Key-Value-Storage - :id: doc__persistency_kvs - :status: valid - :safety: ASIL_B - :security: NO - :realizes: wp__feat_request - :tags: feature_request, persistency - -.. toctree:: - requirements/index.rst - architecture/index.rst - requirements/chklst_req_inspection.rst - safety_analysis/fmea.rst - safety_analysis/dfa.rst - safety_planning/index.rst - - - -Feature flag -============ - -To activate this feature, use the following feature flag: - -``persistency_kvs`` - - -Abstract -======== - -This feature request describes the key-value storage (KVS) that is needed by -applications to store either temporary or permanent data in an easy way that -conforms to most programming languages that provide a hash, hashmap, dictionary -or similar data structure. Access to the KVS is possible from any support -language through language specific interfaces. - -In the scope of S-CORE, an application can range from a system service to an -end-user visible UI. The application uses the KVS as an external memory store -to read and persist data as needed. For example, an application that controls -the air conditioning system in a car could use the KVS to store the current -temperature setting. When the car is started again, the application can -retrieve the temperature setting from the persistent KVS storage, providing a -seamless user experience by restoring the previous state. - - -Motivation -========== - -The current solutions available mostly don't meet the specific needs of the -S-CORE project like storing specific datatypes without a BASE64 conversation or -having no rollback/replay feature. Also the integration into analysis tools is -simpler when the solution grows with the needs instead having to adapt existing -data structures through wrapppers. Especially in the focus of security it will -be possible to build a system that integrates the layers from scratch and -provide them as API to any language whilst still using Rust as the backend. - -A main USP of the solution will be the integration of a tracing framework that -allows to understand how events also in the context of other events interact. - -A key-value storage is used within many applications to store e.g. -configuration data and is therefore seen crucial for the Eclipse S-CORE -platform. - - -Rationale -========= - -1. | Requirement 1: Multiple key-value storages per application - | Solution: Allow each application to have multiple key-value storages (KVS) to enable data separation and different levels of security. -2. | Requirement 2: Update mechanism for KVS versions - | Solution: Implement an update mechanism to ensure compatibility through updates and rollbacks of different KVS versions. -3. | Requirement 3: Language-agnostic KVS interface - | Solution: Design a flexible interface that allows the KVS to be read and written from multiple programming languages, including C++, Rust, and others. -4. | Requirement 4: Default values for KVS - | Solution: Configure the KVS to store default values for all keys, returning either the default value or an error if the key needs to be written first. -5. | Requirement 5: Simple data representation for KVS - | Solution: Utilize a simple data representation, such as JSON or Cap'n Proto, that supports versioned up- and downgrading and is easily debuggable by developers. -6. | Requirement 6: KVS integrity checking - | Solution: Ensure the KVS maintains a consistent state, providing either the currently stored data or the previous snapshot if data retrieval is not possible. - -Backwards Compatibility -======================= - -The API for the specific language tries to represent the language specific -implementation like hashmaps or dictionaries to be mostly backwards compatible -to already existing key-value-storage usage cases. Access without a safe error -handling path, like the array-operator in Rust which can panic, must be -avoided. - - -Security Impact -=============== - -Access to the key-value-storage would allow a malicious user to control the -behaviour of the device, so it must be secured to prevent unauthorized access. -To achieve this, debug access should only be provided when a debug firmware -image is installed. - - -Safety Impact -============= - -The expected ASIL level is ASIL-B. To reach this goal we will apply the S-CORE -development process. Key elements of it are listed in the process descriptions -of safety management and safety analysis. In the safety analysis we will -analyze the impact of the feature. - -:need:`doc__persistency_fmea` - -We use an iterative development process and apply results from the next steps -back to the feature request. For TinyJSON we will perform a software component -classification. - -:need:`doc__persistency_component_classification` - -To ensure the freedom of interference the feature key-value storage should not -be used within different processes. - - -License Impact -============== - - .. note:: - The key-value storage itself uses the Apache-2.0 license. Licenses of - used libraries are need to be checked. diff --git a/docs/features/persistency/kvs/requirements/index.rst b/docs/features/persistency/kvs/requirements/index.rst deleted file mode 100644 index 8c61b8edabc..00000000000 --- a/docs/features/persistency/kvs/requirements/index.rst +++ /dev/null @@ -1,340 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2025 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - - -.. _feature_requirements_PersistencyKvs: - -Requirements -############ - -.. document:: Persistency KVS Feature Requirements - :id: doc__persistency_requirements - :status: valid - :safety: ASIL_B - :security: NO - :realizes: wp__requirements_feat - :tags: persistency - -.. feat_req:: C++ & Rust Interoperability - :id: feat_req__persistency__cpp_rust_interop - :reqtype: Non-Functional - :security: NO - :safety: QM - :satisfies: stkh_req__dev_experience__prog_languages - :status: valid - - The Key-Value-Storage shall provide access through both C++ and Rust - interfaces. - -.. feat_req:: Maximum Size - :id: feat_req__persistency__maximum_size - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: stkh_req__functiona_req__support_of_store - :status: valid - - The Key-Value-Storage shall support specification of its maximum size at - compile time. - -.. feat_req:: Multiple KVS per Software Architecture Element - :id: feat_req__persistency__multiple_kvs - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: stkh_req__functiona_req__support_of_store - :status: valid - - The Key-Value-Storage shall allow instantiating multiple independent stores - per software architecture element. - -.. feat_req:: Supported Datatypes (Keys) - :id: feat_req__persistency__support_datatype_keys - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: stkh_req__functiona_req__support_of_store - :status: valid - - The Key-Value-Storage shall support UTF-8 encoded strings as valid key - types. - -.. feat_req:: Supported Datatypes (Values) - :id: feat_req__persistency__support_datatype_value - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: stkh_req__functiona_req__support_of_store - :status: valid - :tags: persistency - - The Key-Value-Storage shall support storing both primitive and non-primitive - datatypes as values. The supported datatypes shall match those used by the - IPC feature. - -.. feat_req:: Default Values - :id: feat_req__persistency__default_values - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: stkh_req__functiona_req__support_of_store - :status: valid - - The Key-Value-Storage shall support predefined default values for keys. - -.. feat_req:: Default Value Retrieval - :id: feat_req__persistency__default_value_get - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: stkh_req__functiona_req__support_of_store - :status: valid - - The Key-Value-Storage shall support retrieving the default value associated - with a key. - -.. feat_req:: Default Value Reset - :id: feat_req__persistency__default_value_reset - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: stkh_req__functiona_req__support_of_store - :status: valid - - The Key-Value-Storage shall support resetting a single key or all keys to - their respective default values. - -.. feat_req:: Persistency - :id: feat_req__persistency__persistency - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: stkh_req__functiona_req__support_of_store - :status: valid - - The Key-Value-Storage shall persist stored data and provide an API to - explicitly trigger persistence. - -.. feat_req:: Integrity Check - :id: feat_req__persistency__integrity_check - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: stkh_req__functiona_req__support_of_store - :status: valid - - The Key-Value-Storage shall detect and report data corruption. - Note: Implementation depends on AoUs. - -.. feat_req:: Versioning - :id: feat_req__persistency__versioning - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: stkh_req__functiona_req__support_of_store - :status: valid - - The Key-Value-Storage shall support versioning for different layout - configurations. - -.. feat_req:: Update Mechanism - :id: feat_req__persistency__update_mechanism - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: stkh_req__functiona_req__support_of_store - :status: valid - - The Key-Value-Storage shall implement mechanisms to upgrade from one version - to another, including multi-version jumps. - -.. feat_req:: Snapshots - :id: feat_req__persistency__snapshots - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: stkh_req__functiona_req__support_of_store - :status: valid - - The Key-Value-Storage shall support explicit creation of snapshots - identified by unique IDs and allow rollback to previous snapshots. Snapshots - shall also be deletable. - -.. feat_req:: Tooling - :id: feat_req__persistency__tooling - :reqtype: Non-Functional - :security: NO - :safety: ASIL_B - :satisfies: stkh_req__functiona_req__support_of_store - :status: valid - - The Key-Value-Storage shall provide tooling support for viewing and - modifying key-value pairs during development and debugging. - -.. feat_req:: Variant management support - :id: feat_req__persistency__variant_management - :reqtype: Non-Functional - :security: NO - :safety: QM - :satisfies: stkh_req__overall_goals__variant_management - :status: valid - - The Key-Value-Storage shall ensure compatibility across different - architectures and versions. - -.. feat_req:: Set default key values via file - :id: feat_req__persistency__default_value_file - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: stkh_req__functional_req__file_based - :status: valid - - The Key-Value-Storage shall support the configuration of default key values - using an external file. - -.. feat_req:: Configure limits via file - :id: feat_req__persistency__config_file - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: stkh_req__functional_req__file_based - :status: valid - - The Key-Value-Storage shall support the configuration of memory and other - resource limits via a configuration file. - -.. feat_req:: Store persistent data - :id: feat_req__persistency__persist_data - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: stkh_req__functional_req__data_persistency - :status: valid - - The Key-Value-Storage shall support storing and loading its data to and from - persistent storage. - -.. feat_req:: Support engineering mode - :id: feat_req__persistency__eng_mode - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: stkh_req__dependability__safety_features - :status: valid - - The Key-Value-Storage shall an engineering (developer) mode. - The engineering mode shall allow unrestricted data access. - -.. feat_req:: Support field mode - :id: feat_req__persistency__field_mode - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: stkh_req__dependability__safety_features - :status: valid - - The Key-Value-Storage shall a field mode. - The field mode should enforce the most restrictive data access controls feasible. - -.. feat_req:: Provide an async API - :id: feat_req__persistency__async_api - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: stkh_req__dependability__availability, stkh_req__app_architectures__support_request - :status: valid - - The Key-Value-Storage shall provide an asynchronous API for accessing and - manipulating data. - -.. feat_req:: Separate data stores - :id: feat_req__persistency__access_control - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: stkh_req__dependability__security_features - :status: valid - - The Key-Value-Storage shall ensure that only authorized components can - access individual data stores. - -.. feat_req:: Data-change events - :id: feat_req__persistency__events - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: stkh_req__app_architectures__support_data - :status: valid - - The Key-Value-Storage shall provide an API that allows for the registration - of callback functions. These callbacks shall be invoked in response to - specific events, such as when keys are changed or removed. - -.. feat_req:: Fast access - :id: feat_req__persistency__fast_access - :reqtype: Non-Functional - :security: NO - :safety: QM - :satisfies: stkh_req__execution_model__short_app_cycles - :status: valid - - The Key-Value-Storage shall ensure that key operations are completed within - 5 milliseconds. - -.. feat_req:: Intra-Process Data Access - :id: feat_req__persistency__intra_process_comm - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: stkh_req__communication__intra_process - :status: valid - - The Key-Value-Storage shall support concurrent intra-process data access. - -.. needextend:: docname is not None and "persistency/kvs/requirements" in docname - :+tags: persistency - -AoU Requirements -################ - -.. aou_req:: Persistency Error handling - :id: aou_req__persistency__error_handling - :reqtype: Functional - :security: NO - :safety: ASIL_B - :status: valid - :tags: environment - - The application shall handle if the feature persistency is not available. - -.. aou_req:: Application deadlock - :id: aou_req__persistency__appl_design - :reqtype: Functional - :security: NO - :safety: ASIL_B - :status: valid - :tags: environment - - The application shall be designed in a way that deadlocks are avoided. - -.. aou_req:: Application execution - :id: aou_req__persistency__appl_exec - :reqtype: Functional - :security: NO - :safety: ASIL_B - :status: valid - :tags: environment - - The execution of persistency shall not be blocked by the application. diff --git a/docs/features/persistency/kvs/requirements/chklst_req_inspection.rst b/docs/features/persistency/requirements/chklst_req_inspection.rst similarity index 100% rename from docs/features/persistency/kvs/requirements/chklst_req_inspection.rst rename to docs/features/persistency/requirements/chklst_req_inspection.rst diff --git a/docs/features/persistency/requirements/index.rst b/docs/features/persistency/requirements/index.rst new file mode 100644 index 00000000000..f2f4fae9757 --- /dev/null +++ b/docs/features/persistency/requirements/index.rst @@ -0,0 +1,514 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +.. _feature_requirements_persistency: + +Requirements +############ + +.. document:: Persistency Module Feature Requirements + :id: doc__persistency_requirements + :status: valid + :safety: ASIL_B + :security: NO + :realizes: wp__feat_request + :tags: persistency + +.. feat_req:: C++ and Rust language support + :id: feat_req__persistency__cpp_rust + :reqtype: Non-Functional + :security: NO + :safety: QM + :satisfies: stkh_req__dev_experience__prog_languages + :status: valid + + The Persistency Module shall provide native API support for both C++ and Rust programming languages. + +.. feat_req:: Operating system agnostic implementation + :id: feat_req__persistency__os_agnostic + :reqtype: Non-Functional + :security: NO + :safety: QM + :satisfies: stkh_req__hardware_support__chipset_support + :status: valid + + The Persistency Module shall be operating system agnostic and only rely on the POSIX interface. + +.. feat_req:: Variant management support + :id: feat_req__persistency__variant_management + :reqtype: Non-Functional + :security: NO + :safety: QM + :satisfies: stkh_req__overall_goals__variant_management + :status: valid + + The Persistency Module shall ensure compatibility across different architectures and versions. + +.. feat_req:: Dynamic memory allocation during runtime + :id: feat_req__persistency__dynamic_memory_alloc + :reqtype: Non-Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__functional_req__support_of_store + :status: valid + + The Persistency Module shall not allocate dynamic memory during runtime. All required dynamic memory shall be allocated during initialization. + + .. note:: + + Dynamic memory allocation violates safety concepts as the `HEAP` is a shared resource, where freedom from interference cannot be guaranteed. + Additionally, fragmentation of the `HEAP` can lead to non-deterministic behavior of the application. + +.. feat_req:: Multiple KVS per application + :id: feat_req__persistency__multiple_kvs + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__functional_req__data_persistency + :status: valid + + The Persistency Module shall support multiple independent storages per application. + +.. feat_req:: Access from multiple application + :id: feat_req__persistency__multiple_app + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__functional_req__support_of_store + :status: valid + + The Persistency Module shall prevent access to a single KVS instance from multiple applications. + + .. note:: + Access from multiple applications violates freedom from interference, as applications can modify the same data concurrently. + +.. feat_req:: Separate data stores + :id: feat_req__persistency__access_control + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__dependability__security_features + :status: valid + + The Persistency Module shall ensure that only authorized applications can access individual data stores. + + .. note:: + Access control is essential to prevent unauthorized access and modification of sensitive data. + The Persistency Module shall implement mechanisms to enforce access control policies based on user roles and permissions. + +.. feat_req:: Configuration + :id: feat_req__persistency__cfg + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__functional_req__file_based + :status: valid + :tags: config + + The Persistency Module shall support configuration via a configuration file. + The configuration shall include: + + - Global settings: + - Maximum number of KVS instances + - Maximum size of a key + + - Settings for KVS instance: + - Instance identifier + - Storage URI + - Maximum number of Key-Value pairs + - Maximum number of snapshots + - Maximum consumed storage size (Including all metadata and redundant data) + - Security settings + - Redundancy settings + + Configuration file shall be optional and all configuration attributes shall have sensible default values defined at compile time. + + .. note:: + To improve the user experience during rapid prototyping, the Persistency Module shall also be able to operate without a configuration file. + +.. feat_req:: Supported datatypes (Keys) + :id: feat_req__persistency__support_datatype_keys + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__functional_req__support_of_store + :status: valid + + The Persistency Module shall support UTF-8 encoded strings as valid key types. + +.. feat_req:: Supported datatypes (Values) + :id: feat_req__persistency__support_datatype_value + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__functional_req__support_of_store + :status: valid + :tags: persistency + + The Persistency Module shall support storing both primitive and non-primitive (composite) datatypes as values. + +.. feat_req:: Default values + :id: feat_req__persistency__default_values + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__functional_req__support_of_store + :status: valid + + The Persistency Module shall support predefined default values for keys. + +.. feat_req:: Provisioning of default values via external file + :id: feat_req__persistency__default_value_file + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__functional_req__file_based + :status: valid + + The Persistency Module shall support import of default values using an external file. + + .. note:: + Default values are read-only and cannot be modified at runtime. This requirement addresses the provisioning of default values + during initial deployment. See :need:`feat_req__persistency__tooling`. + +.. feat_req:: Retrieval of default values + :id: feat_req__persistency__default_value_get + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__functional_req__support_of_store + :status: valid + + The Persistency Module shall support retrieval of the default value associated with a key. + +.. feat_req:: Reset to default values + :id: feat_req__persistency__reset_to_default + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__functional_req__support_of_store + :status: valid + + The Persistency Module shall support reset of individual key or all keys to their default values. + +.. feat_req:: Store persistent data + :id: feat_req__persistency__store_data + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__functional_req__data_persistency + :status: valid + + The Persistency Module shall support storing of key-value pairs to non-volatile storage. + +.. feat_req:: Reset resistant storage + :id: feat_req__persistency__reset_resistant + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__functional_req__support_of_store + :status: valid + + The Persistency Module shall ensure that write operations are reset resistant to prevent data corruption in case of expected or unexpected interruption. + + .. note:: + As the constant power supply can not be guaranteed in embedded systems, it is essential to ensure that write operations are completed + successfully, or rolled back to the previous state in case of any kind of interruption. + +.. feat_req:: Recovery from reset + :id: feat_req__persistency__recovery_from_reset + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__functional_req__support_of_store + :status: valid + + The Persistency Module shall recover to a consistent state after reset. + + .. note:: + After a reset, the Persistency Module shall ensure that all key-value pairs are in a consistent state, reflecting either the last successful write operation or the previous consistent state. + +.. feat_req:: Atomic store operation + :id: feat_req__persistency__atomic_store + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__functional_req__support_of_store + :status: valid + + The Persistency Module shall support atomic write operation for entire storage to ensure data consistency. + + .. note:: + + Atomic write operation guarantee that either all key-value pairs are written, or no changes are made at all. + This is required to prevent malfunctions when individual key-value pairs are dependent on each other. + +.. feat_req:: Write amplification minimization + :id: feat_req__persistency__write_amplification + :reqtype: Non-Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__app_architectures__support_data + :status: valid + + The Persistency Module shall minimize the write amplification during data storage operations to enhance performance and prolong the lifespan of the underlying storage medium. + + .. note:: + Write amplification refers to the phenomenon where the amount of data written to the storage medium exceeds the amount of user data intended to be written. + Minimizing write amplification is crucial for optimizing performance and reducing wear on storage devices, especially in embedded systems with limited number of program-erase cycles. + +.. feat_req:: Load persistent data + :id: feat_req__persistency__load_data + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__functional_req__data_persistency + :status: valid + + The Persistency Module shall support loading of key-value pairs from persistent storage. + +.. feat_req:: Cached access + :id: feat_req__persistency__cached_access + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__functional_req__support_of_store + :status: valid + + The Persistency Module shall support caching mechanisms to improve access times for frequently accessed key-value pairs. + +.. feat_req:: Direct access + :id: feat_req__persistency__direct_access + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__dependability__availability + :status: valid + + The Persistency Module shall support direct access to key-value pairs without the necessity to load the entire storage to RAM in advance. + + .. note:: + Direct access improves availability of data and reduces memory consumption for large data sets. + +.. feat_req:: Integrity check + :id: feat_req__persistency__integrity_check + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__functional_req__support_of_store + :status: valid + + The Persistency Module shall detect and report data integrity issues. + +.. feat_req:: Confidential storage + :id: feat_req__persistency__confidential_storage + :reqtype: Functional + :security: YES + :safety: QM + :satisfies: stkh_req__functional_req__data_persistency + :status: valid + + The Persistency Module shall support confidential storage of key-value pairs using encryption mechanisms. + + .. note:: + Confidential storage is essential to protect sensitive data from unauthorized access, especially in scenarios where the storage medium may be exposed to potential threats. + +.. feat_req:: Multiple storage backends + :id: feat_req__persistency__storage_backends + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__functional_req__support_of_store + :status: valid + + The Persistency Module shall support multiple storage backends. + More than one storage backend of the same type shall be optionally supported for the sake of redundancy. + The storage backends shall be compile time configurable for each KVS instance. + + .. note:: + Storage backend represents an abstraction for the underlying storage format and mechanism. + Configurable storage backends allow the user to select the most suitable solution for their specific use case (Performance, easy of use, resource consumption, ...). + +.. feat_req:: Asynchronous operation + :id: feat_req__persistency__async_api + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__dependability__availability, stkh_req__app_architectures__support_request + :status: valid + + The Persistency Module shall provide an asynchronous API for time consuming operations like loading and storing of data. + +.. feat_req:: Signalling completion of asynchronous operation + :id: feat_req__persistency__async_completion + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__app_architectures__support_data + :status: valid + + The Persistency Module shall provide a mechanism to signal the completion of an asynchronous operations to the application. + +.. feat_req:: Snapshot create + :id: feat_req__persistency__snapshot_create + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__functional_req__support_of_store + :status: valid + + The Persistency Module shall support explicit creation of snapshots. Snapshots are identified by unique IDs. + Snapshots shall also include the version of the data layout. See :need:`feat_req__persistency__versioning`. + + .. note:: + Snapshots are point-in-time, read-only view on all key-value pairs at moment of snapshot creation. They are typically used for backup and rollback purposes. + Implicit snapshots (e.g. created during store operation) shall be prevented to reduce storage consumption. + +.. feat_req:: Snapshot restore + :id: feat_req__persistency__snapshot_restore + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__functional_req__support_of_store + :status: valid + + The Persistency Module shall support explicit restoration of snapshots. + +.. feat_req:: Snapshot remove + :id: feat_req__persistency__snapshot_remove + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__functional_req__support_of_store + :status: valid + + The Persistency Module shall support explicit removal of snapshots. + +.. feat_req:: Intra-Process data access + :id: feat_req__persistency__concurrency + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__communication__intra_process + :status: valid + + The Persistency Module shall support concurrent access to key-value pairs from multiple threads within the same process. + +.. feat_req:: Versioning + :id: feat_req__persistency__versioning + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__functional_req__support_of_store + :status: valid + + The Persistency Module shall support versioning for different data representation of KVS. + Version shall follow the semantic versioning scheme (MAJOR.MINOR.PATCH). + + .. note:: + Versioning is essential to ensure compatibility between different versions of the Persistency Module and the stored data. + Each version shall be uniquely identifiable and include information of the data layout and structure. + +.. feat_req:: Update Mechanism + :id: feat_req__persistency__update_mechanism + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__functional_req__support_of_store + :status: valid + + The Persistency Module shall implement mechanisms to upgrade from one version to another, including multi-version jumps. + +.. feat_req:: Random access time + :id: feat_req__persistency__fast_access + :reqtype: Non-Functional + :security: NO + :safety: QM + :satisfies: stkh_req__execution_model__short_app_cycles + :status: valid + + The Persistency Module shall ensure that random read access for key-value pair is completed with constant or logarithmic time complexity relative to the number of stored key-value pairs. + +.. feat_req:: Tooling + :id: feat_req__persistency__tooling + :reqtype: Non-Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__functional_req__support_of_store + :status: valid + + The Persistency Module shall provide tooling support for: + + - viewing and modifying key-value pairs during development, testing and debugging + - provisioning of default values via external file + +.. feat_req:: Support development mode + :id: feat_req__persistency__dev_mode + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__dependability__safety_features + :status: valid + + The Persistency Module shall support the development mode. + The development mode shall allow unrestricted data access and bypass security policies. + +.. feat_req:: Support production mode + :id: feat_req__persistency__prod_mode + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__dependability__safety_features + :status: valid + + The Persistency Module shall support the production mode. + The production mode should enforce the most restrictive data access controls feasible. + +.. needextend:: docname is not None and "persistency/requirements" in docname + :+tags: persistency + +.. _feature_requirements_persistency_aou: + +AoU Requirements +################ + +.. aou_req:: Persistency Error handling + :id: aou_req__persistency__error_handling + :reqtype: Functional + :security: NO + :safety: ASIL_B + :status: valid + :tags: environment + + The application shall handle if the feature persistency is not available. + +.. aou_req:: Application deadlock + :id: aou_req__persistency__appl_design + :reqtype: Functional + :security: NO + :safety: ASIL_B + :status: valid + :tags: environment + + The application shall be designed in a way that deadlocks are avoided. + +.. aou_req:: Application execution + :id: aou_req__persistency__appl_exec + :reqtype: Functional + :security: NO + :safety: ASIL_B + :status: valid + :tags: environment + + The execution of persistency shall not be blocked by the application. diff --git a/docs/features/persistency/kvs/safety_analysis/dfa.rst b/docs/features/persistency/safety_analysis/dfa.rst similarity index 100% rename from docs/features/persistency/kvs/safety_analysis/dfa.rst rename to docs/features/persistency/safety_analysis/dfa.rst diff --git a/docs/features/persistency/kvs/safety_analysis/fmea.rst b/docs/features/persistency/safety_analysis/fmea.rst similarity index 100% rename from docs/features/persistency/kvs/safety_analysis/fmea.rst rename to docs/features/persistency/safety_analysis/fmea.rst diff --git a/docs/features/persistency/kvs/safety_planning/index.rst b/docs/features/persistency/safety_planning/index.rst similarity index 94% rename from docs/features/persistency/kvs/safety_planning/index.rst rename to docs/features/persistency/safety_planning/index.rst index 1752cfcfada..de0b5dd2c63 100644 --- a/docs/features/persistency/kvs/safety_planning/index.rst +++ b/docs/features/persistency/safety_planning/index.rst @@ -38,28 +38,28 @@ Feature Safety Planning - :need:`gd_temp__change_feature_request` - :ndf:`copy('status', need_id='gd_temp__change_feature_request')` - https://github.com/eclipse-score/score/issues/760 - - :need:`doc__persistency_kvs` - - :ndf:`copy('status', need_id='doc__persistency_kvs')` + - :need:`doc__persistency` + - :ndf:`copy('status', need_id='doc__persistency')` * - :need:`wp__requirements_feat` - :need:`gd_temp__req_feat_req` - :ndf:`copy('status', need_id='gd_temp__req_feat_req')` - https://github.com/eclipse-score/score/issues/960 - - :ref:`feature_requirements_PersistencyKvs` + - :ref:`feature_requirements_persistency` - valid * - :need:`wp__requirements_feat_aou` - :need:`gd_temp__req_aou_req` - :ndf:`copy('status', need_id='gd_temp__req_aou_req')` - https://github.com/eclipse-score/score/issues/960 - - :ref:`feature_requirements_PersistencyKvs` + - :ref:`feature_requirements_persistency_aou` - valid * - :need:`wp__feature_arch` - :need:`gd_temp__arch_feature` - :ndf:`copy('status', need_id='gd_temp__arch_feature')` - https://github.com/eclipse-score/score/issues/1020 - - :ref:`feature_architecture_PersistencyKvs` + - :ref:`feature_architecture_persistency` - valid * - :need:`wp__feature_fmea` diff --git a/docs/modules/persistency/kvs/docs/requirements/index.rst b/docs/modules/persistency/kvs/docs/requirements/index.rst index d237cea3e10..0f76eb4d63f 100644 --- a/docs/modules/persistency/kvs/docs/requirements/index.rst +++ b/docs/modules/persistency/kvs/docs/requirements/index.rst @@ -120,7 +120,7 @@ Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: feat_req__persistency__default_values,feat_req__persistency__default_value_get,feat_req__persistency__default_value_reset,feat_req__persistency__default_value_file + :satisfies: feat_req__persistency__default_values,feat_req__persistency__default_value_get,feat_req__persistency__reset_to_default,feat_req__persistency__default_value_file :status: valid The component shall accept default values of only permitted value data @@ -131,7 +131,7 @@ Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: feat_req__persistency__default_values,feat_req__persistency__default_value_get,feat_req__persistency__default_value_reset,feat_req__persistency__default_value_file + :satisfies: feat_req__persistency__default_values,feat_req__persistency__default_value_get,feat_req__persistency__reset_to_default,feat_req__persistency__default_value_file :status: valid The component shall provide an API to retrieve default values. @@ -141,7 +141,7 @@ Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: feat_req__persistency__default_values,feat_req__persistency__default_value_get,feat_req__persistency__default_value_reset,feat_req__persistency__default_value_file + :satisfies: feat_req__persistency__default_values,feat_req__persistency__default_value_get,feat_req__persistency__reset_to_default,feat_req__persistency__default_value_file :status: valid The component shall allow configuration of default values in code or in a @@ -152,7 +152,7 @@ Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: feat_req__persistency__default_values,feat_req__persistency__default_value_get,feat_req__persistency__default_value_reset,feat_req__persistency__default_value_file + :satisfies: feat_req__persistency__default_values,feat_req__persistency__default_value_get,feat_req__persistency__reset_to_default,feat_req__persistency__default_value_file :status: valid The component shall secure the configuration file for default values with an @@ -163,7 +163,7 @@ Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: feat_req__persistency__config_file + :satisfies: feat_req__persistency__cfg :status: valid The component shall allow configuration of KVS constraints at compile-time @@ -174,7 +174,7 @@ Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: feat_req__persistency__intra_process_comm + :satisfies: feat_req__persistency__concurrency :status: valid The component shall implement thread-safe mechanisms to enable concurrent @@ -197,7 +197,7 @@ Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: feat_req__persistency__persistency,feat_req__persistency__integrity_check,feat_req__persistency__persist_data + :satisfies: feat_req__persistency__integrity_check,feat_req__persistency__store_data :status: valid The component shall use the file API and the JSON data format to persist data. @@ -207,7 +207,7 @@ Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: feat_req__persistency__persistency,feat_req__persistency__integrity_check,feat_req__persistency__persist_data + :satisfies: feat_req__persistency__integrity_check,feat_req__persistency__store_data :status: valid The component shall generate a checksum for each data file and shall store @@ -218,7 +218,7 @@ Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: feat_req__persistency__persistency,feat_req__persistency__integrity_check,feat_req__persistency__persist_data + :satisfies: feat_req__persistency__integrity_check,feat_req__persistency__load_data :status: valid The component shall verify the checksum when loading data. @@ -228,7 +228,7 @@ Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: feat_req__persistency__persistency,feat_req__persistency__integrity_check,feat_req__persistency__persist_data + :satisfies: feat_req__persistency__integrity_check,feat_req__persistency__store_data :status: valid The component shall use the file API to persist data. @@ -238,7 +238,7 @@ Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: feat_req__persistency__persistency,feat_req__persistency__integrity_check,feat_req__persistency__persist_data + :satisfies: feat_req__persistency__integrity_check,feat_req__persistency__store_data :status: valid The component shall use the JSON data format to persist data. @@ -270,7 +270,7 @@ Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: feat_req__persistency__snapshots + :satisfies: feat_req__persistency__snapshot_create :status: valid The component shall create a snapshot each time data is stored. @@ -280,7 +280,7 @@ Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: feat_req__persistency__snapshots + :satisfies: feat_req__persistency__cfg :status: valid The component shall maintain a configurable maximum number of snapshots. @@ -290,7 +290,7 @@ Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: feat_req__persistency__snapshots + :satisfies: feat_req__persistency__snapshot_create :status: valid The component shall assign the ID 1 to the newest snapshot and shall increment the IDs of older snapshots accordingly. @@ -300,7 +300,7 @@ Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: feat_req__persistency__snapshots + :satisfies: feat_req__persistency__snapshot_remove, feat_req__persistency__snapshot_restore :status: valid The component shall rotate and delete the oldest snapshot when the maximum number is reached. @@ -310,7 +310,7 @@ Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: feat_req__persistency__snapshots + :satisfies: feat_req__persistency__snapshot_restore :status: valid The component shall allow restoration of a snapshot by its ID. @@ -320,7 +320,7 @@ Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: feat_req__persistency__snapshots + :satisfies: feat_req__persistency__snapshot_remove :status: valid The component shall allow deletion of individual snapshots. @@ -330,7 +330,7 @@ Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: feat_req__persistency__eng_mode + :satisfies: feat_req__persistency__dev_mode :status: valid The component shall provide an engineering mode that can be enabled during @@ -341,7 +341,7 @@ Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: feat_req__persistency__field_mode + :satisfies: feat_req__persistency__prod_mode :status: valid The component shall provide a field mode that can be enabled during build @@ -385,7 +385,7 @@ Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: feat_req__persistency__events + :satisfies: feat_req__persistency__async_api, feat_req__persistency__async_completion :status: valid The component shall provide an API for registering callbacks that are triggered by data change events. diff --git a/docs/requirements/stakeholder/index.rst b/docs/requirements/stakeholder/index.rst index 748d898fa8b..2b2e47cfea7 100644 --- a/docs/requirements/stakeholder/index.rst +++ b/docs/requirements/stakeholder/index.rst @@ -85,7 +85,7 @@ Functional requirements The SW-platform shall support configuration of applications via files (e.g. yaml, json) .. stkh_req:: Support of safe Key/Value store - :id: stkh_req__functiona_req__support_of_store + :id: stkh_req__functional_req__support_of_store :reqtype: Functional :security: NO :safety: ASIL_B From 1f1b6311e83080b183bff995f1d7b839593901d2 Mon Sep 17 00:00:00 2001 From: Tibor Zavartkay Date: Fri, 14 Nov 2025 08:53:27 +0100 Subject: [PATCH 022/214] Update Doc-as-Code version to v2.0.0 Fix for warning: Doc-as-Code version mismatch detected. - MODULE.bazel version: 2.0.0 - doc_as_code.rst :version:: v1.3.0 Signed-off-by: Tibor Zavartkay --- docs/score_tools/doc_as_code.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/score_tools/doc_as_code.rst b/docs/score_tools/doc_as_code.rst index 028aaf17b95..d145c04753d 100644 --- a/docs/score_tools/doc_as_code.rst +++ b/docs/score_tools/doc_as_code.rst @@ -15,7 +15,7 @@ .. doc_tool:: Doc-as-Code :id: doc_tool__doc_as_code :status: evaluated - :version: v1.3.0 + :version: v2.0.0 :tcl: LOW :safety_affected: YES :security_affected: YES From c74ed343f04971050028e586878f3e39075d1077 Mon Sep 17 00:00:00 2001 From: Tibor Zavartkay Date: Mon, 17 Nov 2025 14:43:57 +0100 Subject: [PATCH 023/214] Fix review findings --- .../persistency/requirements/index.rst | 105 +++++++++--------- .../persistency/safety_planning/index.rst | 4 +- 2 files changed, 55 insertions(+), 54 deletions(-) diff --git a/docs/features/persistency/requirements/index.rst b/docs/features/persistency/requirements/index.rst index f2f4fae9757..17e5cbf3205 100644 --- a/docs/features/persistency/requirements/index.rst +++ b/docs/features/persistency/requirements/index.rst @@ -12,16 +12,16 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -.. _feature_requirements_persistency: +.. _feature_persistency_requirements: Requirements ############ -.. document:: Persistency Module Feature Requirements - :id: doc__persistency_requirements +.. document:: Persistency Requirements + :id: doc__feature_persistency_requirements :status: valid :safety: ASIL_B - :security: NO + :security: YES :realizes: wp__feat_request :tags: persistency @@ -33,17 +33,17 @@ Requirements :satisfies: stkh_req__dev_experience__prog_languages :status: valid - The Persistency Module shall provide native API support for both C++ and Rust programming languages. + The Persistency shall provide native API support for both C++ and Rust programming languages. .. feat_req:: Operating system agnostic implementation :id: feat_req__persistency__os_agnostic :reqtype: Non-Functional :security: NO :safety: QM - :satisfies: stkh_req__hardware_support__chipset_support + :satisfies: stkh_req__functional_req__operating_system :status: valid - The Persistency Module shall be operating system agnostic and only rely on the POSIX interface. + The Persistency shall be operating system agnostic. .. feat_req:: Variant management support :id: feat_req__persistency__variant_management @@ -53,7 +53,7 @@ Requirements :satisfies: stkh_req__overall_goals__variant_management :status: valid - The Persistency Module shall ensure compatibility across different architectures and versions. + The Persistency shall ensure compatibility across different SW variants and SW versions. .. feat_req:: Dynamic memory allocation during runtime :id: feat_req__persistency__dynamic_memory_alloc @@ -63,11 +63,11 @@ Requirements :satisfies: stkh_req__functional_req__support_of_store :status: valid - The Persistency Module shall not allocate dynamic memory during runtime. All required dynamic memory shall be allocated during initialization. + The Persistency shall not allocate dynamic memory during runtime. All required dynamic memory shall be allocated during initialization. .. note:: - Dynamic memory allocation violates safety concepts as the `HEAP` is a shared resource, where freedom from interference cannot be guaranteed. + Dynamic memory allocation violates freedom from interference as the `HEAP` is a shared resource on OS process level. Additionally, fragmentation of the `HEAP` can lead to non-deterministic behavior of the application. .. feat_req:: Multiple KVS per application @@ -78,7 +78,7 @@ Requirements :satisfies: stkh_req__functional_req__data_persistency :status: valid - The Persistency Module shall support multiple independent storages per application. + The Persistency shall support multiple independent storages per application. .. feat_req:: Access from multiple application :id: feat_req__persistency__multiple_app @@ -88,24 +88,24 @@ Requirements :satisfies: stkh_req__functional_req__support_of_store :status: valid - The Persistency Module shall prevent access to a single KVS instance from multiple applications. + The Persistency shall prevent access to a single KVS instance from multiple OS processes. .. note:: - Access from multiple applications violates freedom from interference, as applications can modify the same data concurrently. + Access from multiple OS processesviolates freedom from interference, as applications can modify the same data concurrently. .. feat_req:: Separate data stores :id: feat_req__persistency__access_control :reqtype: Functional - :security: NO + :security: YES :safety: ASIL_B :satisfies: stkh_req__dependability__security_features :status: valid - The Persistency Module shall ensure that only authorized applications can access individual data stores. + The Persistency shall ensure that only authorized applications can access individual data stores. .. note:: Access control is essential to prevent unauthorized access and modification of sensitive data. - The Persistency Module shall implement mechanisms to enforce access control policies based on user roles and permissions. + The Persistency shall implement mechanisms to enforce access control policies based on user roles and permissions. .. feat_req:: Configuration :id: feat_req__persistency__cfg @@ -116,7 +116,7 @@ Requirements :status: valid :tags: config - The Persistency Module shall support configuration via a configuration file. + The Persistency shall support configuration via a configuration file. The configuration shall include: - Global settings: @@ -135,7 +135,7 @@ Requirements Configuration file shall be optional and all configuration attributes shall have sensible default values defined at compile time. .. note:: - To improve the user experience during rapid prototyping, the Persistency Module shall also be able to operate without a configuration file. + To improve the user experience during rapid prototyping, the Persistency shall also be able to operate without a configuration file. .. feat_req:: Supported datatypes (Keys) :id: feat_req__persistency__support_datatype_keys @@ -145,7 +145,7 @@ Requirements :satisfies: stkh_req__functional_req__support_of_store :status: valid - The Persistency Module shall support UTF-8 encoded strings as valid key types. + The Persistency shall support UTF-8 encoded strings as valid key types. .. feat_req:: Supported datatypes (Values) :id: feat_req__persistency__support_datatype_value @@ -156,7 +156,7 @@ Requirements :status: valid :tags: persistency - The Persistency Module shall support storing both primitive and non-primitive (composite) datatypes as values. + The Persistency shall support storing both primitive and non-primitive (composite) datatypes as values. .. feat_req:: Default values :id: feat_req__persistency__default_values @@ -166,7 +166,7 @@ Requirements :satisfies: stkh_req__functional_req__support_of_store :status: valid - The Persistency Module shall support predefined default values for keys. + The Persistency shall support predefined default values for keys. .. feat_req:: Provisioning of default values via external file :id: feat_req__persistency__default_value_file @@ -176,7 +176,7 @@ Requirements :satisfies: stkh_req__functional_req__file_based :status: valid - The Persistency Module shall support import of default values using an external file. + The Persistency shall support import of default values using an external file. .. note:: Default values are read-only and cannot be modified at runtime. This requirement addresses the provisioning of default values @@ -190,7 +190,7 @@ Requirements :satisfies: stkh_req__functional_req__support_of_store :status: valid - The Persistency Module shall support retrieval of the default value associated with a key. + The Persistency shall support retrieval of the default value associated with a key. .. feat_req:: Reset to default values :id: feat_req__persistency__reset_to_default @@ -200,7 +200,7 @@ Requirements :satisfies: stkh_req__functional_req__support_of_store :status: valid - The Persistency Module shall support reset of individual key or all keys to their default values. + The Persistency shall support reset of individual key or all keys to their default values. .. feat_req:: Store persistent data :id: feat_req__persistency__store_data @@ -210,7 +210,7 @@ Requirements :satisfies: stkh_req__functional_req__data_persistency :status: valid - The Persistency Module shall support storing of key-value pairs to non-volatile storage. + The Persistency shall support storing of key-value pairs to non-volatile storage. .. feat_req:: Reset resistant storage :id: feat_req__persistency__reset_resistant @@ -220,7 +220,7 @@ Requirements :satisfies: stkh_req__functional_req__support_of_store :status: valid - The Persistency Module shall ensure that write operations are reset resistant to prevent data corruption in case of expected or unexpected interruption. + The Persistency shall ensure that write operations are reset resistant to prevent data corruption in case of expected or unexpected interruption. .. note:: As the constant power supply can not be guaranteed in embedded systems, it is essential to ensure that write operations are completed @@ -234,10 +234,10 @@ Requirements :satisfies: stkh_req__functional_req__support_of_store :status: valid - The Persistency Module shall recover to a consistent state after reset. + The Persistency shall recover to a consistent state after reset. .. note:: - After a reset, the Persistency Module shall ensure that all key-value pairs are in a consistent state, reflecting either the last successful write operation or the previous consistent state. + After a reset, the Persistency shall ensure that all key-value pairs are in a consistent state, reflecting either the last successful write operation or the previous consistent state. .. feat_req:: Atomic store operation :id: feat_req__persistency__atomic_store @@ -247,7 +247,7 @@ Requirements :satisfies: stkh_req__functional_req__support_of_store :status: valid - The Persistency Module shall support atomic write operation for entire storage to ensure data consistency. + The Persistency shall support atomic write operation for entire storage to ensure data consistency. .. note:: @@ -262,7 +262,7 @@ Requirements :satisfies: stkh_req__app_architectures__support_data :status: valid - The Persistency Module shall minimize the write amplification during data storage operations to enhance performance and prolong the lifespan of the underlying storage medium. + The Persistency shall minimize the write amplification during data storage operations to enhance performance and prolong the lifespan of the underlying storage medium. .. note:: Write amplification refers to the phenomenon where the amount of data written to the storage medium exceeds the amount of user data intended to be written. @@ -276,7 +276,7 @@ Requirements :satisfies: stkh_req__functional_req__data_persistency :status: valid - The Persistency Module shall support loading of key-value pairs from persistent storage. + The Persistency shall support loading of key-value pairs from persistent storage. .. feat_req:: Cached access :id: feat_req__persistency__cached_access @@ -286,7 +286,7 @@ Requirements :satisfies: stkh_req__functional_req__support_of_store :status: valid - The Persistency Module shall support caching mechanisms to improve access times for frequently accessed key-value pairs. + The Persistency shall support caching mechanisms to improve access times for frequently accessed key-value pairs. .. feat_req:: Direct access :id: feat_req__persistency__direct_access @@ -296,7 +296,7 @@ Requirements :satisfies: stkh_req__dependability__availability :status: valid - The Persistency Module shall support direct access to key-value pairs without the necessity to load the entire storage to RAM in advance. + The Persistency shall support direct access to key-value pairs without the necessity to load the entire storage to RAM in advance. .. note:: Direct access improves availability of data and reduces memory consumption for large data sets. @@ -309,7 +309,7 @@ Requirements :satisfies: stkh_req__functional_req__support_of_store :status: valid - The Persistency Module shall detect and report data integrity issues. + The Persistency shall detect and report data integrity issues. .. feat_req:: Confidential storage :id: feat_req__persistency__confidential_storage @@ -319,7 +319,7 @@ Requirements :satisfies: stkh_req__functional_req__data_persistency :status: valid - The Persistency Module shall support confidential storage of key-value pairs using encryption mechanisms. + The Persistency shall support confidential storage of key-value pairs using encryption mechanisms. .. note:: Confidential storage is essential to protect sensitive data from unauthorized access, especially in scenarios where the storage medium may be exposed to potential threats. @@ -332,7 +332,7 @@ Requirements :satisfies: stkh_req__functional_req__support_of_store :status: valid - The Persistency Module shall support multiple storage backends. + The Persistency shall support multiple storage backends. More than one storage backend of the same type shall be optionally supported for the sake of redundancy. The storage backends shall be compile time configurable for each KVS instance. @@ -348,7 +348,7 @@ Requirements :satisfies: stkh_req__dependability__availability, stkh_req__app_architectures__support_request :status: valid - The Persistency Module shall provide an asynchronous API for time consuming operations like loading and storing of data. + The Persistency shall provide an asynchronous API for time consuming operations like loading and storing of data. .. feat_req:: Signalling completion of asynchronous operation :id: feat_req__persistency__async_completion @@ -358,7 +358,7 @@ Requirements :satisfies: stkh_req__app_architectures__support_data :status: valid - The Persistency Module shall provide a mechanism to signal the completion of an asynchronous operations to the application. + The Persistency shall provide a mechanism to signal the completion of an asynchronous operations to the application. .. feat_req:: Snapshot create :id: feat_req__persistency__snapshot_create @@ -368,7 +368,7 @@ Requirements :satisfies: stkh_req__functional_req__support_of_store :status: valid - The Persistency Module shall support explicit creation of snapshots. Snapshots are identified by unique IDs. + The Persistency shall support explicit creation of snapshots. Snapshots are identified by unique IDs. Snapshots shall also include the version of the data layout. See :need:`feat_req__persistency__versioning`. .. note:: @@ -383,7 +383,7 @@ Requirements :satisfies: stkh_req__functional_req__support_of_store :status: valid - The Persistency Module shall support explicit restoration of snapshots. + The Persistency shall support explicit restoration of snapshots. .. feat_req:: Snapshot remove :id: feat_req__persistency__snapshot_remove @@ -393,7 +393,7 @@ Requirements :satisfies: stkh_req__functional_req__support_of_store :status: valid - The Persistency Module shall support explicit removal of snapshots. + The Persistency shall support explicit removal of snapshots. .. feat_req:: Intra-Process data access :id: feat_req__persistency__concurrency @@ -403,7 +403,7 @@ Requirements :satisfies: stkh_req__communication__intra_process :status: valid - The Persistency Module shall support concurrent access to key-value pairs from multiple threads within the same process. + The Persistency shall support concurrent access to key-value pairs from multiple threads within the same process. .. feat_req:: Versioning :id: feat_req__persistency__versioning @@ -413,11 +413,11 @@ Requirements :satisfies: stkh_req__functional_req__support_of_store :status: valid - The Persistency Module shall support versioning for different data representation of KVS. + The Persistency shall support versioning for different data representation of KVS. Version shall follow the semantic versioning scheme (MAJOR.MINOR.PATCH). .. note:: - Versioning is essential to ensure compatibility between different versions of the Persistency Module and the stored data. + Versioning is essential to ensure compatibility between different versions of the Persistency and the stored data. Each version shall be uniquely identifiable and include information of the data layout and structure. .. feat_req:: Update Mechanism @@ -425,10 +425,10 @@ Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: stkh_req__functional_req__support_of_store + :satisfies: stkh_req__overall_goals__variant_management :status: valid - The Persistency Module shall implement mechanisms to upgrade from one version to another, including multi-version jumps. + The Persistency shall implement mechanisms to upgrade from one version to another, including multi-version jumps. .. feat_req:: Random access time :id: feat_req__persistency__fast_access @@ -438,7 +438,7 @@ Requirements :satisfies: stkh_req__execution_model__short_app_cycles :status: valid - The Persistency Module shall ensure that random read access for key-value pair is completed with constant or logarithmic time complexity relative to the number of stored key-value pairs. + The Persistency shall ensure that random read access for key-value pair is completed with constant or logarithmic time complexity relative to the number of stored key-value pairs. .. feat_req:: Tooling :id: feat_req__persistency__tooling @@ -448,7 +448,7 @@ Requirements :satisfies: stkh_req__functional_req__support_of_store :status: valid - The Persistency Module shall provide tooling support for: + The Persistency shall provide tooling support for: - viewing and modifying key-value pairs during development, testing and debugging - provisioning of default values via external file @@ -461,24 +461,25 @@ Requirements :satisfies: stkh_req__dependability__safety_features :status: valid - The Persistency Module shall support the development mode. + The Persistency shall support the development mode. The development mode shall allow unrestricted data access and bypass security policies. .. feat_req:: Support production mode :id: feat_req__persistency__prod_mode :reqtype: Functional - :security: NO + :security: YES :safety: ASIL_B :satisfies: stkh_req__dependability__safety_features :status: valid - The Persistency Module shall support the production mode. + The Persistency shall support the production mode. The production mode should enforce the most restrictive data access controls feasible. .. needextend:: docname is not None and "persistency/requirements" in docname :+tags: persistency -.. _feature_requirements_persistency_aou: + +.. _feature_persistency_requirements_aou: AoU Requirements ################ diff --git a/docs/features/persistency/safety_planning/index.rst b/docs/features/persistency/safety_planning/index.rst index de0b5dd2c63..e72c01a3e01 100644 --- a/docs/features/persistency/safety_planning/index.rst +++ b/docs/features/persistency/safety_planning/index.rst @@ -45,14 +45,14 @@ Feature Safety Planning - :need:`gd_temp__req_feat_req` - :ndf:`copy('status', need_id='gd_temp__req_feat_req')` - https://github.com/eclipse-score/score/issues/960 - - :ref:`feature_requirements_persistency` + - :ref:`feature_persistency_requirements` - valid * - :need:`wp__requirements_feat_aou` - :need:`gd_temp__req_aou_req` - :ndf:`copy('status', need_id='gd_temp__req_aou_req')` - https://github.com/eclipse-score/score/issues/960 - - :ref:`feature_requirements_persistency_aou` + - :ref:`feature_persistency_requirements_aou` - valid * - :need:`wp__feature_arch` From 10c0b56e2e5efa6c56aac175d3e2591e6ec00274 Mon Sep 17 00:00:00 2001 From: Tibor Zavartkay Date: Tue, 18 Nov 2025 17:36:30 +0100 Subject: [PATCH 024/214] More findings --- docs/features/persistency/requirements/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/features/persistency/requirements/index.rst b/docs/features/persistency/requirements/index.rst index 17e5cbf3205..3d1ef1fb54a 100644 --- a/docs/features/persistency/requirements/index.rst +++ b/docs/features/persistency/requirements/index.rst @@ -53,7 +53,7 @@ Requirements :satisfies: stkh_req__overall_goals__variant_management :status: valid - The Persistency shall ensure compatibility across different SW variants and SW versions. + The Persistency shall ensure compatibility across different SW versions. .. feat_req:: Dynamic memory allocation during runtime :id: feat_req__persistency__dynamic_memory_alloc @@ -91,7 +91,7 @@ Requirements The Persistency shall prevent access to a single KVS instance from multiple OS processes. .. note:: - Access from multiple OS processesviolates freedom from interference, as applications can modify the same data concurrently. + Access from multiple OS processes violates freedom from interference, as applications can modify the same data concurrently. .. feat_req:: Separate data stores :id: feat_req__persistency__access_control From cf82419dd90bd7fa3179411af67a5d9b7d57edcc Mon Sep 17 00:00:00 2001 From: Tibor Zavartkay Date: Wed, 19 Nov 2025 18:17:52 +0100 Subject: [PATCH 025/214] Even more findings --- .../requirements/chklst_req_inspection.rst | 11 ++++++----- docs/features/persistency/requirements/index.rst | 6 ++++-- docs/features/persistency/safety_analysis/dfa.rst | 6 +++--- docs/features/persistency/safety_analysis/fmea.rst | 6 +++--- docs/features/persistency/safety_planning/index.rst | 6 +++--- 5 files changed, 19 insertions(+), 16 deletions(-) diff --git a/docs/features/persistency/requirements/chklst_req_inspection.rst b/docs/features/persistency/requirements/chklst_req_inspection.rst index cc83a26fe26..8cd50d5826e 100644 --- a/docs/features/persistency/requirements/chklst_req_inspection.rst +++ b/docs/features/persistency/requirements/chklst_req_inspection.rst @@ -12,22 +12,23 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -Requirement Inspection Checklist Persistency KVS -================================================ +Persistency Requirements Inspection Checklist +############################################# -.. document:: Requirements Inspection Checklist Persistency KVS - :id: doc__req_inspection_persistency +.. document:: Persistency Requirements Inspection Checklist + :id: doc__feature_persistency_requirements_chklst :status: valid :safety: ASIL_B :security: NO :tags: persistency **Purpose** + The purpose of this requirement inspection checklist is to collect the topics to be checked during requirements inspection. **Checklist** -.. list-table:: Requirement Inspection Checklist Persistency KVS +.. list-table:: Persistency Requirements Inspection Checklist :header-rows: 1 :widths: 10,30,50,6,6,8 diff --git a/docs/features/persistency/requirements/index.rst b/docs/features/persistency/requirements/index.rst index 3d1ef1fb54a..2d836a12127 100644 --- a/docs/features/persistency/requirements/index.rst +++ b/docs/features/persistency/requirements/index.rst @@ -80,7 +80,7 @@ Requirements The Persistency shall support multiple independent storages per application. -.. feat_req:: Access from multiple application +.. feat_req:: Access from multiple applications :id: feat_req__persistency__multiple_app :reqtype: Functional :security: NO @@ -131,6 +131,7 @@ Requirements - Maximum consumed storage size (Including all metadata and redundant data) - Security settings - Redundancy settings + - Backend specific settings Configuration file shall be optional and all configuration attributes shall have sensible default values defined at compile time. @@ -201,6 +202,7 @@ Requirements :status: valid The Persistency shall support reset of individual key or all keys to their default values. + This is only applicable for existing keys that have a predefined default value. .. feat_req:: Store persistent data :id: feat_req__persistency__store_data @@ -210,7 +212,7 @@ Requirements :satisfies: stkh_req__functional_req__data_persistency :status: valid - The Persistency shall support storing of key-value pairs to non-volatile storage. + The Persistency shall support storing of key-value pairs to persistent storage. .. feat_req:: Reset resistant storage :id: feat_req__persistency__reset_resistant diff --git a/docs/features/persistency/safety_analysis/dfa.rst b/docs/features/persistency/safety_analysis/dfa.rst index 85cf942fa8f..d12e39acf52 100644 --- a/docs/features/persistency/safety_analysis/dfa.rst +++ b/docs/features/persistency/safety_analysis/dfa.rst @@ -12,10 +12,10 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -Persistency DFA -############### +DFA (Dependent Failure Analysis) +################################ -.. document:: DFA +.. document:: Persistency DFA :id: doc__persistency_dfa :status: valid :safety: ASIL_B diff --git a/docs/features/persistency/safety_analysis/fmea.rst b/docs/features/persistency/safety_analysis/fmea.rst index f74923a411c..98fae6189ed 100644 --- a/docs/features/persistency/safety_analysis/fmea.rst +++ b/docs/features/persistency/safety_analysis/fmea.rst @@ -12,10 +12,10 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -Persistency FMEA -################ +FMEA (Failure Modes and Effects Analysis) +######################################### -.. document:: FMEA +.. document:: Persistency FMEA :id: doc__persistency_fmea :status: valid :safety: ASIL_B diff --git a/docs/features/persistency/safety_planning/index.rst b/docs/features/persistency/safety_planning/index.rst index e72c01a3e01..9531333aebe 100644 --- a/docs/features/persistency/safety_planning/index.rst +++ b/docs/features/persistency/safety_planning/index.rst @@ -15,7 +15,7 @@ Feature Safety Planning ======================= -.. document:: Persistency KVS Safety WPs +.. document:: Persistency Safety WPs :id: doc__persistency_safety_wp :status: valid :safety: ASIL_B @@ -24,7 +24,7 @@ Feature Safety Planning :tags: persistency -.. list-table:: Feature persistency Workproducts +.. list-table:: Feature persistency workproducts :header-rows: 1 * - Workproduct Id @@ -80,7 +80,7 @@ Feature Safety Planning - :need:`gd_chklst__req_inspection` - :ndf:`copy('status', need_id='gd_chklst__req_inspection')` - https://github.com/eclipse-score/score/issues/960 - - :need:`doc__req_inspection_persistency` + - :need:`doc__feature_persistency_requirements_chklst` - valid * - :need:`wp__sw_arch_verification` From 59a8debbdcc7b1549d9e1956ab72efa2d1bb5eb0 Mon Sep 17 00:00:00 2001 From: "Frank Scholter Peres(MBTI)" <145544737+FScholPer@users.noreply.github.com> Date: Thu, 20 Nov 2025 10:27:53 +0100 Subject: [PATCH 026/214] Update docs/requirements/stakeholder/index.rst Co-authored-by: Oliver Pajonk Signed-off-by: Frank Scholter Peres(MBTI) <145544737+FScholPer@users.noreply.github.com> --- docs/requirements/stakeholder/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements/stakeholder/index.rst b/docs/requirements/stakeholder/index.rst index f494185c083..b35454303fb 100644 --- a/docs/requirements/stakeholder/index.rst +++ b/docs/requirements/stakeholder/index.rst @@ -483,7 +483,7 @@ Communication :status: valid :valid_from: v1.0.0 - The platform shall support not only IPC but also intra Virtual Machine (VM) communication. + The platform shall support not only IPC but also inter Virtual Machine (VM) communication. .. stkh_req:: Stable application interfaces :id: stkh_req__communication__stable_app_inter From c8424e9b5fba0ea03d65b8396bb01dcdb103778a Mon Sep 17 00:00:00 2001 From: Tibor Zavartkay Date: Fri, 21 Nov 2025 14:46:27 +0100 Subject: [PATCH 027/214] Removed semantic version. --- docs/features/persistency/requirements/index.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/features/persistency/requirements/index.rst b/docs/features/persistency/requirements/index.rst index 2d836a12127..e730322c46d 100644 --- a/docs/features/persistency/requirements/index.rst +++ b/docs/features/persistency/requirements/index.rst @@ -416,7 +416,6 @@ Requirements :status: valid The Persistency shall support versioning for different data representation of KVS. - Version shall follow the semantic versioning scheme (MAJOR.MINOR.PATCH). .. note:: Versioning is essential to ensure compatibility between different versions of the Persistency and the stored data. From 11cd44046657c526e12811e7ae629ff43840be32 Mon Sep 17 00:00:00 2001 From: pandaedo Date: Wed, 3 Dec 2025 14:25:23 +0100 Subject: [PATCH 028/214] inital version templates --- docs/modules/orchestrator/docs/index.rst | 22 +- .../orchestrator/docs/manual/index.rst | 21 ++ .../docs/manual/safety_manual.rst | 90 +++++ .../docs/release/release_note.rst | 120 ++++++ .../orchestrator/docs/safety_mgt/index.rst | 23 ++ .../safety_mgt/module_safety_package_fdr.rst | 64 ++++ .../docs/safety_mgt/module_safety_plan.rst | 346 ++++++++++++++++++ .../safety_mgt/module_safety_plan_fdr.rst | 93 +++++ .../module_verification_report.rst | 81 ++++ .../architecture/chklst_arc_inspection.rst | 157 ++++++++ .../executor/docs/architecture/executor.rst | 41 --- .../executor/docs/architecture/index.rst | 122 ++++++ .../executor/docs/detailed_design/index.rst | 70 ++++ .../orchestrator/executor/docs/index.rst | 171 ++++++++- .../requirements/chklst_req_inspection.rst | 181 +++++++++ .../executor/docs/requirements/index.rst | 66 ++++ .../executor/docs/safety_analysis/dfa.rst | 49 +++ .../executor/docs/safety_analysis/fmea.rst | 49 +++ docs/modules/orchestrator/index.rst | 150 +++++++- .../architecture/chklst_arc_inspection.rst | 157 ++++++++ .../{orchestrator.rst => index.rst} | 109 +++++- .../docs/detailed_design/index.rst | 70 ++++ .../orchestrator/orchestrator/docs/index.rst | 170 ++++++++- .../requirements/chklst_req_inspection.rst | 181 +++++++++ .../orchestrator/docs/requirements/index.rst | 66 ++++ .../orchestrator/docs/safety_analysis/dfa.rst | 49 +++ .../docs/safety_analysis/fmea.rst | 49 +++ 27 files changed, 2694 insertions(+), 73 deletions(-) create mode 100644 docs/modules/orchestrator/docs/manual/index.rst create mode 100644 docs/modules/orchestrator/docs/manual/safety_manual.rst create mode 100644 docs/modules/orchestrator/docs/release/release_note.rst create mode 100644 docs/modules/orchestrator/docs/safety_mgt/index.rst create mode 100644 docs/modules/orchestrator/docs/safety_mgt/module_safety_package_fdr.rst create mode 100644 docs/modules/orchestrator/docs/safety_mgt/module_safety_plan.rst create mode 100644 docs/modules/orchestrator/docs/safety_mgt/module_safety_plan_fdr.rst create mode 100644 docs/modules/orchestrator/docs/verification/module_verification_report.rst create mode 100644 docs/modules/orchestrator/executor/docs/architecture/chklst_arc_inspection.rst delete mode 100644 docs/modules/orchestrator/executor/docs/architecture/executor.rst create mode 100644 docs/modules/orchestrator/executor/docs/architecture/index.rst create mode 100644 docs/modules/orchestrator/executor/docs/detailed_design/index.rst create mode 100644 docs/modules/orchestrator/executor/docs/requirements/chklst_req_inspection.rst create mode 100644 docs/modules/orchestrator/executor/docs/requirements/index.rst create mode 100644 docs/modules/orchestrator/executor/docs/safety_analysis/dfa.rst create mode 100644 docs/modules/orchestrator/executor/docs/safety_analysis/fmea.rst create mode 100644 docs/modules/orchestrator/orchestrator/docs/architecture/chklst_arc_inspection.rst rename docs/modules/orchestrator/orchestrator/docs/architecture/{orchestrator.rst => index.rst} (69%) create mode 100644 docs/modules/orchestrator/orchestrator/docs/detailed_design/index.rst create mode 100644 docs/modules/orchestrator/orchestrator/docs/requirements/chklst_req_inspection.rst create mode 100644 docs/modules/orchestrator/orchestrator/docs/requirements/index.rst create mode 100644 docs/modules/orchestrator/orchestrator/docs/safety_analysis/dfa.rst create mode 100644 docs/modules/orchestrator/orchestrator/docs/safety_analysis/fmea.rst diff --git a/docs/modules/orchestrator/docs/index.rst b/docs/modules/orchestrator/docs/index.rst index d7fb4780d2b..4a5cfbac999 100644 --- a/docs/modules/orchestrator/docs/index.rst +++ b/docs/modules/orchestrator/docs/index.rst @@ -12,6 +12,21 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* +Module Documents Orchestrator +############################# + + +.. toctree:: + :maxdepth: 1 + :glob: + + manual/index.rst + safety_mgt/index.rst + verification/module_verification_report.rst + release/release_note.rst + + + .. mod_view_sta:: Orchestrator :id: mod_view_sta__orch__orchestrator :includes: comp_arc_sta__orch__orchestrator, comp_arc_sta__orch__executor @@ -21,10 +36,3 @@ :align: center {{ draw_module(need(), needs) }} - -Module Documents -================ - -.. toctree:: - :maxdepth: 1 - :titlesonly: diff --git a/docs/modules/orchestrator/docs/manual/index.rst b/docs/modules/orchestrator/docs/manual/index.rst new file mode 100644 index 00000000000..08ba1a6e1a0 --- /dev/null +++ b/docs/modules/orchestrator/docs/manual/index.rst @@ -0,0 +1,21 @@ +.. + # ******************************************************************************* + # Copyright (c) 2024 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +Manuals +####### + +.. toctree:: + :titlesonly: + + safety_manual diff --git a/docs/modules/orchestrator/docs/manual/safety_manual.rst b/docs/modules/orchestrator/docs/manual/safety_manual.rst new file mode 100644 index 00000000000..70f50ffd3c7 --- /dev/null +++ b/docs/modules/orchestrator/docs/manual/safety_manual.rst @@ -0,0 +1,90 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +Safety Manual +============= + +.. document:: Orchestrator Safety Manual + :id: doc__orchestrator_safety_manual + :status: draft + :safety: ASIL_B + :security: YES + :realizes: wp__module_safety_manual + :tags: orchestrator + + +Introduction/Scope +------------------ +| + +Assumed Platform Safety Requirements +------------------------------------ +| For the the following safety related stakeholder requirements are assumed to define the top level functionality (purpose) of the . I.e. from these all the feature and component requirements implemented are derived. +| + +Assumptions of Use +------------------ + +Assumptions on the Environment +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +| Generally the assumption of the project platform SEooC is that it is integrated in a safe system, i.e. the POSIX OS it runs on is qualified and also the HW related failures are taken into account by the system integrator, if not otherwise stated in the module's safety concept. +| + +List of AoUs expected from the environment the platform / module runs on: + +.. needtable:: + :style: table + :columns: title;id;status + :colwidths: 25,25,25 + :sort: title + + results = [] + + for need in needs.filter_types(["aou_req"]): + if need and "environment" in need["tags"]: + results.append(need) + +Assumptions on the User +^^^^^^^^^^^^^^^^^^^^^^^ +| As there is no assumption on which specific OS and HW is used, the integration testing of the stakeholder and feature requirements is expected to be performed by the user of the platform SEooC. Tests covering all stakeholder and feature requirements performed on a reference platform (tbd link to reference platform specification), reviewed and passed are included in the platform SEooC safety case. +| Additionally the components of the platform may have additional specific assumptions how they are used. These are part of every module documentation: . Assumptions from components to their users can be fulfilled in two ways: +| 1. There are assumption which need to be fulfilled by all SW components, e.g. "every user of an IPC mechanism needs to make sure that he provides correct data (including appropriate ASIL level)" - in this case the AoU is marked as "platform". +| 2. There are assumption which can be fulfilled by a safety mechanism realized by some other project platform component and are therefore not relevant for an user who uses the whole platform. But those are relevant if you chose to use the module SEooC stand-alone - in this case the AoU is marked as "module". An example would be the "JSON read" which requires "The user shall provide a string as input which is not corrupted due to HW or QM SW errors." - which is covered when using together with safe project platform persistency feature. + +List of AoUs on the user of the platform features or the module of this safety manual: + +.. needtable:: + :style: table + :columns: title;id;status + :colwidths: 25,25,25 + :sort: title + + results = [] + + for need in needs.filter_types(["aou_req"]): + if need and "environment" not in need["tags"]: + results.append(need) + +Safety concept of the SEooC +--------------------------- +| + +Safety Anomalies +---------------- +| Anomalies (bugs in ASIL SW, detected by testing or by users, which could not be fixed) known before release are documented in the platform/module release notes . + +References +---------- +| +| diff --git a/docs/modules/orchestrator/docs/release/release_note.rst b/docs/modules/orchestrator/docs/release/release_note.rst new file mode 100644 index 00000000000..4a064f8fd3a --- /dev/null +++ b/docs/modules/orchestrator/docs/release/release_note.rst @@ -0,0 +1,120 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +Release Note +============ + +.. document:: Orchestrator Release Note + :id: doc__orchestrator_release_note + :status: draft + :safety: ASIL_B + :security: YES + :realizes: wp__module_sw_release_note + :tags: orchestrator + + +| Module Name: Orchestrator +| Release Tag: vX.Y.Z +| Origin Release Tag: vU.V.W +| Release Commit Hash: a1b2c3d4e5f6g7h8i9j0 +| Release Date: YYYY-MM-DD +| Safety: [QM | ASIL_B] +| Security: [NO | YES] +| +| Overview +| -------- +| +| This document provides an overview of the changes, improvements, and bug fixes included in the software module release version vX.Y.Z +| as compared to the module's origin release (which is usually the previous release). +| +| Disclaimer +| ---------- +| This release note does not "release for production", as it does not come with a safety argumentation and a performed safety assessment. +| The work products compiled in the safety package are created with care according to a process satisfying standards, but the as the project, +| being a non-profit and open source organization, can not take over any liability for its content. +| +| New Features +| ------------ +| +| - **Feature 1**: Brief description of the new feature. +| - **Feature 2**: Brief description of the new feature. +| - **Feature 3**: Brief description of the new feature. +| +| Improvements +| ------------ +| +| - **Improvement 1**: Brief description of the improvement. +| - **Improvement 2**: Brief description of the improvement. +| - **Improvement 3**: Brief description of the improvement. +| +| Bug Fixes +| --------- +| +| - **Bug 1**: Brief description of the bug fix. +| - **Bug 2**: Brief description of the bug fix. +| - **Bug 3**: Brief description of the bug fix. +| +| Other changes by Label +| ---------------------- +| +| - **Label 1/Refactor 1**: Brief description of the change. +| - **Label 2/Refactor 2**: Brief description of the change. +| - **Label 3/Refactor 3**: Brief description of the change. +| +| Compatibility +| ------------- +| +| - **Dependencies**: List any dependencies and their versions. +| +| Performed Verification +| ---------------------- +| This release note is based on the verification as documented in module verification report +| :need:`doc__module_name_verification_report`. +| +| Known Issues +| ------------ +| +| - **Issue 1**: Brief description of the known issue. Justification regarding safety impact. +| - **Issue 2**: Brief description of the known issue. Justification regarding safety impact. +| - **Issue 3**: Brief description of the known issue. Justification regarding safety impact. +| +| Known Vulnerabilities +| --------------------- +| +| - **CVE 1**: Brief description of the known CVE. Justification regarding security impact. +| - **CVE 2**: Brief description of the known CVE. Justification regarding security impact. +| - **CVE 3**: Brief description of the known CVE. Justification regarding security impact. +| +| Upgrade Instructions +| -------------------- +| +| 1. **Step 1**: Description of the first step. +| 2. **Step 2**: Description of the second step. +| 3. **Step 3**: Description of the third step. +| +| Contributors +| ------------ +| +| Thanks to everyone who contributed to this release: +| +| Contributor 1 +| Contributor 2 +| + +--- + +| Contact Information +| ------------------- +| +| For any questions or support, please contact the *Project lead* or raise an issue/discussion. diff --git a/docs/modules/orchestrator/docs/safety_mgt/index.rst b/docs/modules/orchestrator/docs/safety_mgt/index.rst new file mode 100644 index 00000000000..04718ba3557 --- /dev/null +++ b/docs/modules/orchestrator/docs/safety_mgt/index.rst @@ -0,0 +1,23 @@ +.. + # ******************************************************************************* + # Copyright (c) 2024 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +Safety Management +################# + +.. toctree:: + :titlesonly: + + module_safety_plan + module_safety_plan_fdr + module_safety_package_fdr diff --git a/docs/modules/orchestrator/docs/safety_mgt/module_safety_package_fdr.rst b/docs/modules/orchestrator/docs/safety_mgt/module_safety_package_fdr.rst new file mode 100644 index 00000000000..5004f01d014 --- /dev/null +++ b/docs/modules/orchestrator/docs/safety_mgt/module_safety_package_fdr.rst @@ -0,0 +1,64 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +Safety Package Formal Review Report +=================================== + +.. document:: Orchestrator Safety Package Formal Review + :id: doc__orchestrator_safety_package_fdr + :status: draft + :safety: ASIL_B + :security: YES + :realizes: wp__fdr_reports + :tags: orchestrator + + +**1. Purpose** + +The purpose of this review checklist is to report status of the formal review for the safety package. + +**2. Checklist** + +.. list-table:: Safety Package Checklist + :header-rows: 1 + + * - Id + - Safety package activity + - Compliant to ISO 26262? + - Comment + + * - 1 + - Is a safety package provided which matches the safety plan (i.e. all planned work products referenced)? + - [YES | NO ] + - + + * - 2 + - Is the argument how functional safety is achieved, provided in the safety package, plausible and sufficient? + - NO + - The argument is intentionally not provided by the project. + + * - 3 + - Are the referenced work products available? + - [YES | NO ] + - + + * - 4 + - Are the referenced work products in released state, including the process safety audit? + - [YES | NO ] + - + + * - 5 + - If safety related deviations from the process or safety concept are documented, are these argued understandably? + - [YES | NO ] + - diff --git a/docs/modules/orchestrator/docs/safety_mgt/module_safety_plan.rst b/docs/modules/orchestrator/docs/safety_mgt/module_safety_plan.rst new file mode 100644 index 00000000000..c430dbdeddc --- /dev/null +++ b/docs/modules/orchestrator/docs/safety_mgt/module_safety_plan.rst @@ -0,0 +1,346 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +Module Safety Plan +****************** + +.. document:: Orchestrator Safety Plan + :id: doc__orchestrator_safety_plan + :status: draft + :safety: ASIL_B + :security: YES + :realizes: wp__module_safety_plan + :tags: orchestrator + +Functional Safety Management Context +==================================== + +This Safety Plan adds to the project's :need:`wp__platform_safety_plan` all the module development relevant work products needed for ISO 26262 conformity. + +Functional Safety Management Scope +================================== + +This Safety Plan's scope is a SW module of the SW platform /index.rst>. +The module consists of one or more SW components and will be qualified as a SEooC. + +Functional Safety Management Roles +================================== + +.. list-table:: Module roles + :header-rows: 1 + + * - Role + - Assignee + + * - Safety Manager + - Volker Häussler + + * - Module Project Manager + - Naveen Mohanan + +Tailoring +========= + +Additional to the tailoring in the SW platform project as defined in the project's :need:`wp__platform_safety_plan` we define here the additional tailoring on module level. + +- Excluded for this module are additionally the following work products (and their related requirements): + + - - + +Functional Safety Module Work products +====================================== + +One set of work products for the module and one set for each component of the module: + +Module Work products List +------------------------- + +.. list-table:: Module Work products + :header-rows: 1 + + * - Work product Id + - Link to process + - Process status + - Link to issue + - Link to WP + - WP status + + * - :need:`wp__module_safety_plan` + - :need:`gd_guidl__saf_plan_definitions` + - :ndf:`copy('status', need_id='gd_guidl__saf_plan_definitions')` + - + - this document + - see above + + * - :need:`wp__module_safety_package` + - :need:`gd_guidl__saf_package` + - :ndf:`copy('status', need_id='gd_guidl__saf_package')` + - + - this document (including the linked documentation) + - see above (and below) + + * - :need:`wp__fdr_reports` (module Safety Plan) + - :need:`gd_chklst__safety_plan` + - :ndf:`copy('status', need_id='gd_chklst__safety_plan')` + - + - :need:`doc__module_name_safety_plan_fdr` + - :ndf:`copy('status', need_id='doc__module_name_safety_plan_fdr')` + + * - :need:`wp__fdr_reports` (module Safety Package) + - :need:`gd_chklst__safety_package` + - :ndf:`copy('status', need_id='gd_chklst__safety_package')` + - + - :need:`doc__module_name_safety_package_fdr` + - :ndf:`copy('status', need_id='doc__module_name_safety_package_fdr')` + + * - :need:`wp__fdr_reports` (module's Safety Analyses & DFA) + - Safety Analysis FDR tbd + - + - + - + - + + * - :need:`wp__audit_report` + - performed by external experts + - n/a + - + - + - + + * - :need:`wp__module_sw_build_config` + - :need:`gd_temp__software_development_plan` + - `copy('status', need_id='gd_temp__software_development_plan')` + - + - + - + + * - :need:`wp__module_safety_manual` + - :need:`gd_temp__safety_manual` + - :ndf:`copy('status', need_id='gd_temp__safety_manual')` + - + - :need:`doc__module_name_safety_manual` + - :ndf:`copy('status', need_id='doc__module_name_safety_manual')` + + * - :need:`wp__verification_module_ver_report` + - :need:`gd_temp__mod_ver_report` + - :ndf:`copy('status', need_id='gd_temp__mod_ver_report')` + - + - :need:`doc__module_name_verification_report` + - :ndf:`copy('status', need_id='doc__module_name_verification_report')` + + * - :need:`wp__module_sw_release_note` + - :need:`gd_temp__rel_mod_rel_note` + - :ndf:`copy('status', need_id='gd_temp__rel_mod_rel_note')` + - + - :need:`doc__module_name_release_note` + - :ndf:`copy('status', need_id='doc__module_name_release_note')` + +Component Work products List +----------------------------------- + +.. list-table:: Component Work products + :header-rows: 1 + + * - Work product Id + - Link to process + - Process status + - Link to issue + - Link to WP + - WP/doc status + + * - :need:`wp__requirements_comp` + - :need:`gd_temp__req_comp_req` + - :ndf:`copy('status', need_id='gd_temp__req_comp_req')` + - + - :need:`doc__component_name_requirements` + - doc :ndf:`copy('status', need_id='doc__component_name_requirements')` & WP below + + * - :need:`wp__requirements_comp_aou` + - :need:`gd_temp__req_aou_req` + - :ndf:`copy('status', need_id='gd_temp__req_aou_req')` + - + - :need:`doc__component_name_requirements` + - doc :ndf:`copy('status', need_id='doc__component_name_requirements')` & WP below + + * - :need:`wp__requirements_inspect` + - :need:`gd_chklst__req_inspection` + - :ndf:`copy('status', need_id='gd_chklst__req_inspection')` + - + - :need:`doc__component_name_req_inspection` + - :ndf:`copy('status', need_id='doc__component_name_req_inspection')` + + * - :need:`wp__component_arch` + - :need:`gd_temp__arch_comp` + - :ndf:`copy('status', need_id='gd_temp__arch_comp')` + - + - :need:`doc__component_name_architecture` + - doc :ndf:`copy('status', need_id='doc__component_name_architecture')` & WP below + + * - :need:`wp__sw_arch_verification` + - :need:`gd_chklst__arch_inspection_checklist` + - :ndf:`copy('status', need_id='gd_chklst__arch_inspection_checklist')` + - + - :need:`doc__component_name_arc_inspection` + - :ndf:`copy('status', need_id='doc__component_name_arc_inspection')` + + * - :need:`wp__sw_component_fmea` + - :need:`gd_temp__comp_saf_fmea` + - :ndf:`copy('status', need_id='gd_temp__comp_saf_fmea')` + - + - :need:`doc__component_name_fmea` + - doc :ndf:`copy('status', need_id='doc__component_name_fmea')` & WP below + + * - :need:`wp__sw_component_dfa` + - :need:`gd_temp__comp_saf_dfa` + - :ndf:`copy('status', need_id='gd_temp__comp_saf_dfa')` + - + - :need:`doc__component_name_dfa` + - doc :ndf:`copy('status', need_id='doc__component_name_dfa')` & WP below + + * - :need:`wp__sw_implementation` + - :need:`gd_guidl__implementation` + - :ndf:`copy('status', need_id='gd_guidl__implementation')` + - + - + - + + * - :need:`wp__verification_sw_unit_test` + - :need:`gd_guidl__verification_guide` + - :ndf:`copy('status', need_id='gd_guidl__verification_guide')` + - + - + - + + * - :need:`wp__sw_implementation_inspection` + - :need:`gd_chklst__impl_inspection_checklist` + - :ndf:`copy('status', need_id='gd_chklst__impl_inspection_checklist')` + - + - + - + + * - :need:`wp__verification_comp_int_test` + - :need:`gd_guidl__verification_guide` + - :ndf:`copy('status', need_id='gd_guidl__verification_guide')` + - + - + - + + * - :need:`wp__sw_component_class` + - :need:`gd_guidl__component_classification` + - :ndf:`copy('status', need_id='gd_guidl__component_classification')` + - + - :need:`doc__component_name_comp_class` + - :ndf:`copy('status', need_id='doc__component_name_comp_class')` + +Note: In case the component is a new development, :need:`wp__sw_component_class` shall be removed from the above list (and also from the folders). +In case an OSS element is used in the module, part 6 has to be filled out. + +OSS (sub-)component qualification plan +====================================== + +For the selected OSS component the following work products will be implemented (and why): + +If the OSS element is classified as a + - component, then the below table shall match the above, adding the reasoning for tailoring of work products according to the OSS component classification. + - lower level component, then no work products additional to the component’s will be planned and activities below are part of the component’s issues. + +.. list-table:: OSS (sub-)component Work products + :header-rows: 1 + + * - Work product Id + - Link to issue + - Reasoning for tailoring + + * - :need:`wp__requirements_comp` + - + - Always needed (for Q and QR classification) and also improves process Id 2 + + * - :need:`wp__requirements_comp_aou` + - + - Always needed (for Q and QR classification) and also improves process Id 5 + + * - :need:`wp__requirements_inspect` + - n/a + - Checklist used in Pull Request Review + + * - :need:`wf__cr_mt_comparch` + - + - + + * - :need:`wp__sw_component_fmea` + - + - + + * - :need:`wp__sw_arch_verification` + - + - + + * - :need:`wp__sw_implementation` + - n/a + - If source code is modified, this is not a OSS qualification any more. + + * - :need:`wp__verification_sw_unit_test` + - + - + + * - :need:`wp__sw_implementation_inspection` + - + - + + * - :need:`wp__verification_comp_int_test` + - + - Always needed (for Q and QR classification) + + * - :need:`wp__sw_component_class` + - + - Always needed as basis for tailoring. + +Work Product Status (for Safety Package) +======================================== + +Component Requirements Status +----------------------------- + +.. needtable:: + :filter: "orchestrator" in docname and "requirements" in docname and docname is not None + :style: table + :types: comp_req + :tags: orchestrator + :columns: id;status;tags + :colwidths: 25,25,25 + :sort: title + +Component AoU Status +-------------------- + +.. needtable:: + :filter: "orchestrator" in docname and "requirements" in docname and docname is not None + :style: table + :types: aou_req + :tags: orchestrator + :columns: id;status;tags + :colwidths: 25,25,25 + :sort: title + +Component Architecture Status +----------------------------- + +.. needtable:: + :filter: "component_name" in docname and "architecture" in docname and docname is not None + :style: table + :types: comp_arc_sta; comp_arc_dyn + :tags: orchestrator + :columns: id;status;tags + :colwidths: 25,25,25 + :sort: title diff --git a/docs/modules/orchestrator/docs/safety_mgt/module_safety_plan_fdr.rst b/docs/modules/orchestrator/docs/safety_mgt/module_safety_plan_fdr.rst new file mode 100644 index 00000000000..69569b0852a --- /dev/null +++ b/docs/modules/orchestrator/docs/safety_mgt/module_safety_plan_fdr.rst @@ -0,0 +1,93 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +Safety Plan Formal Review Report +================================ + +.. document:: Orchestrator Safety Plan Formal Review + :id: doc__orchestrator_safety_plan_fdr + :status: draft + :safety: ASIL_B + :security: YES + :realizes: wp__fdr_reports + :tags: orchestrator + +**1. Purpose** + +The purpose of this safety plan formal review checklist is to report status of the review for the safety plan. + +**2. Checklist** + +.. list-table:: Safety Plan Checklist + :header-rows: 1 + + * - Id + - Safety plan activity + - Compliant to ISO 26262? + - Comment + + * - 1 + - Is the rationale for the safety work products tailoring included? + - [YES | NO ] + - + + * - 2 + - Is impact analysis planned in case of re-use of SW (needed for every release following the first formal release)? + - [YES | NO ] + - + + * - 3 + - Does the safety plan define all needed activities for safety management (incl. Confirmation review and Safety Audit)? + - [YES | NO ] + - + + * - 4 + - Does the safety plan define all needed activities for System and SW development, integration and verification? + - [YES | NO ] + - + + * - 5 + - Does the safety plan define all needed activities for safety analysis and DFA? + - [YES | NO ] + - + + * - 6 + - Does the safety plan define all needed activities for supporting processes (incl. tool mgt)? + - [YES | NO ] + - + + * - 7 + - Does the safety plan document a responsible for all activities? + - [YES | NO ] + - + + * - 8 + - If OSS software components is used, is it planned to be qualified? + - [YES | NO ] + - + + * - 9 + - Is a safety manager and a project manager appointed for the project? + - [YES | NO ] + - + + * - 10 + - Is safety plan sufficiently linked to the project plan? + - [YES | NO ] + - + + * - 11 + - Is safety plan updated iteratively to show the progress? + - [YES | NO ] + - diff --git a/docs/modules/orchestrator/docs/verification/module_verification_report.rst b/docs/modules/orchestrator/docs/verification/module_verification_report.rst new file mode 100644 index 00000000000..88491dfda83 --- /dev/null +++ b/docs/modules/orchestrator/docs/verification/module_verification_report.rst @@ -0,0 +1,81 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +Verification Report +=================== + +.. document:: Orchestrator Verification Report + :id: doc__orchestrator_verification_report + :status: draft + :safety: ASIL_B + :security: YES + :realizes: wp__verification_module_ver_report + :tags: orchestrator + + +This verification report is based on the :need:`gd_temp__verification_plan`. +It covers all the components of the above stated module. + +Verification Report contains: + +**1. Verification Coverage** + +**1.1. on Requirements** + - Lists of component requirements (incl. AoU satisfied by the component) tested by which test case, passed/failed and completeness verdict + (this shall be generated by tools and accompanied by progress charts to be usable also for project steering) + - For external component Assumptions of Use: coverage by platform safety manual or feature/components incl. test case, passed/failed and completeness verdict + - This is split in a list of QM requirements tested and a separate list of tests for ASIL rated requirements. + - List of component requirements (ASIL rated) linked to inspection checklist and verdict (derived from PR export) + +**1.2. on Architecture** + - List of component architecture tags tested by which test case, passed/failed and completeness verdict + (this shall be generated by tools and accompanied by progress charts to be usable also for project steering) + - This is split in a list of QM components tested and a separate list of tests for ASIL rated components. + - List of component architecture tags (ASIL rated) linked to inspection checklist and verdict (derived from PR export) + +**1.3. on Detailed Design** + - List of detailed design tags tested by which test case, passed/failed and completeness verdict + (this shall be generated by tools and accompanied by progress charts to be usable also for project steering) + - This is split in a list of QM components tested and a separate list of tests for ASIL rated components. + - List of detailed design tags (ASIL rated) linked to inspection checklist and verdict (derived from PR export) + + - The lists may also contain other verification methods like "Analysis" - process tbd + +**2. DFA Report** + - List of the performed component DFA, pass/fail with open mitigations + +**3. Safety Analysis Report** + - List of the performed component Safety Analysis, pass/fail with open mitigations + +**4. Unit Verification Coverage** + +**4.1. Structural Coverage** + - List of the units with C0(line) and C1(branch) coverage absolute and percentage + (this shall be generated by tools and accompanied by progress charts to be usable also for project steering) + - List includes a column for the safety rating of each unit. + +**4.2. Static Code Analysis** + - List of the units with compiler warning numbers and coding rule violation numbers + (this shall be generated by tools and accompanied by progress charts to be usable also for project steering) + - List includes a column for the safety rating of each unit. + +**4.3. Manual Code Inspection** + - List of components (ASIL rated) linked to inspection checklist and verdict (derived from PR export) + +**5. Software component qualification verification report** + - Contains the needed verification results if for some components a qualification of pre-developed SW is performed. + +**Note1:** The verification report is valid for the module version tagged together with the report + +**Note2:** All the above lists are generated automatically diff --git a/docs/modules/orchestrator/executor/docs/architecture/chklst_arc_inspection.rst b/docs/modules/orchestrator/executor/docs/architecture/chklst_arc_inspection.rst new file mode 100644 index 00000000000..24beb8a7b6a --- /dev/null +++ b/docs/modules/orchestrator/executor/docs/architecture/chklst_arc_inspection.rst @@ -0,0 +1,157 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + + +.. document:: Executor Architecture Inspection Checklist + :id: doc__executor_arc_inspection + :status: draft + :safety: ASIL_B + :security: YES + :realizes: wp__sw_arch_verification + :tags: executor + + +Architecture Inspection Checklist +================================= + +Purpose +------- + +The purpose of the software architecture checklist is to ensure that the design meets the criteria and quality as +defined per project processes and guidelines for feature and component architectural design elements. +It helps to check the compliance with requirements, identify errors or inconsistencies, and ensure adherence to best +practices. +The checklist guides evaluation of the architecture design, identifies potential problems, and aids in +communication and documentation of architectural decisions to stakeholders. + +Checklist +--------- + +.. list-table:: Architecture Design Review Checklist + :header-rows: 1 + + * - Review Id + - Acceptance criteria + - Type + - Guidance + - passed + - Remarks + - Issue link + * - ARC_01_01 + - Is the traceability from software architectural elements to requirements, and other level architectural + elements (e.g. component to interface) established according to the "Relations between the architectural elements" as described in :need:`doc_concept__arch_process`? + - automated + - Trace should be checked by Sphinx. Will be removed from checklist once requirement is implemented. + - + - + - + * - ARC_01_02 + - If the architectural element is related to any supplier manuals (incl. safety and security) + are the relevant parts covered? + - manual + - If the architecture makes use of supplied elements, their manuals (like safety) have to be considered (i.e. its provided functionality matches the expectation and assumptions are fulfilled). Note that in case of safety component this means that assumed Technical Safety Requirements and AoUs of the safety manual are covered. + - + - + - + * - ARC_01_03 + - Is the architectural element traceable to the lower level artifacts as defined by the workproduct traceability? + - automated + - Will be removed from checklist once requirement is implemented by automated tool check. + Details of possible linking can be depicted from `traceability concept `_ + - + - + - + * - ARC_02_01 + - Is the software architecture design compliant with the (overall) feature architecture? + - manual + - On component level check against the feature architecture, on feature level check other features with common components used. + - + - + - + * - ARC_02_02 + - Is appropriate and comprehensible operation/interface naming present in the architectural design? + - manual + - Check :need:`gd_guidl__arch_design` + - + - + - + * - ARC_02_03 + - Are correctness of data flow and control flow within the architectural elements considered? + - manual + - E.g. examine definitions, transformations, integrity, and interaction of data; check error handling, data + exchange between elements, correct response to inputs and documented decision making. + Note: consistency is ensured by the process/tooling, by defining each interface only once. + - + - + - + * - ARC_02_04 + - Are the interfaces between the software architectural element and other architectural elements well-defined? + - manual + - Check if the interface reacts on non-defined behavior or errors; can established protocols be used; are the + interfaces for inputs, outputs, error codes documented; is loose coupling considered and only limited exposure; + can unit or integration test be written against the interface; data amount transferred; no sensitive data + exposure; + - + - + - + * - ARC_02_05 + - Does the software architectural element consider the timing constraints (from the parent requirement)? + - manual + - If there are hard requirements on the timing a programming time estimation should be performed and also + deadline supervision considered. + - + - + - + * - ARC_02_06 + - Is the documentation of the software architectural element, including textual and graphical descriptions + (e.g., UML diagrams), comprehensible and complete? + - manual + - Use of semi-formal notation is expected for architectural elements with an allocated ASIL level. + Is the architecture template correctly filled? + - + - + - + * - ARC_03_01 + - Is the architectural element modular and encapsulated? + - manual + - Check e.g. that only minimal interfaces are used. Design should be object oriented. Interfaces and interactions are clearly defined. Usage of access types (private, protected) properly set. Limited global variables. + - + - + - + * - ARC_03_02 + - Is the suitability of the software architecture for future modifications and maintainability considered? + - manual + - Check for e.g. loose coupling, separation of concerns, high cohesion, versioning strategy for interfaces, + decision records, use of established design patterns. + - + - + - + * - ARC_03_03 + - Are simplicity and avoidance of unnecessary complexity present in the software architecture? + - manual + - Indicators for complexity are: number of use cases (corresponding to dynamic diagrams) + allocated to single design element, number of interfaces and operations in an interface, + function parameters, global variables, complex types, limited comprehensibility. + + Note: If the "number" above exceeds "3" a design rationale is mandatory (for all types) + - + - + - + * - ARC_03_04 + - Is the software architecture design following best practices and design principles? + - manual + - Refer to architectural guidelines and recommendations within the project documentation. + - + - + - diff --git a/docs/modules/orchestrator/executor/docs/architecture/executor.rst b/docs/modules/orchestrator/executor/docs/architecture/executor.rst deleted file mode 100644 index b3c03d7a04e..00000000000 --- a/docs/modules/orchestrator/executor/docs/architecture/executor.rst +++ /dev/null @@ -1,41 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2025 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -Component Architecture -======================= - -.. document:: Executor Architecture - :id: doc__executor_architecture - :status: valid - :safety: ASIL_B - :security: YES - :realizes: wp__component_arch - :tags: orchestration, executor - -.. comp_arc_sta:: Executor - :id: comp_arc_sta__orch__executor - :security: YES - :safety: ASIL_B - :status: valid - :uses: logic_arc_int__logging__logging, logic_arc_int__tracing__tracing - - .. needarch:: - :scale: 50 - :align: center - - {{ draw_component(need(), needs) }} - -.. toctree:: - :maxdepth: 1 - :titlesonly: diff --git a/docs/modules/orchestrator/executor/docs/architecture/index.rst b/docs/modules/orchestrator/executor/docs/architecture/index.rst new file mode 100644 index 00000000000..3a0c9c9db0e --- /dev/null +++ b/docs/modules/orchestrator/executor/docs/architecture/index.rst @@ -0,0 +1,122 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +Component Architecture +====================== + +.. document:: Executor Architecture + :id: doc__executor_architecture + :status: valid + :safety: ASIL_B + :security: YES + :realizes: wp__component_arch + :tags: orchestration, executor + + +Overview +-------- +Brief summary + +Requirements Linked to Component Architecture +--------------------------------------------- + +.. code-block:: none + + .. needtable:: Overview of Component Requirements + :style: table + :columns: title;id + :filter: search("comp_arch_sta__archdes$", "fulfils_back") + :colwidths: 70,30 + +Description +----------- + +General Description + +Design Decisions - For the documentation of the decision the :need:`gd_temp__change_decision_record` can be used. + +Design Constraints + +Rationale Behind Architecture Decomposition +******************************************* + +Mandatory: a motivation for the decomposition or reason for not further splitting it into lower level components. + +.. note:: Common decisions across components / cross cutting concepts is at the higher level. + +Static Architecture +------------------- + +The components are designed to cover the expectations from the feature architecture +(i.e. if already exists a definition it should be taken over and enriched). + +.. comp_arc_sta:: Executor + :id: comp_arc_sta__orch__executor + :security: YES + :safety: ASIL_B + :status: valid + :uses: logic_arc_int__logging__logging, logic_arc_int__tracing__tracing + + .. needarch:: + :scale: 50 + :align: center + + {{ draw_component(need(), needs) }} + +Dynamic Architecture +-------------------- + +.. .. comp_arc_dyn:: Dynamic View +.. :id: comp_arc_dyn__component_name__dynamic_view +.. :security: YES +.. :safety: ASIL_B +.. :status: invalid +.. :fulfils: comp_req__component_name__some_title + +.. put here a sequence diagram + + +Interfaces +---------- + +.. code-block:: rst + + .. real_arc_int:: + :id: real_arc_int__<component>__<Title> + :security: <YES|NO> + :safety: <QM|ASIL_B> + :fulfils: <link to component requirement id> + :language: cpp + +Lower Level Components +---------------------- + +.. .. comp_arc_sta:: Component Name 2 +.. :id: comp_arc_sta__component_name__2 +.. :status: invalid +.. :safety: ASIL_B +.. :security: YES +.. :fulfils: comp_req__component_name__some_title +.. :implements: logic_arc_int__feature_name__interface_name + +.. no architecture but detailed design + +.. .. note:: +.. Architecture can be split into multiple files. At component level the public interfaces to be used by the user and tester to be shown. + +.. .. attention:: +.. The above directives must be updated according to your component architecture. + +.. - Replace the example content by the real content (according to :need:`gd_guidl__arch_design`) +.. - Set the status to valid and start the review/merge process diff --git a/docs/modules/orchestrator/executor/docs/detailed_design/index.rst b/docs/modules/orchestrator/executor/docs/detailed_design/index.rst new file mode 100644 index 00000000000..4861c94dff8 --- /dev/null +++ b/docs/modules/orchestrator/executor/docs/detailed_design/index.rst @@ -0,0 +1,70 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +Detailed Design +############### + +.. document:: Executor Detailed Design + :id: doc__executor_detailed_design + :status: draft + :safety: ASIL_B + :security: YES + :realizes: wp__sw_implementation + :tags: executor + + +Detailed Design for Component: Orchestrator +=========================================== + +Description +----------- + +| Design Decisions - For the documentation of the decision the :need:`gd_temp__change_decision_record` can be used. +| Design Constraints + +Rationale Behind Decomposition into Units +****************************************** +| mandatory: a motivation for the decomposition into one or more units. + +.. note:: Reason for split into multiple units could be- + - Based on design principles like SOLID,DRY etc + - Based on design pattern's etc. + +Static Diagrams for Unit Interactions +------------------------------------- +.. code-block:: rst + + .. dd_sta:: <Title> + :id: dd_sta__<Feature>__<Title> + :security: <YES|NO> + :safety: <QM|ASIL_B> + :status: <valid|invalid> + :implements: <link to component requirement id> + :satisfies: <link to component architecture id> + + .. image:: <link to drawio image> or .. uml:: <link to plantuml> + +Dynamic Diagrams for Unit Interactions +-------------------------------------- +.. code-block:: rst + + .. dd_dyn:: <Title> + :id: dd_dyn__<Feature>__<Title> + :security: <YES|NO> + :safety: <QM|ASIL_B> + :status: <valid|invalid> + :implements: <link to component requirement id> + :satisfies: <link to component architecture id> + + .. image:: <link to drawio image> or .. uml:: <link to plantuml> diff --git a/docs/modules/orchestrator/executor/docs/index.rst b/docs/modules/orchestrator/executor/docs/index.rst index 50d5ad597c6..f69ebe1222a 100644 --- a/docs/modules/orchestrator/executor/docs/index.rst +++ b/docs/modules/orchestrator/executor/docs/index.rst @@ -1,21 +1,174 @@ -.. _comp_doc_executor: +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + Executor -########### +######## .. document:: Executor :id: doc__executor - :status: valid + :status: draft :safety: ASIL_B :security: YES :realizes: wp__cmpt_request - :tags: orchestration, executor + :tags: executor + + +Abstract +======== + +[A short (~200 word) description of the contribution being addressed.] + + +Motivation +========== + +[Clearly explain why the existing platform/project solution is inadequate to address the topic that the CR solves.] + + .. note:: + The motivation is critical for CRs that want to change the existing components. + It should clearly explain why the existing solution is inadequate to address the topic that the CR solves. + Motivation may based on criteria as resource requirements, scheduling issues, risks, benefits, etc. + CRs submissions without sufficient motivation may be rejected. + + + +Rationale +========= + +[Describe why particular design decisions were made.] + + + .. note:: + The rationale should provide evidence of consensus within the community and discuss important objections or concerns raised during discussion. + For the documentation of the decision the :need:`gd_temp__change_decision_record` can be used. + +Specification +============= + +[Describe the requirements, architecture of any new component.] or +[Describe the change to requirements, architecture, implementation, documentation of any change request.] + + .. note:: + A CR shall specify the component requirements as part of our platform/project. + Thereby the :need:`rl__project_lead` will approve these requirements as part of accepting the CR (e.g. merging the PR with the CR). + + + +Backwards Compatibility +======================= + +[Describe potential impact (especially including safety and security impacts) and severity on pre-existing platform/project elements.] + + +Security Impact +=============== + +[How could a malicious user take advantage of this new/modified component?] + + .. note:: + If there are security concerns in relation to the CR, those concerns should be explicitly written out to make sure reviewers of the CR are aware of them. + +Which security requirements are affected or has to be changed? +Could the new/modified component enable new threat scenarios? +Could the new/modified component enable new attack paths? +Could the new/modified component impact functional safety? +If applicable, which additional security measures must be implemented to mitigate the risk? + + .. note:: + Use Security Software Critically Analysis, Vulnerability Analysis. + [Methods will be defined later in Process area Security Analysis] + + +Safety Impact +============= + +[How could the safety be impacted by the new/modified component?] + + .. note:: + If there are safety concerns in relation to the CR, those concerns should be explicitly written out to make sure reviewers of the CR are aware of them. + +Which safety requirements are affected or has to be changed? +Could the new/modified component be a potential common cause or cascading failure initiator? +If applicable, which additional safety measures must be implemented to mitigate the risk? + + .. note:: + Use Dependency Failure Analysis and/or Safety Software Critically Analysis. + [Methods will be defined later in Process area Safety Analysis] + +For new feature/component contributions: + +[What is the expected ASIL level?] +[What is the expected classification of the contribution?] + + .. note:: + Use the component classification method here to classify your component, if it shall to be used in a safety context: :need:`gd_temp__component_classification`. + +License Impact +============== + +[How could the copyright impacted by the license of the new contribution?] + + +How to Teach This +================= + +[How to teach users, new and experienced, how to apply the CR to their work.] + + .. note:: + For a CR that adds new functionality or changes behavior, it is helpful to include a section on how to teach users, new and experienced, how to apply the CR to their work. + + + +Rejected Ideas +============== + +[Why certain ideas that were brought while discussing this CR were not ultimately pursued.] + + .. note:: + Throughout the discussion of a CR, various ideas will be proposed which are not accepted. + Those rejected ideas should be recorded along with the reasoning as to why they were rejected. + This both helps record the thought process behind the final version of the CR as well as preventing people from bringing up the same rejected idea again in subsequent discussions. + In a way this section can be thought of as a breakout section of the Rationale section that is focused specifically on why certain ideas were not ultimately pursued. + + + +Open Issues +=========== + +[Any points that are still being decided/discussed.] + + .. note:: + While a CR is in draft, ideas can come up which warrant further discussion. + Those ideas should be recorded so people know that they are being thought about but do not have a concrete resolution. + This helps make sure all issues required for the CR to be ready for consideration are complete and reduces people duplicating prior discussion. + + + +Footnotes +========= + +[A collection of footnotes cited in the CR, and a place to list non-inline hyperlink targets.] -Component Documents -=================== .. toctree:: - :maxdepth: 1 - :titlesonly: + :hidden: - architecture/executor + architecture/index.rst + architecture/chklst_arc_inspection.rst + detailed_design/index.rst + requirements/index.rst + requirements/chklst_req_inspection.rst + safety_analysis/fmea.rst + safety_analysis/dfa.rst diff --git a/docs/modules/orchestrator/executor/docs/requirements/chklst_req_inspection.rst b/docs/modules/orchestrator/executor/docs/requirements/chklst_req_inspection.rst new file mode 100644 index 00000000000..6431194ff78 --- /dev/null +++ b/docs/modules/orchestrator/executor/docs/requirements/chklst_req_inspection.rst @@ -0,0 +1,181 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + + +.. document:: Executor Requirements Inspection Checklist + :id: doc__executor_req_inspection + :status: draft + :safety: ASIL_B + :security: YES + :realizes: wp__requirements_inspect + :tags: executor + + +Requirement Inspection Checklist +================================ + + **Purpose** + + The purpose of this requirement inspection checklist is to collect the topics to be checked during requirements inspection. + + **Conduct** + + As described in the concept :need:`doc_concept__wp_inspections` the following "inspection roles" are expected to be filled: + + - author: these are the persons who did the last commits on the requirements in scope (can be derived from version mgt tool) + - reviewer: these are all persons committing into this inspection document or giving a pull request verdict on it (can be derived from version mgt tool) + - moderator: only needed for conflict resolution between author and reviewers, is the safety manager, security manager or quality manager called in as a reviewer (can be derived from version mgt tool) + - test expert: <one of the reviewers explicitly named here, to cover REQ_08_01 as described> + + **Checklist** + + .. list-table:: Component Requirement Inspection Checklist + :header-rows: 1 + :widths: 10,30,50,6,6,8 + + * - Review ID + - Acceptance Criteria + - Guidance + - Passed + - Remarks + - Issue link + * - REQ_01_01 + - Is the requirement formulation template used? + - see :need:`gd_temp__req_formulation`, this includes the use of "shall". + - + - + - + * - REQ_02_01 + - Is the requirement description *comprehensible* ? + - If you think the requirement is hard to understand, comment here. + - + - + - + * - REQ_02_02 + - Is the requirement description *unambiguous* ? + - Especially search for "weak words" like "about", "etc.", "relevant" and others (see the internet documentation on this). This check shall be supported by tooling. + - + - + - + * - REQ_02_03 + - Is the requirement description *atomic* ? + - A good way to think about this is to consider if the requirement may be tested by one (positive) test case or needs more of these. The requirement formulation template should also avoid being non-atomic already. Note that there are cases where also non-atomic requirements are the better ones, for example if those are better understandable. + - + - + - + * - REQ_02_04 + - Is the requirement description *feasible* ? + - If at the time of the inspection the requirement has already some implementation, the answer is yes. This can be checked via traces, but also :need:`gd_req__req_attr_impl` shows this. In case the requirement has no implementation at the time of inspection (i.e. not implemented at least as "proof-of-concept"), a development expert should be invited to the Pull-Request review to explicitly check this item. + - + - + - + * - REQ_02_05 + - Is the requirement description *independent from implementation* ? + - This checkpoint should improve requirements definition in the sense that the "what" is described and not the "how" - the latter should be described in architecture/design derived from the requirement. But there can also be a good reason for this, for example we would require using a file format like JSON and even specify the formatting standard already on stakeholder requirement level because we want to be compatible. A finding in this checkpoint does not mean there is a safety problem in the requirement. + - + - + - + * - REQ_03_01 + - For stakeholder requirements: Is the *rationale* correct? + - Rationales explain why the top level requirements were created. Do those cover the requirement? + - + - + - + * - REQ_03_02 + - For feature/component requirements: Is the *linkage to the parent requirement* correct? + - Linkage to correct levels and ASIL attributes is checked automatically, but it needs checking if the child requirement implements (at least) a part of the parent requirement. + - + - + - + * - REQ_04_01 + - Is the requirement *internally and externally consistent*? + - Does the requirement contradict other requirements within the same or higher levels? One may restrict the search to the feature for component requirements, for features to other features using same components. + - + - + - + * - REQ_05_01 + - Do the software requirements consider *timing constraints*? + - This checkpoint encourages to think about timing constraints even if those are not explicitly mentioned in the parent requirement. If the reviewer of a requirement already knows or suspects that the code execution will be consuming a lot of time, one should think of the expectation of a "user". + - + - + - + * - REQ_06_01 + - Does the requirement consider *external interfaces*? + - The SW platform's external interfaces (to the user) are defined in the Feature Architecture, so the Feature and Component Requirements should determine the input data use and setting of output data for these interfaces. Are all output values defined? + - + - + - + * - REQ_07_01 + - Is the *safety* attribute set correctly? + - Derived requirements are checked automatically, see :need:`gd_req__req_linkage_safety`. But for the top level requirements (and also all AoU) this needs to be checked manually for correctness. + - + - + - + * - REQ_07_02 + - Is the attribute *security* set correctly? + - Stakeholder requirements security attribute should be set based on Threat Analysis and Risk Assessment (TARA) (process is TBD). For feature/component requirements this checklist item is supported by automated check: "Every requirement which satisfies a requirement with security attribute set to YES inherits this". But the feature/component requirements/architecture may additionally also be subject to a Software Security Criticality Analysis (process is TBD). + - + - + - + * - REQ_08_01 + - Is the requirement *verifiable*? + - If at the time of the inspection already tests are created for the requirement, the answer is yes. This can be checked via traces, but also :need:`gd_req__req_attr_test_covered` shows this. In case the requirement is not sufficiently traced to test cases already, a test expert is invited to the inspection to give his opinion whether the requirement is formulated in a way that supports test development and the available test infrastructure is sufficient to perform the test. + - + - + - + * - REQ_09_01 + - For stakeholder requirements: Do those cover assumed safety mechanisms needed by the hardware and system? + - Note that stakeholder requirements covering safety mechanisms come from rationales, whereas feature/component requirements are covering safety mechanisms coming from :need:`gd_chklst__safety_analysis` + - + - + - + * - REQ_09_02 + - For feature/component requirements: Do the requirements defining a safety mechanism contain the error reaction leading to a safe state? + - Alternatively to the safe state there could also be "repair" mechanisms. Also do not forget to consider REQ_05_01 for these. + - + - + - + + +.. attention:: + The above checklist entries must be filled according to your component requirements in scope. + +Note: If a Review ID is not applicable for your requirement, then state ""n/a" in status and comment accordingly in remarks. For example "no stakeholder requirement (no rationale needed)" + +The following requirements in "valid" state and with "inspected" tag set are in the scope of this inspection: + +.. needtable:: + :filter: "component_name" in docname and "requirements" in docname and docname is not None and status == "valid" + :style: table + :types: comp_req + :tags: component_name + :columns: id;status;tags + :colwidths: 25,25,25 + :sort: title + +And also the following AoUs in "valid" state and with "inspected" tag set (for these please answer the questions above as if the AoUs are requirements, except questions REQ_03_01 and REQ_03_02): + +.. needtable:: + :filter: "component_name" in docname and "requirements" in docname and docname is not None and status == "valid" + :style: table + :types: aou_req + :tags: component_name + :columns: id;status;tags + :colwidths: 25,25,25 + :sort: title + +.. attention:: + The above tables filtering must be updated according to your Component. + + - Modify ``component_name`` to be your Component Name in lower snake case diff --git a/docs/modules/orchestrator/executor/docs/requirements/index.rst b/docs/modules/orchestrator/executor/docs/requirements/index.rst new file mode 100644 index 00000000000..2d055127515 --- /dev/null +++ b/docs/modules/orchestrator/executor/docs/requirements/index.rst @@ -0,0 +1,66 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +Requirements +############ + +.. document:: Executor Requirements + :id: doc__executor_requirements + :status: draft + :safety: ASIL_B + :security: YES + :realizes: wp__requirements_comp + :tags: executor + + +<Headlines (for the list of requirements if structuring is needed)> +=================================================================== + +.. .. comp_req:: Some Title +.. :id: comp_req__component_name__some_title +.. :reqtype: Process +.. :security: YES +.. :safety: ASIL_B +.. :satisfies: feat_req__feature_name__some_title +.. :status: invalid + +.. The Component shall do xyz to another component to bring it to this condition at this time + +.. Note: (optional, not to be verified) + +.. attention:: + The above directive must be updated according to your component requirements. + + - Replace the example content by the real content for your first requirement + - Set the status to valid and start the review/merge process + - Add other needed requirements for your component + +.. .. aou_req:: Next Title +.. :id: aou_req__component_name__next_title +.. :reqtype: Process +.. :security: YES +.. :safety: ASIL_B +.. :status: invalid + +.. The Component User shall do xyz to use the component safely + +.. attention:: + The above directives must be updated according to your feature requirements. + + - Replace the example content by the real content for your first requirement (according to :need:`gd_guidl__req_engineering`) + - Set the status to valid and start the review/merge process + - Add other needed requirements for your feature + +.. needextend:: "component_name" in id + :+tags: component_name diff --git a/docs/modules/orchestrator/executor/docs/safety_analysis/dfa.rst b/docs/modules/orchestrator/executor/docs/safety_analysis/dfa.rst new file mode 100644 index 00000000000..ec74b44bf3a --- /dev/null +++ b/docs/modules/orchestrator/executor/docs/safety_analysis/dfa.rst @@ -0,0 +1,49 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + + +DFA (Dependent Failure Analysis) +================================ + +.. document:: Executor DFA + :id: doc__executor_dfa + :status: draft + :safety: ASIL_B + :security: YES + :realizes: wp__sw_component_dfa + :tags: executor + + +Dependent Failure Initiators +---------------------------- + +.. code-block:: rst + + .. comp_saf_dfa:: <Title> + :violates: <Component architecture> + :id: comp_saf_dfa__<Component>__<Element descriptor> + :failure_id: <ID from DFA failure initiators :need:`gd_guidl__dfa_failure_initiators`> + :failure_effect: "description of failure effect of the failure initiator on the element" + :mitigated_by: <ID from Component Requirement | ID from AoU Component Requirement> + :mitigation_issue: <ID from Issue Tracker> + :sufficient: <yes|no> + :status: <valid|invalid> + +.. note:: argument is inside the 'content'. Therefore content is mandatory + +.. attention:: + The above directive must be updated according to your component DFA. + + - The above "code-block" directive must be updated + - Fill in all the needed information in the <brackets> diff --git a/docs/modules/orchestrator/executor/docs/safety_analysis/fmea.rst b/docs/modules/orchestrator/executor/docs/safety_analysis/fmea.rst new file mode 100644 index 00000000000..4afb07d21e2 --- /dev/null +++ b/docs/modules/orchestrator/executor/docs/safety_analysis/fmea.rst @@ -0,0 +1,49 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + + +FMEA (Failure Modes and Effects Analysis) +========================================= + +.. document:: Executor FMEA + :id: doc__executor_fmea + :status: draft + :safety: ASIL_B + :security: YES + :realizes: wp__sw_component_fmea + :tags: executor + + +Failure Mode List +----------------- + +.. code-block:: rst + + .. comp_saf_fmea:: <Title> + :violates: <Component architecture> + :id: comp_saf_fmea__<Component>__<Element descriptor> + :fault_id: <ID from fault model :need:`gd_guidl__fault_models`> + :failure_effect: "description of failure effect of the fault model on the element" + :mitigated_by: <ID from Component Requirement | ID from AoU Component Requirement> + :mitigation_issue: <ID from Issue Tracker> + :sufficient: <yes|no> + :status: <valid|invalid> + +.. note:: argument is inside the 'content'. Therefore content is mandatory + +.. attention:: + The above directive must be updated according to your component FMEA. + + - The above "code-block" directive must be updated + - Fill in all the needed information in the <brackets> diff --git a/docs/modules/orchestrator/index.rst b/docs/modules/orchestrator/index.rst index 7715df9f06f..4d542eca894 100644 --- a/docs/modules/orchestrator/index.rst +++ b/docs/modules/orchestrator/index.rst @@ -12,8 +12,154 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -Orchestrator Module -################### +Orchestrator +############ + +.. document:: Orchestrator + :id: doc__orchestrator + :status: draft + :safety: ASIL_B + :security: YES + :realizes: wp__cmpt_request + :tags: orchestrator + + +Abstract +======== + +[A short (~200 word) description of the contribution being addressed.] + + +Motivation +========== + +[Clearly explain why the existing platform/project solution is inadequate to address the topic that the CR solves.] + + .. note:: + The motivation is critical for CRs that want to change the existing components. + It should clearly explain why the existing solution is inadequate to address the topic that the CR solves. + Motivation may based on criteria as resource requirements, scheduling issues, risks, benefits, etc. + CRs submissions without sufficient motivation may be rejected. + + + +Rationale +========= + +[Describe why particular design decisions were made.] + + + .. note:: + The rationale should provide evidence of consensus within the community and discuss important objections or concerns raised during discussion. + For the documentation of the decision the :need:`gd_temp__change_decision_record` can be used. + +Specification +============= + +[Describe the requirements, architecture of any new component.] or +[Describe the change to requirements, architecture, implementation, documentation of any change request.] + + .. note:: + A CR shall specify the component requirements as part of our platform/project. + Thereby the :need:`rl__project_lead` will approve these requirements as part of accepting the CR (e.g. merging the PR with the CR). + + + +Backwards Compatibility +======================= + +[Describe potential impact (especially including safety and security impacts) and severity on pre-existing platform/project elements.] + + +Security Impact +=============== + +[How could a malicious user take advantage of this new/modified component?] + + .. note:: + If there are security concerns in relation to the CR, those concerns should be explicitly written out to make sure reviewers of the CR are aware of them. + +Which security requirements are affected or has to be changed? +Could the new/modified component enable new threat scenarios? +Could the new/modified component enable new attack paths? +Could the new/modified component impact functional safety? +If applicable, which additional security measures must be implemented to mitigate the risk? + + .. note:: + Use Security Software Critically Analysis, Vulnerability Analysis. + [Methods will be defined later in Process area Security Analysis] + + +Safety Impact +============= + +[How could the safety be impacted by the new/modified component?] + + .. note:: + If there are safety concerns in relation to the CR, those concerns should be explicitly written out to make sure reviewers of the CR are aware of them. + +Which safety requirements are affected or has to be changed? +Could the new/modified component be a potential common cause or cascading failure initiator? +If applicable, which additional safety measures must be implemented to mitigate the risk? + + .. note:: + Use Dependency Failure Analysis and/or Safety Software Critically Analysis. + [Methods will be defined later in Process area Safety Analysis] + +For new feature/component contributions: + +[What is the expected ASIL level?] +[What is the expected classification of the contribution?] + + .. note:: + Use the component classification method here to classify your component, if it shall to be used in a safety context: :need:`gd_temp__component_classification`. + +License Impact +============== + +[How could the copyright impacted by the license of the new contribution?] + + +How to Teach This +================= + +[How to teach users, new and experienced, how to apply the CR to their work.] + + .. note:: + For a CR that adds new functionality or changes behavior, it is helpful to include a section on how to teach users, new and experienced, how to apply the CR to their work. + + + +Rejected Ideas +============== + +[Why certain ideas that were brought while discussing this CR were not ultimately pursued.] + + .. note:: + Throughout the discussion of a CR, various ideas will be proposed which are not accepted. + Those rejected ideas should be recorded along with the reasoning as to why they were rejected. + This both helps record the thought process behind the final version of the CR as well as preventing people from bringing up the same rejected idea again in subsequent discussions. + In a way this section can be thought of as a breakout section of the Rationale section that is focused specifically on why certain ideas were not ultimately pursued. + + + +Open Issues +=========== + +[Any points that are still being decided/discussed.] + + .. note:: + While a CR is in draft, ideas can come up which warrant further discussion. + Those ideas should be recorded so people know that they are being thought about but do not have a concrete resolution. + This helps make sure all issues required for the CR to be ready for consideration are complete and reduces people duplicating prior discussion. + + + +Footnotes +========= + +[A collection of footnotes cited in the CR, and a place to list non-inline hyperlink targets.] + .. toctree:: :titlesonly: diff --git a/docs/modules/orchestrator/orchestrator/docs/architecture/chklst_arc_inspection.rst b/docs/modules/orchestrator/orchestrator/docs/architecture/chklst_arc_inspection.rst new file mode 100644 index 00000000000..6c59d6213b2 --- /dev/null +++ b/docs/modules/orchestrator/orchestrator/docs/architecture/chklst_arc_inspection.rst @@ -0,0 +1,157 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + + +.. document:: Orchestrator Architecture Inspection Checklist + :id: doc__orchestrator_arc_inspection + :status: draft + :safety: ASIL_B + :security: YES + :realizes: wp__sw_arch_verification + :tags: orchestrator + + +Architecture Inspection Checklist +================================= + +Purpose +------- + +The purpose of the software architecture checklist is to ensure that the design meets the criteria and quality as +defined per project processes and guidelines for feature and component architectural design elements. +It helps to check the compliance with requirements, identify errors or inconsistencies, and ensure adherence to best +practices. +The checklist guides evaluation of the architecture design, identifies potential problems, and aids in +communication and documentation of architectural decisions to stakeholders. + +Checklist +--------- + +.. list-table:: Architecture Design Review Checklist + :header-rows: 1 + + * - Review Id + - Acceptance criteria + - Type + - Guidance + - passed + - Remarks + - Issue link + * - ARC_01_01 + - Is the traceability from software architectural elements to requirements, and other level architectural + elements (e.g. component to interface) established according to the "Relations between the architectural elements" as described in :need:`doc_concept__arch_process`? + - automated + - Trace should be checked by Sphinx. Will be removed from checklist once requirement is implemented. + - + - + - + * - ARC_01_02 + - If the architectural element is related to any supplier manuals (incl. safety and security) + are the relevant parts covered? + - manual + - If the architecture makes use of supplied elements, their manuals (like safety) have to be considered (i.e. its provided functionality matches the expectation and assumptions are fulfilled). Note that in case of safety component this means that assumed Technical Safety Requirements and AoUs of the safety manual are covered. + - + - + - + * - ARC_01_03 + - Is the architectural element traceable to the lower level artifacts as defined by the workproduct traceability? + - automated + - Will be removed from checklist once requirement is implemented by automated tool check. + Details of possible linking can be depicted from `traceability concept <https://eclipse-score.github.io/process_description/main/general_concepts/score_traceability_concept.html>`_ + - + - + - + * - ARC_02_01 + - Is the software architecture design compliant with the (overall) feature architecture? + - manual + - On component level check against the feature architecture, on feature level check other features with common components used. + - + - + - + * - ARC_02_02 + - Is appropriate and comprehensible operation/interface naming present in the architectural design? + - manual + - Check :need:`gd_guidl__arch_design` + - + - + - + * - ARC_02_03 + - Are correctness of data flow and control flow within the architectural elements considered? + - manual + - E.g. examine definitions, transformations, integrity, and interaction of data; check error handling, data + exchange between elements, correct response to inputs and documented decision making. + Note: consistency is ensured by the process/tooling, by defining each interface only once. + - + - + - + * - ARC_02_04 + - Are the interfaces between the software architectural element and other architectural elements well-defined? + - manual + - Check if the interface reacts on non-defined behavior or errors; can established protocols be used; are the + interfaces for inputs, outputs, error codes documented; is loose coupling considered and only limited exposure; + can unit or integration test be written against the interface; data amount transferred; no sensitive data + exposure; + - + - + - + * - ARC_02_05 + - Does the software architectural element consider the timing constraints (from the parent requirement)? + - manual + - If there are hard requirements on the timing a programming time estimation should be performed and also + deadline supervision considered. + - + - + - + * - ARC_02_06 + - Is the documentation of the software architectural element, including textual and graphical descriptions + (e.g., UML diagrams), comprehensible and complete? + - manual + - Use of semi-formal notation is expected for architectural elements with an allocated ASIL level. + Is the architecture template correctly filled? + - + - + - + * - ARC_03_01 + - Is the architectural element modular and encapsulated? + - manual + - Check e.g. that only minimal interfaces are used. Design should be object oriented. Interfaces and interactions are clearly defined. Usage of access types (private, protected) properly set. Limited global variables. + - + - + - + * - ARC_03_02 + - Is the suitability of the software architecture for future modifications and maintainability considered? + - manual + - Check for e.g. loose coupling, separation of concerns, high cohesion, versioning strategy for interfaces, + decision records, use of established design patterns. + - + - + - + * - ARC_03_03 + - Are simplicity and avoidance of unnecessary complexity present in the software architecture? + - manual + - Indicators for complexity are: number of use cases (corresponding to dynamic diagrams) + allocated to single design element, number of interfaces and operations in an interface, + function parameters, global variables, complex types, limited comprehensibility. + + Note: If the "number" above exceeds "3" a design rationale is mandatory (for all types) + - + - + - + * - ARC_03_04 + - Is the software architecture design following best practices and design principles? + - manual + - Refer to architectural guidelines and recommendations within the project documentation. + - + - + - diff --git a/docs/modules/orchestrator/orchestrator/docs/architecture/orchestrator.rst b/docs/modules/orchestrator/orchestrator/docs/architecture/index.rst similarity index 69% rename from docs/modules/orchestrator/orchestrator/docs/architecture/orchestrator.rst rename to docs/modules/orchestrator/orchestrator/docs/architecture/index.rst index 1f2a48c9ef4..f9809b13778 100644 --- a/docs/modules/orchestrator/orchestrator/docs/architecture/orchestrator.rst +++ b/docs/modules/orchestrator/orchestrator/docs/architecture/index.rst @@ -1,4 +1,3 @@ - .. # ******************************************************************************* # Copyright (c) 2025 Contributors to the Eclipse Foundation @@ -14,7 +13,7 @@ # ******************************************************************************* Component Architecture -======================= +====================== .. document:: Orchestrator Architecture :id: doc__orchestrator_architecture @@ -24,6 +23,62 @@ Component Architecture :realizes: wp__component_arch :tags: orchestration, orchestrator + +Overview +-------- +Brief summary + +Requirements Linked to Component Architecture +--------------------------------------------- + +.. code-block:: none + + .. needtable:: Overview of Component Requirements + :style: table + :columns: title;id + :filter: search("comp_arch_sta__archdes$", "fulfils_back") + :colwidths: 70,30 + +Description +----------- + +General Description + +Design Decisions - For the documentation of the decision the :need:`gd_temp__change_decision_record` can be used. + +Design Constraints + +Rationale Behind Architecture Decomposition +******************************************* + +Mandatory: a motivation for the decomposition or reason for not further splitting it into lower level components. + +.. note:: Common decisions across components / cross cutting concepts is at the higher level. + + + + + +Component Architecture +======================= + + + + + + + + + + + + +Static Architecture +------------------- + +The components are designed to cover the expectations from the feature architecture +(i.e. if already exists a definition it should be taken over and enriched). + .. comp_arc_sta:: Orchestrator :id: comp_arc_sta__orch__orchestrator :security: YES @@ -39,6 +94,23 @@ Component Architecture {{ draw_component(need(), needs) }} +Dynamic Architecture +-------------------- + +.. .. comp_arc_dyn:: Dynamic View +.. :id: comp_arc_dyn__component_name__dynamic_view +.. :security: YES +.. :safety: ASIL_B +.. :status: invalid +.. :fulfils: comp_req__component_name__some_title + +.. put here a sequence diagram + + +Interfaces +---------- + + .. logic_arc_int_op:: add_design :id: logic_arc_int_op__orch__add_design :security: YES @@ -188,6 +260,33 @@ Component Architecture :status: valid :included_by: logic_arc_int__orchestration__deployment -.. toctree:: - :maxdepth: 1 - :titlesonly: +.. .. code-block:: rst + +.. .. real_arc_int:: <Title> +.. :id: real_arc_int__<component>__<Title> +.. :security: <YES|NO> +.. :safety: <QM|ASIL_B> +.. :fulfils: <link to component requirement id> +.. :language: cpp + +Lower Level Components +---------------------- + +.. .. comp_arc_sta:: Component Name 2 +.. :id: comp_arc_sta__component_name__2 +.. :status: invalid +.. :safety: ASIL_B +.. :security: YES +.. :fulfils: comp_req__component_name__some_title +.. :implements: logic_arc_int__feature_name__interface_name + +.. no architecture but detailed design + +.. .. note:: +.. Architecture can be split into multiple files. At component level the public interfaces to be used by the user and tester to be shown. + +.. .. attention:: +.. The above directives must be updated according to your component architecture. + +.. - Replace the example content by the real content (according to :need:`gd_guidl__arch_design`) +.. - Set the status to valid and start the review/merge process diff --git a/docs/modules/orchestrator/orchestrator/docs/detailed_design/index.rst b/docs/modules/orchestrator/orchestrator/docs/detailed_design/index.rst new file mode 100644 index 00000000000..daacf0e9e8f --- /dev/null +++ b/docs/modules/orchestrator/orchestrator/docs/detailed_design/index.rst @@ -0,0 +1,70 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +Detailed Design +############### + +.. document:: Orchestrator Detailed Design + :id: doc__orchestrator_detailed_design + :status: draft + :safety: ASIL_B + :security: YES + :realizes: wp__sw_implementation + :tags: orchestrator + + +Detailed Design for Component: <Component Name> +=============================================== + +Description +----------- + +| Design Decisions - For the documentation of the decision the :need:`gd_temp__change_decision_record` can be used. +| Design Constraints + +Rationale Behind Decomposition into Units +****************************************** +| mandatory: a motivation for the decomposition into one or more units. + +.. note:: Reason for split into multiple units could be- + - Based on design principles like SOLID,DRY etc + - Based on design pattern's etc. + +Static Diagrams for Unit Interactions +------------------------------------- +.. code-block:: rst + + .. dd_sta:: <Title> + :id: dd_sta__<Feature>__<Title> + :security: <YES|NO> + :safety: <QM|ASIL_B> + :status: <valid|invalid> + :implements: <link to component requirement id> + :satisfies: <link to component architecture id> + + .. image:: <link to drawio image> or .. uml:: <link to plantuml> + +Dynamic Diagrams for Unit Interactions +-------------------------------------- +.. code-block:: rst + + .. dd_dyn:: <Title> + :id: dd_dyn__<Feature>__<Title> + :security: <YES|NO> + :safety: <QM|ASIL_B> + :status: <valid|invalid> + :implements: <link to component requirement id> + :satisfies: <link to component architecture id> + + .. image:: <link to drawio image> or .. uml:: <link to plantuml> diff --git a/docs/modules/orchestrator/orchestrator/docs/index.rst b/docs/modules/orchestrator/orchestrator/docs/index.rst index a410d019d99..7064028cf42 100644 --- a/docs/modules/orchestrator/orchestrator/docs/index.rst +++ b/docs/modules/orchestrator/orchestrator/docs/index.rst @@ -1,21 +1,173 @@ -.. _comp_doc_orchestrator: +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + Orchestrator ############ .. document:: Orchestrator - :id: doc__orchestrator - :status: valid + :id: doc__orchestrator_component + :status: draft :safety: ASIL_B :security: YES :realizes: wp__cmpt_request - :tags: orchestration, orchestrator + :tags: orchestrator + + +Abstract +======== + +[A short (~200 word) description of the contribution being addressed.] + + +Motivation +========== + +[Clearly explain why the existing platform/project solution is inadequate to address the topic that the CR solves.] + + .. note:: + The motivation is critical for CRs that want to change the existing components. + It should clearly explain why the existing solution is inadequate to address the topic that the CR solves. + Motivation may based on criteria as resource requirements, scheduling issues, risks, benefits, etc. + CRs submissions without sufficient motivation may be rejected. + + + +Rationale +========= + +[Describe why particular design decisions were made.] + + + .. note:: + The rationale should provide evidence of consensus within the community and discuss important objections or concerns raised during discussion. + For the documentation of the decision the :need:`gd_temp__change_decision_record` can be used. + +Specification +============= + +[Describe the requirements, architecture of any new component.] or +[Describe the change to requirements, architecture, implementation, documentation of any change request.] + + .. note:: + A CR shall specify the component requirements as part of our platform/project. + Thereby the :need:`rl__project_lead` will approve these requirements as part of accepting the CR (e.g. merging the PR with the CR). + + + +Backwards Compatibility +======================= + +[Describe potential impact (especially including safety and security impacts) and severity on pre-existing platform/project elements.] + + +Security Impact +=============== + +[How could a malicious user take advantage of this new/modified component?] + + .. note:: + If there are security concerns in relation to the CR, those concerns should be explicitly written out to make sure reviewers of the CR are aware of them. + +Which security requirements are affected or has to be changed? +Could the new/modified component enable new threat scenarios? +Could the new/modified component enable new attack paths? +Could the new/modified component impact functional safety? +If applicable, which additional security measures must be implemented to mitigate the risk? + + .. note:: + Use Security Software Critically Analysis, Vulnerability Analysis. + [Methods will be defined later in Process area Security Analysis] + + +Safety Impact +============= + +[How could the safety be impacted by the new/modified component?] + + .. note:: + If there are safety concerns in relation to the CR, those concerns should be explicitly written out to make sure reviewers of the CR are aware of them. + +Which safety requirements are affected or has to be changed? +Could the new/modified component be a potential common cause or cascading failure initiator? +If applicable, which additional safety measures must be implemented to mitigate the risk? + + .. note:: + Use Dependency Failure Analysis and/or Safety Software Critically Analysis. + [Methods will be defined later in Process area Safety Analysis] + +For new feature/component contributions: + +[What is the expected ASIL level?] +[What is the expected classification of the contribution?] + + .. note:: + Use the component classification method here to classify your component, if it shall to be used in a safety context: :need:`gd_temp__component_classification`. + +License Impact +============== + +[How could the copyright impacted by the license of the new contribution?] + + +How to Teach This +================= + +[How to teach users, new and experienced, how to apply the CR to their work.] + + .. note:: + For a CR that adds new functionality or changes behavior, it is helpful to include a section on how to teach users, new and experienced, how to apply the CR to their work. + + + +Rejected Ideas +============== + +[Why certain ideas that were brought while discussing this CR were not ultimately pursued.] + + .. note:: + Throughout the discussion of a CR, various ideas will be proposed which are not accepted. + Those rejected ideas should be recorded along with the reasoning as to why they were rejected. + This both helps record the thought process behind the final version of the CR as well as preventing people from bringing up the same rejected idea again in subsequent discussions. + In a way this section can be thought of as a breakout section of the Rationale section that is focused specifically on why certain ideas were not ultimately pursued. + + + +Open Issues +=========== + +[Any points that are still being decided/discussed.] + + .. note:: + While a CR is in draft, ideas can come up which warrant further discussion. + Those ideas should be recorded so people know that they are being thought about but do not have a concrete resolution. + This helps make sure all issues required for the CR to be ready for consideration are complete and reduces people duplicating prior discussion. + + + +Footnotes +========= -Component Documents -=================== +[A collection of footnotes cited in the CR, and a place to list non-inline hyperlink targets.] .. toctree:: - :maxdepth: 1 - :titlesonly: + :hidden: - architecture/orchestrator + architecture/index.rst + architecture/chklst_arc_inspection.rst + detailed_design/index.rst + requirements/index.rst + requirements/chklst_req_inspection.rst + safety_analysis/fmea.rst + safety_analysis/dfa.rst diff --git a/docs/modules/orchestrator/orchestrator/docs/requirements/chklst_req_inspection.rst b/docs/modules/orchestrator/orchestrator/docs/requirements/chklst_req_inspection.rst new file mode 100644 index 00000000000..d6f8cbd3818 --- /dev/null +++ b/docs/modules/orchestrator/orchestrator/docs/requirements/chklst_req_inspection.rst @@ -0,0 +1,181 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + + +.. document:: Orchestrator Requirements Inspection Checklist + :id: doc__orchestrator_req_inspection + :status: draft + :safety: ASIL_B + :security: YES + :realizes: wp__requirements_inspect + :tags: orchestrator + + +Requirement Inspection Checklist +================================ + + **Purpose** + + The purpose of this requirement inspection checklist is to collect the topics to be checked during requirements inspection. + + **Conduct** + + As described in the concept :need:`doc_concept__wp_inspections` the following "inspection roles" are expected to be filled: + + - author: these are the persons who did the last commits on the requirements in scope (can be derived from version mgt tool) + - reviewer: these are all persons committing into this inspection document or giving a pull request verdict on it (can be derived from version mgt tool) + - moderator: only needed for conflict resolution between author and reviewers, is the safety manager, security manager or quality manager called in as a reviewer (can be derived from version mgt tool) + - test expert: <one of the reviewers explicitly named here, to cover REQ_08_01 as described> + + **Checklist** + + .. list-table:: Component Requirement Inspection Checklist + :header-rows: 1 + :widths: 10,30,50,6,6,8 + + * - Review ID + - Acceptance Criteria + - Guidance + - Passed + - Remarks + - Issue link + * - REQ_01_01 + - Is the requirement formulation template used? + - see :need:`gd_temp__req_formulation`, this includes the use of "shall". + - + - + - + * - REQ_02_01 + - Is the requirement description *comprehensible* ? + - If you think the requirement is hard to understand, comment here. + - + - + - + * - REQ_02_02 + - Is the requirement description *unambiguous* ? + - Especially search for "weak words" like "about", "etc.", "relevant" and others (see the internet documentation on this). This check shall be supported by tooling. + - + - + - + * - REQ_02_03 + - Is the requirement description *atomic* ? + - A good way to think about this is to consider if the requirement may be tested by one (positive) test case or needs more of these. The requirement formulation template should also avoid being non-atomic already. Note that there are cases where also non-atomic requirements are the better ones, for example if those are better understandable. + - + - + - + * - REQ_02_04 + - Is the requirement description *feasible* ? + - If at the time of the inspection the requirement has already some implementation, the answer is yes. This can be checked via traces, but also :need:`gd_req__req_attr_impl` shows this. In case the requirement has no implementation at the time of inspection (i.e. not implemented at least as "proof-of-concept"), a development expert should be invited to the Pull-Request review to explicitly check this item. + - + - + - + * - REQ_02_05 + - Is the requirement description *independent from implementation* ? + - This checkpoint should improve requirements definition in the sense that the "what" is described and not the "how" - the latter should be described in architecture/design derived from the requirement. But there can also be a good reason for this, for example we would require using a file format like JSON and even specify the formatting standard already on stakeholder requirement level because we want to be compatible. A finding in this checkpoint does not mean there is a safety problem in the requirement. + - + - + - + * - REQ_03_01 + - For stakeholder requirements: Is the *rationale* correct? + - Rationales explain why the top level requirements were created. Do those cover the requirement? + - + - + - + * - REQ_03_02 + - For feature/component requirements: Is the *linkage to the parent requirement* correct? + - Linkage to correct levels and ASIL attributes is checked automatically, but it needs checking if the child requirement implements (at least) a part of the parent requirement. + - + - + - + * - REQ_04_01 + - Is the requirement *internally and externally consistent*? + - Does the requirement contradict other requirements within the same or higher levels? One may restrict the search to the feature for component requirements, for features to other features using same components. + - + - + - + * - REQ_05_01 + - Do the software requirements consider *timing constraints*? + - This checkpoint encourages to think about timing constraints even if those are not explicitly mentioned in the parent requirement. If the reviewer of a requirement already knows or suspects that the code execution will be consuming a lot of time, one should think of the expectation of a "user". + - + - + - + * - REQ_06_01 + - Does the requirement consider *external interfaces*? + - The SW platform's external interfaces (to the user) are defined in the Feature Architecture, so the Feature and Component Requirements should determine the input data use and setting of output data for these interfaces. Are all output values defined? + - + - + - + * - REQ_07_01 + - Is the *safety* attribute set correctly? + - Derived requirements are checked automatically, see :need:`gd_req__req_linkage_safety`. But for the top level requirements (and also all AoU) this needs to be checked manually for correctness. + - + - + - + * - REQ_07_02 + - Is the attribute *security* set correctly? + - Stakeholder requirements security attribute should be set based on Threat Analysis and Risk Assessment (TARA) (process is TBD). For feature/component requirements this checklist item is supported by automated check: "Every requirement which satisfies a requirement with security attribute set to YES inherits this". But the feature/component requirements/architecture may additionally also be subject to a Software Security Criticality Analysis (process is TBD). + - + - + - + * - REQ_08_01 + - Is the requirement *verifiable*? + - If at the time of the inspection already tests are created for the requirement, the answer is yes. This can be checked via traces, but also :need:`gd_req__req_attr_test_covered` shows this. In case the requirement is not sufficiently traced to test cases already, a test expert is invited to the inspection to give his opinion whether the requirement is formulated in a way that supports test development and the available test infrastructure is sufficient to perform the test. + - + - + - + * - REQ_09_01 + - For stakeholder requirements: Do those cover assumed safety mechanisms needed by the hardware and system? + - Note that stakeholder requirements covering safety mechanisms come from rationales, whereas feature/component requirements are covering safety mechanisms coming from :need:`gd_chklst__safety_analysis` + - + - + - + * - REQ_09_02 + - For feature/component requirements: Do the requirements defining a safety mechanism contain the error reaction leading to a safe state? + - Alternatively to the safe state there could also be "repair" mechanisms. Also do not forget to consider REQ_05_01 for these. + - + - + - + + +.. attention:: + The above checklist entries must be filled according to your component requirements in scope. + +Note: If a Review ID is not applicable for your requirement, then state ""n/a" in status and comment accordingly in remarks. For example "no stakeholder requirement (no rationale needed)" + +The following requirements in "valid" state and with "inspected" tag set are in the scope of this inspection: + +.. needtable:: + :filter: "component_name" in docname and "requirements" in docname and docname is not None and status == "valid" + :style: table + :types: comp_req + :tags: component_name + :columns: id;status;tags + :colwidths: 25,25,25 + :sort: title + +And also the following AoUs in "valid" state and with "inspected" tag set (for these please answer the questions above as if the AoUs are requirements, except questions REQ_03_01 and REQ_03_02): + +.. needtable:: + :filter: "component_name" in docname and "requirements" in docname and docname is not None and status == "valid" + :style: table + :types: aou_req + :tags: component_name + :columns: id;status;tags + :colwidths: 25,25,25 + :sort: title + +.. attention:: + The above tables filtering must be updated according to your Component. + + - Modify ``component_name`` to be your Component Name in lower snake case diff --git a/docs/modules/orchestrator/orchestrator/docs/requirements/index.rst b/docs/modules/orchestrator/orchestrator/docs/requirements/index.rst new file mode 100644 index 00000000000..6a5cfe0ef68 --- /dev/null +++ b/docs/modules/orchestrator/orchestrator/docs/requirements/index.rst @@ -0,0 +1,66 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +Requirements +############ + +.. document:: Orchestrator Requirements + :id: doc__orchestrator_requirements + :status: draft + :safety: ASIL_B + :security: YES + :realizes: wp__requirements_comp + :tags: orchestrator + + +<Headlines (for the list of requirements if structuring is needed)> +=================================================================== + +.. .. comp_req:: Some Title +.. :id: comp_req__component_name__some_title +.. :reqtype: Process +.. :security: YES +.. :safety: ASIL_B +.. :satisfies: feat_req__feature_name__some_title +.. :status: invalid + +.. The Component shall do xyz to another component to bring it to this condition at this time + +.. Note: (optional, not to be verified) + +.. attention:: + The above directive must be updated according to your component requirements. + + - Replace the example content by the real content for your first requirement + - Set the status to valid and start the review/merge process + - Add other needed requirements for your component + +.. .. aou_req:: Next Title +.. :id: aou_req__component_name__next_title +.. :reqtype: Process +.. :security: YES +.. :safety: ASIL_B +.. :status: invalid + +.. The Component User shall do xyz to use the component safely + +.. attention:: + The above directives must be updated according to your feature requirements. + + - Replace the example content by the real content for your first requirement (according to :need:`gd_guidl__req_engineering`) + - Set the status to valid and start the review/merge process + - Add other needed requirements for your feature + +.. needextend:: "component_name" in id + :+tags: component_name diff --git a/docs/modules/orchestrator/orchestrator/docs/safety_analysis/dfa.rst b/docs/modules/orchestrator/orchestrator/docs/safety_analysis/dfa.rst new file mode 100644 index 00000000000..d35bfd76163 --- /dev/null +++ b/docs/modules/orchestrator/orchestrator/docs/safety_analysis/dfa.rst @@ -0,0 +1,49 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + + +DFA (Dependent Failure Analysis) +================================ + +.. document:: Orchestrator DFA + :id: doc__orchestrator_dfa + :status: draft + :safety: ASIL_B + :security: YES + :realizes: wp__sw_component_dfa + :tags: orchestrator + + +Dependent Failure Initiators +---------------------------- + +.. code-block:: rst + + .. comp_saf_dfa:: <Title> + :violates: <Component architecture> + :id: comp_saf_dfa__<Component>__<Element descriptor> + :failure_id: <ID from DFA failure initiators :need:`gd_guidl__dfa_failure_initiators`> + :failure_effect: "description of failure effect of the failure initiator on the element" + :mitigated_by: <ID from Component Requirement | ID from AoU Component Requirement> + :mitigation_issue: <ID from Issue Tracker> + :sufficient: <yes|no> + :status: <valid|invalid> + +.. note:: argument is inside the 'content'. Therefore content is mandatory + +.. attention:: + The above directive must be updated according to your component DFA. + + - The above "code-block" directive must be updated + - Fill in all the needed information in the <brackets> diff --git a/docs/modules/orchestrator/orchestrator/docs/safety_analysis/fmea.rst b/docs/modules/orchestrator/orchestrator/docs/safety_analysis/fmea.rst new file mode 100644 index 00000000000..6cf9f3d054c --- /dev/null +++ b/docs/modules/orchestrator/orchestrator/docs/safety_analysis/fmea.rst @@ -0,0 +1,49 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + + +FMEA (Failure Modes and Effects Analysis) +========================================= + +.. document:: Orchestrator FMEA + :id: doc__orchestrator_fmea + :status: draft + :safety: ASIL_B + :security: YES + :realizes: wp__sw_component_fmea + :tags: orchestrator + + +Failure Mode List +----------------- + +.. code-block:: rst + + .. comp_saf_fmea:: <Title> + :violates: <Component architecture> + :id: comp_saf_fmea__<Component>__<Element descriptor> + :fault_id: <ID from fault model :need:`gd_guidl__fault_models`> + :failure_effect: "description of failure effect of the fault model on the element" + :mitigated_by: <ID from Component Requirement | ID from AoU Component Requirement> + :mitigation_issue: <ID from Issue Tracker> + :sufficient: <yes|no> + :status: <valid|invalid> + +.. note:: argument is inside the 'content'. Therefore content is mandatory + +.. attention:: + The above directive must be updated according to your component FMEA. + + - The above "code-block" directive must be updated + - Fill in all the needed information in the <brackets> From 0588c1736f6cfdff85cf75132e1ab41c26c15f66 Mon Sep 17 00:00:00 2001 From: Tibor Zavartkay <zat1lr@bosch.com> Date: Thu, 4 Dec 2025 13:44:48 +0100 Subject: [PATCH 029/214] Fixing review findings --- docs/features/persistency/requirements/index.rst | 6 +++--- docs/requirements/stakeholder/index.rst | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/features/persistency/requirements/index.rst b/docs/features/persistency/requirements/index.rst index e730322c46d..a60974d0420 100644 --- a/docs/features/persistency/requirements/index.rst +++ b/docs/features/persistency/requirements/index.rst @@ -110,7 +110,7 @@ Requirements .. feat_req:: Configuration :id: feat_req__persistency__cfg :reqtype: Functional - :security: NO + :security: YES :safety: ASIL_B :satisfies: stkh_req__functional_req__file_based :status: valid @@ -217,7 +217,7 @@ Requirements .. feat_req:: Reset resistant storage :id: feat_req__persistency__reset_resistant :reqtype: Functional - :security: NO + :security: YES :safety: ASIL_B :satisfies: stkh_req__functional_req__support_of_store :status: valid @@ -457,7 +457,7 @@ Requirements .. feat_req:: Support development mode :id: feat_req__persistency__dev_mode :reqtype: Functional - :security: NO + :security: YES :safety: ASIL_B :satisfies: stkh_req__dependability__safety_features :status: valid diff --git a/docs/requirements/stakeholder/index.rst b/docs/requirements/stakeholder/index.rst index 2b2e47cfea7..0413c6111d5 100644 --- a/docs/requirements/stakeholder/index.rst +++ b/docs/requirements/stakeholder/index.rst @@ -246,7 +246,7 @@ Dependability .. stkh_req:: Safety features :id: stkh_req__dependability__safety_features :reqtype: Functional - :security: NO + :security: YES :safety: ASIL_B :rationale: tbd :status: valid From 1fc5c865fdfcaf672578794fa115732260c4bf0d Mon Sep 17 00:00:00 2001 From: Aleksey Borisyuk <aleksey.borisyuk@validas.de> Date: Wed, 3 Dec 2025 16:56:04 +0100 Subject: [PATCH 030/214] ITF safety evaluation - added diagram - added verification report - added itf to index.rst --- docs/score_tools/_assets/itf.drawio.svg | 189 +++++++++++++++++++++ docs/score_tools/index.rst | 1 + docs/score_tools/itf.rst | 212 ++++++++++++++++++++++++ 3 files changed, 402 insertions(+) create mode 100644 docs/score_tools/_assets/itf.drawio.svg create mode 100644 docs/score_tools/itf.rst diff --git a/docs/score_tools/_assets/itf.drawio.svg b/docs/score_tools/_assets/itf.drawio.svg new file mode 100644 index 00000000000..822bf100418 --- /dev/null +++ b/docs/score_tools/_assets/itf.drawio.svg @@ -0,0 +1,189 @@ +<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" style="background: #ffffff; background-color: light-dark(#ffffff, #121212);" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="468px" height="231px" viewBox="-0.5 -0.5 468 231" content="<mxfile scale="1" border="0"><diagram name="Page-1" id="T3BMX8OljUpALTbiXzM3">7Vptb9s2EP41BtYPNijJku2PiROnG1asQ9K13ZeBlmiJKCVqFB3b/fUjRVLvshXH7dogBpKIJ/JI3j3P8Y7xyFnG+zsG0+gdDRAZ2SDYj5ybkW27C1v8loKDEjiOqwQhw4ESWaXgHn9FWgi0dIsDlNU6ckoJx2ld6NMkQT6vySBjdFfvtqGkPmsKQ9QS3PuQtKUfccAjJZ27oJS/RTiMzMwW0G/W0P8SMrpN9Hwj29nkH/U6hkaX7p9FMKC7isi5HTlLRilXT/F+iYg0rTGbGrfqeVusm6GEDxnwEd7x1d8HsJphhPgiWv22+TCeKi2PkGyR2YZHhL7rDRVqhT2hr154/27lSq/fIvKIOPZhKcq9Qyir9RPmAPmnKvJC+fcBZVI1Qyll3My3Zua1kYitqEUYcW5FfjCeyzijXwqnWaJLxGOiH4W1U9kv3ocStpMNoTs/goxPAupvY2Ez4YDrXYQ5uk/VHneioxypIAomtltXmfsaSWsC0SJwjch1gYGlNkBCEySV5GtbFlZxwNy1Fr60KyakIg8QWm9mxYjqbgKYRcV0EWX4q7AGLDYoVo2TsN56oGIHN2MLFPaq4kND5hExjvYVkcbLHaIx4uwguui3jqe5rLltaa7vSqJYRhZVSDKdaX5qboaF5hKf4kFD9AlwtdxevAb4sQmgJ0FYDb2nG74TJhNtGEs0JOssPYbJQtwx/2WWhGMZwWzwyxonkB3ePHEpTdL08iLeiqA7NuyQjCzA/ceWEyxxnWNN4keslFwRHCZSFQ4Cqf6H4YpmsD0Vz1Av0hd7Qkx7YAVjTCSmS7OrF/p4smzdNpMHaAO3pDTos1hlTr5DvVkllQM6SDV/PqkcqwUIFIjjUDe1Qyp+RHvMP1WeP+eR0dWtm722eN44VBrvEcNiddLiSpaIlX4qw2re/mwUy0apK28ZZSWQ2m6u4aZ0UR0ddhcIeiE8CB1WLzp6gF5dm6DalUxbqvgXshWWTtMGCEwPn8Asw74S6i5Wmxj6oD2CzoxumQ45tuvoNAuyEOlupp9Ew1EMM0Qgx4/15KkLkvlQsQ94qHRIKU54VtH8XgpKathgXuPGYt5At1LYPdiagq7BxeTKBnpQgzPFDgfRqOB8b9pUEsyEc/lirCLTlehgTdO9itplEtU6FR4Eh4S1lplg0+b8fOvXh9XQnKpOt670qBIcGiiUue983hXQHc9ZOMFloqcNTodPuyN8ukewOjR8mqJgePgswl415ukAeiTqtUPYIGYfzZm+Ld0Hm9D+TibMW81jqG3Xcw64Qb4oitmK2Y+VYBeOvK3oOJ3VeeNaE88CM2duuy4QRfv0WwVLc9wcz9nfH7ioCsdrmIno0598H8+yuSosRVzKE+b0wCOavHnNjH/SzHg2/X6ZsduuLIXvA1ULNpCSO+308Xgy61xTzmk8Kqr339GGG0cpybXucTM1heBVU2ku/auhmct7AF05Ojc4DsX2fYKFcwQ/VncIsn8se74XP5M0CS/huZlTP5Vn7WN50eE60+1ZrvNarvvz9t2HV7cNSKZm7v/mNm/WcS40XCajYvryqsC+8o1RLo54mpzKM1oOLq7H4dqYDhx3vN3IorvSaHAJL3fdMDcTwK6CtzMFnHhgUbs9mAAwOycRfGGAGnitcNYNguHpyQS1Ah23qwDTsmfnsYMS1d5xGvDjph6Vp18i4fW6LqnPh3ztugycAPsrrp+M62qBZrLAHwTrLjgP63bjJqyppwfrQ2/rOq/jziFKO3F7JcpPQhTvRRClWXBeliflLLX/zD+VN6JZfktAdS+/ieHc/gc=</diagram></mxfile>"> + <defs/> + <rect fill="#ffffff" width="100%" height="100%" x="0" y="0" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"/> + <g> + <g> + <path d="M 462 2 C 464.76 2 467 4.24 467 7 L 467 43.13 Q 439 32.55 411 43.13 Q 383 53.7 355 43.13 L 355 7.88 L 355 7 C 355 4.24 357.24 2 360 2 Z" fill="#deebf7" stroke="#08519c" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(222, 235, 247), rgb(27, 38, 48)); stroke: light-dark(rgb(8, 81, 156), rgb(122, 185, 249));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 112px; height: 1px; padding-top: 21px; margin-left: 355px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <font color="#000000" face="Helvetica" style="color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"> + Test report + <br/> + </font> + </div> + </div> + </div> + </foreignObject> + <text x="411" y="24" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Test report + </text> + </switch> + </g> + </g> + <g> + <path d="M 14.77 3.98 C 14.77 2.93 15.55 1.91 16.94 1.17 C 18.32 0.42 20.2 0 22.16 0 L 122.61 0 C 124.57 0 126.45 0.42 127.84 1.17 C 129.22 1.91 130 2.93 130 3.98 L 130 35.83 C 111.59 31.63 90.8 31.63 72.39 35.83 C 53.97 40.04 33.19 40.04 14.77 35.83 Z" fill="#deebf7" stroke="#08519c" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(222, 235, 247), rgb(27, 38, 48)); stroke: light-dark(rgb(8, 81, 156), rgb(122, 185, 249));"/> + <path d="M 7.39 7.96 C 7.39 5.76 10.69 3.98 14.77 3.98 L 115.23 3.98 C 119.31 3.98 122.61 5.76 122.61 7.96 L 122.61 39.81 C 104.2 35.61 83.41 35.61 65 39.81 C 46.59 44.02 25.8 44.02 7.39 39.81 Z" fill="#deebf7" stroke="#08519c" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(222, 235, 247), rgb(27, 38, 48)); stroke: light-dark(rgb(8, 81, 156), rgb(122, 185, 249));"/> + <path d="M 0 11.94 C 0 10.89 0.78 9.88 2.16 9.13 C 3.55 8.38 5.43 7.96 7.39 7.96 L 107.84 7.96 C 109.8 7.96 111.68 8.38 113.06 9.13 C 114.45 9.88 115.23 10.89 115.23 11.94 L 115.23 43.8 C 96.81 39.59 76.03 39.59 57.61 43.8 C 39.2 48 18.41 48 0 43.8 Z" fill="#deebf7" stroke="#08519c" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(222, 235, 247), rgb(27, 38, 48)); stroke: light-dark(rgb(8, 81, 156), rgb(122, 185, 249));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 24px; margin-left: 65px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: nowrap; "> + <div> + <font face="Helvetica"> + Software + </font> + </div> + <div> + <font face="Helvetica"> + image (binary) + </font> + </div> + </div> + </div> + </div> + </foreignObject> + <text x="65" y="28" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Software... + </text> + </switch> + </g> + </g> + <g> + <path d="M 130 88 L 188 88 Q 198 88 203.11 79.4 L 215.79 58.08" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 218.86 52.92 L 218.21 61.84 L 215.79 58.08 L 211.33 57.75 Z" fill="#000000" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <rect x="190" y="0" width="120" height="51" rx="7.65" ry="7.65" fill="#ffff88" stroke="#36393d" pointer-events="all" style="fill: light-dark(rgb(255, 255, 136), rgb(33, 33, 0)); stroke: light-dark(rgb(54, 57, 61), rgb(186, 189, 192));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 26px; margin-left: 191px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <font color="#000000" face="Times,serif" style="font-size: 14px; color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"> + ITF + </font> + </div> + </div> + </div> + </foreignObject> + <text x="250" y="29" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + ITF + </text> + </switch> + </g> + </g> + <g> + <path d="M 130 24.78 L 181.76 25.4" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 187.76 25.47 L 179.72 29.38 L 181.76 25.4 L 179.81 21.38 Z" fill="#000000" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <path d="M 310 25.5 L 346.76 25.5" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 352.76 25.5 L 344.76 29.5 L 346.76 25.5 L 344.76 21.5 Z" fill="#000000" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <path d="M 14.77 67.98 C 14.77 66.93 15.55 65.91 16.94 65.17 C 18.32 64.42 20.2 64 22.16 64 L 122.61 64 C 124.57 64 126.45 64.42 127.84 65.17 C 129.22 65.91 130 66.93 130 67.98 L 130 99.83 C 111.59 95.63 90.8 95.63 72.39 99.83 C 53.97 104.04 33.19 104.04 14.77 99.83 Z" fill="#deebf7" stroke="#08519c" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(222, 235, 247), rgb(27, 38, 48)); stroke: light-dark(rgb(8, 81, 156), rgb(122, 185, 249));"/> + <path d="M 7.39 71.96 C 7.39 69.76 10.69 67.98 14.77 67.98 L 115.23 67.98 C 119.31 67.98 122.61 69.76 122.61 71.96 L 122.61 103.81 C 104.2 99.61 83.41 99.61 65 103.81 C 46.59 108.02 25.8 108.02 7.39 103.81 Z" fill="#deebf7" stroke="#08519c" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(222, 235, 247), rgb(27, 38, 48)); stroke: light-dark(rgb(8, 81, 156), rgb(122, 185, 249));"/> + <path d="M 0 75.94 C 0 74.89 0.78 73.88 2.16 73.13 C 3.55 72.38 5.43 71.96 7.39 71.96 L 107.84 71.96 C 109.8 71.96 111.68 72.38 113.06 73.13 C 114.45 73.88 115.23 74.89 115.23 75.94 L 115.23 107.8 C 96.81 103.59 76.03 103.59 57.61 107.8 C 39.2 112 18.41 112 0 107.8 Z" fill="#deebf7" stroke="#08519c" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(222, 235, 247), rgb(27, 38, 48)); stroke: light-dark(rgb(8, 81, 156), rgb(122, 185, 249));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 88px; margin-left: 65px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: nowrap; "> + <div> + Pytest-based + </div> + <div> + test file (python) + </div> + </div> + </div> + </div> + </foreignObject> + <text x="65" y="92" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Pytest-based... + </text> + </switch> + </g> + </g> + <g> + <rect x="163" y="160" width="90" height="70" rx="10.5" ry="10.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <image x="186.5" y="166.5" width="42" height="42" xlink:href="data:image/png;base64,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" preserveAspectRatio="none"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 223px; margin-left: 164px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; "> + hardware + </div> + </div> + </div> + </foreignObject> + <text x="208" y="223" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle" font-weight="bold"> + hardware + </text> + </switch> + </g> + </g> + <g> + <rect x="265" y="160" width="90" height="70" rx="10.5" ry="10.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <image x="288.5" y="166.5" width="42" height="42" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGgAAAB6CAYAAABTAhYxAAAAAXNSR0IArs4c6QAAIABJREFUeF7lnQmUXGd15/9vqb2qq/dFe0vdktqytXiH2JIBGxsbQwCPCQOO2QKcBAabMOAQJsxMcpxAhmPOgXNmTDIDw0zmHJbMYgZjDh4HbCfYYLzIm7aWWr0vVdW1vHr7Mud+772q6lJ1d20tyUodSd2q/b3f+997v/vd734c/hnczjzxpVtjMevv5k/O3bP/Q9/76RvpkLk30pdt9rumnvvyiY5OYdTSDeQzypnMvPz3Qdv5i113fzvX7Huer9f9swCkn/qKY1s2HMuCYxvsZ74QhpKe/40VSv6H0dse+sH5OuGNfs4lD2jql3/yl5u3CQ/oOrcCkE2wLBO2YSKbs5c0yfw/huP8m8vv/u58oydxI59/yQOSjt6XDUaTyWoF+YBg27BNA45toaAIMBX7N3a4429Hbv3GtzfyxNf73pc0oNd+9MnRvVf1nTAtAfUAcmwbjmnAMIJQncBSUXae4Rzhjy+76+GT9Z7Qdj/vkgY0/+yXftHfzx9pFJBNps+yAJODwnfBCfectB37O7tu/tpfthvAeu93SQNSj33J4YMhMDNWFSTUMnG+gkqA2GtsejmiW3fDMm2ohv1juWB+ZfT2b76w3sltx+OXLKCTj91/9649se9bXJiZrVYBDV5zA9T0y9AlHUU9AkMVl5Qi/1/FaPDLo7d/U2sHjFrvcckCyh79t1OxDnELHXSrgLjOzejevgnFmVfcc2g77g/TQVEPW4YqPi8VzK9sxCD4vAMa/8Enkr0Hrjo5+/LzG3b1nXz0M6FdY0nVEaOuclpUUPe+gzBVGfryJBwHcOgf22VFvzu2A8sEikp4wTADPxadwOfbNQg+r4DoxG2+7ECWswphI3MKct5GOmv8ePboxKdv+XePT7bLTMw+++ffHezX7m0HIIgC+vffgMLEs8wHOZarHh8M6L8MkgcOgK7akLTI8ULWePCaT/3oe60c13kFlDv+8GJQlPvM3AQbJJL3pfGHpWtYnNOP62bg/naYCenon9qRrhg7tlYVFBocQbQzCmnmdaYaBoagkJmrAkPwHMcG5wRg2yZ7bnZR16ZOF99+61effLIZUOcNEMGJhqU+LTPlHmQFIBY92ZSGsZHNWAtLk6n/cd1nH/tcMwd08tHPHNo1lnwegSQcxwsOWjBxfQffDGluAkZh0QXDzJurmBVKsgWQmthn0mMMpo25cQlXf/Efmj7PTb+wkZOXefmrryU6k2N65gSDsBYgeKBUmXeWptL/c2nB+Fwj5o8So10D0VGOC7QMyAn2o2dkBPnxZ5if8YMD35yx+5iaBPZZjkPpJNcEwuZhGQ5Ov5J68ciDTx9q5HxVPnfDARGcjt6hMT39spcLqw8QnQzTMmDqNlKz8vNcvP/Lq5m/Uz+77xPdm4bui0SDY+FEJwrprKMXC0j28uz4mg0S4tsPAsYylMXJkjljARxJhKlJcJOvDgdYAhyQWSMTJ8K2HEgLOZydtY40a97ou28oIBrJ927be8TIvOKpxjVj9SjIB+SaFIrEbCyn5KV8wfr6dfc98VVK43Rv7fmbaEff4URfHwc+TCQ8u+P+VHNLyM4tobMb4AShZrK0MhdXOVC17CgG9h/E8vHnYGlKObr24XiqgU3+xmCKcX2eF0TYwNSxdO7N//6pzmbVs6GAKJIa2jV8r5Z6jfkbF0oLgOjE0B8bCA2NoHPbXvDR/vKx00mqAgR2nwVTN5E6O4mgqCES59n3WC+TwHdsRaI3jtypV3zLBliknLJqmFKq4Pi+SStqmDhV+C83f/Xpj110gAhO/66xe830S+xk0IlrF6Dw5t1IbtkJLTeLUOd2INTn2fzVAcExvOdomD+9CN7KIpoIlAIVP5tdqaDOPddBmT8FNZX2ggFSieD+TofEAgU3UrBgg7M4N9T27ls8vWxf/WdPuS9o4dZ2E0fzL0P7rnrAzr5cSq+0C1CgbwTdO0agZZ6FYzoQO0Yhdl5RPyBmg9ysTHo278iZSS6Z4F2z6wUnLJuNJPr37ET6ledgG0TD+wjbZP6lEg6ZtFJE5wMzdEyelFoKDnymbQU0+cyf/9GmkbFvOdKxFY65HYAQH0L/nitKcJgi0YvowCgQ3gTXnK30Qb6JKymoAhA5d7rJmayTmlrkOqIKwAvse4f6hhmS4tnjXCUcCgSYgljytexrfNWQsugmLWQxnUZLwUHbAVFycvjq3/m+UzwLx5JWZJBbBhQdQP/eK6Gln2bKKY3iAQSSIwgk9wCc2BQgCo+ZmdI0zB6fZb9vP7QPmdd/DbOoM3PmQimbtFqqoefZtg7YIubO5loODtoKiKpmtu6/8jFePQPL1Ji5qEzxtwLICfRh4PKrVsApnzAHDteD+OAwEN7SNCDKNmh5xTF1naN0DgqzMBWqXXDB+KphAqxSjg/Qh2OoCiYntZaDg7YBopH78LVHnhf0aZi65B1MewCpYhib9h2GkX0RprJccrWlk0ZRFYBg5wgCnaOuitjZ9EydF8WtZuKUvApDzrMcG4pzMGW95G+qAwEfTmUgUA3Hsi1k56S2BAdtAURjkd033XJCMJdgG8ssKHCvttYBkaMeuOLaFXDKV7ObBwM5bIoQuU7EBjeDj+5cF5CcSZWgcMqCC8W70eRcpUnzlVOpGgbK8PI8bMrB/d3/OX0235bgoC2AzLnvOQKvwzGWS2mVdgDS7QQza0bu5ZJyCA7nCLBJHT4cOjeOe4LFjmGEe3YCYvwcBRUyBcfU8hxvSrCLi7AU1b2QSubKzQzU42+qVVMJR07nMZvj2xIctAWQPPG3iiPPhR1TdSh73A4FKTaPwT1vBuST0IpuBdQKOP5YhECx8NgzawAim/ZATIwwQJRFUAp5+FAcXYfNPLkbuNaCU8vfVIbQa8Gh91ucl9oWHLQFEIXVW3ePfcvOP4biUgiGFUaiv8N974o6gEaChOToDbDkaZjFM6vCcaHRSfZNquvIxUQ/NCfJoDhKCrauVSQ43ehvBRz/9U0EA+RvuArYtqlhckZvW3DQFkD0JqSikLAYhnWavacumcino+jo6yzlv+oFFN9xHWClYOROrIDDeFdET+5JLvsBFgL7WWR2bdConvJCfgTWOJyayqnyNz5s29Gh53XkFVxcCqIv6KvITD/qQ3cFZNpIzXMIR7oRTVA6fu1cXGzb1YBdhJF9yX0fy00+VsJZTTmVqrBMf9i/BhyWfHXfu3p8U/oMLytQK1Ij5fgXBMExZROWZrFjXJS4tqqoLZkEUpFoz4Qt2TVL1bfMEgfBDiPRGzknm01+KzSwF6GQCc3LeteC41/RvnrKobYHpFI5jKpbK+BeGOXnlMziKmatOoz2xzf+RVd5MRAcS7VgauQP3dlW3eHtZSs03MgcVs2T5t3ZFkDjj3/hT3Ye3P9gcWLtlR160UBeSqK7VwR4nvmpQO9uhCMc1JRbZsb8hKce36z5V7UPx7/yV5ysesyaN1VQPQBdK23jh8++z6lUDoXbpuImgiunw7Mq9+KmGw59lL5fq/VzbQFEX4RFdLnXwkZhbq0LwjVZhgUpIyC+ay+6hjZDXXraveIr4FSatsqAYE04VcrxATJ/5ImoGk6tTHRl2obe4xw4pptwNVSTqbMaEB3L2IduAScGMD0unTQN7cvNrqBoGyDKYg/u3P5A7vjj6wICx7GxDBffju7Ra6BM/4IQt6acVeCsUF2VWatHOb6CGCgPDCwHlkFF9xTm1waUvGYftl02AFY4SRmGJTmdnsp+p9FCx7YBogPIv/6QbadPclp2fRX5FLsP3FqO3KpMWymSqgqnS2bGD3MrIrbSWGydQehqcBzo7vSBLZaUw/yQF1AQHJvq4HR3GmI1QKSqvR94C4RwlAGiZS40NybnNczP5H5cb1F+WwGRinq39D+QeeGJ9VXkPcOIDGL79W9zVWSppXC62u/4QUGl36mM2GgQyjn8iqDAN231mrVqOOyzTDfbzT7fg0O+h5m1dQDFdnRj102HYFIZlgeIpjlsw2BLXlLTuYX0gvqFtWrn2grIV5F89iVOX6p/HVTn1bc6kXiEM5aeWXW8Ux21lcY6VaatOkPg+rzaGelSHo0lVb2JN5vye3opr0jlvezmwfHHXPUAoucOv/tGRLvjNQH59RCZBViGZX1ncnzq87c88PiKZZkbA2j2BFeYnATvXX3ryikUxM47PgRl7rewlcXSDKXvP1aF49dIV6Vw/Ak0P7/mj3X8gIBB8wadbjBSNmtlc0b+pUI5frheqZp1FESfG+oIYe9dN6JyhZ+vIB8Qm3I3DVCpWWom9cL8Gfl+vxKorYBoXmjb3uHHCqefYEUZmmRBWlShSUDQcStjVrslrrwe/TuHocw8XZ5CrvA99WQKWETlDTCr4TAR1KgdKMFhQQAHDl5hSxUc35ytMGt1AKLPHbrpELq394MWMVeauGpA/rIXRzdZBZNkJD/fVkC0oiAcsraoS6e8qhl3kEh1I3JaQzFjQ9CLpUmwSlicwGH0Ax+FsXwMZmHmnDxbZWDgp3HW8jt+6S0rcqciQtA6HwccK2JxS7nABREbiMGQDFAmmrkVloAtT9Qx01bhb5oBxPEcrrjnRhimyHzPagoiQLoWZDbVzOS5ieOZF9sGiArjdx7cr5ICTI1sOC3SLQOiqIn91SxIyyqKyzqCenkuhr5UfN+YNXz4JkEa//kKQJXqqQwMShGUl50uBQUVVZ5USOhmFfwSKQHBWBDRTX2I9SSgFHQIwSA4QURxZgKF6QwM2SxfRG0ARF+ha/8ubLtqMzTVOQeQWnDzTnpRg3R6FrmJHJv6yCPyZNsAUalV32D03uLsb12HugogNilmuqGqLlvIpm1wsmTzmsGSb2MffT8EJwt18XR5utkLmVdLgrqDRXL05Zo1N8Vjw3Z48I4FXgghMjCAcG8nlKU58JwBy9BhyIabDRAERLuTiA5shiEXsXxmEer8onssLSrITx+NffAIOI6Dpeus3kHVHFhywVGm0lzm5CK7oMvDhDYDUsYfcmxpCoY8XzcgipB8ZZGfkrI5xDuT2Pcv70Hh1C/hGIVyUpJKbP25H5tOGs3tuAlKhwpkTRr8kuUqp17ItIV7Y4j0b4KSWoA0tcyg9OzpYlcsZQIIDv2lZCcpx1JMhJJxhHdsQXKwB9npFLTpGSjLBfeCaTBI8IcLpO7Qpj5s/50RZj30uRmkjy8y87rCv1ZMgbRNQVTRs3P/Zd8vTv/CDZPrVFAlIM60YTg2LE3E3rveD6rlNrJz5wCiENgpldl6JTfkT6g2umJlAc8HEO7rR258mvkXQeQhRkUMXTvErlICsRogup+AxYdi6NqzGaGuXkz/8nl2XyuACJYYCUAvUO1DOYm74YAoOIhGnS1qhoKD1gCFk73YcfOdKBz/CVMDJU6pvLa0LoeNVyjR6qnHv6rJdHqrC4RAAE4wjvRLpyGEqdbNgTRfZP4vmAxi+1u3QQwJNQFR+M1U10mrI3iYVLgIgI8PIPPb11oGxAbN7jK98qxu5VxWuxXkBwfa0lMwNap5bg3Q5htvcwJBcNrcr1lE5dc/k89yw6zyijZmr9ndbt02AeJ5EaHufiy+dJyZD2lGgkFXvnfjOQ5iREBiawL9B/tKJo4eDiVDEONBdzZYt2EZYIAorRPv24Tl45NQs1I5vVNnmF09hXFeAc08df8j/du23KmlXij5k2ZNnCPyGHnXPSicfgq2mnJ5lAIED5C3eKpyCaIPiOMDiPT3YeoXryI/SeVU5XmgSkCcQEWkPPggj03XDyG5owNCmNIxlpsENaxzAJEKo1tHsPiPv31jAaLgQLAmoBfSLQOKjR1ig1Ua6NJghKnGX3boL5aqWHZYctoOlUtxiPQP4MQPn4Mue9OlFaohKMxUCe5MLY276EYm8IqP7IOlU/i7OiBLtxFKdkPJGVAmp+vKxZWLUMpF9efVxFFwMLJ/+/flBfeq8iOyZhU0fMd7oWfPQEuPr1hNvdqC3RIgy0a4ZzNO/u9fQyt4KxkIBsehEowPhf2kxziOQdn21i1IDnetC4iCmo5du5mKSuZ1lemGyvLkC2bi/ODAKLhjllYACckha/jIzULuxCOASQFAebn7moAsgfmcU488BzWnnQOlUi0EhqOZXKYgsN/91NBlH7ysLkBCOI5gLIT00dPrZrMvqIKo38HOGy7LqpkX2YG1Cmjg+pvd4GD+WW92tQ5ABl+CQ1U166nFh8IA8fTXVRF1D9l07SA6R7tW9UFk4khBtCSzY+d25F46BoMGuBergig4GNzRd6eePca+eCuA6ITtfOeHIU08BUtZqAsQKzZJDmH8J8+xkqdq31JLLZVQwOCQpeNYZpsKP/bevacuQLzAIbZ5K9LPvXrxAvKDA0tbbhlQdOd+FhwUJ55w0yrsqlxbQboRcRaeOcUZBVKO6/ArfctqaiEwPK0tJgWRH6LfOUBJqeg/0IuOnZ1wzBBL/5P5o9ZkIueWCtPNolpwg+LvANInaGqk9pT3BfVBtKp61xU7HtayL7r5rhYVtP2Wu1kW28ieqQsQ+Tpt2cbcb6ZKYKp9y2pqKYEhf1QBiFQYiAWw9wPvZLUHtF7INlSWN3MMHZauur3kNJUB0rMaCrPyxQmIgoOOhLlFV6ZbBuREBqxth28TlNP/i63krkdBtiFg4YVZFhSwk+w5/Grfsppa3NeU1UPRnpbXIUZE7Hn/HW9sQH5wYEgvucppUUE9V77ViURtTp17js3D1APILHKY/tVkCUyjaiGzxsycbxp5DlpWY4B233X7GxsQ9T7o2xQ/YsknWVjdEiAksOOW90CZehyWkqsLkGMJyJ8tIDeZWRGJNaIWAsMiOK+6mMyjmlERiIgYee873riAqGqnuy/6QEBMAU6+ZUDBzZdjcHQnChNPgPMyBOspyLTimP/VcWbaKiOx1XxLLbW4iuPdKM7LLBAgyiqMvPu2NxYgCgg6e+Kfj0RDo4GgWSrZTc8biIVyCIQLTQcJmw/fBTN/Enp2vC5AlMWWlgPIH5+oGYnV8i211FIJhnwRhc3ykgIxGMbOd7314gdE604TPYmHRCF8OBZVOSp0oEQktVOh8QaVtLKfXADZlAwjt4BYLMem+evNZlvRfmx/060ojv+YTSfUoyBq87Xw4izVKHnBwcpIrF61kIJYQoH+YZEcoCwq4MXQBQdEmfclxSuUDISPlqa8X/nBhwe7hrq+HQgG3xwNaj1s8RPPgxcDzBzwosjm7en/dD/HCxDEEAMHkYNasJGfPolQMFvXhF3y8pvc4GDheZZ4rAeQabpzPDRuaUUtlekfd0zEobggs+MZvuMt511BNJ0xXyi3PXUC4aOx3sRnqPSKIxPW0Rl6UHDMHt7IsMGZD4WUwqAIAlNPSUUBkQFiKXsh6o7gRG9poa5jYWIZtjGHsCOVqnr8PJ3bRTeCrW95nxscaIW6AMEJYPn0Moy84gKqEYnV8i211EJQbE6A535YyF1ckAA+gG1vu54d20aPg2jysFot4Ujowdu/9cz3S6NiGnyzXm4d4tj8sZesKG8IHFW4kEKEoJs+aUBFlW9Mvy/PZiEtTiFkZ0uJVAIk9F2Gvl17oc78rNRKcj0FGU4vsi8fY3Bo3FKvb6mlFo5R88wcy0DwSL+eQfcVw0hu2wRTLcKSqRlg0Z2iCIThUHFjiwNVmmqgsZtvwoKxyDgnBP+0Gso5gLp6QmO2/gpbXr44TZX7AjpiKJuzelTkKagaEv2fzN/S+KsQ1AwLywevfy/s4jj07Km6AAFBSBnLrbJhiU7Xb1RHYvWqheMcN9XDTDUHU7ZYqdOudx85p7jQranWYckKDEWFbVKxigM1p7PQvJFUz7KkGZopTK4HZVVAlQ8UFxVksxF0xAUI4TCz+XyA/FHtYMH3RbUA+fcRqOJywUkO9HN66h8ZLL974ZoKMgUsn14qvfU5YLxIrF61sCwCqdDL3xWmJQQiYfRffWBVQOSTWeWnQWW6NrITeba6rhFAZxeNo+/9zy8cWOscVT/GTFyy0xqz1VM1X2dqNmgJo8hHEO8Mr+2LaqiISpoUmXcER+IoTKfV226t9MqmrGsBMooGpLniinFLs2px829sNo9FcHRbemkJw7e/mVmM6vJcX0GVgCjrIM26FbL1AsoXFWihZMM9FEqATMldWb3WrbjogPoYdPX1MrtcHXL7KqKeBFJBZAUB4VCes9UzJbXQfQ0Dkg3Ii25ttz9uaVYt1YNbNaVBy2vY8pYbmI+pB1B+suCVTq29Pqhywm4pr6Vv/eYLveud45oKSiSMMUuuraDqF5BJsjQTmXQYHd1dbGkFRT3gIkwp9PxIpMg5+ri3PNDtaUD/lJe2N6YgUzWhpuQV45ZakVi1b6lWy8ppBp4Ng5ZeTaNnbASxLZvqAmQpGrJn8nUt4PIBkRXJCeGmVn+7UVzCGKMRfaM3Gr8sZwT0j1wHUVBhKUdLPqXcALx1QFQwqGbdORl/3FIrEqv2LdVq8V9LZATOgaFYyI5nseO2W9wuXXUoSJrJs+CgkZqEdFYxbv7mS8FGzy+zEmx/t+7AqJGrT0G1PiS66x7YuX+ArS6whyuXvrsrBlpTEANUMFeMW5pRC/typXkgIH9WghgOoffANXUDWj6WYvV/9S7gomOfy+jjd/zH50eaB9QpjFLI2+wttvveDQVEU9K6ZLjpGW/c0qha3OwHvdjNZNOQIv16GgPXXIlQR1ddgNTlAsj/lFZ211G4KMk6ZDHecHDgs2AKiie4UUpYNntLjH14QwHxwQ5o+WVW8ekXelRGYrV8S7Va/Kw1vZ58Q/bkMjovvw7R3i2QU9MQBLeuYa0gIXs6xeofSpFbHYAWs80FBysBxe1RdXmiWT5I7ttYQEK4k62WVham3LqDioIPNyPg3uf7lmq1+FDZc2wHyyezSI5djWj/sNfr1C1ZVlITDs/r7p4P3kLfUpitqlh6dd5Vj1+HsA4gk3wcF2wqOFgBKBa1R6lYsNlb8sDHNlRBBCg6tA2FM0fdr1gq+HAjsbXUwjIOXtKN/EF+Iof4zivdZrSspZnbW9vvymhqMopL82B98LxdIimTUDibhpzyzFudgLI5GZvffjjcygZQzMRFw9qounS2WT7ouurj5wWQmlmCRT3k6lQLg+MlVungcmfyiG47iOjgmAunBiBq20zTK6YqQV6cZ/Coz8HS0cmGlp9QlDebaj44WKEgAiQvNG/ieq75gw0FFIhGEB4YhSHloGenwQf8eaCyOkr5Ob/2ms2WllM6+akCwoP7Ed20v9zCeQ1AfjdgPZ/F/DOvwSjKbm/TOhdw5QsqClrw99ZKhNajCKagSEAelRem63l+zef0Xr+xCgrGIwj1eYByyxBDCjNblb6lUi2s1s2rHqWflJYRkyNObNu17gN+j+06AC29egLS6QWYVHbVwAq7pXSx6bFP5UnmFp6+/3Qs5gwX590as2Zu/b/zyQ1VEB8QEO3vh6kHoefzLNoSAwoczoIQErwc3UpV0eidljSC70VsaA/Uour2NG0AUOHsNFJHz8A01JJy6lGQqsrIG6FHbvnrZ97dzPk8B1A0ag9Lc80raPDGjQVEg8JITw8gJBgg8gu02Jf2lTMVGTwkBDto1peDodBSlDAC3QchRjvLfsZWy5DqUNDy9DzSv3ZbpDW6iHg5I8EY7Ous7hrSDCymoEhIHy7M1d8AqfqDNt30qQ1VkN9rNNIZg66GWMVnfOtOWCpVgMqwVJlts0bZ6OS+O2urxHZTRUxJXVvXDBKKqSVn9he/4ljdXIOrvGlQvZBRm0qM1gLoAgqow/nZ5gFtftsfbjggsv/BaAS2E4IlF9Exuo9NS1s0+6kqrDTXVlUkD70PAtVNVKvEA+SYEiwnsVJdFWE29dU+8/+eQUikaM5bztnAMvxcVmlLcFCK4ghQiJeHCzP1Nz+qJr3l1j86L4DI/tPEmi7r6B47yAD5Zo7ma0hJQnIzkiM3rAqIwmhDzUEIbwIfjKwYB5G6xh99HOEwrVH1mmw0qKDFRaktwcE5gHJTzSto2zs+fd4A8SLtDQcXkGGcY+ZsVUPPdR9YExCNc3RpGaHuUfc80CZQag5nf/I4CzpKERs91gAgWS62LTgoAaL2/uGA8XeBsHllQJYFRW581+Mdd37mvAFi61J4DvGtYxBCoZpmLrrz2nP9jGfi/IEojXP0goRw7yhMTcPko4+AD9qwdFqU1VyvnnSq0LbgoASo0ly9/qNP/nUkZt8btXN9xayyorneWhHIzt/9V3UDcvutUSMjty1mXTUJ3m6//hJ8+i6BRA/iW3bUNHNUs9B14HdXBgI1ANFoP3N2FvKpSZAyDVV2BdUEIFq2P59W2hYc1ATk30mVpYJRfDjE61ebcp6jnjpr3Ube99m1AdH2L1kNoewsjEwWwjV3g1PH3QYV3iru9cqu/EGiD5UPhFgCVYzGWTMkWsfjR3OGUkTPgXex+0vpnApAFKXlzp5F/sQ0x4kcIp0Jz6z5neybU9B8zmzL2GfFOGi92Pz4Dz/yNwFB+EiUywqFrAJq2VJ92/X++88BREtTaJFTID3tQgkI0OL9sIIJdB14N2zlDNx9Vd0JvkYB0W5ZQiAIx6S+dDLEYAhiNOjuokUOPrGJNaz1AamFLHITJ1A8dZbN/YSTMZYjpQZ+rLrIa0XWrIKoXYBmc23tmU3fpe5uV0f/+++/IygaDyViwm45tcyZRrkXwd7f+2MGyJLnoS2rEJemYRcKUIUk+I44uHjc65LLsc4dXLgfA4feBmXi/8KipYZNAFqx8putYgywMijqVMUFCJ6IvmvfgfzMSRRPnYSeNxDqpFJlwKSyZr8FprfNQDsAsRIAhbuw29P8/K9uTm4a3fHfIhxuD+opQU4XsPUt1wHjTzEofCIBJT6EcDIKk23R7MChzh20es50AdF93ftuhCjaaKQ2u3pj88pGFn4rGLdHncVWYJs6h2B3JwLQ2dJFv5GcI5fZAAAHzElEQVSfTRvTbhAgAj1fFJqeQa22TnUrqJYp/M1/uuv3ewbCX0vGrYFITwhijHNLfL2e0qV67BqADKGHrW6g+mxTzTds4mq1gqncqtlv5Me6lXiO/3wBKpp82zbZaAlQJTTp6H3ZYNhJ2mauLkBk9zv2HmHdfpXZJy8pQDRruyCLn3/71578+no+fr3H2waIxlN7DiZPGPpi3YD8VQ7y1D/BVubqWgJZGZqvZuKYYrxWmBdCQQSoaAttUVHbANFJYc0thgJ30s5ZzOd4fUpr+SC/NaY4tI/1SJAnn7ikAJEJTqlCS/UIDUVx60nRf1x+5V87PL/E+rDVA4haq2x9678Abchu5KbqWuXth+YXs4IIEA010mJ8eytb1bRVQQSJVoHHAsUj1NKFJtpWi+J8BRGgyOAWtuNjbvznbrvkOjqNXMxBgr+TC11AeUtsKexuO6DiS59zzMIi1FwRctZEICog1hM6J8yuBERgtxy+A5Y8AzV18pIClCs0t6phzVRPveas+nm0nHLbsPNwfnLGDRR0t0GeXHCzD/H+MPvp91egLoakIPo/Fx8s9cxmbVfqbUdW1RKzXBPuKvFCBQmk8IKkQdadlvJzbVXQ4rNfTMUDCz1yRloBiLXyMiw2cFRVHpEkh1BCZM1efUAEiVqS0XIVeea1Nzwg2m0so5otwWlrkECrxMeu7J8rzJ11m8tWKMgH5PZco5S+BYkG9kIYvUNiKZiwhU579x138tKpn8KkpkWVW4+t0xKzMpNwocNsKhopFGxj+zsOJ1opWmwrIAoOknHziJKacOGsA8jtqmuxYkBVFFhDc5rJ7Dz0JifZF+Oks78+74DowrFUCWI00fTWAKZqIZNXDGdzX19bikaa9TfVr1OPfcmhTTF0WWkIkAvKBapYJsJDA7j6wx9E4cyvYMpLdTeVbVZBFKzQyolCtsB8Jh8UEE/Quty4e4gNzKhSU0BaC+R09420ElpXntu2+CDaBXLHDjxYXJxyk6ENKKgSEGutaTm49s8+h+IUdVKc3RhANm3Ia8AopCDleQTjAYR7u9AxSFMQNqZfSaG7O9QQILIEqYzcVjhtM3GUh+MdNWkWcy0DSh7aa+++7WY+e+yxtps4Uzag5XKQChbEIO3r0IXeHUlwArUecJvikpkrLCmw0jKCHcG6FER+NZOWmlokvJ4Fa1lBfg5Oyc2y1vutKuiKT38InJmBsnCiLYAM1WITh4acZueC7x7EwJ4k20OBZTp0k434KwFRdDlzLI3upLtqca3CRbYQLFWAbEZarsOuBatlQFS21dVvD+t52tzcbgmQ2NWBA5/4ONu3wTL1pgFZhgktp0FbdnsrmOHkfM9lQ119WyMhN4os5wlXA6RKJqS5JcTi8VUBkTlOLeQ3DE5bTJx16guOri7CUo2WAW1+183o3dqD4iRFcHW0ZfaL2b29G2iSTppJscpTgqJC/MZ19z3xVf/KpIG0aBf/ortH7vMHzKsBcgwTs+M5JGPURMrd+mZF8bztILMoQRHibZlWWM3UtaQgavC3abP1AMtee/sdNGvi6Aseuv/TLDgwpbmmAOWnJSybgYeu++xjn1vLtpNZdjjr68lE4e3RkBOqZeIIkKYB2bMLSHQlVgBi1UALEjQx2nK2ekN9kD9JZyrU3crdkKJZQJ1XXW5te9NhQTr9aFO5ONqLdnFB//uDf/jTu9Y76MrHaVY40Rn4UjKh72FRtW6xDAcBMkwOy3NFRGgVRZB293J3X8mncyhYsQ2H05KJo9Ksnbsjz5vGomvTWwR0xac+3FKyVElpKMYGhy6/+7tN1TBTJsRMLXwrEu9+TzQi8T4gCiSYijrdwWs+lWt79ehaF1TTJo72DYomxB8mk85hgc8mW/FBQk8X2xaNUjxsv+wmphsWxpfnD9z35FAj6lntuaSqIKTPRkPClfSc3KIMwSqyvKGsh1uaPmj0+zUNqPKDaBeUjjj+ipax0L4/9eTi/FQP/dz8zttYekeZea6pCTsa30zPyg9UBgSNnohaz6cKpo6I+JWwI39AXSwMqoidVzgtmbhaB+S31RR09c4gX4CeL7A0Tq1kaSkXx4Vx+R98CvrM46CB7npdf2vVJBRmChj55ONtudhWA/uzLx4+7O8O3A749b7Hhh2UH9ImRKlPyhThqNRev5zN9gElDoxhy5U3Qjn706ZqEqh328Kc9vyBTz12Vb0H/UZ63oYB8k8CqSoa4h+hOm+7IHFqTmKRkg9o7COfYK2ZjWW3+2KjCtIyCqTI9t2X3fVw492g3gCkNhxQ5Tmg1RMhoXhPwCwMSJM58H2b7d3vfA9PrZlZT9AmAGXmpaWxj/28/w1wrpv6iucVkP8N/dUTUTt/TUBfAhcJge/pZs1iG1EQzb1MTWrrDkybOjMXyYsuCKDKY6fVEwlkP85lpxDsiLFie8TcuZj1ZlSL8zKGP/LYBT+GjWR50Ryc76vE/Ow1ATXFYDld1HqTdhj2OzSW91Cl++bOypdscOBDv2gAVY+r4sWpbyAzwQaeBMtO9npJS3dVnp7X8Mpv821bRbCRKmjlvS9KQNUmMKKlPx5QZtnddtcQ2ykrPVu4pIODi1pBta442liKC5k/5zKz19C+dbIYajgx2sqVfKFee9ErqNaJodV+sWD4n3bd/e3chTpx5+tz/z9f12lM5ZJi3gAAAABJRU5ErkJggg==" preserveAspectRatio="none"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 223px; margin-left: 266px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; "> + QEMU + </div> + </div> + </div> + </foreignObject> + <text x="310" y="223" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle" font-weight="bold"> + QEMU + </text> + </switch> + </g> + </g> + <g> + <path d="M 257 100 L 257 61.24" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 257 55.24 L 261 63.24 L 257 61.24 L 253 63.24 Z" fill="#000000" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <path d="M 260 100 L 220 100 Q 210 100 209.67 109.99 L 208.27 151.77" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 208.07 157.77 L 204.34 149.64 L 208.27 151.77 L 212.34 149.9 Z" fill="#000000" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <path d="M 260 100 L 300 100 Q 310 100 310 110 L 310 151.76" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 310 157.76 L 306 149.76 L 310 151.76 L 314 149.76 Z" fill="#000000" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + </g> + <switch> + <g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/> + <a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"> + <text text-anchor="middle" font-size="10px" x="50%" y="100%"> + Text is not SVG - cannot display + </text> + </a> + </switch> +</svg> diff --git a/docs/score_tools/index.rst b/docs/score_tools/index.rst index 2781b1a6624..59e9f1e58eb 100644 --- a/docs/score_tools/index.rst +++ b/docs/score_tools/index.rst @@ -33,3 +33,4 @@ S-CORE Tools Overview gtest bazel rustfmt + itf diff --git a/docs/score_tools/itf.rst b/docs/score_tools/itf.rst new file mode 100644 index 00000000000..aa906f1da93 --- /dev/null +++ b/docs/score_tools/itf.rst @@ -0,0 +1,212 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +.. doc_tool:: ITF + :id: doc_tool__itf + :status: draft + :version: 0.1.0 + :tcl: LOW + :safety_affected: YES + :security_affected: YES + :realizes: wp__tool_verification_report + :tags: tool_management + +ITF (Integration Testing Framework) Verification Report +======================================================= + +Introduction +------------ +Scope and purpose +~~~~~~~~~~~~~~~~~ +ITF is a pytest-based integration testing framework that simplifies writing and +running integration tests. It provides utilities for common integration tasks +— for example, SSH connection setup, interpreting dataframes, parsing +diagnostic messages, etc. ITF can execute tests on emulators (QEMU) as well as on +physical hardware. + +Inputs and outputs +~~~~~~~~~~~~~~~~~~ +| Inputs: Software image (binary), Pytest-based test files (python) +| Outputs: Test report + +.. figure:: _assets/itf.drawio.svg + :width: 100% + :align: center + :alt: ITF overview + + ITF overview + +Available information +~~~~~~~~~~~~~~~~~~~~~ +- Version: 0.1.0 [1]_ +- Repository: https://github.com/eclipse-score/itf +- Example of ITF test in S-CORE ITF repository: https://github.com/eclipse-score/itf/blob/main/examples/examples/itf/test_docker.py + + +Installation and integration +---------------------------- +Installation +~~~~~~~~~~~~ +| To add the ITF Bazel dependency to your project or module, include the following line in your MODULE.bazel file: + +.. code-block:: Python + + bazel_dep(name = "score_itf", version = "0.1.0") + +| And verify that the `.bazelrc` configuration file contains the following directive to register the S-CORE module registry: + +.. code-block:: Python + + common --registry=https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/ + +| The sources of bazel S-CORE ITF module configuration can be found at: https://github.com/eclipse-score/bazel_registry/tree/main/modules/score_itf + + +Integration +~~~~~~~~~~~ +Integrated in bazel. + +Environment +~~~~~~~~~~~ +Running application software instance with configured connection. + +Safety evaluation +----------------- +This section outlines the safety evaluation of ITF for its use within the S-CORE project. + + +.. list-table:: Safety evaluation + :header-rows: 1 + :widths: 1 2 8 2 6 4 2 2 + + * - Malfunction identification + - Use case description + - Malfunctions + - Impact on safety? + - Impact safety measures available? + - Impact safety detection sufficient? + - Further additional safety measure required? + - Confidence (automatic calculation) + * - 1 + - Run tests and generate test report + - | Fails to load input files + | + | ITF fails to load provided file even if file is present and accessible. + - yes + - (implicit) Check ITF test run status + - yes + - no + - high + * - 2 + - Run tests and generate test report + - | Fails to write result to file + | + | ITF was not able to save results in file(s). + - yes + - (implicit) Check ITF test run status + - yes + - no + - high + * - 3 + - Run tests and generate test report + - | Fails to collect results of the test(s) + | + | ITF was not able to collect results of executed test. + - no + - no + - yes + - no + - high + * - 4 + - Run tests and generate test report + - | Fails to detect an existing error + | + | ITF fails to detect the presence of existing errors. + - yes + - no + - no + - yes (qualification) + - low + * - 5 + - Run tests and generate test report + - | Fails to execute the test + | + | ITF fails to execute specific test from the test plan + - no + - no + - yes + - no + - high + * - 6 + - Run tests and generate test report + - | Indicates presence of a non-existing error + | + | ITF indicates the presence of errors that do not exist. + - no + - no + - yes + - no + - high + * - 7 + - Run tests and generate test report + - | Produces wrong test report + | + | ITF fails to save correct test result in test report. + - yes + - Review test report + - yes + - no + - high + +Security evaluation +------------------- +This section outlines the security evaluation of ITF for its use within the S-CORE project. + + +.. list-table:: Security evaluation + :header-rows: 1 + + * - Threat identification + - Use case description + - Threats + - Impact on security? + - Impact security measures available? + - Impact security detection sufficient? + * - 1 + - TBD + - TBD + - TBD + - TBD + - TBD + +Result +~~~~~~ +ITF requires qualification for use in safety-related software development. + + +**Tool Qualification** +------------------------------------------- +Based on method: validation of the software tool. + +Requirements and testing aspects +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Tool requirements are derived from official documentation (currently missing): https://github.com/eclipse-score/itf + +The testing team is responsible for identifying the specific ITF functionality +used in the project. Based on this, requirements for the utilized features must be derived from +the available documentation and ITF validated against defined requirements. + + +.. [1] The tool version mentioned in this document is preliminary. + It is subject to change and will be updated in future. From 3cb936e96d7d093be864800944e591e56edc6473 Mon Sep 17 00:00:00 2001 From: Priyanka Patil <Priyanka.Patil@bti.bmwgroup.com> Date: Mon, 8 Dec 2025 11:19:16 +0530 Subject: [PATCH 031/214] lib/result - Address requirement inspection findings --- .../result/docs/requirements/index.rst | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/docs/modules/baselibs/result/docs/requirements/index.rst b/docs/modules/baselibs/result/docs/requirements/index.rst index 7519d56bb9f..4f457e5f348 100644 --- a/docs/modules/baselibs/result/docs/requirements/index.rst +++ b/docs/modules/baselibs/result/docs/requirements/index.rst @@ -35,7 +35,18 @@ Functional Requirements :status: valid :tags: inspected - The Result library shall provide an error handling mechanism that enables functions to return either successful values or error information without using C++ exceptions. + The Result library shall provide an error handling mechanism that enables functions to return either successful values ("Get Value") or error information ("Get Error") without using C++ exceptions. + +.. comp_req:: Set Result + :id: comp_req__result__set_result + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__result_library + :status: valid + :tags: inspected + + The Result library shall provide a "Set Result" operation that accepts either a successful value of type T or an Error object. .. comp_req:: Domain-Specific Error Information :id: comp_req__result__domain_error_information @@ -68,7 +79,7 @@ Functional Requirements :status: valid :tags: inspected - The Result library shall provide conversion utilities to transform Result objects into standard library optional type, with enforced error handling. + The Result library shall provide conversion utilities to transform Result objects into std::optional<T> types. The conversion shall require explicit handling of error cases before discarding error information, ensuring that errors cannot be silently ignored. Non-Functional Requirements =========================== @@ -118,6 +129,16 @@ Assumptions of Use (AoU) The user shall check and handle both successful and error states of Result objects before accessing contained values to prevent undefined behavior. +.. aou_req:: Error Reaction and Safe State + :id: aou_req__result__error_reaction + :reqtype: Functional + :security: NO + :safety: ASIL_B + :status: valid + :tags: inspected + + The user shall implement error reaction mechanisms that transition the system to a safe state when error conditions are detected in Result objects. + .. aou_req:: Thread Safety :id: aou_req__result__thread_safety :reqtype: Non-Functional @@ -126,7 +147,7 @@ Assumptions of Use (AoU) :status: valid :tags: inspected - The user shall ensure appropriate synchronization mechanisms when using Result objects in multi-threaded environments, as the library provides no internal thread safety guarantees. + The user shall implement external synchronization mechanisms (e.g., mutexes, atomic operations, or locks) when accessing or modifying Result objects from multiple threads concurrently, as the library provides no internal thread safety guarantees. .. aou_req:: Resource Lifetime :id: aou_req__result__resource_lifetime From 3a680a8109b6d5c0cfcb63957389614023e7c40c Mon Sep 17 00:00:00 2001 From: aschemmel-git <alexander.schemmel@bmw.de> Date: Fri, 5 Dec 2025 15:22:01 +0100 Subject: [PATCH 032/214] Safety Managers for Modules --- docs/modules/baselibs/docs/safety_mgt/module_safety_plan.rst | 2 +- .../communication/docs/safety_mgt/module_safety_plan.rst | 2 +- docs/modules/feo/docs/safety_mgt/module_safety_plan.rst | 2 +- docs/modules/persistency/docs/safety_mgt/module_safety_plan.rst | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/modules/baselibs/docs/safety_mgt/module_safety_plan.rst b/docs/modules/baselibs/docs/safety_mgt/module_safety_plan.rst index 248486e9611..b9d3a641bd5 100644 --- a/docs/modules/baselibs/docs/safety_mgt/module_safety_plan.rst +++ b/docs/modules/baselibs/docs/safety_mgt/module_safety_plan.rst @@ -46,7 +46,7 @@ Functional Safety Management Roles - Assignee * - Safety Manager - - tbd + - Alexander Schemmel * - Module Project Manager (= Feature team lead) - Andrey Babanin diff --git a/docs/modules/communication/docs/safety_mgt/module_safety_plan.rst b/docs/modules/communication/docs/safety_mgt/module_safety_plan.rst index 9b10cc8a151..021b3791b4f 100644 --- a/docs/modules/communication/docs/safety_mgt/module_safety_plan.rst +++ b/docs/modules/communication/docs/safety_mgt/module_safety_plan.rst @@ -47,7 +47,7 @@ Functional Safety Management Roles - Assignee * - Safety Manager - - tbd + - Alexander Schemmel * - Module Project Manager (= Feature team lead) - Committers of feature team see `Communication FT <https://github.com/eclipse-score/communication/blob/main/.github/CODEOWNERS>`_ diff --git a/docs/modules/feo/docs/safety_mgt/module_safety_plan.rst b/docs/modules/feo/docs/safety_mgt/module_safety_plan.rst index 975295a038a..a8aad384da5 100644 --- a/docs/modules/feo/docs/safety_mgt/module_safety_plan.rst +++ b/docs/modules/feo/docs/safety_mgt/module_safety_plan.rst @@ -45,7 +45,7 @@ Functional Safety Management Roles - Assignee * - Safety Manager - - tbd + - Markus Schu * - Module Project Manager (= Feature team lead) - Johannes Glamsch diff --git a/docs/modules/persistency/docs/safety_mgt/module_safety_plan.rst b/docs/modules/persistency/docs/safety_mgt/module_safety_plan.rst index 5a71e835839..fb7163b84ed 100644 --- a/docs/modules/persistency/docs/safety_mgt/module_safety_plan.rst +++ b/docs/modules/persistency/docs/safety_mgt/module_safety_plan.rst @@ -44,7 +44,7 @@ Functional Safety Management Roles - Assignee * - Safety Manager - - tbd + - Volker Häussler * - Module Project Manager (= Feature team lead) - Lars Bauhofer From 7899c2bde17cb4d2fea08d34f2e921e242bf2b4a Mon Sep 17 00:00:00 2001 From: aschemmel-git <alexander.schemmel@bmw.de> Date: Mon, 8 Dec 2025 13:11:34 +0100 Subject: [PATCH 033/214] Update safety competence management Resolves: #1304 --- .../safety_management.rst | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/platform_management_plan/safety_management.rst b/docs/platform_management_plan/safety_management.rst index 38a491bdd3c..8f0d3750b35 100644 --- a/docs/platform_management_plan/safety_management.rst +++ b/docs/platform_management_plan/safety_management.rst @@ -185,7 +185,7 @@ The project will be under the Eclipse Foundation and so the `Eclipse Foundation *Project Roles* Roles are defined in every process and in a generic roles section. All those are matched to Eclipse roles. -Project role assignment is done in every feature development Safety Plan. +Project role assignment is documented in dedicated documents. *Critical dependencies* @@ -199,22 +199,22 @@ Organization and management system has not a mature level yet. *Skills* -The main safety related project roles are the project manager and the safety manager and these also have to have the (Eclipse) committer role. +The main safety related project roles are the project manager, the safety manager and the safety engineer, these also have to have the (Eclipse) committer role. As defined in `Committer Training <https://www.eclipse.org/projects/training/>`_ the committers are elected in a meritocratic manner, meaning those have to show their skills and understanding of the project processes in several previous pull requests. -As each project can adopt additional criteria for the committers election, we define the following: +For the :need:`rl__project_lead`, the :need:`rl__safety_manager` and the :need:`rl__safety_engineer` the required skills and experience are described +in these project role definitions. They are also elected in a meritocratic way and this election is documented including the evidences checked to prove the experience. -each committer has to prove his knowledge in functional safety SW development by +Committers in the S-CORE project can work on the development of safety related or non-safety related SW modules. +If they work on safety related modules they have to prove (additionaly to their committer election, which already shows they are skilled developers): -* an absolved training in ISO 26262 (or equivalent standard, at least 16h of SW development specific training by a trusted training provider) OR -* by attending the projects's ISO 26262 SW development training (given by a safety team member) +* two years practice of safety related SW development (or management) relevant for the section content (includes trainings in safety standards like ISO 26262) +* training on the S-CORE processes -Additionally the project repository is organized in "CODEOWNER" sections. These "CODEOWNERS" need to approve any pull request modifying a file in their area before it is merged. +To ensure this, the platform and module repositories folders (and files) are protected by "CODEOWNER" sections. +These "CODEOWNERS" need to approve any pull request modifying a file in their area before it is merged. -In case of safety related "CODEOWNER" sections (e.g. a file containing feature requirements with an ASIL level) the persons having "CODEOWNER" rights need to have: -* One year of professional practice of safety related SW development (or management) relevant for the section content - -The successful checking of committers and CODEOWNERS skills is ensured by the safety manager and documented in the role assignment document. +The successful checking of CODEOWNERS experience is ensured by the safety manager and documented in the role assignment document. One important aspect to this is, that we ensure the identity of the committer by applying the GitHub digital signature mechanism. Functional Safety Resources From ff373f0f70c51e58e1c08b0f30b687350dd1f5bd Mon Sep 17 00:00:00 2001 From: Andreas Zwinkau <95761648+a-zw@users.noreply.github.com> Date: Tue, 9 Dec 2025 09:04:58 +0100 Subject: [PATCH 034/214] Review docs-as-code tool verification report (#2307) --- MODULE.bazel | 2 +- docs/score_tools/doc_as_code.rst | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 0e9b333faaa..cf1fa2e77ce 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -73,5 +73,5 @@ bazel_dep(name = "rules_java", version = "8.15.1") # ############################################################################### bazel_dep(name = "score_tooling", version = "1.0.2") -bazel_dep(name = "score_docs_as_code", version = "2.1.0") +bazel_dep(name = "score_docs_as_code", version = "2.2.0") bazel_dep(name = "score_process", version = "1.3.2") diff --git a/docs/score_tools/doc_as_code.rst b/docs/score_tools/doc_as_code.rst index 028aaf17b95..3c3faa6db37 100644 --- a/docs/score_tools/doc_as_code.rst +++ b/docs/score_tools/doc_as_code.rst @@ -15,7 +15,7 @@ .. doc_tool:: Doc-as-Code :id: doc_tool__doc_as_code :status: evaluated - :version: v1.3.0 + :version: v2.2.0 :tcl: LOW :safety_affected: YES :security_affected: YES @@ -58,7 +58,7 @@ This includes getting started or usage information and integration manual. The capabilities of the tool can be found here: -`Doc-as-Code Project Capabilities <https://eclipse-score.github.io/docs-as-code/main/product/capabilities.html#capabilities>`_ +`Doc-as-Code Project Capabilities <https://eclipse-score.github.io/docs-as-code/main/internals/requirements/capabilities.html>`_ Installation and integration @@ -66,14 +66,15 @@ Installation and integration Tool location: -`Release v0.4.4 <https://github.com/eclipse-score/docs-as-code/tree/v0.4.4>`_ +`Release v2.2.0 <https://github.com/eclipse-score/docs-as-code/tree/v2.2.0>`_ How to integrate: -`Doc-as-Code Integration <https://eclipse-score.github.io/docs-as-code/main/how-to-integrate/index.html>`_ +`Doc-as-Code Setup <https://eclipse-score.github.io/docs-as-code/main/how-to/setup.html>`_ -Environment: github, python, Version 3.y.z, sphinx, Version x.y.z, sphinx-needs, Version x.y.z -Supported platforms: Windows, Linux +Environment: Bazel + +Supported platforms: Linux Evaluation @@ -158,14 +159,14 @@ Requirements and testing aspects -------------------------------- Tool requirements are defined here: -`Doc-as-Code Requirements <https://eclipse-score.github.io/docs-as-code/main/product/requirements.html#requirements>`_ +`Doc-as-Code Requirements <https://eclipse-score.github.io/docs-as-code/main/internals/requirements/requirements.html>`_ Test cases and tests are defined here: -`Doc-as-Code Test cases and tests <https://github.com/eclipse-score/docs-as-code/tree/v0.4.2/src/extensions>`_ +`Doc-as-Code Test cases and tests <https://github.com/eclipse-score/docs-as-code/tree/v2.2.0/src/extensions>`_ The tests are part of the rules checker code sections. Requirements coverage is documented here: -`Doc-as-Code Requirements <https://eclipse-score.github.io/docs-as-code/main/product/requirements.html#requirements>`_ +`Doc-as-Code Requirements <https://eclipse-score.github.io/docs-as-code/main/internals/requirements/requirements.html>`_ From 92d5dd35daeb30877fd5c98810ed2bcfaafc83c7 Mon Sep 17 00:00:00 2001 From: aschemmel-git <alexander.schemmel@bmw.de> Date: Tue, 9 Dec 2025 08:46:08 +0100 Subject: [PATCH 035/214] Join WP lists safety security mgt Resolves: #1304 --- .../ipc/docs/safety_planning/index.rst | 11 +- .../safety_management.rst | 186 ++++++++---------- .../security_management.rst | 147 ++------------ 3 files changed, 107 insertions(+), 237 deletions(-) diff --git a/docs/features/communication/ipc/docs/safety_planning/index.rst b/docs/features/communication/ipc/docs/safety_planning/index.rst index 8f38b0ab198..a2f02db89eb 100644 --- a/docs/features/communication/ipc/docs/safety_planning/index.rst +++ b/docs/features/communication/ipc/docs/safety_planning/index.rst @@ -14,8 +14,15 @@ .. _safety_planning_ipc: -Safety Planning -############### +Feature Safety Planning +####################### + +.. document:: Communication IPC Safety WPs + :id: doc__com_ipc_safety_wp + :status: draft + :safety: ASIL_B + :security: YES + :realizes: wp__platform_safety_plan Tailoring ========= diff --git a/docs/platform_management_plan/safety_management.rst b/docs/platform_management_plan/safety_management.rst index 8f0d3750b35..788d61af019 100644 --- a/docs/platform_management_plan/safety_management.rst +++ b/docs/platform_management_plan/safety_management.rst @@ -318,190 +318,164 @@ The platform management plan defines :doc:`quality_management` Platform Safety Plan ++++++++++++++++++++ -Functional Safety Management SW Platform Work Products -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. _sw_platform_wp_list: + +Functional Safety/Security Management SW Platform Work Products +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. list-table:: SW Platform work products :header-rows: 1 * - work product Id - - Link to process - Process status - - Link to issue - Link to WP - WP status * - :need:`wp__policies` - n/a (comes from outside the project) - - n/a - - n/a - `Eclipse Foundation Project Handbook: <https://www.eclipse.org/projects/handbook/>`_ - RELEASED - * - :need:`wp__training_path` - - n/a - - n/a - - n/a - - not open sourced - - to be shown to assessor - * - :need:`wp__qms_plan` - - :need:`wf__platform_cr_mt_platform_mgmt_plan` - - :ndf:`copy('status', need_id='wf__platform_cr_mt_platform_mgmt_plan')` - - `#316 <https://github.com/eclipse-score/score/issues/316>`_ - - :doc:`quality_management` - - not started + - :ndf:`copy('status', need_id='wf__cr_mt_qlm_plan')` + - :need:`doc__platform_quality_plan` + - :ndf:`copy('status', need_id='doc__platform_quality_plan')` * - :need:`wp__issue_track_system` - - :doc:`index` - - :ndf:`copy('status', need_id='doc__platform_mgt_plan')` - - n/a + - :ndf:`copy('status', need_id='wf__platform_mr_im_platform_mgmt_plan')` - `Project issues <https://github.com/eclipse-score/score/issues>`_ - established * - :need:`wp__platform_mgmt` - - :need:`wf__platform_cr_mt_platform_mgmt_plan` - :ndf:`copy('status', need_id='wf__platform_cr_mt_platform_mgmt_plan')` - - `#540 <https://github.com/eclipse-score/score/issues/540>`_ - :doc:`index` - :ndf:`copy('status', need_id='doc__platform_mgt_plan')` * - :need:`wp__process_description` - - :need:`wf__def_app_process_description` - :ndf:`copy('status', need_id='wf__def_app_process_description')` - - `Process community issues <https://github.com/orgs/eclipse-score/projects/7>`_ - `Process description <https://eclipse-score.github.io/process_description/main/index.html>`_ - - <automated> + - Maturity Level 1 * - :need:`wp__process_impr_report` - - :need:`wf__mon_imp_process_description` - :ndf:`copy('status', need_id='wf__mon_imp_process_description')` - - <Link to issue> - - <Link to WP> - - <automated> + - `Process issues <https://github.com/eclipse-score/process_description/issues>`_ + - see issues * - :need:`wp__process_strategy` - - :need:`wf__cr_mt_process_mgt_strategy` - :ndf:`copy('status', need_id='wf__cr_mt_process_mgt_strategy')` - - `#232 <https://github.com/eclipse-score/score/issues/232>`_ - - `Process community issues <https://github.com/orgs/eclipse-score/projects/7>`_ + - `Process community planning <https://github.com/orgs/eclipse-score/projects/21>`_ + - see planning board + + * - :need:`wp__platform_sw_build_config` + - <Process status> + - <Link to WP> + - <automated> + + * - :need:`wp__platform_sw_release_note` + - :ndf:`copy('status', need_id='wf__rel_platform_rel_note')` + - :need:`doc__score_v05_alpha_release_note` + - :ndf:`copy('status', need_id='doc__score_v05_alpha_release_note')` + + * - :need:`wp__verification_platform_ver_report` + - :ndf:`copy('status', need_id='wf__verification_platform_ver_report')` + - <Link to WP> + - <automated> + + * - :need:`wp__requirements_stkh` + - :ndf:`copy('status', need_id='wf__req_stkh_req')` + - :ref:`stakeholder_requirements` - <automated> + * - :need:`wp__sw_development_plan` + - :ndf:`copy('status', need_id='wf__sw_development_plan')` + - :need:`doc__software_development_plan` + - :ndf:`copy('status', need_id='doc__software_development_plan')` + + * - :need:`wp__verification_plan` + - :ndf:`copy('status', need_id='wf__verification_plan')` + - :need:`doc__verification_plan` + - :ndf:`copy('status', need_id='doc__verification_plan')` + + * - :need:`wp__tool_verification_report` + - :ndf:`copy('status', need_id='wf__tool_create_tool_verification_report')` + - :ref:`tools` + - see WP link + + +Functional Safety Specific SW Platform Work Products +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. list-table:: SW Platform safety work products + :header-rows: 1 + + * - work product Id + - Process status + - Link to WP + - WP status + * - :need:`wp__platform_safety_plan` - - :need:`gd_guidl__saf_plan_definitions` - - :ndf:`copy('status', need_id='gd_guidl__saf_plan_definitions')` - - `#381 <https://github.com/eclipse-score/score/issues/381>`_ + - :ndf:`copy('status', need_id='wf__cr_mt_safety_plan')` - this document - see above * - :need:`wp__platform_safety_package` - - :need:`gd_guidl__saf_package` - - :ndf:`copy('status', need_id='gd_guidl__saf_package')` - - <Link to issue> + - :ndf:`copy('status', need_id='wf__cr_mt_safety_package')` - <Link to WP> - <automated> * - :need:`wp__fdr_reports` (platform Safety Plan) - - :need:`gd_chklst__safety_plan` - - :ndf:`copy('status', need_id='gd_chklst__safety_plan')` - - <Link to issue> + - :ndf:`copy('status', need_id='wf__p_formal_rv')` - <Link to WP> - <automated> * - :need:`wp__fdr_reports` (platform Safety Package) - - :need:`gd_chklst__safety_package` - - :ndf:`copy('status', need_id='gd_chklst__safety_package')` - - <Link to issue> + - :ndf:`copy('status', need_id='wf__p_formal_rv')` - <Link to WP> - <automated> * - :need:`wp__fdr_reports` (feature's Safety Analyses & DFA) - - Safety Analysis FDR tbd - - <automated> - - <Link to issue> + - <Process status> - <Link to WP> - <automated> * - :need:`wp__audit_report` - performed by external experts - - n/a - - `#470 <https://github.com/eclipse-score/score/issues/470>`_ - <Link to WP> - intermediate * - :need:`wp__feature_dfa` - - <Link to process> - <Process status> - - <Link to issue> - - <Link to WP> - - <automated> - - * - :need:`wp__platform_sw_build_config` - - :need:`doc__software_development_plan` - - :ndf:`copy('status', need_id='doc__software_development_plan')` - - <Link to issue> - <Link to WP> - <automated> * - :need:`wp__platform_safety_manual` - - :need:`gd_temp__safety_manual` - - :ndf:`copy('status', need_id='gd_temp__safety_manual')` - - <Link to issue> + - :ndf:`copy('status', need_id='wf__cr_mt_safety_manual')` - <Link to WP> - <automated> - * - :need:`wp__platform_sw_release_note` - - :need:`gd_temp__rel_plat_rel_note` - - :ndf:`copy('status', need_id='gd_temp__rel_plat_rel_note')` - - <Link to issue> - - <Link to WP> - - <automated> + * - :need:`wp__tailoring` (generic) + - :ndf:`copy('status', need_id='wf__def_app_process_description')` + - :need:`wp__tailoring_work_products` & :need:`doc__platform_safety_plan` + - valid - * - :need:`wp__verification_platform_ver_report` - - :need:`gd_temp__mod_ver_report` - - :ndf:`copy('status', need_id='gd_temp__mod_ver_report')` - - <Link to issue> - - <Link to WP> - - <automated> +Process status: Status of the workflow which "outputs" the work product, derived from the docs it "has" and guidances it "contains". - * - :need:`wp__requirements_stkh` - - :need:`gd_temp__req_stkh_req` - - :ndf:`copy('status', need_id='gd_temp__req_stkh_req')` - - n/a (done already) - - :ref:`stakeholder_requirements` - - <automated> - * - :need:`wp__sw_development_plan` - - :need:`wf__platform_cr_mt_platform_mgmt_plan` - - :ndf:`copy('status', need_id='wf__platform_cr_mt_platform_mgmt_plan')` - - `#583 <https://github.com/eclipse-score/score/issues/583>`_ - - :need:`doc__software_development_plan` - - :ndf:`copy('status', need_id='doc__software_development_plan')` +Platform Management Plan - Feature Work Product Lists +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - * - :need:`wp__verification_plan` - - :need:`wf__platform_cr_mt_platform_mgmt_plan` - - :ndf:`copy('status', need_id='wf__platform_cr_mt_platform_mgmt_plan')` - - `#611 <https://github.com/eclipse-score/score/issues/611>`_ - - :need:`doc__verification_plan` - - :ndf:`copy('status', need_id='doc__verification_plan')` +:need:`doc__baselibs_safety_wp` - * - :need:`wp__tool_verification_report` - - :need:`doc__platform_tool_management_plan` - - :ndf:`copy('status', need_id='doc__platform_tool_management_plan')` - - <Link to issue> - - <Link to WP> - - <automated> +:need:`doc__com_ipc_safety_wp` - * - :need:`wp__tailoring` (generic) - - :need:`gd_guidl__saf_plan_definitions` - - :ndf:`copy('status', need_id='gd_guidl__saf_plan_definitions')` - - `#307 <https://github.com/eclipse-score/score/issues/307>`_ - - :need:`std_req__iso26262__management_5421` & :need:`doc__platform_safety_plan` - - valid +:need:`doc__feo_safety_wp` + +:need:`doc__orchestration_safety_wp` + +:need:`doc__persistency_safety_wp` +Note: list of features according to :ref:`releases` -Note: list of features for v0.5 according to `S-CORE Roadmap <https://github.com/orgs/eclipse-score/projects/17>`_ -and :ref:`releases` Platform Management Plan - Documents Status Chart ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/platform_management_plan/security_management.rst b/docs/platform_management_plan/security_management.rst index b3956dace61..8757b989d76 100644 --- a/docs/platform_management_plan/security_management.rst +++ b/docs/platform_management_plan/security_management.rst @@ -257,177 +257,66 @@ Platform Security Plan Security Management SW Platform Work Products ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. list-table:: SW Platform work products +For the generic ones see :ref:`sw_platform_wp_list` + +Functional Safety Specific SW Platform Work Products +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. list-table:: SW Platform security work products :header-rows: 1 * - work product Id - - Link to process - Process status - - Link to issue - Link to WP - WP status - * - :need:`wp__training_path` - - n/a - - n/a - - n/a - - not open sourced - - to be shown to assessor - - * - :need:`wp__platform_mgmt` - - :need:`wf__platform_cr_mt_platform_mgmt_plan` - - :ndf:`copy('status', need_id='wf__platform_cr_mt_platform_mgmt_plan')` - - `#540 <https://github.com/eclipse-score/score/issues/540>`_ - - :doc:`index` - - :ndf:`copy('status', need_id='doc__platform_mgt_plan')` - - * - :need:`wp__qms_plan` - - :need:`wf__platform_cr_mt_platform_mgmt_plan` - - :ndf:`copy('status', need_id='wf__platform_cr_mt_platform_mgmt_plan')` - - `#316 <https://github.com/eclipse-score/score/issues/316>`_ - - :doc:`quality_management` - - not started - * - :need:`wp__platform_security_plan` - - :need:`gd_guidl__security_plan_definitions` - - :ndf:`copy('status', need_id='gd_guidl__security_plan_definitions')` - - `#TBD <https://github.com/eclipse-score/score/issues/381>`_ + - :ndf:`copy('status', need_id='wf__cr_mt_security_plan')` - this document - see above * - :need:`wp__platform_security_package` - - :need:`gd_guidl__security_package` - - :ndf:`copy('status', need_id='gd_guidl__security_package')` - - <Link to issue> + - :ndf:`copy('status', need_id='wf__cr_mt_security_package')` - <Link to WP> - <automated> - * - :need:`wp__issue_track_system` - - :doc:`index` - - :ndf:`copy('status', need_id='doc__platform_mgt_plan')` - - n/a - - `Project issues <https://github.com/eclipse-score/score/issues>`_ - - established - - * - :need:`wp__process_description` - - :need:`wf__def_app_process_description` - - :ndf:`copy('status', need_id='wf__def_app_process_description')` - - `Process community issues <https://github.com/orgs/eclipse-score/projects/7>`_ - - `REPLACE_process_description` - - <automated> - - * - :need:`wp__process_impr_report` - - :need:`wf__mon_imp_process_description` - - :ndf:`copy('status', need_id='wf__mon_imp_process_description')` - - <Link to issue> - - <Link to WP> - - <automated> - - * - :need:`wp__process_strategy` - - :need:`wf__cr_mt_process_mgt_strategy` - - :ndf:`copy('status', need_id='wf__cr_mt_process_mgt_strategy')` - - `#232 <https://github.com/eclipse-score/score/issues/232>`_ - - `Process community issues <https://github.com/orgs/eclipse-score/projects/7>`_ - - <automated> - * - :need:`wp__fdr_reports_security` (platform Security Plan) - - :need:`gd_chklst__security_plan` - - :ndf:`copy('status', need_id='gd_chklst__security_plan')` - - <Link to issue> + - :ndf:`copy('status', need_id='wf__p_formal_security_rv')` - <Link to WP> - <automated> * - :need:`wp__fdr_reports_security` (platform Security Package) - - :need:`gd_chklst__security_package` - - :ndf:`copy('status', need_id='gd_chklst__security_package')` - - <Link to issue> + - :ndf:`copy('status', need_id='wf__p_formal_security_rv')` - <Link to WP> - <automated> * - :need:`wp__fdr_reports_security` (feature's Security Analyses) - - Security Analysis FDR tbd - - <automated> - - <Link to issue> + - <Process Status> - <Link to WP> - <automated> * - :need:`wp__audit_report_security` - performed by external experts - n/a - - `#TBD1 <https://github.com/eclipse-score/score/issues/470>`_ - - <Link to WP> - currently tailored out - * - :need:`wp__platform_sw_build_config` - - :need:`doc__software_development_plan` - - :ndf:`copy('status', need_id='doc__software_development_plan')` - - <Link to issue> - - <Link to WP> - - <automated> - * - :need:`wp__platform_security_manual` - - :need:`gd_temp__security_manual` - - :ndf:`copy('status', need_id='gd_temp__security_manual')` - - <Link to issue> - - <Link to WP> - - <automated> - - * - :need:`wp__platform_sw_release_note` - - :doc:`release_management` - - not started - - <Link to issue> - - <Link to WP> - - <automated> - - * - :need:`wp__verification_platform_ver_report` - - :need:`gd_temp__mod_ver_report` - - :ndf:`copy('status', need_id='gd_temp__mod_ver_report')` - - <Link to issue> - - <Link to WP> - - <automated> - - * - :need:`wp__requirements_stkh` - - :need:`gd_temp__req_stkh_req` - - :ndf:`copy('status', need_id='gd_temp__req_stkh_req')` - - n/a (done already) - - :ref:`stakeholder_requirements` - - <automated> - - * - :need:`wp__sw_development_plan` - - :need:`wf__platform_cr_mt_platform_mgmt_plan` - - :ndf:`copy('status', need_id='wf__platform_cr_mt_platform_mgmt_plan')` - - <Link to issue> - - :doc:`software_development` - - not started - - * - :need:`wp__verification_plan` - - :need:`wf__platform_cr_mt_platform_mgmt_plan` - - :ndf:`copy('status', need_id='wf__platform_cr_mt_platform_mgmt_plan')` - - <Link to issue> - - :doc:`software_verification` - - not started - - * - :need:`wp__tool_verification_report` - - :doc:`tool_management` - - not started - - <Link to issue> + - :ndf:`copy('status', need_id='wf__cr_mt_security_manual')` - <Link to WP> - <automated> * - :need:`wp__tailoring` (generic) - - :need:`gd_guidl__security_plan_definitions` - - :ndf:`copy('status', need_id='gd_guidl__security_plan_definitions')` - - `#TBD2 <https://github.com/eclipse-score/score/issues/307>`_ - - `REPLACEstandard_iso26262` & :need:`doc__platform_safety_plan` - - valid + - :ndf:`copy('status', need_id='wf__def_app_process_description')` + - :need:`doc__platform_security_plan` + - :ndf:`copy('status', need_id='doc__platform_security_plan')` * - :need:`wp__sw_platform_sbom` - - :need:`wf__cr_mt_security_sbom` - - not started - - <Link to issue> + - :ndf:`copy('status', need_id='wf__cr_mt_security_sbom')` - <Link to WP> - <automated> +Process status: Status of the workflow which "outputs" the work product, derived from the docs it "has" and guidances it "contains". + Security Management Feature Specific Work Products ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From 22f1921e14d247e713c83866c724ba62e999e31a Mon Sep 17 00:00:00 2001 From: rahulthakre <rahul.thakre@bti.bmwgroup.com> Date: Mon, 8 Dec 2025 15:44:11 +0530 Subject: [PATCH 036/214] lib/result: Requirement inspection for REQ_08_01 --- .../result/docs/requirements/chklst_req_inspection.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/modules/baselibs/result/docs/requirements/chklst_req_inspection.rst b/docs/modules/baselibs/result/docs/requirements/chklst_req_inspection.rst index b98ed33512f..a3ef1c1feb2 100644 --- a/docs/modules/baselibs/result/docs/requirements/chklst_req_inspection.rst +++ b/docs/modules/baselibs/result/docs/requirements/chklst_req_inspection.rst @@ -129,9 +129,9 @@ Requirement Inspection Checklist * - REQ_08_01 - Is the requirement *verifiable*? - If at the time of the inspection already tests are created for the requirement, the answer is yes. This can be checked via traces, but also :need:`gd_req__req_attr_test_covered` shows this. In case the requirement is not sufficiently traced to test cases already, a test expert is invited to the inspection to give his opinion whether the requirement is formulated in a way that supports test development and the available test infrastructure is sufficient to perform the test. - - TBD - - - - + - YES + - all requirements have test cases implemented + - none * - REQ_09_01 - For stakeholder requirements: Do those cover assumed safety mechanisms needed by the hardware and system? - Note that stakeholder requirements covering safety mechanisms come from rationales, whereas feature/component requirements are covering safety mechanisms coming from :need:`gd_chklst__safety_analysis` From 3c88988b28dd6202cce022daa940848b7fb62be1 Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Tue, 9 Dec 2025 11:24:32 +0100 Subject: [PATCH 037/214] initial version election --- docs/platform_management_plan/index.rst | 1 + .../platform_safety_engineer.rst | 80 +++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 docs/platform_management_plan/role_assignment/platform_safety_engineer.rst diff --git a/docs/platform_management_plan/index.rst b/docs/platform_management_plan/index.rst index ca2149dcbcc..fcd68149ebe 100644 --- a/docs/platform_management_plan/index.rst +++ b/docs/platform_management_plan/index.rst @@ -46,4 +46,5 @@ Platform Management Plan :titlesonly: :caption: Role Assignments + role_assignment/platform_safety_engineer role_assignment/platform_safety_manager diff --git a/docs/platform_management_plan/role_assignment/platform_safety_engineer.rst b/docs/platform_management_plan/role_assignment/platform_safety_engineer.rst new file mode 100644 index 00000000000..3c7368c5328 --- /dev/null +++ b/docs/platform_management_plan/role_assignment/platform_safety_engineer.rst @@ -0,0 +1,80 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +Platform Safety Engineer Election +********************************* + +.. document:: Platform Safety Engineer + :id: doc__platform_safety_engineer + :status: valid + :safety: ASIL_B + :security: YES + :realizes: wp__platform_safety_plan + +Elected Committer(s) +==================== + +For the platform safety management a pool of safety engineers is elected due to complexity of the task: + +`Volker Häussler <https://github.com/PandaeDo>`_ + +Election Reasoning +================== + +For the role :need:`rl__safety_engineer` the required skills, knowledge and experience is defined in :need:`rl__safety_engineer`. + +The evidences are not published openly due to personal data confidentiality, but will be checked in a dedicated review meeting +and confirmed by the first reviewer of this document's pull requests. + +Evidences Volker Häussler +------------------------- + +`LinkedIn Profile <https://www.linkedin.com/in/volker-h%C3%A4ussler-58a840111/details/experience/>`_ + +Safety Management Experience: + +- Project Safety Manager for ESP development at Tier1 from 2010 to 2011 +- Project Lead Functional Safety at OEM from 2013 to 2015 +- Teamlead / Safety Manager at Engineering Service Provider from 2015 to 2018 +- Department Head / Competence Manager Functional Safety & Cyber Security at Engineering Service Provider from 2018 to 2025 +- Compliance Manager / Safety Manager at Tier1 from 2025 to now + +Safety Engineer Experience: + +- Safety Engineer for ESP development at Tier1 from 2007 to 2010 +- Lead Safety Engineer at OEM from 2012 to 2013 + +Education and Skills: + +- Dipl.-Ing. (FH) Electrical Engineering - certificate +- Safety related development at system, software and hardware level > 10 years - letters of recommendation from employers +- Safety trainings by TÜV SÜD (ISO 26262 and IEC 61508) + + +Election +======== + +For the election the following Committers already elected as safety managers are asked: + +Elected safety manager: + +- `<https://github.com/aschemmel-tech>`_ + +For the election further Committers with similar skills are asked for approval: + +- `<https://github.com/masc2023>`_ + +The election is performed by approving the pull request of this document. +The nominee is elected if more than half of the above committers in the list approved and nobody "request changes". +Nominees are not allowed to vote for themselves. From 9ee5c2f98757e1e5c6807e425920c0fdf9550646 Mon Sep 17 00:00:00 2001 From: aschemmel-git <alexander.schemmel@bmw.de> Date: Tue, 9 Dec 2025 13:05:13 +0100 Subject: [PATCH 038/214] Join WP lists safety security mgt -fix Resolves: #1304 --- docs/platform_management_plan/security_management.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/platform_management_plan/security_management.rst b/docs/platform_management_plan/security_management.rst index 8757b989d76..191dd1f06e8 100644 --- a/docs/platform_management_plan/security_management.rst +++ b/docs/platform_management_plan/security_management.rst @@ -254,13 +254,13 @@ The platform management plan defines :doc:`quality_management` Platform Security Plan ++++++++++++++++++++++ -Security Management SW Platform Work Products -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Functional Safety/Security Management SW Platform Work Products +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -For the generic ones see :ref:`sw_platform_wp_list` +see :ref:`sw_platform_wp_list` -Functional Safety Specific SW Platform Work Products -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Security Specific SW Platform Work Products +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. list-table:: SW Platform security work products :header-rows: 1 From 85e4132155fda80d6e1af7963312e67e544d31b0 Mon Sep 17 00:00:00 2001 From: "markus.schu" <markus.schu@accenture.com> Date: Tue, 9 Dec 2025 14:47:28 +0100 Subject: [PATCH 039/214] update platform safety engineer election --- .../role_assignment/platform_safety_engineer.rst | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/platform_management_plan/role_assignment/platform_safety_engineer.rst b/docs/platform_management_plan/role_assignment/platform_safety_engineer.rst index 3c7368c5328..acc8f707db4 100644 --- a/docs/platform_management_plan/role_assignment/platform_safety_engineer.rst +++ b/docs/platform_management_plan/role_assignment/platform_safety_engineer.rst @@ -29,6 +29,8 @@ For the platform safety management a pool of safety engineers is elected due to `Volker Häussler <https://github.com/PandaeDo>`_ +`Markus Schu <https://github.com/masc2023>`_ + Election Reasoning ================== @@ -62,6 +64,12 @@ Education and Skills: - Safety trainings by TÜV SÜD (ISO 26262 and IEC 61508) +Evidences Markus Schu +--------------------- + +See :need:`doc__platform_safety_manager` for evidences of Markus Schu. + + Election ======== @@ -71,9 +79,11 @@ Elected safety manager: - `<https://github.com/aschemmel-tech>`_ -For the election further Committers with similar skills are asked for approval: +For the election the following Committers already elected as safety engineers are asked: + +Elected safety engineer: -- `<https://github.com/masc2023>`_ +- `<https://github.com/PandaeDo>`_ The election is performed by approving the pull request of this document. The nominee is elected if more than half of the above committers in the list approved and nobody "request changes". From a517a069565aa1c417f4960e04693923bb0bcbe5 Mon Sep 17 00:00:00 2001 From: aschemmel-git <alexander.schemmel@bmw.de> Date: Tue, 9 Dec 2025 15:07:34 +0100 Subject: [PATCH 040/214] Feature Safety WP List status updates Resolves: #1304 --- .../baselibs/docs/requirements/index.rst | 3 + .../baselibs/docs/safety_planning/index.rst | 42 ++--- .../ipc/docs/safety_planning/index.rst | 39 ++--- .../frameworks/feo/requirements/aou_req.rst | 2 +- .../frameworks/feo/safety_planning/index.rst | 40 ++--- .../architecture/chklst_arc_inspection.rst | 155 ++++++++++++++++++ .../persistency/kvs/architecture/index.rst | 3 + docs/features/persistency/kvs/index.rst | 3 +- .../persistency/kvs/safety_planning/index.rst | 36 +--- .../documentation_management.rst | 101 +++++------- 10 files changed, 260 insertions(+), 164 deletions(-) create mode 100644 docs/features/persistency/kvs/architecture/chklst_arc_inspection.rst diff --git a/docs/features/baselibs/docs/requirements/index.rst b/docs/features/baselibs/docs/requirements/index.rst index 0453e2cf969..82346371f94 100644 --- a/docs/features/baselibs/docs/requirements/index.rst +++ b/docs/features/baselibs/docs/requirements/index.rst @@ -131,3 +131,6 @@ Requirements :status: valid The base libraries shall provide a filesystem library with file and directory manipulation functionality. + +.. needextend:: "__baselibs" in id + :+tags: baselibs diff --git a/docs/features/baselibs/docs/safety_planning/index.rst b/docs/features/baselibs/docs/safety_planning/index.rst index e5d7544e30c..0d902b68b85 100644 --- a/docs/features/baselibs/docs/safety_planning/index.rst +++ b/docs/features/baselibs/docs/safety_planning/index.rst @@ -13,8 +13,8 @@ # ******************************************************************************* -Feature Safety Planning -======================= +Feature Safety Work Products List +================================= .. document:: Baselibs Safety WPs :id: doc__baselibs_safety_wp @@ -30,74 +30,66 @@ Feature Safety Planning * - Work product Id - Link to process - Process status - - Link to issue - Link to WP - - WP/doc status * - :need:`wp__feat_request` - :need:`gd_temp__change_feature_request` - :ndf:`copy('status', need_id='gd_temp__change_feature_request')` - - `#549 <https://github.com/eclipse-score/score/issues/549>`_ - :need:`doc__baselibs` - - :ndf:`copy('status', need_id='doc__baselibs')` * - :need:`wp__requirements_feat` - :need:`gd_temp__req_feat_req` - :ndf:`copy('status', need_id='gd_temp__req_feat_req')` - - `#549 <https://github.com/eclipse-score/score/issues/549>`_ - :need:`doc__baselibs_requirements` - - doc :ndf:`copy('status', need_id='doc__baselibs_requirements')` & WP below * - :need:`wp__requirements_feat_aou` - :need:`gd_temp__req_aou_req` - :ndf:`copy('status', need_id='gd_temp__req_aou_req')` - - <link to issue> - :need:`doc__baselibs_requirements` - - doc :ndf:`copy('status', need_id='doc__baselibs_requirements')` & WP below * - :need:`wp__feature_arch` - :need:`gd_temp__arch_feature` - :ndf:`copy('status', need_id='gd_temp__arch_feature')` - - `#1240 <https://github.com/eclipse-score/score/issues/1240>`_ - :need:`doc__baselibs_architecture` - - doc :ndf:`copy('status', need_id='doc__baselibs_architecture')` & WP below * - :need:`wp__feature_fmea` - :need:`gd_temp__feat_saf_fmea` - :ndf:`copy('status', need_id='gd_temp__feat_saf_fmea')` - - <link to issue> - :need:`doc__baselibs_fmea` - - doc :ndf:`copy('status', need_id='doc__baselibs_fmea')` & WP below * - :need:`wp__feature_dfa` - :need:`gd_temp__feat_saf_dfa` - :ndf:`copy('status', need_id='gd_temp__feat_saf_dfa')` - - <Link to issue> - :need:`doc__baselibs_dfa` - - doc :ndf:`copy('status', need_id='doc__baselibs_dfa')` & WP below * - :need:`wp__requirements_inspect` - :need:`gd_chklst__req_inspection` - :ndf:`copy('status', need_id='gd_chklst__req_inspection')` - - <link to issue> - - <Link to WP> - - <automated> + - :need:`doc__baselibs_req_inspection` * - :need:`wp__sw_arch_verification` - :need:`gd_chklst__arch_inspection_checklist` - :ndf:`copy('status', need_id='gd_chklst__arch_inspection_checklist')` - - <link to issue> - - <Link to WP> - - <automated> + - :need:`doc__baselibs_arc_inspection` * - :need:`wp__verification_feat_int_test` - :need:`gd_guidl__verification_guide` - :ndf:`copy('status', need_id='gd_guidl__verification_guide')` - - <link to issue> - <Link to WP> - - <automated> +Feature Safety Package +====================== + +To create the safety package (according to :need:`gd_guidl__saf_package`) the following +documents and work products status have to go to "valid" (after the relevant verification were performed). +Feature Documents Status +------------------------ + +For all the work product documents the status can be seen by following the "Link to WP". +A summary of the status is also documented in the project's documentation management plan. + +See :ref:`documents_docs_features_baselibs` Feature Requirements Status --------------------------- @@ -127,7 +119,7 @@ Feature Architecture Status --------------------------- .. needtable:: - :filter: docname is not None and "baselibs" in docname and "requirements" in docname + :filter: docname is not None and "baselibs" in docname and "architecture" in docname :style: table :types: feat_arc_sta; feat_arc_dyn :tags: baselibs diff --git a/docs/features/communication/ipc/docs/safety_planning/index.rst b/docs/features/communication/ipc/docs/safety_planning/index.rst index a2f02db89eb..3dd5c285973 100644 --- a/docs/features/communication/ipc/docs/safety_planning/index.rst +++ b/docs/features/communication/ipc/docs/safety_planning/index.rst @@ -14,8 +14,8 @@ .. _safety_planning_ipc: -Feature Safety Planning -####################### +Feature Safety Work Products List +################################# .. document:: Communication IPC Safety WPs :id: doc__com_ipc_safety_wp @@ -24,6 +24,7 @@ Feature Safety Planning :security: YES :realizes: wp__platform_safety_plan + Tailoring ========= @@ -44,72 +45,66 @@ Inter-process Communication Safety Work Products * - Workproduct Id - Link to process - Process status - - Link to issue - Link to WP - - WP status * - :need:`wp__feat_request` - :need:`gd_temp__change_feature_request` - :ndf:`copy('status', need_id='gd_temp__change_feature_request')` - - `#69 <https://github.com/eclipse-score/score/issues/69>`_ - :need:`doc__com_ipc` - - :ndf:`copy('status', need_id='doc__com_ipc')` * - :need:`wp__requirements_feat` - :need:`gd_temp__req_feat_req` - :ndf:`copy('status', need_id='gd_temp__req_feat_req')` - - `#69 <https://github.com/eclipse-score/score/issues/69>`_ - :need:`doc__ipc_requirements`, :need:`doc__communication_requirements` - - :ndf:`copy('status', need_id='doc__ipc_requirements')`, :ndf:`copy('status', need_id='doc__communication_requirements')` * - :need:`wp__requirements_feat_aou` - :need:`gd_temp__req_aou_req` - :ndf:`copy('status', need_id='gd_temp__req_aou_req')` - - <link to issue> - :need:`doc__ipc_requirements`, :need:`doc__communication_requirements` - - :ndf:`copy('status', need_id='doc__ipc_requirements')`, :ndf:`copy('status', need_id='doc__communication_requirements')` * - :need:`wp__feature_arch` - :need:`gd_temp__arch_feature` - :ndf:`copy('status', need_id='gd_temp__arch_feature')` - - `#388 <https://github.com/eclipse-score/score/issues/388>`_ - :need:`doc__ipc_architecture` - - :ndf:`copy('status', need_id='doc__ipc_architecture')` * - :need:`wp__feature_fmea` - :need:`gd_temp__feat_saf_fmea` - :ndf:`copy('status', need_id='gd_temp__feat_saf_fmea')` - - <link to issue> - :need:`doc__ipc_fmea` - - :ndf:`copy('status', need_id='doc__ipc_fmea')` * - :need:`wp__feature_dfa` - :need:`gd_temp__feat_saf_dfa` - :ndf:`copy('status', need_id='gd_temp__feat_saf_dfa')` - - <link to issue> - :need:`doc__ipc_dfa` - - :ndf:`copy('status', need_id='doc__ipc_dfa')` * - :need:`wp__requirements_inspect` - :need:`gd_chklst__req_inspection` - :ndf:`copy('status', need_id='gd_chklst__req_inspection')` - tailored - - n/a - - n/a * - :need:`wp__sw_arch_verification` - :need:`gd_chklst__arch_inspection_checklist` - :ndf:`copy('status', need_id='gd_chklst__arch_inspection_checklist')` - tailored - - n/a - - n/a * - :need:`wp__verification_feat_int_test` - :need:`gd_guidl__verification_guide` - :ndf:`copy('status', need_id='gd_guidl__verification_guide')` - - <link to issue> - <Link to WP> - - <automated> + +Feature Safety Package +====================== + +To create the safety package (according to :need:`gd_guidl__saf_package`) the following +documents and work products status have to go to "valid" (after the relevant verification were performed). + +Feature Documents Status +------------------------ + +For all the work product documents the status can be seen by following the "Link to WP". +A summary of the status is also documented in the project's documentation management plan. + +See :ref:`documents_docs_features_communication` Feature Requirements Status --------------------------- diff --git a/docs/features/frameworks/feo/requirements/aou_req.rst b/docs/features/frameworks/feo/requirements/aou_req.rst index 3b8bd29f116..d15818ee2d2 100644 --- a/docs/features/frameworks/feo/requirements/aou_req.rst +++ b/docs/features/frameworks/feo/requirements/aou_req.rst @@ -28,7 +28,7 @@ FEO Feature Assumption of Use Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :status: valid + :status: invalid Something shall be done. diff --git a/docs/features/frameworks/feo/safety_planning/index.rst b/docs/features/frameworks/feo/safety_planning/index.rst index e976cd92b48..b8d7a69ec80 100644 --- a/docs/features/frameworks/feo/safety_planning/index.rst +++ b/docs/features/frameworks/feo/safety_planning/index.rst @@ -13,8 +13,8 @@ # ******************************************************************************* -FEO Feature Safety Planning -=========================== +Feature Safety Work Products List +================================= .. document:: FEO Safety Work Products :id: doc__feo_safety_wp @@ -31,79 +31,71 @@ FEO Feature Safety Planning * - Work product Id - Link to process - Process status - - Link to issue - Link to WP - - WP/doc status * - :need:`wp__feat_request` - :need:`gd_temp__change_feature_request` - :ndf:`copy('status', need_id='gd_temp__change_feature_request')` - - https://github.com/eclipse-score/score/issues/1646 - :need:`doc__frameworks_feo` - - :ndf:`copy('status', need_id='doc__frameworks_feo')` * - :need:`wp__requirements_feat` - :need:`gd_temp__req_feat_req` - :ndf:`copy('status', need_id='gd_temp__req_feat_req')` - - https://github.com/eclipse-score/score/issues/1647 - :need:`doc__frameworks_feo_feat_reqs` - - :ndf:`copy('status', need_id='doc__frameworks_feo_feat_reqs')` * - :need:`wp__requirements_feat_aou` - :need:`gd_temp__req_aou_req` - :ndf:`copy('status', need_id='gd_temp__req_aou_req')` - - https://github.com/eclipse-score/score/issues/1648 - :need:`doc__frameworks_feo_aou_reqs` - - :ndf:`copy('status', need_id='doc__frameworks_feo_aou_reqs')` * - :need:`wp__feature_arch` - :need:`gd_temp__arch_feature` - :ndf:`copy('status', need_id='gd_temp__arch_feature')` - - https://github.com/eclipse-score/score/issues/1649 - :need:`doc__frameworks_feo_feat_arch` - - :ndf:`copy('status', need_id='doc__frameworks_feo_feat_arch')` * - :need:`wp__feature_fmea` - :need:`gd_temp__feat_saf_fmea` - :ndf:`copy('status', need_id='gd_temp__feat_saf_fmea')` - - https://github.com/eclipse-score/score/issues/1650 - :need:`doc__frameworks_feo_fmea` - - :ndf:`copy('status', need_id='doc__frameworks_feo_fmea')` * - :need:`wp__feature_dfa` - :need:`gd_temp__feat_saf_dfa` - :ndf:`copy('status', need_id='gd_temp__feat_saf_dfa')` - - https://github.com/eclipse-score/score/issues/1651 - :need:`doc__frameworks_feo_dfa` - - :ndf:`copy('status', need_id='doc__frameworks_feo_dfa')` * - :need:`wp__fdr_reports` (Features's Safety Analyses & DFA) - :need:`gd_chklst__safety_analysis` - :ndf:`copy('status', need_id='gd_chklst__safety_analysis')` - - https://github.com/eclipse-score/score/issues/1652 - :need:`doc__saf_ana_inspec_frameworks_feo` - - :ndf:`copy('status', need_id='doc__saf_ana_inspec_frameworks_feo')` * - :need:`wp__requirements_inspect` - :need:`gd_chklst__req_inspection` - :ndf:`copy('status', need_id='gd_chklst__req_inspection')` - - https://github.com/eclipse-score/score/issues/1653 - :need:`doc__req_inspection_frameworks_feo` - - :ndf:`copy('status', need_id='doc__req_inspection_frameworks_feo')` * - :need:`wp__sw_arch_verification` - :need:`gd_chklst__arch_inspection_checklist` - :ndf:`copy('status', need_id='gd_chklst__arch_inspection_checklist')` - - https://github.com/eclipse-score/score/issues/1654 - :need:`doc__arch_inspection_frameworks_feo` - - :ndf:`copy('status', need_id='doc__arch_inspection_frameworks_feo')` * - :need:`wp__verification_feat_int_test` - :need:`gd_guidl__verification_guide` - :ndf:`copy('status', need_id='gd_guidl__verification_guide')` - - https://github.com/eclipse-score/score/issues/1655 - <Link to WP> - - <automated> + +Feature Safety Package +====================== + +To create the safety package (according to :need:`gd_guidl__saf_package`) the following +documents and work products status have to go to "valid" (after the relevant verification were performed). + +Feature Documents Status +------------------------ + +For all the work product documents the status can be seen by following the "Link to WP". +A summary of the status is also documented in the project's documentation management plan. + +See :ref:`documents_docs_features_frameworks` FEO Requirements Status ----------------------- diff --git a/docs/features/persistency/kvs/architecture/chklst_arc_inspection.rst b/docs/features/persistency/kvs/architecture/chklst_arc_inspection.rst new file mode 100644 index 00000000000..b9123302488 --- /dev/null +++ b/docs/features/persistency/kvs/architecture/chklst_arc_inspection.rst @@ -0,0 +1,155 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + + +.. document:: Persistency Architecture Inspection Checklist + :id: doc__persistency_arc_inspection + :status: draft + :safety: ASIL_B + :security: YES + :realizes: wp__sw_arch_verification + + +Architecture Inspection Checklist +================================= + +Purpose +------- + +The purpose of the software architecture checklist is to ensure that the design meets the criteria and quality as +defined per project processes and guidelines for feature and component architectural design elements. +It helps to check the compliance with requirements, identify errors or inconsistencies, and ensure adherence to best +practices. +The checklist guides evaluation of the architecture design, identifies potential problems, and aids in +communication and documentation of architectural decisions to stakeholders. + +Checklist +--------- + +.. list-table:: Architecture Design Review Checklist + :header-rows: 1 + + * - Review Id + - Acceptance criteria + - Type + - Guidance + - passed + - Remarks + - Issue link + * - ARC_01_01 + - Is the traceability from software architectural elements to requirements, and other level architectural + elements (e.g. component to interface) established according to the "Relations between the architectural elements" as described in :need:`doc_concept__arch_process`? + - automated + - Trace should be checked automatically by tool support in the future. It will be removed from the checklist once the requirement (:need:`Correlations of the architectural building blocks <gd_req__arch_build_blocks_corr>`) is implemented. Refer to `Tool Requirements <https://eclipse-score.github.io/docs-as-code/main/internals/requirements/requirements.html>`_ for the current status. + - + - + - + * - ARC_01_02 + - If the architectural element is related to any supplier manuals (incl. safety and security) + are the relevant parts covered? + - manual + - If the architecture makes use of supplied elements, their manuals (like safety) have to be considered (i.e. its provided functionality matches the expectation and assumptions are fulfilled). Note that in case of safety component this means that assumed Technical Safety Requirements and AoUs of the safety manual are covered. + - + - + - + * - ARC_01_03 + - Is the architectural element traceable to the lower level artifacts as defined by the workproduct traceability? + - automated + - Will be removed from checklist once the requirement (:need:`Correlations of the architectural building blocks <gd_req__arch_build_blocks_corr>`) is implemented by automated tool check. See `Tool Requirements <https://eclipse-score.github.io/docs-as-code/main/internals/requirements/requirements.html>`_. + - + - + - + * - ARC_02_01 + - Is the software architecture design compliant with the (overall) feature architecture? + - manual + - On component level check against the feature architecture, on feature level check other features with common components used. + - + - + - + * - ARC_02_02 + - Is appropriate and comprehensible operation/interface naming present in the architectural design? + - manual + - Check :need:`gd_guidl__arch_design` + - + - + - + * - ARC_02_03 + - Are correctness of data flow and control flow within the architectural elements considered? + - manual + - E.g. examine definitions, transformations, integrity, and interaction of data; check error handling, data + exchange between elements, correct response to inputs and documented decision making. + Note: consistency is ensured by the process/tooling, by defining each interface only once. + - + - + - + * - ARC_02_04 + - Are the interfaces between the software architectural element and other architectural elements well-defined? + - manual + - Check if the interface reacts on non-defined behavior or errors; can established protocols be used; are the + interfaces for inputs, outputs, error codes documented; is loose coupling considered and only limited exposure; + can unit or integration test be written against the interface; data amount transferred; no sensitive data + exposure; + - + - + - + * - ARC_02_05 + - Does the software architectural element consider the timing constraints (from the parent requirement)? + - manual + - If there are hard requirements on the timing a programming time estimation should be performed and also + deadline supervision considered. + - + - + - + * - ARC_02_06 + - Is the documentation of the software architectural element, including textual and graphical descriptions + (e.g., UML diagrams), comprehensible and complete? + - manual + - Use of semi-formal notation is expected for architectural elements with an allocated ASIL level. + Is the architecture template correctly filled? + - + - + - + * - ARC_03_01 + - Is the architectural element modular and encapsulated? + - manual + - Check e.g. that only minimal interfaces are used. Design should be object oriented. Interfaces and interactions are clearly defined. Usage of access types (private, protected) properly set. Limited global variables. + - + - + - + * - ARC_03_02 + - Is the suitability of the software architecture for future modifications and maintainability considered? + - manual + - Check for e.g. loose coupling, separation of concerns, high cohesion, versioning strategy for interfaces, + decision records, use of established design patterns. + - + - + - + * - ARC_03_03 + - Are simplicity and avoidance of unnecessary complexity present in the software architecture? + - manual + - Indicators for complexity are: number of use cases (corresponding to dynamic diagrams) + allocated to single design element, number of interfaces and operations in an interface, + function parameters, global variables, complex types, limited comprehensibility. + + Note: If the "number" above exceeds "3" a design rationale is mandatory (for all types) + - + - + - + * - ARC_03_04 + - Is the software architecture design following best practices and design principles? + - manual + - Refer to architectural guidelines and recommendations within the project documentation. + - + - + - diff --git a/docs/features/persistency/kvs/architecture/index.rst b/docs/features/persistency/kvs/architecture/index.rst index 750dbdfc11b..4a7e070eb92 100644 --- a/docs/features/persistency/kvs/architecture/index.rst +++ b/docs/features/persistency/kvs/architecture/index.rst @@ -144,3 +144,6 @@ Logical Interfaces :status: valid .. uml:: _assets/kvs_interface.puml + +.. needextend:: docname is not None and "persistency/kvs/architecture" in docname + :+tags: persistency diff --git a/docs/features/persistency/kvs/index.rst b/docs/features/persistency/kvs/index.rst index 895c7392838..03c2aab3d90 100644 --- a/docs/features/persistency/kvs/index.rst +++ b/docs/features/persistency/kvs/index.rst @@ -24,8 +24,9 @@ Key-Value-Storage :tags: feature_request, persistency .. toctree:: - requirements/index.rst architecture/index.rst + architecture/chklst_arc_inspection.rst + requirements/index.rst requirements/chklst_req_inspection.rst safety_analysis/fmea.rst safety_analysis/dfa.rst diff --git a/docs/features/persistency/kvs/safety_planning/index.rst b/docs/features/persistency/kvs/safety_planning/index.rst index bdd62e7e1fa..a26e86a99c5 100644 --- a/docs/features/persistency/kvs/safety_planning/index.rst +++ b/docs/features/persistency/kvs/safety_planning/index.rst @@ -12,8 +12,8 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -Feature Safety Planning -======================= +Feature Safety Work Products List +================================= .. document:: Persistency KVS Safety WPs :id: doc__persistency_safety_wp @@ -30,72 +30,52 @@ Feature Safety Planning * - Workproduct Id - Link to process - Process status - - Link to issue - Link to WP - - WP status * - :need:`wp__feat_request` - :need:`gd_temp__change_feature_request` - :ndf:`copy('status', need_id='gd_temp__change_feature_request')` - - https://github.com/eclipse-score/score/issues/760 - :need:`doc__persistency_kvs` - - :ndf:`copy('status', need_id='doc__persistency_kvs')` * - :need:`wp__requirements_feat` - :need:`gd_temp__req_feat_req` - :ndf:`copy('status', need_id='gd_temp__req_feat_req')` - - https://github.com/eclipse-score/score/issues/960 - - :ref:`feature_requirements_PersistencyKvs` - - valid + - :need:`doc__persistency_requirements` * - :need:`wp__requirements_feat_aou` - :need:`gd_temp__req_aou_req` - :ndf:`copy('status', need_id='gd_temp__req_aou_req')` - - https://github.com/eclipse-score/score/issues/960 - - :ref:`feature_requirements_PersistencyKvs` - - valid + - :need:`doc__persistency_requirements` * - :need:`wp__feature_arch` - :need:`gd_temp__arch_feature` - :ndf:`copy('status', need_id='gd_temp__arch_feature')` - - https://github.com/eclipse-score/score/issues/1020 - - :ref:`feature_architecture_PersistencyKvs` - - valid + - :need:`doc__persistency_architecture` * - :need:`wp__feature_fmea` - :need:`gd_guidl__safety_analysis` - :ndf:`copy('status', need_id='gd_guidl__safety_analysis')` - - https://github.com/eclipse-score/score/issues/965 - :need:`doc__persistency_fmea` - - valid * - :need:`wp__feature_dfa` - :need:`gd_guidl__safety_analysis` - :ndf:`copy('status', need_id='gd_guidl__safety_analysis')` - - https://github.com/eclipse-score/score/issues/965 - :need:`doc__persistency_dfa` - - valid * - :need:`wp__requirements_inspect` - :need:`gd_chklst__req_inspection` - :ndf:`copy('status', need_id='gd_chklst__req_inspection')` - - https://github.com/eclipse-score/score/issues/960 - :need:`doc__req_inspection_persistency` - - valid * - :need:`wp__sw_arch_verification` - :need:`gd_chklst__arch_inspection_checklist` - :ndf:`copy('status', need_id='gd_chklst__arch_inspection_checklist')` - - https://github.com/eclipse-score/score/issues/1020 - - Checklist used in Pull Request Review - - n/a + - :need:`doc__persistency_arc_inspection` * - :need:`wp__verification_feat_int_test` - :need:`gd_guidl__verification_guide` - :ndf:`copy('status', need_id='gd_guidl__verification_guide')` - - https://github.com/eclipse-score/score/issues/964 - - Checklist used in Pull Request Review - - <automated> + - <WP Link> Feature Requirements Status @@ -126,7 +106,7 @@ Feature Architecture Status --------------------------- .. needtable:: - :filter: docname is not None and "persistency" in docname and "requirements" in docname + :filter: docname is not None and "persistency" in docname and "architecture" in docname :style: table :types: feat_arc_sta; feat_arc_dyn :tags: persistency diff --git a/docs/platform_management_plan/documentation_management.rst b/docs/platform_management_plan/documentation_management.rst index a626d757e5f..75d6bbc083b 100644 --- a/docs/platform_management_plan/documentation_management.rst +++ b/docs/platform_management_plan/documentation_management.rst @@ -95,12 +95,11 @@ documents are listed as well, so that it is easy to identify missing documents. Platform documentation ++++++++++++++++++++++ +.. _documents_docs_glossary: docs/glossary ############# -.. _documents_docs_glossary: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -113,12 +112,11 @@ docs/glossary if need["docname"] is not None and "glossary/" in need["docname"]: results.append(need) +.. _documents_docs_contribute: docs/contribute ############### -.. _documents_docs_contribute: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -133,7 +131,6 @@ docs/contribute .. _doc_platform_management_plan: - docs/platform_management_plan ############################# @@ -149,12 +146,11 @@ docs/platform_management_plan if need["docname"] is not None and "platform_management_plan/" in need["docname"]: results.append(need) +.. _documents_docs_requirements: docs/requirements ################# -.. _documents_docs_requirements: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -167,12 +163,11 @@ docs/requirements if need["docname"] is not None and "requirements/" in need["docname"] and not "features/" in need["docname"] and not "modules/" in need["docname"]: results.append(need) +.. _documents_docs_quality: docs/quality ############ -.. _documents_docs_quality: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -185,12 +180,11 @@ docs/quality if need["docname"] is not None and "quality/" in need["docname"]: results.append(need) +.. _documents_docs_safety: docs/safety ########### -.. _documents_docs_safety: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -203,12 +197,11 @@ docs/safety if need["docname"] is not None and "safety/" in need["docname"]: results.append(need) +.. _documents_docs_security: docs/security ############# -.. _documents_docs_security: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -221,12 +214,11 @@ docs/security if need["docname"] is not None and "security/" in need["docname"]: results.append(need) +.. _documents_docs_score_tools: docs/score_tools ################ -.. _documents_docs_score_tools: - .. needtable:: :style: table :columns: title;id;safety_affected;security_affected;status @@ -239,12 +231,11 @@ docs/score_tools if need["docname"] is not None and "score_tools/" in need["docname"]: results.append(need) +.. _documents_docs_verification_report: docs/verification_report ######################## -.. _documents_docs_verification_report: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -257,12 +248,11 @@ docs/verification_report if need["docname"] is not None and "verification_report/" in need["docname"]: results.append(need) +.. _documents_docs_platform_integration_tests: platform_integration_tests ############################### -.. _documents_docs_platform_integration_tests: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -275,12 +265,11 @@ platform_integration_tests if need["docname"] is not None and "platform_integration_tests/" in need["docname"]: results.append(need) +.. _documents_docs_manuals: docs/manuals ############ -.. _documents_docs_manuals: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -293,12 +282,11 @@ docs/manuals if need["docname"] is not None and "manuals/" in need["docname"]: results.append(need) +.. _documents_docs_score_releases: docs/score_releases ################### -.. _documents_docs_score_releases: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -315,7 +303,6 @@ docs/score_releases .. _documents_docs_features: - Feature documentation +++++++++++++++++++++ @@ -392,11 +379,11 @@ planned for release v0.5, are listed. .. need["title"] = need["title"] .. results.append(need) +.. _documents_docs_features_baselibs: + docs/features/baselibs ###################### -.. _documents_docs_features_baselibs: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -427,11 +414,11 @@ docs/features/baselibs need["title"] = need["title"] results.append(need) +.. _documents_docs_features_communication: + docs/features/communication ########################### -.. _documents_docs_features_communication: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -497,11 +484,11 @@ docs/features/communication .. need["title"] = need["title"] .. results.append(need) +.. _documents_docs_features_frameworks: + docs/features/frameworks ######################## -.. _documents_docs_features_frameworks: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -637,11 +624,11 @@ docs/features/frameworks .. need["title"] = need["title"] .. results.append(need) +.. _documents_docs_features_orchestration: + docs/features/orchestration ########################### -.. _documents_docs_features_orchestration: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -672,11 +659,11 @@ docs/features/orchestration need["title"] = need["title"] results.append(need) +.. _documents_docs_features_persistency: + docs/features/persistency ######################### -.. _documents_docs_features_persistency: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -748,11 +735,11 @@ docs/features/persistency Modules documentation +++++++++++++++++++++ +.. _documents_docs_modules_baselibs_docs: + docs/modules/baselibs/docs ########################## -.. _documents_docs_modules_baselibs_docs: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -783,12 +770,11 @@ docs/modules/baselibs/docs need["title"] = need["title"] results.append(need) +.. _documents_docs_modules_communication_docs: docs/modules/communication/docs ############################### -.. _documents_docs_modules_communication_docs: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -819,12 +805,11 @@ docs/modules/communication/docs need["title"] = need["title"] results.append(need) +.. _documents_docs_modules_feo_docs: docs/modules/feo/docs ##################### -.. _documents_docs_modules_feo_docs: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -892,11 +877,11 @@ docs/modules/feo/docs .. results.append(need) +.. _documents_docs_modules_logging_docs: + docs/modules/logging/docs ######################### -.. _documents_docs_modules_logging_docs: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -927,12 +912,11 @@ docs/modules/logging/docs need["title"] = need["title"] results.append(need) +.. _documents_docs_modules_os_docs: docs/modules/os/docs #################### -.. _documents_docs_modules_os_docs: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -963,12 +947,11 @@ docs/modules/os/docs need["title"] = need["title"] results.append(need) +.. _documents_docs_modules_persistency_docs: docs/modules/persistency/docs ############################# -.. _documents_docs_modules_persistency_docs: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -999,12 +982,11 @@ docs/modules/persistency/docs need["title"] = need["title"] results.append(need) +.. _documents_docs_modules_tracing_docs: docs/modules/tracing/docs ######################### -.. _documents_docs_modules_tracing_docs: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -1038,16 +1020,14 @@ docs/modules/tracing/docs .. _documents_docs_modules_components: - Components documentation ++++++++++++++++++++++++ +.. _documents_docs_modules_baselibs_components: docs/modules/baselibs/components ################################ -.. _documents_docs_modules_baselibs_components: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -1096,12 +1076,11 @@ docs/modules/baselibs/components components.append(component_name) +.. _documents_docs_modules_communication_components: docs/modules/communication/components ##################################### -.. _documents_docs_modules_communication_components: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -1150,12 +1129,11 @@ docs/modules/communication/components components.append(component_name) +.. _documents_docs_modules_feo_components: docs/modules/feo/components ########################### -.. _documents_docs_modules_feo_components: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -1259,11 +1237,11 @@ docs/modules/feo/components .. components.append(component_name) +.. _documents_docs_modules_logging_components: + docs/modules/logging/components ############################### -.. _documents_docs_modules_logging_components: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -1312,12 +1290,11 @@ docs/modules/logging/components components.append(component_name) +.. _documents_docs_modules_os_components: docs/modules/os/components ########################## -.. _documents_docs_modules_os_components: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -1366,12 +1343,11 @@ docs/modules/os/components components.append(component_name) +.. _documents_docs_modules_persistency_components: docs/modules/persistency/components ################################### -.. _documents_docs_modules_persistency_components: - .. needtable:: :style: table :columns: title;id;safety;security;status @@ -1420,12 +1396,11 @@ docs/modules/persistency/components components.append(component_name) +.. _documents_docs_modules_tracing_components: docs/modules/tracing/components ############################### -.. _documents_docs_modules_tracing_components: - .. needtable:: :style: table :columns: title;id;safety;security;status From de1129645c632e2ee4bbfb4a9dce1edee509516a Mon Sep 17 00:00:00 2001 From: aschemmel-git <alexander.schemmel@bmw.de> Date: Tue, 9 Dec 2025 16:49:46 +0100 Subject: [PATCH 041/214] Finalize Req inspection - Baselibs result lib Resolves: #2229 --- .../requirements/chklst_req_inspection.rst | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/modules/baselibs/result/docs/requirements/chklst_req_inspection.rst b/docs/modules/baselibs/result/docs/requirements/chklst_req_inspection.rst index a3ef1c1feb2..533e473c082 100644 --- a/docs/modules/baselibs/result/docs/requirements/chklst_req_inspection.rst +++ b/docs/modules/baselibs/result/docs/requirements/chklst_req_inspection.rst @@ -34,7 +34,7 @@ Requirement Inspection Checklist - author: these are the persons who did the last commits on the requirements in scope (can be derived from version mgt tool) - reviewer: these are all persons committing into this inspection document or giving a pull request verdict on it (can be derived from version mgt tool) - moderator: only needed for conflict resolution between author and reviewers, is the safety manager, security manager or quality manager called in as a reviewer (can be derived from version mgt tool) - - test expert: <one of the reviewers explicitly named here, to cover REQ_08_01 as described> + - test expert: `<https://github.com/rahulthakre29>`_ **Checklist** @@ -57,21 +57,21 @@ Requirement Inspection Checklist * - REQ_02_01 - Is the requirement description *comprehensible* ? - If you think the requirement is hard to understand, comment here. - - NO - - :need:`comp_req__result__std_integration` : it is not clear what "standard library optional type, with enforced error handling" means. + - YES + - Fixed: :need:`comp_req__result__std_integration` : it is not clear what "standard library optional type, with enforced error handling" means. - `#2229 <https://github.com/eclipse-score/score/issues/2229>`_ * - REQ_02_02 - Is the requirement description *unambiguous* ? - Especially search for "weak words" like "about", "etc.", "relevant" and others (see the internet documentation on this). This check shall be supported by tooling. - - NO - - :need:`aou_req__result__thread_safety` : uses "appropriate" + - YES + - Fixed: :need:`aou_req__result__thread_safety` : uses "appropriate" - `#2229 <https://github.com/eclipse-score/score/issues/2229>`_ * - REQ_02_03 - Is the requirement description *atomic* ? - A good way to think about this is to consider if the requirement may be tested by one (positive) test case or needs more of these. The sentence template should also avoid being non-atomic already. Note that there are cases where also non-atomic requirements are the better ones, for example if those are better understandable. - - NO - - :need:`comp_req__result__error_handling` : "without using C++ exceptions" sound like a scond part of the requirement - - `#2229 <https://github.com/eclipse-score/score/issues/2229>`_ + - YES + - (old) finding explained + - none * - REQ_02_04 - Is the requirement description *feasible* ? - If at the time of the inspection the requirement has already some implementation, the answer is yes. This can be checked via traces, but also :need:`gd_req__req_attr_impl` shows this. In case the requirement has no implementationat the time of inspection (i.e. not implemented at least as "proof-of-concept"), a development expert shall be invited to the inspection to explicitly check this item. @@ -111,8 +111,8 @@ Requirement Inspection Checklist * - REQ_06_01 - Does the requirement set consider *external interfaces*? - The SW platform's external interfaces (to the user) are defined in the Feature Architecture, so the Feature and Component Requirements should determine the input data use and setting of output data for these interfaces. Are all output values defined? - - NO - - This could be improved by using the interfaces defined in :need:`comp_arc_sta__baselibs__result` + - YES + - Fixed: This could be improved by using the interfaces defined in :need:`comp_arc_sta__baselibs__result` - `#2229 <https://github.com/eclipse-score/score/issues/2229>`_ * - REQ_07_01 - Is the *safety* attribute set correctly? @@ -141,8 +141,8 @@ Requirement Inspection Checklist * - REQ_09_02 - For feature/component requirements: Do the requirements defining a safety mechanism contain the error reaction leading to a safe state? - Alternatively to the safe state there could also be "repair" mechanisms. Also do not forget to consider REQ_05_01 for these. - - NO - - There should be an AoU covering this, :need:`aou_req__result__value_handling` is not. + - YES + - Fixed: There should be an AoU covering this, :need:`aou_req__result__value_handling` is not. - `#2229 <https://github.com/eclipse-score/score/issues/2229>`_ Note: If a Review ID is not applicable for your requirement, then state "n/a" in status and comment accordingly in remarks. For example "no stakeholder requirement (no rationale needed)" From a42a59023721745f4b12d1cb9b55e9f8bc4974e5 Mon Sep 17 00:00:00 2001 From: Alexander Lanin <Alexander.Lanin@etas.com> Date: Wed, 10 Dec 2025 08:29:02 +0100 Subject: [PATCH 042/214] Update module version to 0.5.0 (#2318) Signed-off-by: Alexander Lanin <Alexander.Lanin@etas.com> --- MODULE.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MODULE.bazel b/MODULE.bazel index cf1fa2e77ce..75256323af8 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -13,7 +13,7 @@ module( name = "score_platform", - version = "0.4.2", + version = "0.5.0", compatibility_level = 0, ) From 59fa9fe1c54340da777810393e4f7dc91c5a9678 Mon Sep 17 00:00:00 2001 From: Pawel Rutka <pawel.rutka.ext@qorix.ai> Date: Fri, 5 Dec 2025 14:41:29 +0100 Subject: [PATCH 043/214] tooling: Verification report for Clippy --- docs/score_tools/_assets/clippy.drawio.svg | 197 +++++++++++++++++++++ docs/score_tools/clippy.rst | 134 ++++++++++++++ docs/score_tools/index.rst | 1 + 3 files changed, 332 insertions(+) create mode 100644 docs/score_tools/_assets/clippy.drawio.svg create mode 100644 docs/score_tools/clippy.rst diff --git a/docs/score_tools/_assets/clippy.drawio.svg b/docs/score_tools/_assets/clippy.drawio.svg new file mode 100644 index 00000000000..d39263047c6 --- /dev/null +++ b/docs/score_tools/_assets/clippy.drawio.svg @@ -0,0 +1,197 @@ +<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" style="background: #ffffff; background-color: light-dark(#ffffff, #121212);" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="641px" height="190px" viewBox="-0.5 -0.5 641 190" content="<mxfile scale="1" border="0"><diagram name="Page-1" id="T3BMX8OljUpALTbiXzM3">7Vndk9IwEP9rmNGHY/pJ4fFAOcfR0RGdU99Cm7YZ06amKVD/epMm6QctdxwHeufIA5PdbDbL7m8/Wkb2ItndUJDF70kA8cgygt3IfjWyrJln8G/BKCXDtieSEVEUSJbZMFboF1RMdS4qUADzjiAjBDOUdZk+SVPosw4PUEq2XbGQ4O6tGYhgj7HyAe5zb1HAYsmdukbDfwNRFOubTUPtrIH/I6KkSNV9I8sOq4/cToDWpeTzGARk22LZr0f2ghLC5CrZLSAWrtVuk+eWB3ZruylM2TEHbsENW34vjaWHIGSzePk2/HJlulLNBuAC6t8xwVzhPEAbvozEUrNCwq/iPga+lJ38LIT18zcQbyBDPmhY+uiKhGzLbeQ0SDLOSNd51lLJ7ZVauzdx9sD95zEpJwX1OeQs48WnImcvH2hKFUtWavzwsGZimewikR/jEJOtHwPKxknBUXwVEL9IqhDNG8R8KBhGqThmcv4GUmEpvsYoSoUqFARC/TxmCVYy1TEoQmlwCoM1xPNa3YJgQvlWSoTOec4o+QE1k+PSmLrmzBfeQhi3+AGE69CrT2j8i/sCkMf1dbnMWsvha6CM9PlvglRFYAkShEUBaNwuN1S+m5ai9eUBDEGBG4e2YayQLbwCdy2WgvUNJAlktOQiatdyVIqVurSoErRtEtq0lUzcSmZnquqIqiFRrbrJI75QqTScVrW5/QxS2GzAopEoNq6kU6+5gOlkOwm4Gql9QH9GicDsIocUhR1Rvw5ow7SN6tMHv49RlpUHIb8H7gZ1AhPbGDG4yqRlW472LkT3wCVK4XQ6BEd7Ys/s4Dyxd8wjYm8OxN41Hx97x+15DAa8uyhSpWPLRXCH2FeRVGNXUd9aO692Kt8qolTEQSfJOqbdoFonoBHU6LYkT5h0pyspxIChTbchPsovs4GceJCjugXJeqZueF6lYQ5+idHuX6kMXrcw6B7Rrgs6f9t1QY+vjwq8dV/gHzKvzL+/EycQFkEenqLWVAu/oEUlZwA+l4op1KckPzziPIVh5qLjSs5BidLoHQxFfK+mZ8KWN3b/3sjhTE5sO3r9rdOChtuOID7ygsKtE2Oe5KXc0q9toqVJkI2qiirb1L6yU0u81S/xdz7a/Pm6r58dj4/PiX490YV3uqvtV334L7jQ/BMQfwJwPr+L1dGPBFWdRlUs1512C5buh1qFNEqdar9G2Fc02Ru4bVPXQq1KQqinqop5/YuOg4F9sJG2nslXPkgrD2WEsqoG8xj0OmPAg+UzKLoiyvOiaqb/H/CfxQN+D3ND3da9ULd1+6/IFiQNUVRQnpAk/Q+YiwCmh44BDB3/Rmg6MP1fajxzvRN7V/etgDGunpGe4IS216uOHNnO3tIso9vS6r8UHtrS9tHSU3SgoV1TCsqWWCYE8sMGm449eE+DK6nx5G45O3nuHLsTr4uY2cy7BzN9eAyi6HjM9EfPs2PG9u4J9bGY2X/vaJnmRTDjeNY5McPJ5h8nKd78q2e//g0=</diagram></mxfile>"> + <defs/> + <rect fill="#ffffff" width="100%" height="100%" x="0" y="0" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"/> + <g> + <g> + <path d="M 184.77 69.98 C 184.77 68.93 185.55 67.91 186.94 67.17 C 188.32 66.42 190.2 66 192.16 66 L 292.61 66 C 294.57 66 296.45 66.42 297.84 67.17 C 299.22 67.91 300 68.93 300 69.98 L 300 101.83 C 281.59 97.63 260.8 97.63 242.39 101.83 C 223.97 106.04 203.19 106.04 184.77 101.83 Z" fill="#deebf7" stroke="#08519c" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(222, 235, 247), rgb(27, 38, 48)); stroke: light-dark(rgb(8, 81, 156), rgb(122, 185, 249));"/> + <path d="M 177.39 73.96 C 177.39 71.76 180.69 69.98 184.77 69.98 L 285.23 69.98 C 289.31 69.98 292.61 71.76 292.61 73.96 L 292.61 105.81 C 274.2 101.61 253.41 101.61 235 105.81 C 216.59 110.02 195.8 110.02 177.39 105.81 Z" fill="#deebf7" stroke="#08519c" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(222, 235, 247), rgb(27, 38, 48)); stroke: light-dark(rgb(8, 81, 156), rgb(122, 185, 249));"/> + <path d="M 170 77.94 C 170 76.89 170.78 75.88 172.16 75.13 C 173.55 74.38 175.43 73.96 177.39 73.96 L 277.84 73.96 C 279.8 73.96 281.68 74.38 283.06 75.13 C 284.45 75.88 285.23 76.89 285.23 77.94 L 285.23 109.8 C 266.81 105.59 246.03 105.59 227.61 109.8 C 209.2 114 188.41 114 170 109.8 Z" fill="#deebf7" stroke="#08519c" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(222, 235, 247), rgb(27, 38, 48)); stroke: light-dark(rgb(8, 81, 156), rgb(122, 185, 249));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 90px; margin-left: 235px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: nowrap; "> + <div> + <font face="Helvetica"> + Software + </font> + </div> + <div> + <font face="Helvetica"> + sources (Rust) + </font> + </div> + </div> + </div> + </div> + </foreignObject> + <text x="235" y="94" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Software... + </text> + </switch> + </g> + </g> + <g> + <rect x="340" y="66" width="110" height="51" rx="7.65" ry="7.65" fill="#ffff88" stroke="#36393d" pointer-events="all" style="fill: light-dark(rgb(255, 255, 136), rgb(33, 33, 0)); stroke: light-dark(rgb(54, 57, 61), rgb(186, 189, 192));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 92px; margin-left: 341px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <font color="#000000" face="Times,serif" style="font-size: 14px; color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"> + clippy + </font> + </div> + </div> + </div> + </foreignObject> + <text x="395" y="95" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + clippy + </text> + </switch> + </g> + </g> + <g> + <path d="M 72.5 36 L 72.5 59.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 72.5 64.88 L 69 57.88 L 72.5 59.63 L 76 57.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <path d="M 72.5 36 L 72.5 57.76" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 72.5 63.76 L 68.5 55.76 L 72.5 57.76 L 76.5 55.76 Z" fill="#000000" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <rect x="0" y="0" width="145" height="36" rx="5.4" ry="5.4" fill="#ffff88" stroke="#36393d" pointer-events="all" style="fill: light-dark(rgb(255, 255, 136), rgb(33, 33, 0)); stroke: light-dark(rgb(54, 57, 61), rgb(186, 189, 192));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 143px; height: 1px; padding-top: 18px; margin-left: 1px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <font color="#000000" face="Times,serif" style="font-size: 14px; color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"> + Bazel + </font> + </div> + </div> + </div> + </foreignObject> + <text x="73" y="22" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Bazel + </text> + </switch> + </g> + </g> + <g> + <path d="M 22.27 69.98 C 22.27 68.93 23.05 67.91 24.44 67.17 C 25.82 66.42 27.7 66 29.66 66 L 130.11 66 C 132.07 66 133.95 66.42 135.34 67.17 C 136.72 67.91 137.5 68.93 137.5 69.98 L 137.5 101.83 C 119.09 97.63 98.3 97.63 79.89 101.83 C 61.47 106.04 40.69 106.04 22.27 101.83 Z" fill="#deebf7" stroke="#08519c" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(222, 235, 247), rgb(27, 38, 48)); stroke: light-dark(rgb(8, 81, 156), rgb(122, 185, 249));"/> + <path d="M 14.89 73.96 C 14.89 71.76 18.19 69.98 22.27 69.98 L 122.73 69.98 C 126.81 69.98 130.11 71.76 130.11 73.96 L 130.11 105.81 C 111.7 101.61 90.91 101.61 72.5 105.81 C 54.09 110.02 33.3 110.02 14.89 105.81 Z" fill="#deebf7" stroke="#08519c" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(222, 235, 247), rgb(27, 38, 48)); stroke: light-dark(rgb(8, 81, 156), rgb(122, 185, 249));"/> + <path d="M 7.5 77.94 C 7.5 76.89 8.28 75.88 9.66 75.13 C 11.05 74.38 12.93 73.96 14.89 73.96 L 115.34 73.96 C 117.3 73.96 119.18 74.38 120.56 75.13 C 121.95 75.88 122.73 76.89 122.73 77.94 L 122.73 109.8 C 104.31 105.59 83.53 105.59 65.11 109.8 C 46.7 114 25.91 114 7.5 109.8 Z" fill="#deebf7" stroke="#08519c" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(222, 235, 247), rgb(27, 38, 48)); stroke: light-dark(rgb(8, 81, 156), rgb(122, 185, 249));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 90px; margin-left: 69px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: nowrap; "> + <font face="Helvetica"> + BZL files + <br/> + (rules and macros) + </font> + </div> + </div> + </div> + </foreignObject> + <text x="69" y="94" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + BZL files... + </text> + </switch> + </g> + </g> + <g> + <path d="M 137.5 90 L 161.76 90" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 167.76 90 L 159.76 94 L 161.76 90 L 159.76 86 Z" fill="#000000" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <path d="M 300 90.93 L 331.76 91.38" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 337.76 91.47 L 329.71 95.35 L 331.76 91.38 L 329.82 87.35 Z" fill="#000000" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <path d="M 450 91.5 L 481.76 91.5" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 487.76 91.5 L 479.76 95.5 L 481.76 91.5 L 479.76 87.5 Z" fill="#000000" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <path d="M 507.05 69.98 C 507.05 68.93 507.94 67.91 509.54 67.17 C 511.14 66.42 513.31 66 515.57 66 L 631.48 66 C 633.74 66 635.91 66.42 637.5 67.17 C 639.1 67.91 640 68.93 640 69.98 L 640 101.83 C 618.75 97.63 594.77 97.63 573.52 101.83 C 552.28 106.04 528.29 106.04 507.05 101.83 Z" fill="#deebf7" stroke="#08519c" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(222, 235, 247), rgb(27, 38, 48)); stroke: light-dark(rgb(8, 81, 156), rgb(122, 185, 249));"/> + <path d="M 498.52 73.96 C 498.52 71.76 502.34 69.98 507.05 69.98 L 622.95 69.98 C 627.66 69.98 631.48 71.76 631.48 73.96 L 631.48 105.81 C 610.23 101.61 586.25 101.61 565 105.81 C 543.75 110.02 519.77 110.02 498.52 105.81 Z" fill="#deebf7" stroke="#08519c" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(222, 235, 247), rgb(27, 38, 48)); stroke: light-dark(rgb(8, 81, 156), rgb(122, 185, 249));"/> + <path d="M 490 77.94 C 490 76.89 490.9 75.88 492.5 75.13 C 494.09 74.38 496.26 73.96 498.52 73.96 L 614.43 73.96 C 616.69 73.96 618.86 74.38 620.46 75.13 C 622.06 75.88 622.95 76.89 622.95 77.94 L 622.95 109.8 C 601.71 105.59 577.72 105.59 556.48 109.8 C 535.23 114 511.25 114 490 109.8 Z" fill="#deebf7" stroke="#08519c" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(222, 235, 247), rgb(27, 38, 48)); stroke: light-dark(rgb(8, 81, 156), rgb(122, 185, 249));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 90px; margin-left: 565px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: nowrap; "> + <div> + Scan report with + <br/> + detected issues + </div> + </div> + </div> + </div> + </foreignObject> + <text x="565" y="94" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Scan report with... + </text> + </switch> + </g> + </g> + <g> + <path d="M 184.77 143.98 C 184.77 142.93 185.55 141.91 186.94 141.17 C 188.32 140.42 190.2 140 192.16 140 L 292.61 140 C 294.57 140 296.45 140.42 297.84 141.17 C 299.22 141.91 300 142.93 300 143.98 L 300 175.83 C 281.59 171.63 260.8 171.63 242.39 175.83 C 223.97 180.04 203.19 180.04 184.77 175.83 Z" fill="#deebf7" stroke="#08519c" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(222, 235, 247), rgb(27, 38, 48)); stroke: light-dark(rgb(8, 81, 156), rgb(122, 185, 249));"/> + <path d="M 177.39 147.96 C 177.39 145.76 180.69 143.98 184.77 143.98 L 285.23 143.98 C 289.31 143.98 292.61 145.76 292.61 147.96 L 292.61 179.81 C 274.2 175.61 253.41 175.61 235 179.81 C 216.59 184.02 195.8 184.02 177.39 179.81 Z" fill="#deebf7" stroke="#08519c" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(222, 235, 247), rgb(27, 38, 48)); stroke: light-dark(rgb(8, 81, 156), rgb(122, 185, 249));"/> + <path d="M 170 151.94 C 170 149.75 173.31 147.96 177.39 147.96 L 277.84 147.96 C 281.92 147.96 285.23 149.75 285.23 151.94 L 285.23 183.8 C 266.81 179.59 246.03 179.59 227.61 183.8 C 209.2 188 188.41 188 170 183.8 Z" fill="#deebf7" stroke="#08519c" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(222, 235, 247), rgb(27, 38, 48)); stroke: light-dark(rgb(8, 81, 156), rgb(122, 185, 249));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 164px; margin-left: 235px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: nowrap; "> + Configuration + </div> + </div> + </div> + </foreignObject> + <text x="235" y="168" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Configuration + </text> + </switch> + </g> + </g> + <g> + <path d="M 72.5 108.24 L 72.92 160 Q 73 170 83 170 L 161.76 170" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 167.76 170 L 159.76 174 L 161.76 170 L 159.76 166 Z" fill="#000000" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <path d="M 300 170 L 392 170 Q 402 170 402.07 160 L 402.31 125.08" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 402.35 119.08 L 406.3 127.11 L 402.31 125.08 L 398.3 127.05 Z" fill="#000000" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + </g> + <switch> + <g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/> + <a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"> + <text text-anchor="middle" font-size="10px" x="50%" y="100%"> + Text is not SVG - cannot display + </text> + </a> + </switch> +</svg> diff --git a/docs/score_tools/clippy.rst b/docs/score_tools/clippy.rst new file mode 100644 index 00000000000..ac82b557af7 --- /dev/null +++ b/docs/score_tools/clippy.rst @@ -0,0 +1,134 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +.. doc_tool:: clippy + :id: doc_tool__clippy + :status: evaluated + :version: 1.90.0 (see [1]) + :tcl: HIGH + :safety_affected: YES + :security_affected: YES + :realizes: wp__tool_verification_report + :tags: tool_management + +Clippy Verification Report +=========================== + +Introduction +------------ +Scope and purpose +~~~~~~~~~~~~~~~~~ +Clippy is a linter tool (performs static code analysis) for the Rust programming language. +It provides a collection of lints to catch common mistakes and improve code quality. +Clippy helps developers identify potential issues in their Rust code, such as performance pitfalls, +stylistic inconsistencies, and potential bugs. + +Inputs and outputs +~~~~~~~~~~~~~~~~~~ +| Inputs: Software sources (Rust), Lint configuration +| Outputs: Report with detected rules violations + +.. figure:: _assets/clippy.drawio.svg + :width: 100% + :align: center + :alt: Clippy overview + + Clippy overview + +Available information +~~~~~~~~~~~~~~~~~~~~~ +- Version: >= 1.90.0 [1]_ +- Official repository: https://github.com/rust-lang/rust-clippy +- Official documentation: https://github.com/rust-lang/rust-clippy +- Clippy configuration in S-CORE module repository: https://github.com/eclipse-score/score_rust_policies/tree/main/clippy + + +Installation and integration +---------------------------- +Installation +~~~~~~~~~~~~ +| To add the Clippy Bazel targets to your project or module follow guidelines in `here <https://github.com/eclipse-score/score_rust_policies>`_ + +Integration +~~~~~~~~~~~ +Integrated in bazel. + +Environment +~~~~~~~~~~~ +Requires Rust toolchain and Bazel build environment. + +Safety evaluation +----------------- +This section outlines the safety evaluation of clippy for its use within the S-CORE project. + + +.. list-table:: Safety evaluation + :header-rows: 1 + :widths: 1 2 8 2 6 4 2 2 + + * - Malfunction identification + - Use case description + - Malfunctions + - Impact on safety? + - Impact safety measures available? + - Impact safety detection sufficient? + - Further additional safety measure required? + - Confidence (automatic calculation) + * - 1 + - False-negative: Fail to detect non-compliance with the consistency rules + - | Diverging from consistency rules. + | However lints are not involved in ensuring correctness of code, but only a measure of quality of the source code. + + - no + - no + - yes + - no + - high + * - 2 + - False-positive: Report non-compliance, although the code is compliant + - | No in code malfunction. + | However this will cause an failure in CI/CD checks that needs to be resolved before merging code by author through manual inspection and explanation + - no + - no + - yes + - no + - high + +Security evaluation +------------------- +This section outlines the security evaluation of Rustfmt for its use within the S-CORE project. + + +.. list-table:: Security evaluation + :header-rows: 1 + + * - Threat identification + - Use case description + - Threats + - Impact on security? + - Impact security measures available? + - Impact security detection sufficient? + * - 1 + - TBD + - TBD + - TBD + - TBD + - TBD + +Result +~~~~~~ +Clippy does not require qualification for use in safety-related software development according to ISO 26262. + +.. [1] The tool version mentioned in this document is preliminary. + Exact version shall be derived from qualified Rust compiler used in S-CORE project. diff --git a/docs/score_tools/index.rst b/docs/score_tools/index.rst index 2781b1a6624..e3319cc8605 100644 --- a/docs/score_tools/index.rst +++ b/docs/score_tools/index.rst @@ -33,3 +33,4 @@ S-CORE Tools Overview gtest bazel rustfmt + clippy From 246e3d5829f4abe5dfbdfb7b2f36d1eacde6aa42 Mon Sep 17 00:00:00 2001 From: aschemmel-git <alexander.schemmel@bmw.de> Date: Wed, 10 Dec 2025 10:53:31 +0100 Subject: [PATCH 044/214] Document Codeowners experience - com and baselibs Resolves: #1304 --- .../baselibs/docs/safety_mgt/index.rst | 1 + .../docs/safety_mgt/module_codeowners.rst | 52 +++++++++++++++++++ .../communication/docs/safety_mgt/index.rst | 1 + .../docs/safety_mgt/module_codeowners.rst | 46 ++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 docs/modules/baselibs/docs/safety_mgt/module_codeowners.rst create mode 100644 docs/modules/communication/docs/safety_mgt/module_codeowners.rst diff --git a/docs/modules/baselibs/docs/safety_mgt/index.rst b/docs/modules/baselibs/docs/safety_mgt/index.rst index 04718ba3557..ba72f6019ab 100644 --- a/docs/modules/baselibs/docs/safety_mgt/index.rst +++ b/docs/modules/baselibs/docs/safety_mgt/index.rst @@ -19,5 +19,6 @@ Safety Management :titlesonly: module_safety_plan + module_codeowners module_safety_plan_fdr module_safety_package_fdr diff --git a/docs/modules/baselibs/docs/safety_mgt/module_codeowners.rst b/docs/modules/baselibs/docs/safety_mgt/module_codeowners.rst new file mode 100644 index 00000000000..072ddc85d99 --- /dev/null +++ b/docs/modules/baselibs/docs/safety_mgt/module_codeowners.rst @@ -0,0 +1,52 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +Module Codeowners Skill Check +***************************** + +.. document:: Baselibs Codeowners + :id: doc__baselibs_codeowners + :status: valid + :safety: ASIL_B + :security: YES + :realizes: wp__module_safety_plan + +Assigned Committer(s) +===================== + +According to `Baselibs Module Codeowners <https://github.com/eclipse-score/baselibs/blob/main/.github/CODEOWNERS>`_ +the following committers are assigned to guard the Baselibs repository: + +- `<https://github.com/castler>`_ +- `<https://github.com/hoe-jo>`_ +- `<https://github.com/LittleHuba>`_ +- `<https://github.com/ramceb>`_ +- `<https://github.com/nradakovic>`_ +- `<https://github.com/4og>`_ + +Skill Check +=========== + +For the CODEOWNERS the required skills, knowledge and experience is defined in `<https://eclipse-score.github.io/score/main/platform_management_plan/safety_management.html#functional-safety-management-organization>`_. + +The evidences are not published openly due to personal data confidentiality, but will be checked by the module safety manager. + +- `<https://github.com/castler>`_: SW developer and team lead for Safe POSIX SW platform at OEM > 2 years +- `<https://github.com/hoe-jo>`_: SW developer for Safe POSIX SW platform at OEM > 1.5y and safety manager for camera systems at OEM 1y, member of S-CORE process community +- `<https://github.com/LittleHuba>`_: SW developer for Safe POSIX SW platform at OEM > 2 years +- `<https://github.com/ramceb>`_: SW architect for Safe POSIX SW platform at OEM > 2 years +- `<https://github.com/nradakovic>`_: SW developer and tool expert for Safe POSIX SW platform at OEM > 2 years +- `<https://github.com/4og>`_: SW developer for safety related application at OEM > 2 years + +The S-CORE processes are trained on the job by the Baselibs module safety manager to the CODEOWNERS. diff --git a/docs/modules/communication/docs/safety_mgt/index.rst b/docs/modules/communication/docs/safety_mgt/index.rst index 04718ba3557..ba72f6019ab 100644 --- a/docs/modules/communication/docs/safety_mgt/index.rst +++ b/docs/modules/communication/docs/safety_mgt/index.rst @@ -19,5 +19,6 @@ Safety Management :titlesonly: module_safety_plan + module_codeowners module_safety_plan_fdr module_safety_package_fdr diff --git a/docs/modules/communication/docs/safety_mgt/module_codeowners.rst b/docs/modules/communication/docs/safety_mgt/module_codeowners.rst new file mode 100644 index 00000000000..66b3146fff1 --- /dev/null +++ b/docs/modules/communication/docs/safety_mgt/module_codeowners.rst @@ -0,0 +1,46 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +Module Codeowners Skill Check +***************************** + +.. document:: Communication Codeowners + :id: doc__communication_codeowners + :status: valid + :safety: ASIL_B + :security: YES + :realizes: wp__module_safety_plan + +Assigned Committer(s) +===================== + +According to `Communication Module Codeowners <https://github.com/eclipse-score/communication/blob/main/.github/CODEOWNERS>`_ +the following committers are assigned to guard the Communication repository: + +- `<https://github.com/castler>`_ +- `<https://github.com/hoe-jo>`_ +- `<https://github.com/LittleHuba>`_ + +Skill Check +=========== + +For the CODEOWNERS the required skills, knowledge and experience is defined in `<https://eclipse-score.github.io/score/main/platform_management_plan/safety_management.html#functional-safety-management-organization>`_. + +The evidences are not published openly due to personal data confidentiality, but will be checked by the module safety manager. + +- `<https://github.com/castler>`_: SW developer and team lead for Safe POSIX SW platform at OEM > 2 years +- `<https://github.com/hoe-jo>`_: SW developer for Safe POSIX SW platform at OEM > 1.5y and safety manager for camera systems at OEM 1y, member of S-CORE process community +- `<https://github.com/LittleHuba>`_: SW developer for Safe POSIX SW platform at OEM > 2 years + +The S-CORE processes are trained on the job by the Communication module safety manager to the CODEOWNERS. From 453a8c73722b9708e0edf446350606d02227a496 Mon Sep 17 00:00:00 2001 From: Tibor Zavartkay <zat1lr@bosch.com> Date: Wed, 10 Dec 2025 15:10:07 +0100 Subject: [PATCH 045/214] Resolve merge issues --- docs/features/persistency/index.rst | 3 ++- docs/features/persistency/safety_planning/index.rst | 8 ++++---- docs/score_tools/doc_as_code.rst | 4 ---- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/docs/features/persistency/index.rst b/docs/features/persistency/index.rst index 181b224ddd0..6f6246e5f34 100644 --- a/docs/features/persistency/index.rst +++ b/docs/features/persistency/index.rst @@ -24,8 +24,9 @@ Persistency (v0.5 alpha) :tags: feature_request, persistency .. toctree:: - requirements/index.rst architecture/index.rst + architecture/chklst_arc_inspection.rst + requirements/index.rst requirements/chklst_req_inspection.rst safety_analysis/fmea.rst safety_analysis/dfa.rst diff --git a/docs/features/persistency/safety_planning/index.rst b/docs/features/persistency/safety_planning/index.rst index 314366499c8..d21a5ad323b 100644 --- a/docs/features/persistency/safety_planning/index.rst +++ b/docs/features/persistency/safety_planning/index.rst @@ -35,17 +35,17 @@ Feature Safety Work Products List * - :need:`wp__feat_request` - :need:`gd_temp__change_feature_request` - :ndf:`copy('status', need_id='gd_temp__change_feature_request')` - - :need:`doc__persistency_kvs` + - :need:`doc__persistency` * - :need:`wp__requirements_feat` - :need:`gd_temp__req_feat_req` - :ndf:`copy('status', need_id='gd_temp__req_feat_req')` - - :need:`doc__persistency_requirements` + - :need:`doc__feature_persistency_requirements` * - :need:`wp__requirements_feat_aou` - :need:`gd_temp__req_aou_req` - :ndf:`copy('status', need_id='gd_temp__req_aou_req')` - - :need:`doc__persistency_requirements` + - :need:`doc__feature_persistency_requirements` * - :need:`wp__feature_arch` - :need:`gd_temp__arch_feature` @@ -65,7 +65,7 @@ Feature Safety Work Products List * - :need:`wp__requirements_inspect` - :need:`gd_chklst__req_inspection` - :ndf:`copy('status', need_id='gd_chklst__req_inspection')` - - :need:`doc__req_inspection_persistency` + - :need:`doc__feature_persistency_requirements_chklst` * - :need:`wp__sw_arch_verification` - :need:`gd_chklst__arch_inspection_checklist` diff --git a/docs/score_tools/doc_as_code.rst b/docs/score_tools/doc_as_code.rst index 59a33cfdf30..3c3faa6db37 100644 --- a/docs/score_tools/doc_as_code.rst +++ b/docs/score_tools/doc_as_code.rst @@ -15,11 +15,7 @@ .. doc_tool:: Doc-as-Code :id: doc_tool__doc_as_code :status: evaluated -<<<<<<< HEAD - :version: v2.0.0 -======= :version: v2.2.0 ->>>>>>> etas-contrib/HEAD :tcl: LOW :safety_affected: YES :security_affected: YES From 4ea4a57c54e8074547cc02b57596533f4fb4abab Mon Sep 17 00:00:00 2001 From: "markus.schu" <markus.schu@accenture.com> Date: Wed, 10 Dec 2025 11:12:44 +0100 Subject: [PATCH 046/214] update process description version to 1.4.0 resolve removed wps for build config --- MODULE.bazel | 2 +- docs/handbook/index.rst | 7 ++++ .../docs/safety_mgt/module_safety_plan.rst | 42 ------------------- .../docs/safety_mgt/module_safety_plan.rst | 7 ---- .../docs/safety_mgt/module_safety_plan.rst | 7 ---- .../docs/safety_mgt/module_safety_plan.rst | 7 ---- .../quality_management.rst | 3 -- .../safety_management.rst | 12 +++--- 8 files changed, 14 insertions(+), 73 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 75256323af8..1fe9e739e13 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -74,4 +74,4 @@ bazel_dep(name = "rules_java", version = "8.15.1") ############################################################################### bazel_dep(name = "score_tooling", version = "1.0.2") bazel_dep(name = "score_docs_as_code", version = "2.2.0") -bazel_dep(name = "score_process", version = "1.3.2") +bazel_dep(name = "score_process", version = "1.4.0") diff --git a/docs/handbook/index.rst b/docs/handbook/index.rst index 5e572a15fec..fb1d3cc5ace 100644 --- a/docs/handbook/index.rst +++ b/docs/handbook/index.rst @@ -19,6 +19,13 @@ own_application/index.rst building_simple_application/index.rst +.. document:: Handbook + :id: doc__platform_handbook + :status: valid + :safety: ASIL_B + :security: YES + :realizes: wp__platform_handbook + Handbook ======== diff --git a/docs/modules/baselibs/docs/safety_mgt/module_safety_plan.rst b/docs/modules/baselibs/docs/safety_mgt/module_safety_plan.rst index b9d3a641bd5..5b1602d5ada 100644 --- a/docs/modules/baselibs/docs/safety_mgt/module_safety_plan.rst +++ b/docs/modules/baselibs/docs/safety_mgt/module_safety_plan.rst @@ -56,9 +56,6 @@ Tailoring Additional to the tailoring in the SW platform project as defined in the :need:`doc__platform_safety_plan` we define here the additional tailoring on module level. -- Excluded for this module are additionally the following work products (and their related requirements): - - :need:`wp__module_sw_build_config` - Baselibs is a collection of libraries, so this work product is specific for every component. - Functional Safety Module Work products ====================================== @@ -231,14 +228,6 @@ Component bitmanipulation Work products List - component integration not needed (no sub-components and units are independent) - n/a - * - :need:`wp__module_sw_build_config` - - :need:`gd_temp__software_development_plan` - - :ndf:`copy('status', need_id='gd_temp__software_development_plan')` - - n/a - - `BUILD <https://github.com/eclipse-score/baselibs/blob/main/score/bitmanipulation/BUILD>`_ - - valid - - Component containers Work products List --------------------------------------- @@ -329,14 +318,6 @@ Component containers Work products List - component integration not needed (no sub-components and units are independent) - n/a - * - :need:`wp__module_sw_build_config` - - :need:`gd_temp__software_development_plan` - - :ndf:`copy('status', need_id='gd_temp__software_development_plan')` - - n/a - - `containers/BUILD <https://github.com/eclipse-score/baselibs/blob/main/score/containers/BUILD>`_ - - valid - - Component filesystem Work products List --------------------------------------- @@ -427,14 +408,6 @@ Component filesystem Work products List - component integration not needed (no sub-components and units are independent) - n/a - * - :need:`wp__module_sw_build_config` - - :need:`gd_temp__software_development_plan` - - :ndf:`copy('status', need_id='gd_temp__software_development_plan')` - - n/a - - `filesystem/BUILD <https://github.com/eclipse-score/baselibs/blob/main/score/filesystem/BUILD>`_ - - valid - - Component result Work products List --------------------------------------- @@ -525,14 +498,6 @@ Component result Work products List - component integration not needed (no sub-components and units are independent) - n/a - * - :need:`wp__module_sw_build_config` - - :need:`gd_temp__software_development_plan` - - :ndf:`copy('status', need_id='gd_temp__software_development_plan')` - - n/a - - `result/BUILD <https://github.com/eclipse-score/baselibs/blob/main/score/result/BUILD>`_ - - valid - - Component json Work products List --------------------------------------- @@ -623,13 +588,6 @@ Component json Work products List - <Link to WP> - <automatic> - * - :need:`wp__module_sw_build_config` - - :need:`gd_temp__software_development_plan` - - :ndf:`copy('status', need_id='gd_temp__software_development_plan')` - - n/a - - `json/BUILD <https://github.com/eclipse-score/baselibs/blob/main/score/json/BUILD>`_ - - valid - * - :need:`wp__sw_component_class` - :need:`tsf__trust__trustable-software` - :ndf:`copy('status', need_id='gd_guidl__component_classification')` diff --git a/docs/modules/communication/docs/safety_mgt/module_safety_plan.rst b/docs/modules/communication/docs/safety_mgt/module_safety_plan.rst index 021b3791b4f..924f352590e 100644 --- a/docs/modules/communication/docs/safety_mgt/module_safety_plan.rst +++ b/docs/modules/communication/docs/safety_mgt/module_safety_plan.rst @@ -123,13 +123,6 @@ Module Work products List - <Link to WP> - <WP status (manual)> - * - :need:`wp__module_sw_build_config` - - :need:`gd_temp__software_development_plan` - - :ndf:`copy('status', need_id='gd_temp__software_development_plan')` - - n/a - - `com/BUILD <https://github.com/eclipse-score/communication/blob/main/score/mw/com/BUILD>`_ - - valid - * - :need:`wp__module_safety_manual` - :need:`gd_temp__safety_manual` - :ndf:`copy('status', need_id='gd_temp__safety_manual')` diff --git a/docs/modules/feo/docs/safety_mgt/module_safety_plan.rst b/docs/modules/feo/docs/safety_mgt/module_safety_plan.rst index a7ae6d21c22..30f3f3c8a0b 100644 --- a/docs/modules/feo/docs/safety_mgt/module_safety_plan.rst +++ b/docs/modules/feo/docs/safety_mgt/module_safety_plan.rst @@ -118,13 +118,6 @@ FEO Module Work Products List - <Link to WP> - <WP status (manual)> - * - :need:`wp__module_sw_build_config` - - :need:`gd_temp__software_development_plan` - - :ndf:`copy('status', need_id='gd_temp__software_development_plan')` - - https://github.com/eclipse-score/score/issues/1662 - - <Link to WP> - - <automated> - * - :need:`wp__module_safety_manual` - :need:`gd_temp__safety_manual` - :ndf:`copy('status', need_id='gd_temp__safety_manual')` diff --git a/docs/modules/persistency/docs/safety_mgt/module_safety_plan.rst b/docs/modules/persistency/docs/safety_mgt/module_safety_plan.rst index b18e7a8e616..18977d109ce 100644 --- a/docs/modules/persistency/docs/safety_mgt/module_safety_plan.rst +++ b/docs/modules/persistency/docs/safety_mgt/module_safety_plan.rst @@ -117,13 +117,6 @@ Module Workproducts List - <Link to WP> - <WP status (manual)> - * - :need:`wp__module_sw_build_config` - - `gd_temp__software_development_plan` - - `copy('status', need_id='doc__software_development_plan')` - - <Link to issue> - - <Link to WP> - - <automated> - * - :need:`wp__module_safety_manual` - :need:`gd_temp__safety_manual` - :ndf:`copy('status', need_id='gd_temp__safety_manual')` diff --git a/docs/platform_management_plan/quality_management.rst b/docs/platform_management_plan/quality_management.rst index fac7d1161b5..b276c4a8fb1 100644 --- a/docs/platform_management_plan/quality_management.rst +++ b/docs/platform_management_plan/quality_management.rst @@ -347,9 +347,6 @@ None * - :need:`wp__platform_safety_package` - :ref:`project_documents_list` - * - :need:`wp__platform_sw_build_config` - - :ref:`project_documents_list` - * - :need:`wp__platform_sw_release_note` - :ref:`project_documents_list` diff --git a/docs/platform_management_plan/safety_management.rst b/docs/platform_management_plan/safety_management.rst index 788d61af019..9ca64b7e4d9 100644 --- a/docs/platform_management_plan/safety_management.rst +++ b/docs/platform_management_plan/safety_management.rst @@ -13,11 +13,11 @@ # ******************************************************************************* .. document:: Platform Safety Plan - :id: doc__platform_safety_plan + :id: doc__score_platform_safety_plan :status: draft :safety: ASIL_B :security: NO - :realizes: wp__platform_safety_plan,wp__tailoring + :realizes: wp__platform_safety_plan, wp__tailoring :tags: platform_management Safety management / Platform Safety Plan @@ -366,10 +366,10 @@ Functional Safety/Security Management SW Platform Work Products - `Process community planning <https://github.com/orgs/eclipse-score/projects/21>`_ - see planning board - * - :need:`wp__platform_sw_build_config` - - <Process status> - - <Link to WP> - - <automated> + * - :need:`wp__platform_handbook` + - :ndf:`copy('status', need_id='wf__rel_platform_handbook')` + - :need:`doc__platform_handbook` + - :ndf:`copy('status', need_id='doc__platform_handbook')` * - :need:`wp__platform_sw_release_note` - :ndf:`copy('status', need_id='wf__rel_platform_rel_note')` From 89e75bd11360eae7baf4a4c6ae4e1f51a56b52c6 Mon Sep 17 00:00:00 2001 From: "markus.schu" <markus.schu@accenture.com> Date: Wed, 10 Dec 2025 19:01:57 +0100 Subject: [PATCH 047/214] bugfix broken link --- .../orchestrator/docs/safety_mgt/module_safety_plan.rst | 7 ------- 1 file changed, 7 deletions(-) diff --git a/docs/modules/orchestrator/docs/safety_mgt/module_safety_plan.rst b/docs/modules/orchestrator/docs/safety_mgt/module_safety_plan.rst index c430dbdeddc..47a2e9e3ebc 100644 --- a/docs/modules/orchestrator/docs/safety_mgt/module_safety_plan.rst +++ b/docs/modules/orchestrator/docs/safety_mgt/module_safety_plan.rst @@ -118,13 +118,6 @@ Module Work products List - <Link to WP> - <WP status (manual)> - * - :need:`wp__module_sw_build_config` - - :need:`gd_temp__software_development_plan` - - `copy('status', need_id='gd_temp__software_development_plan')` - - <Link to issue> - - <Link to WP> - - <automated> - * - :need:`wp__module_safety_manual` - :need:`gd_temp__safety_manual` - :ndf:`copy('status', need_id='gd_temp__safety_manual')` From 35d2b6144d461b89cde79045eae00c51570c60b5 Mon Sep 17 00:00:00 2001 From: "markus.schu" <markus.schu@accenture.com> Date: Fri, 12 Dec 2025 09:45:35 +0100 Subject: [PATCH 048/214] update fed module safety plan add link to current release notes clarify oss qualification --- .../modules/feo/docs/release/release_note.rst | 72 ++----------------- .../docs/safety_mgt/module_safety_plan.rst | 34 ++++----- 2 files changed, 19 insertions(+), 87 deletions(-) diff --git a/docs/modules/feo/docs/release/release_note.rst b/docs/modules/feo/docs/release/release_note.rst index 4d8ddeab94f..e5b185db4e3 100644 --- a/docs/modules/feo/docs/release/release_note.rst +++ b/docs/modules/feo/docs/release/release_note.rst @@ -14,7 +14,7 @@ .. document:: FEO Module Release Note :id: doc__feo_release_note - :status: draft + :status: valid :security: NO :safety: ASIL_B :realizes: wp__module_sw_release_note @@ -25,70 +25,6 @@ FEO Module Release Note ======================= -| Module Name: FEO -| Release Tag: vX.Y.Z -| Origin Release Tag: vU.V.W -| Release Commit Hash: a1b2c3d4e5f6g7h8i9j0 -| Release Date: YYYY-MM-DD -| -| Overview -| -------- -| -| This document provides an overview of the changes, improvements, and bug fixes included in the software module release version vX.Y.Z -| as compared to the module's origin release (which is usually the previous release). -| -| Disclaimer -| ---------- -| This release note does not "release for production", as it does not come with a safety argumentation and a performed safety assessment. -| The work products compiled in the safety package are created with care according to a process satisfying standards, but the as the project, -| being a non-profit and open source organization, can not take over any liability for its content. -| -| New Features -| ------------ -| -| - **Feature 1**: Brief description of the new feature. -| - **Feature 2**: Brief description of the new feature. -| - **Feature 3**: Brief description of the new feature. -| -| Improvements -| ------------ -| -| - **Improvement 1**: Brief description of the improvement. -| - **Improvement 2**: Brief description of the improvement. -| - **Improvement 3**: Brief description of the improvement. -| -| Bug Fixes -| --------- -| -| - **Bug 1**: Brief description of the bug fix. -| - **Bug 2**: Brief description of the bug fix. -| - **Bug 3**: Brief description of the bug fix. -| -| Compatibility -| ------------- -| -| - **Dependencies**: List any dependencies and their versions. -| -| Performed Verification -| ---------------------- -| This release note is based on the verification as documented in module verification report -| :need:`doc__feo_verification_report`. -| -| Known Issues -| ------------ -| -| - **Issue 1**: Brief description of the known issue. Justification regarding safety impact. -| - **Issue 2**: Brief description of the known issue. Justification regarding safety impact. -| - **Issue 3**: Brief description of the known issue. Justification regarding safety impact. -| -| Upgrade Instructions -| -------------------- -| -| 1. **Step 1**: Description of the first step. -| 2. **Step 2**: Description of the second step. -| 3. **Step 3**: Description of the third step. -| -| Contact Information -| ------------------- -| -| For any questions or support, please contact the *Project lead* or raise an issue/discussion. +The release notes for FEO module version 1.0.2 can be found at: + +`v1.0.2 <https://github.com/eclipse-score/feo/releases/tag/v1.0.2>`_ diff --git a/docs/modules/feo/docs/safety_mgt/module_safety_plan.rst b/docs/modules/feo/docs/safety_mgt/module_safety_plan.rst index 30f3f3c8a0b..220ddc2cf03 100644 --- a/docs/modules/feo/docs/safety_mgt/module_safety_plan.rst +++ b/docs/modules/feo/docs/safety_mgt/module_safety_plan.rst @@ -229,18 +229,14 @@ FEO Component Work Products List - <Link to WP> - <automated> - * - :need:`wp__sw_component_class` - - :need:`gd_guidl__component_classification` - - :ndf:`copy('status', need_id='gd_guidl__component_classification')` - - https://github.com/eclipse-score/score/issues/1679 - - :need:`doc__feo_comp_class` - - :ndf:`copy('status', need_id='doc__feo_comp_class')` -Note: In case the component is a new development, :need:`wp__sw_component_class` shall be removed from the above list (and also from the folders). -In case an OSS element is used in the module, part 6 has to be filled out, depending on the component classification results. +As feo is using score-crates as OSS component, the following section should be filled out +accordingly. +This section is currently only a placeholder and needs to be adapted based on the progress of the +OSS qualification. -OSS (sub-)component qualification plan -====================================== +OSS score-crates component qualification plan +============================================= For the selected OSS component the following work products will be implemented (and why): @@ -257,27 +253,27 @@ If the OSS element is classified as a * - :need:`wp__requirements_comp` - <Link to issue> - - Always needed (for Q and QR classification) and also improves process Id 2 + - Always needed (for Q and QR classification) and also improves process Id 2. * - :need:`wp__requirements_comp_aou` - <Link to issue> - - Always needed (for Q and QR classification) and also improves process Id 5 + - Always needed (for Q and QR classification) and also improves process Id 5. * - :need:`wp__requirements_inspect` - n/a - - Checklist used in Pull Request Review + - Checklist used in Pull Request Review. * - :need:`wf__cr_mt_comparch` - <Link to issue> - - <Reasoning for tailoring, needed for example in case of deficits in process Id 3&4 and complexity Ids 1&4> + - <Reasoning for tailoring, needed for example in case of deficits in process Id 3&4 and complexity Ids 1&4>. * - :need:`wp__sw_component_fmea` - <Link to issue> - - <Reasoning for tailoring, could help arguing too high cyclomatic complexity covered by safety mechanisms> + - <Reasoning for tailoring, could help arguing too high cyclomatic complexity covered by safety mechanisms>. * - :need:`wp__sw_arch_verification` - <Link to issue> - - <Reasoning for tailoring, needed if also wf__cr_mt_comparch is required> + - <Reasoning for tailoring, needed if also wf__cr_mt_comparch is required>. * - :need:`wp__sw_implementation` - n/a @@ -285,15 +281,15 @@ If the OSS element is classified as a * - :need:`wp__verification_sw_unit_test` - <Link to issue> - - <Reasoning for tailoring, can improve deficits in process Id 6 and complexity Id 3> + - <Reasoning for tailoring, can improve deficits in process Id 6 and complexity Id 3>. * - :need:`wp__sw_implementation_inspection` - <Link to issue> - - <Reasoning for tailoring, can improve deficits in process Id 6 and complexity Id 2> + - <Reasoning for tailoring, can improve deficits in process Id 6 and complexity Id 2>. * - :need:`wp__verification_comp_int_test` - <Link to issue> - - Always needed (for Q and QR classification) + - Always needed (for Q and QR classification). * - :need:`wp__sw_component_class` - <Link to issue> From bb5ed090d2f3770da3d5de216ed0a62546e8d75f Mon Sep 17 00:00:00 2001 From: aschemmel-git <alexander.schemmel@bmw.de> Date: Wed, 10 Dec 2025 16:32:22 +0100 Subject: [PATCH 049/214] Modules safety plans status updates Resolves: #1304 --- docs/index.rst | 2 +- .../docs/safety_mgt/module_safety_plan.rst | 212 ++++++------------ .../docs/requirements/aou_req.rst | 3 + .../docs/safety_mgt/module_safety_plan.rst | 105 +++++---- .../docs/safety_mgt/module_safety_plan.rst | 105 +++------ .../feo/feo/docs/requirements/aou_req.rst | 4 +- .../docs/safety_mgt/module_safety_plan.rst | 105 +++------ .../kvs/docs/architecture/index.rst | 3 + .../kvs/docs/requirements/index.rst | 6 +- .../safety_management.rst | 2 +- 10 files changed, 195 insertions(+), 352 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 4adb40408ca..870ba5ef98b 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -94,7 +94,7 @@ Project structure and processes ^^^ Read about our project and organization structure in the :ref:`Project Handbook <pmp>`. - And learn how we deal with :need:`doc__platform_safety_plan` or care about :need:`doc__verification_plan`. + And learn how we deal with :need:`doc__score_platform_safety_plan` or care about :need:`doc__verification_plan`. .. dropdown:: Click to see the complete sitemap diff --git a/docs/modules/baselibs/docs/safety_mgt/module_safety_plan.rst b/docs/modules/baselibs/docs/safety_mgt/module_safety_plan.rst index 5b1602d5ada..d99e5a6ef4b 100644 --- a/docs/modules/baselibs/docs/safety_mgt/module_safety_plan.rst +++ b/docs/modules/baselibs/docs/safety_mgt/module_safety_plan.rst @@ -28,7 +28,7 @@ Module Safety Plan Functional Safety Management Context ==================================== -This Safety Plan adds to the :need:`doc__platform_safety_plan` all the module development relevant work products needed for ISO 26262 conformity. +This Safety Plan adds to the :need:`doc__score_platform_safety_plan` all the module development relevant work products needed for ISO 26262 conformity. Functional Safety Management Scope ================================== @@ -54,7 +54,7 @@ Functional Safety Management Roles Tailoring ========= -Additional to the tailoring in the SW platform project as defined in the :need:`doc__platform_safety_plan` we define here the additional tailoring on module level. +Additional to the tailoring in the SW platform project as defined in the :need:`doc__score_platform_safety_plan` we define here the additional tailoring on module level. Functional Safety Module Work products ====================================== @@ -70,72 +70,52 @@ Module Work products List * - Work product Id - Link to process - Process status - - Link to issue - Link to WP - - WP status * - :need:`wp__module_safety_plan` - :need:`gd_guidl__saf_plan_definitions` - :ndf:`copy('status', need_id='gd_guidl__saf_plan_definitions')` - - `#1255 <https://github.com/eclipse-score/score/issues/1255>`_ - this document - - see above * - :need:`wp__module_safety_package` - :need:`gd_guidl__saf_package` - :ndf:`copy('status', need_id='gd_guidl__saf_package')` - - `#1255 <https://github.com/eclipse-score/score/issues/1255>`_ - this document (including the linked documentation) - - see above (and below) * - :need:`wp__fdr_reports` (module Safety Plan) - :need:`gd_chklst__safety_plan` - :ndf:`copy('status', need_id='gd_chklst__safety_plan')` - - `#1255 <https://github.com/eclipse-score/score/issues/1255>`_ - :need:`doc__baselibs_safety_plan_fdr` - - :ndf:`copy('status', need_id='doc__baselibs_safety_plan_fdr')` * - :need:`wp__fdr_reports` (module Safety Package) - :need:`gd_chklst__safety_package` - :ndf:`copy('status', need_id='gd_chklst__safety_package')` - - `#1255 <https://github.com/eclipse-score/score/issues/1255>`_ - :need:`doc__baselibs_safety_package_fdr` - - :ndf:`copy('status', need_id='doc__baselibs_safety_package_fdr')` * - :need:`wp__fdr_reports` (module's Safety Analyses & DFA) - - Safety Analysis FDR tbd - - <automated> - - <Link to issue> + - :need:`gd_chklst__safety_analysis` + - :ndf:`copy('status', need_id='gd_chklst__safety_analysis')` - <Link to WP> - - <automated> * - :need:`wp__audit_report` - performed by external experts - n/a - - `#77 <https://github.com/eclipse-score/process_description/issues/77>`_ - <Link to WP> - - <WP status (manual)> * - :need:`wp__module_safety_manual` - :need:`gd_temp__safety_manual` - :ndf:`copy('status', need_id='gd_temp__safety_manual')` - - `#1255 <https://github.com/eclipse-score/score/issues/1255>`_ - :need:`doc__baselibs_safety_manual` - - :ndf:`copy('status', need_id='doc__baselibs_safety_manual')` * - :need:`wp__verification_module_ver_report` - :need:`gd_temp__mod_ver_report` - :ndf:`copy('status', need_id='gd_temp__mod_ver_report')` - - `#1255 <https://github.com/eclipse-score/score/issues/1255>`_ - :need:`doc__baselibs_verification_report` - - :ndf:`copy('status', need_id='doc__baselibs_verification_report')` * - :need:`wp__module_sw_release_note` - :need:`gd_temp__rel_mod_rel_note` - :ndf:`copy('status', need_id='gd_temp__rel_mod_rel_note')` - - `#1255 <https://github.com/eclipse-score/score/issues/1255>`_ - :need:`doc__baselibs_release_note` - - :ndf:`copy('status', need_id='doc__baselibs_release_note')` Component bitmanipulation Work products List @@ -147,86 +127,62 @@ Component bitmanipulation Work products List * - Work product Id - Link to process - Process status - - Link to issue - Link to WP - - WP/doc status * - :need:`wp__requirements_comp` - :need:`gd_temp__req_comp_req` - :ndf:`copy('status', need_id='gd_temp__req_comp_req')` - - `#1719 <https://github.com/eclipse-score/score/issues/1719>`_ - :need:`doc__bitmanipulation_requirements` - - :ndf:`copy('status', need_id='doc__bitmanipulation_requirements')` * - :need:`wp__requirements_comp_aou` - :need:`gd_temp__req_aou_req` - :ndf:`copy('status', need_id='gd_temp__req_aou_req')` - - <Link to issue> - :need:`doc__bitmanipulation_requirements` - - :ndf:`copy('status', need_id='doc__bitmanipulation_requirements')` * - :need:`wp__requirements_inspect` - :need:`gd_chklst__req_inspection` - :ndf:`copy('status', need_id='gd_chklst__req_inspection')` - - <Link to issue> - <Link to WP> - - <automated> * - :need:`wp__component_arch` - :need:`gd_temp__arch_comp` - :ndf:`copy('status', need_id='gd_temp__arch_comp')` - - `#1822 <https://github.com/eclipse-score/score/issues/1822>`_ - :need:`doc__bitmanipulation_architecture` - - :ndf:`copy('status', need_id='doc__bitmanipulation_architecture')` * - :need:`wp__sw_arch_verification` - :need:`gd_chklst__arch_inspection_checklist` - :ndf:`copy('status', need_id='gd_chklst__arch_inspection_checklist')` - - <Link to issue> - <Link to WP> - - <automated> * - :need:`wp__sw_component_fmea` - :need:`gd_temp__comp_saf_fmea` - :ndf:`copy('status', need_id='gd_temp__comp_saf_fmea')` - - <Link to issue> - :need:`doc__bitmanipulation_fmea` - - :ndf:`copy('status', need_id='doc__bitmanipulation_fmea')` * - :need:`wp__sw_component_dfa` - :need:`gd_temp__comp_saf_dfa` - :ndf:`copy('status', need_id='gd_temp__comp_saf_dfa')` - - <Link to issue> - :need:`doc__bitmanipulation_dfa` - - :ndf:`copy('status', need_id='doc__bitmanipulation_dfa')` * - :need:`wp__sw_implementation` - :need:`gd_guidl__implementation` - :ndf:`copy('status', need_id='gd_guidl__implementation')` - - n/a - `.h/.cpp <https://github.com/eclipse-score/baselibs/tree/main/score/bitmanipulation>`_, `design <https://github.com/eclipse-score/baselibs/tree/main/score/bitmanipulation/design>`_ - - valid * - :need:`wp__verification_sw_unit_test` - :need:`gd_guidl__verification_guide` - :ndf:`copy('status', need_id='gd_guidl__verification_guide')` - - n/a - `test.cpp <https://github.com/eclipse-score/baselibs/tree/main/score/bitmanipulation>`_ - - valid * - :need:`wp__sw_implementation_inspection` - :need:`gd_chklst__impl_inspection_checklist` - :ndf:`copy('status', need_id='gd_chklst__impl_inspection_checklist')` - - <Link to issue> - <Link to WP> - - <manual> * - :need:`wp__verification_comp_int_test` - :need:`gd_guidl__verification_guide` - :ndf:`copy('status', need_id='gd_guidl__verification_guide')` - - n/a - component integration not needed (no sub-components and units are independent) - - n/a Component containers Work products List --------------------------------------- @@ -237,86 +193,62 @@ Component containers Work products List * - Work product Id - Link to process - Process status - - Link to issue - Link to WP - - WP/doc status * - :need:`wp__requirements_comp` - :need:`gd_temp__req_comp_req` - :ndf:`copy('status', need_id='gd_temp__req_comp_req')` - - `#1718 <https://github.com/eclipse-score/score/issues/1718>`_ - :need:`doc__containers_lib_requirements` - - :ndf:`copy('status', need_id='doc__containers_lib_requirements')` * - :need:`wp__requirements_comp_aou` - :need:`gd_temp__req_aou_req` - :ndf:`copy('status', need_id='gd_temp__req_aou_req')` - - <Link to issue> - :need:`doc__containers_lib_requirements` - - :ndf:`copy('status', need_id='doc__containers_lib_requirements')` * - :need:`wp__requirements_inspect` - :need:`gd_chklst__req_inspection` - :ndf:`copy('status', need_id='gd_chklst__req_inspection')` - - <Link to issue> - <Link to WP> - - <automated> * - :need:`wp__component_arch` - :need:`gd_temp__arch_comp` - :ndf:`copy('status', need_id='gd_temp__arch_comp')` - - `#1824 <https://github.com/eclipse-score/score/issues/1824>`_ - :need:`doc__containers_architecture` - - :ndf:`copy('status', need_id='doc__containers_architecture')` * - :need:`wp__sw_arch_verification` - :need:`gd_chklst__arch_inspection_checklist` - :ndf:`copy('status', need_id='gd_chklst__arch_inspection_checklist')` - - <Link to issue> - <Link to WP> - - <automated> * - :need:`wp__sw_component_fmea` - :need:`gd_temp__comp_saf_fmea` - :ndf:`copy('status', need_id='gd_temp__comp_saf_fmea')` - - <Link to issue> - :need:`doc__containers_fmea` - - :ndf:`copy('status', need_id='doc__containers_fmea')` * - :need:`wp__sw_component_dfa` - :need:`gd_temp__comp_saf_dfa` - :ndf:`copy('status', need_id='gd_temp__comp_saf_dfa')` - - <Link to issue> - :need:`doc__containers_dfa` - - :ndf:`copy('status', need_id='doc__containers_dfa')` * - :need:`wp__sw_implementation` - :need:`gd_guidl__implementation` - :ndf:`copy('status', need_id='gd_guidl__implementation')` - - n/a - `containers .h/.cpp <https://github.com/eclipse-score/baselibs/tree/main/score/containers>`_, `containers/design <https://github.com/eclipse-score/baselibs/tree/main/score/containers/design>`_ - - draft * - :need:`wp__verification_sw_unit_test` - :need:`gd_guidl__verification_guide` - :ndf:`copy('status', need_id='gd_guidl__verification_guide')` - - n/a - `containers/test.cpp <https://github.com/eclipse-score/baselibs/tree/main/score/containers>`_ - - valid * - :need:`wp__sw_implementation_inspection` - :need:`gd_chklst__impl_inspection_checklist` - :ndf:`copy('status', need_id='gd_chklst__impl_inspection_checklist')` - - <Link to issue> - <Link to WP> - - <manual> * - :need:`wp__verification_comp_int_test` - :need:`gd_guidl__verification_guide` - :ndf:`copy('status', need_id='gd_guidl__verification_guide')` - - n/a - component integration not needed (no sub-components and units are independent) - - n/a Component filesystem Work products List --------------------------------------- @@ -327,89 +259,65 @@ Component filesystem Work products List * - Work product Id - Link to process - Process status - - Link to issue - Link to WP - - WP/doc status * - :need:`wp__requirements_comp` - :need:`gd_temp__req_comp_req` - :ndf:`copy('status', need_id='gd_temp__req_comp_req')` - - `#1720 <https://github.com/eclipse-score/score/issues/1720>`_ - :need:`doc__filesystem_lib_requirements` - - :ndf:`copy('status', need_id='doc__filesystem_lib_requirements')` * - :need:`wp__requirements_comp_aou` - :need:`gd_temp__req_aou_req` - :ndf:`copy('status', need_id='gd_temp__req_aou_req')` - - <Link to issue> - :need:`doc__filesystem_lib_requirements` - - :ndf:`copy('status', need_id='doc__filesystem_lib_requirements')` * - :need:`wp__requirements_inspect` - :need:`gd_chklst__req_inspection` - :ndf:`copy('status', need_id='gd_chklst__req_inspection')` - - <Link to issue> - <Link to WP> - - <automated> * - :need:`wp__component_arch` - :need:`gd_temp__arch_comp` - :ndf:`copy('status', need_id='gd_temp__arch_comp')` - - `#1823 <https://github.com/eclipse-score/score/issues/1823>`_ - :need:`doc__filesystem_architecture` - - :ndf:`copy('status', need_id='doc__filesystem_architecture')` * - :need:`wp__sw_arch_verification` - :need:`gd_chklst__arch_inspection_checklist` - :ndf:`copy('status', need_id='gd_chklst__arch_inspection_checklist')` - - <Link to issue> - <Link to WP> - - <automated> * - :need:`wp__sw_component_fmea` - :need:`gd_temp__comp_saf_fmea` - :ndf:`copy('status', need_id='gd_temp__comp_saf_fmea')` - - <Link to issue> - :need:`doc__filesystem_fmea` - - :ndf:`copy('status', need_id='doc__filesystem_fmea')` * - :need:`wp__sw_component_dfa` - :need:`gd_temp__comp_saf_dfa` - :ndf:`copy('status', need_id='gd_temp__comp_saf_dfa')` - - <Link to issue> - :need:`doc__filesystem_dfa` - - :ndf:`copy('status', need_id='doc__filesystem_dfa')` * - :need:`wp__sw_implementation` - :need:`gd_guidl__implementation` - :ndf:`copy('status', need_id='gd_guidl__implementation')` - - n/a - `filesystem .h/.cpp <https://github.com/eclipse-score/baselibs/tree/main/score/filesystem>`_, `filesystem/design <https://github.com/eclipse-score/baselibs/tree/main/score/filesystem/design>`_ - - valid * - :need:`wp__verification_sw_unit_test` - :need:`gd_guidl__verification_guide` - :ndf:`copy('status', need_id='gd_guidl__verification_guide')` - - n/a - `filesystem/test.cpp <https://github.com/eclipse-score/baselibs/tree/main/score/filesystem>`_ - - valid * - :need:`wp__sw_implementation_inspection` - :need:`gd_chklst__impl_inspection_checklist` - :ndf:`copy('status', need_id='gd_chklst__impl_inspection_checklist')` - - <Link to issue> - <Link to WP> - - <manual> * - :need:`wp__verification_comp_int_test` - :need:`gd_guidl__verification_guide` - :ndf:`copy('status', need_id='gd_guidl__verification_guide')` - - n/a - component integration not needed (no sub-components and units are independent) - - n/a Component result Work products List ---------------------------------------- +----------------------------------- .. list-table:: Component result Work products :header-rows: 1 @@ -417,89 +325,65 @@ Component result Work products List * - Work product Id - Link to process - Process status - - Link to issue - Link to WP - - WP/doc status * - :need:`wp__requirements_comp` - :need:`gd_temp__req_comp_req` - :ndf:`copy('status', need_id='gd_temp__req_comp_req')` - - n/a - :need:`doc__result_lib_requirements` - - :ndf:`copy('status', need_id='doc__result_lib_requirements')` * - :need:`wp__requirements_comp_aou` - :need:`gd_temp__req_aou_req` - :ndf:`copy('status', need_id='gd_temp__req_aou_req')` - - <Link to issue> - :need:`doc__result_lib_requirements` - - :ndf:`copy('status', need_id='doc__result_lib_requirements')` * - :need:`wp__requirements_inspect` - :need:`gd_chklst__req_inspection` - :ndf:`copy('status', need_id='gd_chklst__req_inspection')` - - <Link to issue> - <Link to WP> - - <automated> * - :need:`wp__component_arch` - :need:`gd_temp__arch_comp` - :ndf:`copy('status', need_id='gd_temp__arch_comp')` - - `#1821 <https://github.com/eclipse-score/score/issues/1821>`_ - :need:`doc__result_architecture` - - :ndf:`copy('status', need_id='doc__result_architecture')` * - :need:`wp__sw_arch_verification` - :need:`gd_chklst__arch_inspection_checklist` - :ndf:`copy('status', need_id='gd_chklst__arch_inspection_checklist')` - - <Link to issue> - <Link to WP> - - <automated> * - :need:`wp__sw_component_fmea` - :need:`gd_temp__comp_saf_fmea` - :ndf:`copy('status', need_id='gd_temp__comp_saf_fmea')` - - <Link to issue> - :need:`doc__result_fmea` - - :ndf:`copy('status', need_id='doc__result_fmea')` * - :need:`wp__sw_component_dfa` - :need:`gd_temp__comp_saf_dfa` - :ndf:`copy('status', need_id='gd_temp__comp_saf_dfa')` - - <Link to issue> - :need:`doc__result_dfa` - - :ndf:`copy('status', need_id='doc__result_dfa')` * - :need:`wp__sw_implementation` - :need:`gd_guidl__implementation` - :ndf:`copy('status', need_id='gd_guidl__implementation')` - - n/a - `result .h/.cpp <https://github.com/eclipse-score/baselibs/tree/main/score/result>`_, `result/design <https://github.com/eclipse-score/baselibs/tree/main/score/result/design>`_ - - draft * - :need:`wp__verification_sw_unit_test` - :need:`gd_guidl__verification_guide` - :ndf:`copy('status', need_id='gd_guidl__verification_guide')` - - n/a - `result/test.cpp <https://github.com/eclipse-score/baselibs/tree/main/score/result>`_ - - valid * - :need:`wp__sw_implementation_inspection` - :need:`gd_chklst__impl_inspection_checklist` - :ndf:`copy('status', need_id='gd_chklst__impl_inspection_checklist')` - - <Link to issue> - <Link to WP> - - <manual> * - :need:`wp__verification_comp_int_test` - :need:`gd_guidl__verification_guide` - :ndf:`copy('status', need_id='gd_guidl__verification_guide')` - - n/a - component integration not needed (no sub-components and units are independent) - - n/a Component json Work products List ---------------------------------------- +--------------------------------- .. list-table:: Component json Work products :header-rows: 1 @@ -507,96 +391,128 @@ Component json Work products List * - Work product Id - Link to process - Process status - - Link to issue - Link to WP - - WP/doc status * - :need:`wp__requirements_comp` - :need:`gd_temp__req_comp_req` - :ndf:`copy('status', need_id='gd_temp__req_comp_req')` - - `#1432 <https://github.com/eclipse-score/score/issues/1432>`_ - :need:`doc__json_requirements` - - :ndf:`copy('status', need_id='doc__json_requirements')` * - :need:`wp__requirements_comp_aou` - :need:`gd_temp__req_aou_req` - :ndf:`copy('status', need_id='gd_temp__req_aou_req')` - - <Link to issue> - :need:`doc__json_requirements` - - :ndf:`copy('status', need_id='doc__json_requirements')` * - :need:`wp__requirements_inspect` - :need:`gd_chklst__req_inspection` - :ndf:`copy('status', need_id='gd_chklst__req_inspection')` - - <Link to issue> - <Link to WP> - - <automated> * - :need:`wp__component_arch` - :need:`gd_temp__arch_comp` - :ndf:`copy('status', need_id='gd_temp__arch_comp')` - - n/a - :need:`doc__json_architecture` - - :ndf:`copy('status', need_id='doc__json_architecture')` * - :need:`wp__sw_arch_verification` - :need:`gd_chklst__arch_inspection_checklist` - :ndf:`copy('status', need_id='gd_chklst__arch_inspection_checklist')` - - <Link to issue> - <Link to WP> - - <automated> * - :need:`wp__sw_component_fmea` - :need:`gd_temp__comp_saf_fmea` - :ndf:`copy('status', need_id='gd_temp__comp_saf_fmea')` - - <Link to issue> - :need:`doc__json_fmea` - - :ndf:`copy('status', need_id='doc__json_fmea')` * - :need:`wp__sw_component_dfa` - :need:`gd_temp__comp_saf_dfa` - :ndf:`copy('status', need_id='gd_temp__comp_saf_dfa')` - - <Link to issue> - :need:`doc__json_dfa` - - :ndf:`copy('status', need_id='doc__json_dfa')` * - :need:`wp__sw_implementation` - :need:`gd_guidl__implementation` - :ndf:`copy('status', need_id='gd_guidl__implementation')` - - n/a - `json .h/.cpp <https://github.com/eclipse-score/baselibs/tree/main/score/json>`_, `json/design <https://github.com/eclipse-score/baselibs/tree/main/score/json/detailed_design>`_ - - valid * - :need:`wp__verification_sw_unit_test` - :need:`gd_guidl__verification_guide` - :ndf:`copy('status', need_id='gd_guidl__verification_guide')` - - n/a - `json/test.cpp <https://github.com/eclipse-score/baselibs/tree/main/score/json>`_ - - valid * - :need:`wp__sw_implementation_inspection` - :need:`gd_chklst__impl_inspection_checklist` - :ndf:`copy('status', need_id='gd_chklst__impl_inspection_checklist')` - - <Link to issue> - <Link to WP> - - <manual> * - :need:`wp__verification_comp_int_test` - :need:`gd_guidl__verification_guide` - :ndf:`copy('status', need_id='gd_guidl__verification_guide')` - - <Link to issue> - <Link to WP> - - <automatic> * - :need:`wp__sw_component_class` - :need:`tsf__trust__trustable-software` - :ndf:`copy('status', need_id='gd_guidl__component_classification')` - - `#1460 <https://github.com/eclipse-score/score/issues/1460>`_ - `TSF Report on nlohman/json <https://eclipse-score.github.io/inc_nlohmann_json/main/report.html>`_ - - draft All other components of the baselibs module as released in the :need:`doc__baselibs_release_note` are not planned to be qualifiable stand alone (as SEooC), but only in context, for example as they are used in other S-CORE modules (e.g. communication). To be qualifiable in context those come with unit tests, are implemented according to defined coding and detailed design guidelines, achieve the required structural coverage and fulfill the AoUs of the reference OS (e.g. don’t use banned functions). + +Module Safety Package +===================== + +To create the safety package (according to :need:`gd_guidl__saf_package`) the following +documents and work products status have to go to "valid" (after the relevant verification were performed). + +Module Documents Status +----------------------- + +For all the work product documents the status can be seen by following the "Link to WP". +A summary of the status is also documented in the project's documentation management plan. + +See :ref:`documents_docs_modules_baselibs_docs` + +Component Documents Status +-------------------------- + +For all the work product documents the status can be seen by following the "Link to WP". +A summary of the status is also documented in the project's documentation management plan. + +See :ref:`documents_docs_modules_baselibs_components` + +Component Requirements Status +----------------------------- + +.. needtable:: + :filter: docname is not None and "baselibs" in docname and "requirements" in docname + :style: table + :types: comp_req + :tags: baselibs + :columns: id;status;tags + :colwidths: 25,25,25 + :sort: title + +Component AoU Status +-------------------- + +.. needtable:: + :filter: docname is not None and "baselibs" in docname and "requirements" in docname + :style: table + :types: aou_req + :tags: baselibs + :columns: id;status;tags + :colwidths: 25,25,25 + :sort: title + +Component Architecture Status +----------------------------- + +.. needtable:: + :filter: docname is not None and "baselibs" in docname and "architecture" in docname + :style: table + :types: comp_arc_sta; comp_arc_dyn + :tags: baselibs + :columns: id;status;tags + :colwidths: 25,25,25 + :sort: title diff --git a/docs/modules/communication/docs/requirements/aou_req.rst b/docs/modules/communication/docs/requirements/aou_req.rst index 7c8517a83de..6f59e31a898 100644 --- a/docs/modules/communication/docs/requirements/aou_req.rst +++ b/docs/modules/communication/docs/requirements/aou_req.rst @@ -328,3 +328,6 @@ Assumptions of Use It shall be ensured that all safety relevant events/fields in the service type, are the same in all configurations. + +.. needextend:: "__communication_" in id + :+tags: communication diff --git a/docs/modules/communication/docs/safety_mgt/module_safety_plan.rst b/docs/modules/communication/docs/safety_mgt/module_safety_plan.rst index 924f352590e..c04a89ac939 100644 --- a/docs/modules/communication/docs/safety_mgt/module_safety_plan.rst +++ b/docs/modules/communication/docs/safety_mgt/module_safety_plan.rst @@ -29,7 +29,7 @@ Module Safety Plan Functional Safety Management Context ==================================== -This Safety Plan adds to the :need:`doc__platform_safety_plan` all the module development relevant work products needed for ISO 26262 conformity. +This Safety Plan adds to the :need:`doc__score_platform_safety_plan` all the module development relevant work products needed for ISO 26262 conformity. Functional Safety Management Scope ================================== @@ -55,7 +55,7 @@ Functional Safety Management Roles Tailoring ========= -Additional to the tailoring in the SW platform project as defined in the :need:`doc__platform_safety_plan` we define here the additional tailoring on module level. +Additional to the tailoring in the SW platform project as defined in the :need:`doc__score_platform_safety_plan` we define here the additional tailoring on module level. - Excluded for this module are additionally the following work products (and their related requirements): @@ -77,72 +77,52 @@ Module Work products List * - Work product Id - Link to process - Process status - - Link to issue - Link to WP - - WP status * - :need:`wp__module_safety_plan` - :need:`gd_guidl__saf_plan_definitions` - :ndf:`copy('status', need_id='gd_guidl__saf_plan_definitions')` - - n/a - this document - - see above * - :need:`wp__module_safety_package` - :need:`gd_guidl__saf_package` - :ndf:`copy('status', need_id='gd_guidl__saf_package')` - - n/a - this document (including the linked documentation) - - see above (and below) * - :need:`wp__fdr_reports` (module Safety Plan) - :need:`gd_chklst__safety_plan` - :ndf:`copy('status', need_id='gd_chklst__safety_plan')` - - <Link to issue> - :need:`doc__communication_safety_plan_fdr` - - :ndf:`copy('status', need_id='doc__communication_safety_plan_fdr')` * - :need:`wp__fdr_reports` (module Safety Package) - :need:`gd_chklst__safety_package` - :ndf:`copy('status', need_id='gd_chklst__safety_package')` - - <Link to issue> - :need:`doc__communication_safety_package_fdr` - - :ndf:`copy('status', need_id='doc__communication_safety_package_fdr')` * - :need:`wp__fdr_reports` (module's Safety Analyses & DFA) - - Safety Analysis FDR tbd - - <automated> + - :need:`gd_chklst__safety_analysis` + - :ndf:`copy('status', need_id='gd_chklst__safety_analysis')` - tailored - - n/a - - n/a * - :need:`wp__audit_report` - performed by external experts - n/a - - `#77 <https://github.com/eclipse-score/process_description/issues/77>`_ - <Link to WP> - - <WP status (manual)> * - :need:`wp__module_safety_manual` - :need:`gd_temp__safety_manual` - :ndf:`copy('status', need_id='gd_temp__safety_manual')` - - <Link to issue> - :need:`doc__communication_safety_manual` - - :ndf:`copy('status', need_id='doc__communication_safety_manual')` * - :need:`wp__verification_module_ver_report` - :need:`gd_temp__mod_ver_report` - :ndf:`copy('status', need_id='gd_temp__mod_ver_report')` - - <Link to issue> - :need:`doc__communication_verification_report` - - :ndf:`copy('status', need_id='doc__communication_verification_report')` * - :need:`wp__module_sw_release_note` - :need:`gd_temp__rel_mod_rel_note` - :ndf:`copy('status', need_id='gd_temp__rel_mod_rel_note')` - - `#1925 <https://github.com/eclipse-score/score/issues/1925>`_ - :need:`doc__communication_release_note` - - :ndf:`copy('status', need_id='doc__communication_release_note')` Component lola Work products List --------------------------------- @@ -153,90 +133,109 @@ Component lola Work products List * - Work product Id - Link to process - Process status - - Link to issue - Link to WP - - WP/doc status * - :need:`wp__requirements_comp` - :need:`gd_temp__req_comp_req` - :ndf:`copy('status', need_id='gd_temp__req_comp_req')` - - n/a - - `lola trlc <https://github.com/eclipse-score/communication/blob/main/score/mw/com/requirements/component_requirements/component_requirements_ipc.trlc>`_ - - valid + - :need:`doc__lola_requirements` * - :need:`wp__requirements_comp_aou` - :need:`gd_temp__req_aou_req` - :ndf:`copy('status', need_id='gd_temp__req_aou_req')` - - `#1987 <https://github.com/eclipse-score/score/pull/1987>`_ - - `lola/aou <https://github.com/eclipse-score/score/docs/modules/communication/docs/requirements/aou_req.rst>`_ - - in progress + - :need:`doc__communication_aou` * - :need:`wp__requirements_inspect` - :need:`gd_chklst__req_inspection` - :ndf:`copy('status', need_id='gd_chklst__req_inspection')` - tailored - - n/a - - n/a * - :need:`wp__component_arch` - :need:`gd_temp__arch_comp` - :ndf:`copy('status', need_id='gd_temp__arch_comp')` - - n/a - :need:`doc__lola_architecture` - - :ndf:`copy('status', need_id='doc__lola_architecture')` * - :need:`wp__sw_arch_verification` - :need:`gd_chklst__arch_inspection_checklist` - :ndf:`copy('status', need_id='gd_chklst__arch_inspection_checklist')` - tailored - - n/a - - n/a * - :need:`wp__sw_component_fmea` - :need:`gd_temp__comp_saf_fmea` - :ndf:`copy('status', need_id='gd_temp__comp_saf_fmea')` - - <Link to issue> - :need:`doc__lola_fmea` - - :ndf:`copy('status', need_id='doc__lola_fmea')` * - :need:`wp__sw_component_dfa` - :need:`gd_temp__comp_saf_dfa` - :ndf:`copy('status', need_id='gd_temp__comp_saf_dfa')` - - <Link to issue> - :need:`doc__lola_dfa` - - :ndf:`copy('status', need_id='doc__lola_dfa')` * - :need:`wp__sw_implementation` - :need:`gd_guidl__implementation` - :ndf:`copy('status', need_id='gd_guidl__implementation')` - - n/a - - `lola/.h/.cpp <https://github.com/eclipse-score/communication/blob/main/score/mw/com>`_, `lola/design <https://github.com/eclipse-score/communication/blob/main/score/mw/com/design>`_ - - valid + - `lola/.h/.cpp <https://github.com/eclipse-score/communication/blob/main/score/mw/com>`_, :need:`doc__lola_detailed_design` * - :need:`wp__verification_sw_unit_test` - :need:`gd_guidl__verification_guide` - :ndf:`copy('status', need_id='gd_guidl__verification_guide')` - - n/a - `lola/test.cpp <https://github.com/eclipse-score/communication/blob/main/score/mw/com>`_ - - valid * - :need:`wp__sw_implementation_inspection` - :need:`gd_chklst__impl_inspection_checklist` - :ndf:`copy('status', need_id='gd_chklst__impl_inspection_checklist')` - - n/a - External process - - n/a * - :need:`wp__verification_comp_int_test` - :need:`gd_guidl__verification_guide` - :ndf:`copy('status', need_id='gd_guidl__verification_guide')` - - <Link to issue> - <Link to WP> - - <automated> * - :need:`wp__sw_component_class` - :need:`gd_guidl__component_classification` - :ndf:`copy('status', need_id='gd_guidl__component_classification')` - - n/a - :need:`doc__lola_comp_class` - - :ndf:`copy('status', need_id='doc__lola_comp_class')` + +Module Safety Package +===================== + +To create the safety package (according to :need:`gd_guidl__saf_package`) the following +documents and work products status have to go to "valid" (after the relevant verification were performed). + +Module Documents Status +----------------------- + +For all the work product documents the status can be seen by following the "Link to WP". +A summary of the status is also documented in the project's documentation management plan. + +See :ref:`documents_docs_modules_communication_docs` + +Component Documents Status +-------------------------- + +For all the work product documents the status can be seen by following the "Link to WP". +A summary of the status is also documented in the project's documentation management plan. + +See :ref:`documents_docs_modules_communication_components` + +Component Requirements Status +----------------------------- + +not documented as needs, `lola trlc <https://github.com/eclipse-score/communication/blob/main/score/mw/com/requirements/component_requirements/component_requirements_ipc.trlc>`_ +shows no status attribute + +Component AoU Status +-------------------- + +.. needtable:: + :filter: "communication" in docname and "requirements" in docname and docname is not None + :style: table + :types: aou_req + :tags: communication + :columns: id;status;tags + :colwidths: 25,25,25 + :sort: title + +Component Architecture Status +----------------------------- + +see document link :need:`doc__lola_architecture` (as above) diff --git a/docs/modules/feo/docs/safety_mgt/module_safety_plan.rst b/docs/modules/feo/docs/safety_mgt/module_safety_plan.rst index 220ddc2cf03..ff941c6199b 100644 --- a/docs/modules/feo/docs/safety_mgt/module_safety_plan.rst +++ b/docs/modules/feo/docs/safety_mgt/module_safety_plan.rst @@ -27,7 +27,7 @@ FEO Module Safety Plan Functional Safety Management Context ==================================== -This Safety Plan adds to the :need:`doc__platform_safety_plan` all the module development relevant work products needed for ISO 26262 conformity. +This Safety Plan adds to the :need:`doc__score_platform_safety_plan` all the module development relevant work products needed for ISO 26262 conformity. Functional Safety Management Scope ================================== @@ -53,7 +53,7 @@ Functional Safety Management Roles Tailoring ========= -Additional to the tailoring in the SW platform project as defined in the :need:`doc__platform_safety_plan` we define here the additional tailoring on module level. +Additional to the tailoring in the SW platform project as defined in the :need:`doc__score_platform_safety_plan` we define here the additional tailoring on module level. - Excluded for this module are additionally the following work products (and their related requirements): - No work products excluded @@ -72,72 +72,52 @@ FEO Module Work Products List * - Work product Id - Link to process - Process status - - Link to issue - Link to WP - - WP status * - :need:`wp__module_safety_plan` - :need:`gd_guidl__saf_plan_definitions`, :need:`gd_temp__module_safety_plan` - :ndf:`copy('status', need_id='gd_guidl__saf_plan_definitions')` - - https://github.com/eclipse-score/score/issues/1658 - this document - - see above * - :need:`wp__module_safety_package` - :need:`gd_guidl__saf_package` - :ndf:`copy('status', need_id='gd_guidl__saf_package')` - - https://github.com/eclipse-score/score/issues/1659 - this document (including the linked documentation) - - see above (and below), safety manual * - :need:`wp__fdr_reports` (module Safety Plan) - :need:`gd_chklst__safety_plan` - :ndf:`copy('status', need_id='gd_chklst__safety_plan')` - - https://github.com/eclipse-score/score/issues/1660 - :need:`doc__feo_safety_plan_fdr` - - :ndf:`copy('status', need_id='doc__feo_safety_plan_fdr')` * - :need:`wp__fdr_reports` (module Safety Package) - :need:`gd_chklst__safety_package` - :ndf:`copy('status', need_id='gd_chklst__safety_package')` - - https://github.com/eclipse-score/score/issues/1660 - :need:`doc__feo_safety_package_fdr` - - :ndf:`copy('status', need_id='doc__feo_safety_package_fdr')` * - :need:`wp__fdr_reports` (module's Safety Analyses & DFA) - :need:`gd_chklst__safety_analysis` - :ndf:`copy('status', need_id='gd_chklst__safety_analysis')` - - https://github.com/eclipse-score/score/issues/1660 - :need:`doc__safety_analysis_inspection_component_feo` - - :ndf:`copy('status', need_id='doc__safety_analysis_inspection_component_feo')` * - :need:`wp__audit_report` - performed by external experts - n/a - - https://github.com/eclipse-score/score/issues/1661 - <Link to WP> - - <WP status (manual)> * - :need:`wp__module_safety_manual` - :need:`gd_temp__safety_manual` - :ndf:`copy('status', need_id='gd_temp__safety_manual')` - - https://github.com/eclipse-score/score/issues/1663 - :need:`doc__feo_safety_manual` - - :ndf:`copy('status', need_id='doc__feo_safety_manual')` * - :need:`wp__verification_module_ver_report` - :need:`gd_temp__mod_ver_report` - :ndf:`copy('status', need_id='gd_temp__mod_ver_report')` - - https://github.com/eclipse-score/score/issues/1665 - :need:`doc__feo_verification_report` - - :ndf:`copy('status', need_id='doc__feo_verification_report')` * - :need:`wp__module_sw_release_note` - :need:`gd_temp__rel_mod_rel_note` - :ndf:`copy('status', need_id='gd_temp__rel_mod_rel_note')` - - https://github.com/eclipse-score/score/issues/1666 - :need:`doc__feo_release_note` - - :ndf:`copy('status', need_id='doc__feo_release_note')` FEO Component Work Products List -------------------------------- @@ -148,86 +128,62 @@ FEO Component Work Products List * - Work product Id - Link to process - Process status - - Link to issue - Link to WP - - WP/doc status * - :need:`wp__requirements_comp` - :need:`gd_temp__req_comp_req` - :ndf:`copy('status', need_id='gd_temp__req_comp_req')` - - https://github.com/eclipse-score/score/issues/1668 - :need:`doc__component_feo_requirements` - - doc :ndf:`copy('status', need_id='doc__component_feo_requirements')` & WP below * - :need:`wp__requirements_comp_aou` - :need:`gd_temp__req_aou_req` - :ndf:`copy('status', need_id='gd_temp__req_aou_req')` - - https://github.com/eclipse-score/score/issues/1669 - :need:`doc__component_feo_aou_reqs` - - doc :ndf:`copy('status', need_id='doc__component_feo_aou_reqs')` & WP below * - :need:`wp__requirements_inspect` - :need:`gd_chklst__req_inspection` - :ndf:`copy('status', need_id='gd_chklst__req_inspection')` - - https://github.com/eclipse-score/score/issues/1670 - :need:`doc__req_inspection_component_feo` - - doc :ndf:`copy('status', need_id='doc__req_inspection_component_feo')` * - :need:`wp__component_arch` - :need:`gd_temp__arch_comp` - :ndf:`copy('status', need_id='gd_temp__arch_comp')` - - https://github.com/eclipse-score/score/issues/1671 - :need:`doc__component_feo_architecture` - - doc :ndf:`copy('status', need_id='doc__component_feo_architecture')` & WP below * - :need:`wp__sw_arch_verification` - :need:`gd_chklst__arch_inspection_checklist` - :ndf:`copy('status', need_id='gd_chklst__arch_inspection_checklist')` - - https://github.com/eclipse-score/score/issues/1672 - :need:`doc__arch_inspection_component_feo` - - doc :ndf:`copy('status', need_id='doc__arch_inspection_component_feo')` * - :need:`wp__sw_component_fmea` - :need:`gd_temp__comp_saf_fmea` - :ndf:`copy('status', need_id='gd_temp__comp_saf_fmea')` - - https://github.com/eclipse-score/score/issues/1673 - :need:`doc__component_feo_fmea` - - doc :ndf:`copy('status', need_id='doc__component_feo_fmea')` & WP below * - :need:`wp__sw_component_dfa` - :need:`gd_temp__comp_saf_fmea` - :ndf:`copy('status', need_id='gd_temp__comp_saf_fmea')` - - https://github.com/eclipse-score/score/issues/1674 - :need:`doc__component_feo_dfa` - - doc :ndf:`copy('status', need_id='doc__component_feo_dfa')` & WP below * - :need:`wp__sw_implementation` - :need:`gd_guidl__implementation` - :ndf:`copy('status', need_id='gd_guidl__implementation')` - - https://github.com/eclipse-score/score/issues/1675 - <Link to WP> - - <automated> * - :need:`wp__verification_sw_unit_test` - :need:`gd_guidl__verification_guide` - :ndf:`copy('status', need_id='gd_guidl__verification_guide')` - - https://github.com/eclipse-score/score/issues/1676 - <Link to WP> - - <automated> * - :need:`wp__sw_implementation_inspection` - :need:`gd_chklst__impl_inspection_checklist` - :ndf:`copy('status', need_id='gd_chklst__impl_inspection_checklist')` - - https://github.com/eclipse-score/score/issues/1677 - :need:`doc__impl_inspection_component_feo` - - :ndf:`copy('status', need_id='doc__impl_inspection_component_feo')` * - :need:`wp__verification_comp_int_test` - :need:`gd_guidl__verification_guide` - :ndf:`copy('status', need_id='gd_guidl__verification_guide')` - - https://github.com/eclipse-score/score/issues/1667 - <Link to WP> - - <automated> As feo is using score-crates as OSS component, the following section should be filled out @@ -244,59 +200,66 @@ If the OSS element is classified as a - component, then the below table shall match the above, adding the reasoning for tailoring of work products according to the OSS component classification. - lower level component, then no work products additional to the component’s will be planned and activities below are part of the component’s issues. -.. list-table:: OSS (sub-)component <name> Work products +.. list-table:: OSS (sub-)component score-crates Work products :header-rows: 1 * - Work product Id - - Link to issue - Reasoning for tailoring * - :need:`wp__requirements_comp` - - <Link to issue> - - Always needed (for Q and QR classification) and also improves process Id 2. + - Always needed (for Q and QR classification) and also improves process Id 2 * - :need:`wp__requirements_comp_aou` - - <Link to issue> - - Always needed (for Q and QR classification) and also improves process Id 5. + - Always needed (for Q and QR classification) and also improves process Id 5 * - :need:`wp__requirements_inspect` - - n/a - - Checklist used in Pull Request Review. + - <Reasoning for tailoring> * - :need:`wf__cr_mt_comparch` - - <Link to issue> - - <Reasoning for tailoring, needed for example in case of deficits in process Id 3&4 and complexity Ids 1&4>. + - <Reasoning for tailoring, needed for example in case of deficits in process Id 3&4 and complexity Ids 1&4> * - :need:`wp__sw_component_fmea` - - <Link to issue> - - <Reasoning for tailoring, could help arguing too high cyclomatic complexity covered by safety mechanisms>. + - <Reasoning for tailoring, could help arguing too high cyclomatic complexity covered by safety mechanisms> * - :need:`wp__sw_arch_verification` - - <Link to issue> - - <Reasoning for tailoring, needed if also wf__cr_mt_comparch is required>. + - <Reasoning for tailoring, needed if also wf__cr_mt_comparch is required> * - :need:`wp__sw_implementation` - - n/a - - If source code is modified, this is not a OSS qualification any more. + - Tailored - If source code is modified, this is not a OSS qualification any more. * - :need:`wp__verification_sw_unit_test` - - <Link to issue> - - <Reasoning for tailoring, can improve deficits in process Id 6 and complexity Id 3>. + - <Reasoning for tailoring, can improve deficits in process Id 6 and complexity Id 3> * - :need:`wp__sw_implementation_inspection` - - <Link to issue> - - <Reasoning for tailoring, can improve deficits in process Id 6 and complexity Id 2>. + - <Reasoning for tailoring, can improve deficits in process Id 6 and complexity Id 2> * - :need:`wp__verification_comp_int_test` - - <Link to issue> - - Always needed (for Q and QR classification). + - Always needed (for Q and QR classification) * - :need:`wp__sw_component_class` - - <Link to issue> - Always needed as basis for tailoring. -Work Product Status (for Safety Package) -======================================== +Module Safety Package +===================== + +To create the safety package (according to :need:`gd_guidl__saf_package`) the following +documents and work products status have to go to "valid" (after the relevant verification were performed). + +Module Documents Status +----------------------- + +For all the work product documents the status can be seen by following the "Link to WP". +A summary of the status is also documented in the project's documentation management plan. + +See :ref:`documents_docs_modules_feo_docs` + +Component Documents Status +-------------------------- + +For all the work product documents the status can be seen by following the "Link to WP". +A summary of the status is also documented in the project's documentation management plan. + +See :ref:`documents_docs_modules_feo_components` Component Requirements Status ----------------------------- diff --git a/docs/modules/feo/feo/docs/requirements/aou_req.rst b/docs/modules/feo/feo/docs/requirements/aou_req.rst index a854d46778f..e97251bcb8e 100644 --- a/docs/modules/feo/feo/docs/requirements/aou_req.rst +++ b/docs/modules/feo/feo/docs/requirements/aou_req.rst @@ -14,7 +14,7 @@ .. document:: FEO Component Assumptions of Use Requirements :id: doc__component_feo_aou_reqs - :status: valid + :status: draft :security: NO :safety: ASIL_B :realizes: wp__requirements_comp_aou @@ -29,7 +29,7 @@ FEO Component Assumption of Use Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :status: valid + :status: invalid Anything shall be done. diff --git a/docs/modules/persistency/docs/safety_mgt/module_safety_plan.rst b/docs/modules/persistency/docs/safety_mgt/module_safety_plan.rst index 18977d109ce..93e633670ec 100644 --- a/docs/modules/persistency/docs/safety_mgt/module_safety_plan.rst +++ b/docs/modules/persistency/docs/safety_mgt/module_safety_plan.rst @@ -71,179 +71,131 @@ Module Workproducts List * - Workproduct Id - Link to process - Process status - - Link to issue - Link to WP - - WP status * - :need:`wp__module_safety_plan` - :need:`gd_guidl__saf_plan_definitions` - :ndf:`copy('status', need_id='gd_guidl__saf_plan_definitions')` - - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C963 - this document - - valid * - :need:`wp__module_safety_package` - :need:`gd_guidl__saf_package` - :ndf:`copy('status', need_id='gd_guidl__saf_package')` - - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C963 - this document (including the linked documentation) - - valid * - :need:`wp__fdr_reports` (module Safety Plan) - :need:`gd_chklst__safety_plan` - :ndf:`copy('status', need_id='gd_chklst__safety_plan')` - - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C963 - :need:`doc__persistency_safety_plan_fdr` - - :ndf:`copy('status', need_id='doc__persistency_safety_plan_fdr')` * - :need:`wp__fdr_reports` (module Safety Package) - :need:`gd_chklst__safety_package` - :ndf:`copy('status', need_id='gd_chklst__safety_package')` - - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C963 - :need:`doc__persistency_safety_package_fdr` - - :ndf:`copy('status', need_id='doc__persistency_safety_package_fdr')` * - :need:`wp__fdr_reports` (module's Safety Analyses & DFA) - :need:`gd_guidl__safety_analysis` - :ndf:`copy('status', need_id='gd_guidl__safety_analysis')` - - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C965 - - :need:`doc__persistency_kvs_fmea` - - :ndf:`copy('status', need_id='doc__persistency_kvs_fmea')` + - <Link to WP> * - :need:`wp__audit_report` - performed by external experts - n/a - - <Link to issue> - <Link to WP> - - <WP status (manual)> * - :need:`wp__module_safety_manual` - :need:`gd_temp__safety_manual` - :ndf:`copy('status', need_id='gd_temp__safety_manual')` - - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C963 - :need:`doc__persistency_safety_manual` - - :ndf:`copy('status', need_id='doc__persistency_safety_manual')` * - :need:`wp__verification_module_ver_report` - :need:`gd_temp__mod_ver_report` - :ndf:`copy('status', need_id='gd_temp__mod_ver_report')` - - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C964 - :need:`doc__persistency_verification_report` - - :ndf:`copy('status', need_id='doc__persistency_verification_report')` * - :need:`wp__module_sw_release_note` - :need:`gd_temp__rel_mod_rel_note` - :ndf:`copy('status', need_id='gd_temp__rel_mod_rel_note')` - - <Link to issue> - :need:`doc__persistency_release_note` - - :ndf:`copy('status', need_id='doc__persistency_release_note')` -Component <name> Workproducts List ----------------------------------- +Component KVS Workproducts List +------------------------------- -.. list-table:: Component <name> Workproducts +.. list-table:: Component KVS Workproducts :header-rows: 1 * - Workproduct Id - Link to process - Process status - - Link to issue - Link to WP - - WP/doc status * - :need:`wp__requirements_comp` - :need:`gd_temp__req_comp_req` - :ndf:`copy('status', need_id='gd_temp__req_comp_req')` - - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C960 - :need:`doc__persistency_kvs_requirements` - - :ndf:`copy('status', need_id='doc__persistency_kvs_requirements')` & WP below * - :need:`wp__requirements_comp_aou` - :need:`gd_temp__req_aou_req` - :ndf:`copy('status', need_id='gd_temp__req_aou_req')` - - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C960 - :need:`doc__persistency_kvs_requirements` - - :ndf:`copy('status', need_id='doc__persistency_kvs_requirements')` & WP below * - :need:`wp__requirements_inspect` - :need:`gd_chklst__req_inspection` - :ndf:`copy('status', need_id='gd_chklst__req_inspection')` - - n/a - Checklist used in Pull Request Review - - n/a * - :need:`wp__component_arch` - :need:`gd_temp__arch_comp` - :ndf:`copy('status', need_id='gd_temp__arch_comp')` - - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C1020 - :need:`doc__persistency_kvs_architecture` - - :ndf:`copy('status', need_id='doc__persistency_kvs_architecture')` & WP below * - :need:`wp__sw_arch_verification` - :need:`gd_chklst__arch_inspection_checklist` - :ndf:`copy('status', need_id='gd_chklst__arch_inspection_checklist')` - - n/a - Checklist used in Pull Request Review - - n/a * - :need:`wp__sw_component_fmea` - :need:`wp__sw_component_fmea` - :ndf:`copy('status', need_id='gd_guidl__safety_analysis')` - - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C965 - :need:`doc__persistency_kvs_fmea` - - :ndf:`copy('status', need_id='doc__persistency_kvs_fmea')` & WP below * - :need:`wp__sw_component_dfa` - :need:`wp__sw_component_dfa` - :ndf:`copy('status', need_id='gd_guidl__safety_analysis')` - - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C965 - :need:`doc__persistency_kvs_dfa` - - :ndf:`copy('status', need_id='doc__persistency_kvs_dfa')` & WP below * - :need:`wp__sw_implementation` - :need:`gd_guidl__implementation` - :ndf:`copy('status', need_id='gd_guidl__implementation')` - - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C961 - <Link to WP> - - <automated> * - :need:`wp__verification_sw_unit_test` - :need:`gd_guidl__verification_guide` - :ndf:`copy('status', need_id='gd_guidl__verification_guide')` - - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C964 - <Link to WP> - - <automated> * - :need:`wp__sw_implementation_inspection` - :need:`gd_chklst__impl_inspection_checklist` - :ndf:`copy('status', need_id='gd_chklst__impl_inspection_checklist')` - - n/a - Checklist used in Pull Request Review - - n/a * - :need:`wp__verification_comp_int_test` - :need:`gd_guidl__verification_guide` - :ndf:`copy('status', need_id='gd_guidl__verification_guide')` - - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C964 - <Link to WP> - - <automated> * - :need:`wp__sw_component_class` - :need:`gd_guidl__component_classification` - :ndf:`copy('status', need_id='gd_guidl__component_classification')` - - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C963 - :need:`doc__persistency_component_classification` - - :ndf:`copy('status', need_id='doc__persistency_component_classification')` -Note: In case the component is a new development, :need:`wp__sw_component_class` shall be removed from the above list (and also from the folders). -In case an OSS element is used in the module, part 6 has to be filled out. OSS (sub-)component qualification plan ====================================== For the selected OSS component the following workproducts will be implemented (and why): -If the OSS element is classified as a +If the OSS element is classified as - component, then the below table shall match the above, adding the reasoning for tailoring of work products according to the OSS component classification. - lower level component, then no workproducts additional to the component’s will be planned and activities below are part of the component’s issues. @@ -251,55 +203,62 @@ If the OSS element is classified as a :header-rows: 1 * - Workproduct Id - - Link to issue - Reasoning for tailoring * - :need:`wp__requirements_comp` - - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C960 - Always needed (for Q and QR classification) and also improves process Id 2 * - :need:`wp__requirements_comp_aou` - - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C960 - Always needed (for Q and QR classification) and also improves process Id 5 * - :need:`wp__requirements_inspect` - - n/a - - Checklist used in Pull Request Review + - <Reasoning for tailoring> * - :need:`wf__cr_mt_comparch` - - <Link to issue> - <Reasoning for tailoring, needed for example in case of deficits in process Id 3&4 and complexity Ids 1&4> * - :need:`wp__sw_component_fmea` - - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C965 - <Reasoning for tailoring, could help arguing too high cyclomatic complexity covered by safety mechanisms> * - :need:`wp__sw_arch_verification` - - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C964 - <Reasoning for tailoring, needed if also wf__cr_mt_comparch is required> * - :need:`wp__sw_implementation` - - n/a - - If source code is modified, this is not a OSS qualification any more. + - Tailored - If source code is modified, this is not a OSS qualification any more. * - :need:`wp__verification_sw_unit_test` - - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C964 - <Reasoning for tailoring, can improve deficits in process Id 6 and complexity Id 3> * - :need:`wp__sw_implementation_inspection` - - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C961 - <Reasoning for tailoring, can improve deficits in process Id 6 and complexity Id 2> * - :need:`wp__verification_comp_int_test` - - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C964 - Always needed (for Q and QR classification) * - :need:`wp__sw_component_class` - - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C963 - Always needed as basis for tailoring. -Work Product Status (for Safety Package) -======================================== +Module Safety Package +===================== + +To create the safety package (according to :need:`gd_guidl__saf_package`) the following +documents and work products status have to go to "valid" (after the relevant verification were performed). + +Module Documents Status +----------------------- + +For all the work product documents the status can be seen by following the "Link to WP". +A summary of the status is also documented in the project's documentation management plan. + +See :ref:`documents_docs_modules_persistency_docs` + +Component Documents Status +-------------------------- + +For all the work product documents the status can be seen by following the "Link to WP". +A summary of the status is also documented in the project's documentation management plan. + +See :ref:`documents_docs_modules_persistency_components` Component Requirements Status ----------------------------- @@ -308,7 +267,7 @@ Component Requirements Status :filter: docname is not None and "persistency" in docname and "requirements" in docname :style: table :types: comp_req - :tags: persistencykvs + :tags: kvs :columns: id;status;tags :colwidths: 25,25,25 :sort: title @@ -320,7 +279,7 @@ Component AoU Status :filter: docname is not None and "persistency" in docname and "requirements" in docname :style: table :types: aou_req - :tags: persistencykvs + :tags: kvs :columns: id;status;tags :colwidths: 25,25,25 :sort: title @@ -329,10 +288,10 @@ Component Architecture Status ----------------------------- .. needtable:: - :filter: docname is not None and "persistency" in docname and "requirements" in docname + :filter: docname is not None and "persistency" in docname and "architecture" in docname :style: table :types: comp_arc_sta; comp_arc_dyn - :tags: persistencykvs + :tags: kvs :columns: id;status;tags :colwidths: 25,25,25 :sort: title diff --git a/docs/modules/persistency/kvs/docs/architecture/index.rst b/docs/modules/persistency/kvs/docs/architecture/index.rst index e04f5bdbfe5..e03efc14b08 100644 --- a/docs/modules/persistency/kvs/docs/architecture/index.rst +++ b/docs/modules/persistency/kvs/docs/architecture/index.rst @@ -120,3 +120,6 @@ Lower Level Components - Replace the example content by the real content (according to :need:`gd_guidl__arch_design`) - Set the status to valid and start the review/merge process + +.. needextend:: docname is not None and "persistency/kvs/docs/architecture" in docname + :+tags: kvs diff --git a/docs/modules/persistency/kvs/docs/requirements/index.rst b/docs/modules/persistency/kvs/docs/requirements/index.rst index 0f76eb4d63f..407c6c42545 100644 --- a/docs/modules/persistency/kvs/docs/requirements/index.rst +++ b/docs/modules/persistency/kvs/docs/requirements/index.rst @@ -15,7 +15,7 @@ Requirements ############ -.. document:: Persistency KVS Module Requirements +.. document:: Persistency KVS Requirements :id: doc__persistency_kvs_requirements :status: valid :safety: ASIL_B @@ -390,5 +390,5 @@ Requirements The component shall provide an API for registering callbacks that are triggered by data change events. -.. needextend:: docname is not None and "persistency/kvs/requirements" in docname - :+tags: persistencykvs +.. needextend:: docname is not None and "persistency/kvs/docs/requirements" in docname + :+tags: kvs diff --git a/docs/platform_management_plan/safety_management.rst b/docs/platform_management_plan/safety_management.rst index 9ca64b7e4d9..1cf06b0e6fc 100644 --- a/docs/platform_management_plan/safety_management.rst +++ b/docs/platform_management_plan/safety_management.rst @@ -455,7 +455,7 @@ Functional Safety Specific SW Platform Work Products * - :need:`wp__tailoring` (generic) - :ndf:`copy('status', need_id='wf__def_app_process_description')` - - :need:`wp__tailoring_work_products` & :need:`doc__platform_safety_plan` + - :need:`wp__tailoring_work_products` & :need:`doc__score_platform_safety_plan` - valid Process status: Status of the workflow which "outputs" the work product, derived from the docs it "has" and guidances it "contains". From 2ca9485ab03757f1770f890963160fefb7a2ba0b Mon Sep 17 00:00:00 2001 From: aschemmel-git <alexander.schemmel@bmw.de> Date: Fri, 12 Dec 2025 11:08:04 +0100 Subject: [PATCH 050/214] Modules safetyplan status updates - fix Resolves: #1304 --- docs/modules/baselibs/docs/safety_mgt/module_safety_plan.rst | 2 -- .../communication/docs/safety_mgt/module_safety_plan.rst | 2 -- 2 files changed, 4 deletions(-) diff --git a/docs/modules/baselibs/docs/safety_mgt/module_safety_plan.rst b/docs/modules/baselibs/docs/safety_mgt/module_safety_plan.rst index d99e5a6ef4b..01f87aadaf9 100644 --- a/docs/modules/baselibs/docs/safety_mgt/module_safety_plan.rst +++ b/docs/modules/baselibs/docs/safety_mgt/module_safety_plan.rst @@ -15,8 +15,6 @@ Module Safety Plan ****************** -.. note:: Document header - .. document:: Baselibs Safety Plan :id: doc__baselibs_safety_plan :status: draft diff --git a/docs/modules/communication/docs/safety_mgt/module_safety_plan.rst b/docs/modules/communication/docs/safety_mgt/module_safety_plan.rst index c04a89ac939..631d00bb31b 100644 --- a/docs/modules/communication/docs/safety_mgt/module_safety_plan.rst +++ b/docs/modules/communication/docs/safety_mgt/module_safety_plan.rst @@ -15,8 +15,6 @@ Module Safety Plan ****************** -.. note:: Document header - .. document:: Communication Safety Plan :id: doc__communication_safety_plan :status: draft From 14b298cce949b5e869f4b97e2da023273105c15e Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Mon, 15 Dec 2025 10:13:17 +0100 Subject: [PATCH 051/214] update safety documents --- .../architecture/chklst_arc_inspection.rst | 81 +++++++++++------- docs/features/persistency/index.rst | 1 + .../requirements/chklst_req_inspection.rst | 28 +++++++ .../safety_analysis/safety_analysis_fdr.rst | 83 +++++++++++++++++++ .../persistency/safety_planning/index.rst | 29 ++++++- 5 files changed, 190 insertions(+), 32 deletions(-) create mode 100644 docs/features/persistency/safety_analysis/safety_analysis_fdr.rst diff --git a/docs/features/persistency/architecture/chklst_arc_inspection.rst b/docs/features/persistency/architecture/chklst_arc_inspection.rst index b9123302488..e52a0e13320 100644 --- a/docs/features/persistency/architecture/chklst_arc_inspection.rst +++ b/docs/features/persistency/architecture/chklst_arc_inspection.rst @@ -37,7 +37,7 @@ communication and documentation of architectural decisions to stakeholders. Checklist --------- -.. list-table:: Architecture Design Review Checklist +.. list-table:: Feature Architecture Design Review Checklist Persistency :header-rows: 1 * - Review Id @@ -49,48 +49,49 @@ Checklist - Issue link * - ARC_01_01 - Is the traceability from software architectural elements to requirements, and other level architectural - elements (e.g. component to interface) established according to the "Relations between the architectural elements" as described in :need:`doc_concept__arch_process`? + elements (e.g. component to interface) established according to the defined :need:`Relations between the architectural elements <doc_concept__arch_process>`? - automated - - Trace should be checked automatically by tool support in the future. It will be removed from the checklist once the requirement (:need:`Correlations of the architectural building blocks <gd_req__arch_build_blocks_corr>`) is implemented. Refer to `Tool Requirements <https://eclipse-score.github.io/docs-as-code/main/internals/requirements/requirements.html>`_ for the current status. - - - - - - + - Trace should be checked by Sphinx. Will be removed from checklist once requirement is implemented. + - No + - Traceability not complete, template not followed + - `Issue for Findings <https://github.com/eclipse-score/score/issues/1992>`_ * - ARC_01_02 - If the architectural element is related to any supplier manuals (incl. safety and security) are the relevant parts covered? - manual - If the architecture makes use of supplied elements, their manuals (like safety) have to be considered (i.e. its provided functionality matches the expectation and assumptions are fulfilled). Note that in case of safety component this means that assumed Technical Safety Requirements and AoUs of the safety manual are covered. - - - - + - Yes + - Not applicable - * - ARC_01_03 - Is the architectural element traceable to the lower level artifacts as defined by the workproduct traceability? - automated - - Will be removed from checklist once the requirement (:need:`Correlations of the architectural building blocks <gd_req__arch_build_blocks_corr>`) is implemented by automated tool check. See `Tool Requirements <https://eclipse-score.github.io/docs-as-code/main/internals/requirements/requirements.html>`_. - - - - - - + - Will be removed from checklist once requirement is implemented by automated tool check. + Details of possible linking can be depicted from `Traceability Concept <https://eclipse-score.github.io/process_description/main/general_concepts/score_traceability_concept.html#general-concepts-traceability>`_ + - No + - Traceability not complete, template not followed + - `Issue for Findings <https://github.com/eclipse-score/score/issues/1992>`_ * - ARC_02_01 - Is the software architecture design compliant with the (overall) feature architecture? - manual - On component level check against the feature architecture, on feature level check other features with common components used. - - - - - - + - No + - There is no component architecture available for persistency + - `Issue for Findings <https://github.com/eclipse-score/score/issues/1992>`_ * - ARC_02_02 - Is appropriate and comprehensible operation/interface naming present in the architectural design? - manual - Check :need:`gd_guidl__arch_design` - - - - - - + - No + - Are these interfaces names, any operations? Please update template. + - `Issue for Findings <https://github.com/eclipse-score/score/issues/1992>`_ * - ARC_02_03 - Are correctness of data flow and control flow within the architectural elements considered? - manual - E.g. examine definitions, transformations, integrity, and interaction of data; check error handling, data exchange between elements, correct response to inputs and documented decision making. Note: consistency is ensured by the process/tooling, by defining each interface only once. - - + - Yes - - * - ARC_02_04 @@ -100,7 +101,7 @@ Checklist interfaces for inputs, outputs, error codes documented; is loose coupling considered and only limited exposure; can unit or integration test be written against the interface; data amount transferred; no sensitive data exposure; - - + - Yes - - * - ARC_02_05 @@ -108,32 +109,32 @@ Checklist - manual - If there are hard requirements on the timing a programming time estimation should be performed and also deadline supervision considered. - - - - - - + - No + - No information found, but required + - `Issue for Findings <https://github.com/eclipse-score/score/issues/1992>`_ * - ARC_02_06 - Is the documentation of the software architectural element, including textual and graphical descriptions (e.g., UML diagrams), comprehensible and complete? - manual - Use of semi-formal notation is expected for architectural elements with an allocated ASIL level. Is the architecture template correctly filled? - - + - Yes - - * - ARC_03_01 - Is the architectural element modular and encapsulated? - manual - Check e.g. that only minimal interfaces are used. Design should be object oriented. Interfaces and interactions are clearly defined. Usage of access types (private, protected) properly set. Limited global variables. - - - - + - No + - Yes - * - ARC_03_02 - Is the suitability of the software architecture for future modifications and maintainability considered? - manual - Check for e.g. loose coupling, separation of concerns, high cohesion, versioning strategy for interfaces, decision records, use of established design patterns. - - - - + - Yes + - Not applicable on feature architecture level - * - ARC_03_03 - Are simplicity and avoidance of unnecessary complexity present in the software architecture? @@ -143,13 +144,33 @@ Checklist function parameters, global variables, complex types, limited comprehensibility. Note: If the "number" above exceeds "3" a design rationale is mandatory (for all types) - - - - + - Yes + - Not applicable on feature architecture level - * - ARC_03_04 - Is the software architecture design following best practices and design principles? - manual - Refer to architectural guidelines and recommendations within the project documentation. + - Yes + - + - + * - ARC_04_01 + - If software partitioning (different operating system processes) is used to implement freedom from interference between the processes with different rating (QM/ASIL), is effectiveness evidence generated during integration and verification tests? + + Note: see ISO 26262-6, 7.4.9 and Annex D for partitioning + - manual + - + a) the usage of shared resources (cpu time, shared memory, ...) are checked in a way that freedom from interference between the processes is ensured, + b) check if the operating system supports freedom from interference between the processes + - + - + - + * - ARC_04_02 + - Is an upper estimation of the required resources (RAM, ROM, non volatile memory, communication) available and documented? + + Note: see ISO 26262-6, 7.4.11 + - manual + - - - - diff --git a/docs/features/persistency/index.rst b/docs/features/persistency/index.rst index 6f6246e5f34..cd4992563e6 100644 --- a/docs/features/persistency/index.rst +++ b/docs/features/persistency/index.rst @@ -30,6 +30,7 @@ Persistency (v0.5 alpha) requirements/chklst_req_inspection.rst safety_analysis/fmea.rst safety_analysis/dfa.rst + safety_analysis/safety_analysis_fdr.rst safety_planning/index.rst diff --git a/docs/features/persistency/requirements/chklst_req_inspection.rst b/docs/features/persistency/requirements/chklst_req_inspection.rst index 33409b1dea2..3500eac586e 100644 --- a/docs/features/persistency/requirements/chklst_req_inspection.rst +++ b/docs/features/persistency/requirements/chklst_req_inspection.rst @@ -123,3 +123,31 @@ The purpose of this requirement inspection checklist is to collect the topics to - Yes - No remarks - https://github.com/eclipse-score/score/issues/960 + * - REQ_09_01 + - Do the feature requirements defining a safety mechanism contain the error reaction leading to a safe state? + - Alternatively to the safe state there could also be "repair" mechanisms. Also do not forget to consider REQ_05_01 for these. + - + - + - + +The following requirements in "valid" state and with "inspected" tag set are in the scope of this inspection: + +.. needtable:: + :filter: "feature_name" in docname and "requirements" in docname and docname is not None and status == "valid" + :style: table + :types: feat_req + :tags: persistency + :columns: id;status;tags + :colwidths: 25,25,25 + :sort: title + +And also the following AoUs in "valid" state and with "inspected" tag set (for these please answer the questions above as if the AoUs are requirements, except questions REQ_03_01 and REQ_03_02): + +.. needtable:: + :filter: "feature_name" in docname and "requirements" in docname and docname is not None and status == "valid" + :style: table + :types: aou_req + :tags: persistency + :columns: id;status;tags + :colwidths: 25,25,25 + :sort: title diff --git a/docs/features/persistency/safety_analysis/safety_analysis_fdr.rst b/docs/features/persistency/safety_analysis/safety_analysis_fdr.rst new file mode 100644 index 00000000000..b2ac40fd66f --- /dev/null +++ b/docs/features/persistency/safety_analysis/safety_analysis_fdr.rst @@ -0,0 +1,83 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + + +Safety Analysis Checklist +========================= + +.. document:: Persistency Safety Analysis Checklist + :id: doc__persistency_safety_analysis_fdr + :status: valid + :safety: ASIL_B + :security: YES + :realizes: wp__fdr_reports + :tags: persistency + +**Purpose** +The purpose of this Safety Analysis (DFA and FMEA) checklist template is to collect the topics to be checked during verification of the Safety Analysis. + +**Checklist** + +.. list-table:: Safety Analysis Checklist + :header-rows: 1 + :widths: 10,30,30,15,8,8 + + * - Review ID + - Acceptance Criteria + - Guidance + - Passed + - Remarks + - Issue link + * - REQ_01_01 + - Is / are the attribute sufficient set correctly? + - The mitigations shall have a direct influence ont the violation by prevention, detection or mitigation to reduce the risk to an acceptable level. + - The mitigations are sufficient. + - yes + - + * - REQ_01_02 + - Are the templates for DFA and/or FMEA used? + - See :ref:`dfa_templates` / :ref:`FMEA_templates` and also :ref:`process_requirements_safety_analysis` + - Templates are used to generate the DFA or / and FMEA. + - yes + - + * - REQ_01_03 + - Were the failure initiators / fault models applied? + - See :need:`gd_guidl__dfa_failure_initiators` / :need:`gd_guidl__fault_models` + - The applicable items of the failure initiators / fault models are used to ensure a structured analysis. For all not applicable items an argument shall be given in the content of the document. + - yes + - + * - REQ_01_04 + - Are the failure effects clearly and completely described? + - Use the generic failure effect descriptions and enlarge the description if it's applicable to the considered element. + - The effects of the failure is described completely. The effect can be recognized easily. + - yes + - + * - REQ_01_06 + - Is the attribute "mitigated by" linked correct? + - Check if the correct failure effect is linked via "mitigated by". + - The "mitigated by" link is correct. + - yes + - + * - REQ_01_07 + - Is the sufficiency of the "mitigated by" (prevention, detection or mitigation) described or can it be recognized easily? + - The sufficiency of the "mitigated by" is described in the content of the document. It can be recognized easily. + - The "mitigated by" shows clearly that a fault / failure can be mitigated by the linked requirement by prevention, detection or mitigation. It shall be described in the contend. + - yes + - + * - REQ_01_08 + - Is the overall result of the Safety Analysis described in the report? + - It shall be shown in the report if the Safety Analysis are finished and if all artifacts are "valid" and "sufficient". + - The results of the Safety Analysis are described in the report. The report is available :need:`wp__verification_platform_ver_report`. + - no + - Platform verification report is missing diff --git a/docs/features/persistency/safety_planning/index.rst b/docs/features/persistency/safety_planning/index.rst index d21a5ad323b..10b40d507df 100644 --- a/docs/features/persistency/safety_planning/index.rst +++ b/docs/features/persistency/safety_planning/index.rst @@ -13,7 +13,7 @@ # ******************************************************************************* Feature Safety Work Products List -================================= +################################# .. document:: Persistency Safety WPs :id: doc__persistency_safety_wp @@ -24,7 +24,19 @@ Feature Safety Work Products List :tags: persistency -.. list-table:: Feature persistency workproducts +Tailoring +========= + +Additional to the tailoring in the SW platform project as defined in the project's :need:`wp__platform_safety_plan` we define here the additional tailoring on feature level. + +- Excluded for this feature are additionally the following work products (and their related requirements): + + - no tailoring is used for the feature + +Safety Work products List +========================= + +.. list-table:: Feature persistency Work products :header-rows: 1 * - Workproduct Id @@ -77,6 +89,19 @@ Feature Safety Work Products List - :ndf:`copy('status', need_id='gd_guidl__verification_guide')` - <WP Link> +Feature Safety Package +====================== + +To create the safety package (according to :need:`gd_guidl__saf_package`) the following +documents and work products status have to go to "valid" (after the relevant verification were performed). + +Feature Documents Status +------------------------ + +For all the work product documents the status can be seen by following the "Link to WP". +A summary of the status is also documented in the project's documentation management plan. + +See :ref:`documents_docs_features_persistency` Feature Requirements Status --------------------------- From 5143316674763d920c93d955f9bb44532e06fd71 Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Mon, 15 Dec 2025 10:38:56 +0100 Subject: [PATCH 052/214] fix link --- .../persistency/safety_analysis/safety_analysis_fdr.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/persistency/safety_analysis/safety_analysis_fdr.rst b/docs/features/persistency/safety_analysis/safety_analysis_fdr.rst index b2ac40fd66f..a56b53f356a 100644 --- a/docs/features/persistency/safety_analysis/safety_analysis_fdr.rst +++ b/docs/features/persistency/safety_analysis/safety_analysis_fdr.rst @@ -47,7 +47,7 @@ The purpose of this Safety Analysis (DFA and FMEA) checklist template is to coll - * - REQ_01_02 - Are the templates for DFA and/or FMEA used? - - See :ref:`dfa_templates` / :ref:`FMEA_templates` and also :ref:`process_requirements_safety_analysis` + - See :need:`gd_temp__plat_saf_dfa` / :need:`gd_temp__feat_saf_dfa` / :need:`gd_temp__comp_saf_dfa` and also :need:`gd_temp__feat_saf_fmea` / :need:`gd_temp__comp_saf_fmea` - Templates are used to generate the DFA or / and FMEA. - yes - From f78acf5d4670140370bb3b5bf6625af6edc5ad3a Mon Sep 17 00:00:00 2001 From: Andreas Mittag <andreas.mittag@etas.com> Date: Mon, 15 Dec 2025 18:06:24 +0100 Subject: [PATCH 053/214] bug: operations replaced by infrastructure --- docs/platform_management_plan/project_management.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/platform_management_plan/project_management.rst b/docs/platform_management_plan/project_management.rst index 5dc40f091ca..91584ae01d3 100644 --- a/docs/platform_management_plan/project_management.rst +++ b/docs/platform_management_plan/project_management.rst @@ -68,8 +68,8 @@ Technical committees is to do a breakdown of platform sagas to the concrete tasks (see `Planning`_) . Currently following *Communities* are defined in the *S-CORE* project: - * *Operational*: *community* for all kind of infra topics: - compiler, IDE, build toolchain and etc. See `GitHub Discussions/Operational Community <https://github.com/orgs/eclipse-score/discussions/categories/operational-community>`_ for more. + * *Infrastructure*: *community* for all kind of infra topics: + compiler, IDE, build toolchain and etc. See `GitHub Discussions/Infrastructure Community <https://github.com/orgs/eclipse-score/discussions/categories/infrastructure-community>`_ for more. * *Testing*: *community* to clarify questions and define testing strategy for the 'S-CORE' project. See `GitHub Discussions/Testing Community <https://github.com/orgs/eclipse-score/discussions/categories/testing-community>`_ for more. * *Software Architecture*: *community* for clarification of software architecture topics, From cd4694f444cc89a80b7ea0e551d1f0750826a873 Mon Sep 17 00:00:00 2001 From: rahulthakre <rahul.thakre@bti.bmwgroup.com> Date: Mon, 15 Dec 2025 18:18:54 +0530 Subject: [PATCH 054/214] lib/bitmanipulation: Define AoU --- .../docs/requirements/index.rst | 50 ++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/docs/modules/baselibs/bitmanipulation/docs/requirements/index.rst b/docs/modules/baselibs/bitmanipulation/docs/requirements/index.rst index f80902c7c6c..0c7294c9d75 100644 --- a/docs/modules/baselibs/bitmanipulation/docs/requirements/index.rst +++ b/docs/modules/baselibs/bitmanipulation/docs/requirements/index.rst @@ -72,5 +72,53 @@ Non-Functional Requirements The bit manipulation API shall be header-only and not require external dependencies. -.. needextend:: "__bitmaipulation__" in id +Assumptions of Use (AoU) +======================== + +.. aou_req:: Valid Bit Positions and Ranges + :id: aou_req__bitmanipulation__valid_bit_positions + :reqtype: Functional + :security: NO + :safety: ASIL_B + :status: valid + + The user shall ensure that bit positions and bit ranges passed to bit manipulation functions are within valid bounds for the integral type being operated on. Bit positions must not exceed the type's bit width. + +.. aou_req:: Integral Type Constraints + :id: aou_req__bitmanipulation__type_constraints + :reqtype: Functional + :security: NO + :safety: ASIL_B + :status: valid + + The user shall only use bit manipulation functions with integral types (integers, enumerations) as specified in the library's type constraints. Operations on floating-point or non-integral types are not supported. + +.. aou_req:: Enum Class Type Safety + :id: aou_req__bitmanipulation__enum_type_safety + :reqtype: Functional + :security: NO + :safety: ASIL_B + :status: valid + + The user shall use scoped enumeration types (enum class) when applying bitmask operators. Unscoped enumerations are not supported to maintain type safety and prevent implicit conversions. Additionally, enum elements must be set to power-of-two values (1, 2, 4, 8, 16, etc.), and no enum element shall have the value 0. + +.. aou_req:: No Side Effects on Concurrent Access + :id: aou_req__bitmanipulation__concurrent_access + :reqtype: Non-Functional + :security: NO + :safety: ASIL_B + :status: valid + + The user shall implement external synchronization mechanisms (e.g., mutexes, atomic operations, or locks) when accessing or modifying the same integral value from multiple threads concurrently, as the library provides no internal thread safety guarantees. + +.. aou_req:: Bit Extraction Index Validation + :id: aou_req__bitmanipulation__bit_validation + :reqtype: Functional + :security: NO + :safety: ASIL_B + :status: valid + + The user shall validate byte and half-byte extraction indices to ensure they correspond to valid positions within the target integral type to prevent accessing invalid memory ranges. + +.. needextend:: "__bitmanipulation__" in id :+tags: baselibs From fca4bfbd086031746a709efc5b25392142dfe035 Mon Sep 17 00:00:00 2001 From: rahulthakre <rahul.thakre@bti.bmwgroup.com> Date: Tue, 16 Dec 2025 18:47:56 +0530 Subject: [PATCH 055/214] lib/bitmanipulation: Fixed review comment --- .../baselibs/bitmanipulation/docs/requirements/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/modules/baselibs/bitmanipulation/docs/requirements/index.rst b/docs/modules/baselibs/bitmanipulation/docs/requirements/index.rst index 0c7294c9d75..dfe3a19ef21 100644 --- a/docs/modules/baselibs/bitmanipulation/docs/requirements/index.rst +++ b/docs/modules/baselibs/bitmanipulation/docs/requirements/index.rst @@ -82,7 +82,7 @@ Assumptions of Use (AoU) :safety: ASIL_B :status: valid - The user shall ensure that bit positions and bit ranges passed to bit manipulation functions are within valid bounds for the integral type being operated on. Bit positions must not exceed the type's bit width. + The bit manipulation API shall validate bit positions and ranges are within the integral type's bit width and prevent data corruption through bounds checking. .. aou_req:: Integral Type Constraints :id: aou_req__bitmanipulation__type_constraints @@ -100,7 +100,7 @@ Assumptions of Use (AoU) :safety: ASIL_B :status: valid - The user shall use scoped enumeration types (enum class) when applying bitmask operators. Unscoped enumerations are not supported to maintain type safety and prevent implicit conversions. Additionally, enum elements must be set to power-of-two values (1, 2, 4, 8, 16, etc.), and no enum element shall have the value 0. + The user shall use scoped enumeration types (enum class) whose enumerators are defined as non-zero power-of-two values (1, 2, 4, 8, 16, etc.) .. aou_req:: No Side Effects on Concurrent Access :id: aou_req__bitmanipulation__concurrent_access From 45faa6781b5c7d292d885d4e2ad95eaf21c925c5 Mon Sep 17 00:00:00 2001 From: Piotr Korkus <piotr.korkus.ext@qorix.ai> Date: Tue, 16 Dec 2025 14:21:44 +0100 Subject: [PATCH 056/214] bazel: fix module integration (#2333) set dev dependecies to avoid collisions --- MODULE.bazel | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 1fe9e739e13..23e790ff3a2 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -26,7 +26,7 @@ bazel_dep(name = "rules_python", version = "1.4.1") PYTHON_VERSION = "3.12" -python = use_extension("@rules_python//python/extensions:python.bzl", "python") +python = use_extension("@rules_python//python/extensions:python.bzl", "python", dev_dependency = True) python.toolchain( configure_coverage_tool = True, is_default = True, @@ -36,7 +36,7 @@ use_repo(python) # Additional Python rules provided by aspect, e.g. an improved version of # `py_binary`. But more importantly, it provides `py_venv`. -bazel_dep(name = "aspect_rules_py", version = "1.6.3") +bazel_dep(name = "aspect_rules_py", version = "1.6.3", dev_dependency = True) ############################################################################### # @@ -72,6 +72,6 @@ bazel_dep(name = "rules_java", version = "8.15.1") # Score custom modules loading # ############################################################################### -bazel_dep(name = "score_tooling", version = "1.0.2") +bazel_dep(name = "score_tooling", version = "1.0.4") bazel_dep(name = "score_docs_as_code", version = "2.2.0") bazel_dep(name = "score_process", version = "1.4.0") From 4b6372f189402e6656c807e8492b08ce909153fd Mon Sep 17 00:00:00 2001 From: "markus.schu" <markus.schu@accenture.com> Date: Wed, 17 Dec 2025 07:43:24 +0100 Subject: [PATCH 057/214] update safety management plan tailoring Add std_wp__iso26262__software_1052 to tailored out --- docs/platform_management_plan/safety_management.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/platform_management_plan/safety_management.rst b/docs/platform_management_plan/safety_management.rst index 1cf06b0e6fc..c2f22063c7b 100644 --- a/docs/platform_management_plan/safety_management.rst +++ b/docs/platform_management_plan/safety_management.rst @@ -105,6 +105,8 @@ The following ISO 26262 defined safety work products are not relevant for the S These may be reused by the users on their HW platform to cover Technical Safety Requirements towards the SW platform. But if these are sufficiently also covering the TSRs must be analyzed and decided by the user. + Therefore and as S-CORE only delivers source code, :need:`std_wp__iso26262__software_1052` is tailored out. + * Also tailored out is the SW testing on the target, as the S-CORE project can only test on reference HW (part of SW integration testing). So these are not relevant: :need:`std_wp__iso26262__software_1151`, :need:`std_wp__iso26262__software_1152` From 8993b288a1b548f1332b44206a9b41c165c75d32 Mon Sep 17 00:00:00 2001 From: rahulthakre <rahul.thakre@bti.bmwgroup.com> Date: Wed, 17 Dec 2025 14:44:03 +0530 Subject: [PATCH 058/214] lib/bitmanipulation : Review Comment fixed for AoU --- .../baselibs/bitmanipulation/docs/requirements/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/baselibs/bitmanipulation/docs/requirements/index.rst b/docs/modules/baselibs/bitmanipulation/docs/requirements/index.rst index dfe3a19ef21..d41d990dd1c 100644 --- a/docs/modules/baselibs/bitmanipulation/docs/requirements/index.rst +++ b/docs/modules/baselibs/bitmanipulation/docs/requirements/index.rst @@ -82,7 +82,7 @@ Assumptions of Use (AoU) :safety: ASIL_B :status: valid - The bit manipulation API shall validate bit positions and ranges are within the integral type's bit width and prevent data corruption through bounds checking. + The user shall assume that the API performs bound checking to validate bit positions and ranges provided to the bit manipulation functions. .. aou_req:: Integral Type Constraints :id: aou_req__bitmanipulation__type_constraints From 67b76ab7343ca067d7b60a75e0748892c4647690 Mon Sep 17 00:00:00 2001 From: "Frank Scholter Peres(MBTI)" <145544737+FScholPer@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:13:19 +0100 Subject: [PATCH 059/214] update to 0.5.1 (#2356) --- MODULE.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MODULE.bazel b/MODULE.bazel index 23e790ff3a2..5475a238f02 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -13,7 +13,7 @@ module( name = "score_platform", - version = "0.5.0", + version = "0.5.1", compatibility_level = 0, ) From f33b5f946a1afe776459d3cf42260faa72b2c83e Mon Sep 17 00:00:00 2001 From: Tim Kliefoth <tim.kliefoth@mercedes-benz.com> Date: Wed, 22 Oct 2025 08:49:33 +0200 Subject: [PATCH 060/214] added FR template --- docs/features/code_generation/index.rst | 115 ++++++++++++++++++ .../code_generation/requirements/index.rst | 28 +++++ 2 files changed, 143 insertions(+) create mode 100644 docs/features/code_generation/index.rst create mode 100644 docs/features/code_generation/requirements/index.rst diff --git a/docs/features/code_generation/index.rst b/docs/features/code_generation/index.rst new file mode 100644 index 00000000000..026b1d7955f --- /dev/null +++ b/docs/features/code_generation/index.rst @@ -0,0 +1,115 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +.. _code_generation_feature: + +Code Generation +############### + +.. document:: Code-Generation + :id: doc__code_generation + :status: draft + :safety: ASIL_B + :tags: feature_request + +.. toctree:: + :maxdepth: 1 + :glob: + :titlesonly: + :hidden: + + */index + + +Feature flag +============ + +To activate this feature, use the following feature flag: + +``experimental_code_generation`` + + +Abstract +======== + + +Motivation +========== + + +Rationale +========= + + +Specification +============= + + +Subchapter +__________ + +.. example for image embedding +.. .. image:: _assets/sample_image.svg +.. :alt: Name + + +uml example: + +.. uml:: + + @startuml + + class ExampleClass { + +fun(input): bool + } + + @enduml + + +Requirements +____________ + +The related requirements can be found in :doc:`requirements/index`. + + +Backwards Compatibility +======================= + + +Security Impact +=============== + + +Safety Impact +============= + + +License Impact +============== + + +How to Teach This +================= + + +Rejected Ideas +============== + + +Open Issues +=========== + + +Footnotes +========= diff --git a/docs/features/code_generation/requirements/index.rst b/docs/features/code_generation/requirements/index.rst new file mode 100644 index 00000000000..bb9307520bf --- /dev/null +++ b/docs/features/code_generation/requirements/index.rst @@ -0,0 +1,28 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +.. _codegen_requirements: + +Requirements +============ + +.. feat_req:: Example 1 + :id: feat_req__code_generation__example1 + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__ai_platform__enablement + :status: valid + + Example Text. From 3a49e7031f9d6d2a6468c8a36c241d3124078235 Mon Sep 17 00:00:00 2001 From: Stephanie-Even <stephanie.even@mercedes-benz.com> Date: Mon, 27 Oct 2025 18:21:19 -0700 Subject: [PATCH 061/214] First draft of the code gen index.rst First draft explaining the motivation, rationale and specification in favot of a code generation approach. Signed-off-by: Stephanie-Even <stephanie.even@mercedes-benz.com> --- docs/features/code_generation/index.rst | 148 ++++++++++++++++++++++++ 1 file changed, 148 insertions(+) diff --git a/docs/features/code_generation/index.rst b/docs/features/code_generation/index.rst index 026b1d7955f..e6064498144 100644 --- a/docs/features/code_generation/index.rst +++ b/docs/features/code_generation/index.rst @@ -47,14 +47,161 @@ Abstract Motivation ========== +To accomplish multi-generational portability of systems and +applications across suppliers, there is a need to enable +decoupling of human-written functional code from vendor-specific +system deployment architectures, application development frameworks, +communication mechanism libraries and operating system interface +specifics. Rationale ========= +Separation of concern +_____________________ + +Traditionally, automotive project/system-specific implementations tend +to be very heavily interwoven with technology supplier API +peculiarities and vendor framework-expected application code +structures. This is okay for one-off projects, but not for reusable +code across different technology stacks and vehicle generations. To +address this issue, a key design philosophy is to impose a very +specific code structure requirement for all functional code that is to +be run in the middleware space. For example, one want to have the freedom to +swap communication mechanisms as new improved technologies +emerge. This means the architecture needs to be +simultaneously agnostic and accomodating of different communication +frameworks and protocols. This is accomplished by enforcing a standard +API for the function/application developer to access input data, +runtime parameters, internal state variables, hardware interface +contexts and to populate output data structures. + +A standard well defined API is the condition to code generation. + + +Code generation approach +________________________ + + +The isolation of functional code from system-level and +deployment-level context allows for code reuse, rapid system +reconfiguration, prototyping, simulation and advanced fuzz testing +without in-code changes and refactoring when the application lifecycle +standard API is combined with a code generator. The code generator is +responsible for generating the middleware boiler code that gets compiled and +deployed. There is no need for the developer to know how this is done. + +This allows eliminating large amounts of +"boilerplate" code that would otherwise clutter human-written +codebases and slow down refactoring. This opens the door to affordable +code base translation. + + +The only limiting factor in freedom-of-redeployment is if the +functional code's dependency libraries (if any) require +specific hardware or drivers. Abstracting away vendor-specific +accelerator hardware/driver interfaces is beyond the current scope. + + Specification ============= +Software Compute Unit +_____________________ + +Let's define a software unit an entity that implements a specific +input-output algorithmic function as part of a larger graph +algorithm. This would be a ROS node or an ARA Application. + +We want to support both functional programming stylem or Object +Oriented programming style. In object-oriented programming languages, +such as C++, a software unit would be implemented as a trivially +default-constructible class with public methods and no defined +constructors, that inherits from the C++ base class. Conversely in +Rust, it would be a struct that implements the equivalent public +functions with no constructor. + +We want to support error handling and not enforce throwing exception. +Each of the standard interface functions must return an ErrorCode. + +We want to advanced code re-usability. We therefore define the concept +for an archetype which is the skeleton of a software unit. An instance +is a unique implementation of an archetype, with a specific +configuration defined as a parameter set. For example, if you would +have 5 cameras in the car, you would define a single archetype, but +instanciate it 5 times, with a different set of parameters for each +camera. + +We want to support different steps in the operation mode. +The standard set of API we came up looks like this: + +**onInit(Parameters p, InternalState is)** is responsible for +initializing any Internal State or Hidden State variables and data +structures, including any hardware contexts. onInit() is only called +once during the lifecycle of a software unit. You can think of this as +roughly equivalent to the contents of a class constructor. This +function determines the starting point of the lifecycle of a software +unit instance. + +**onUpdate(Time t, Parameters p, Inputs in, InternalState is, Output +out)** is responsible for the core repeated logic to be +executed. onUpdate() is called by the execution triggering logic that +may be internal or external depending on the execution environment. + +**onReset(Parameters p, InternalState is)** is responsible for +handling situations where the internal state needs to +be reset, to either recover from a trivial error state or because +something in the execution environment has changed. Any trivial +mechanisms for recovery from transient error states can be handled as +part of the onReset function. onReset() can be called any number of +times during the lifecycle of a compute unit instance. + +**onShutdown(Parameters p, InternalState is)** is responsible for +handling any cleanup tasks of hardware states and deallocation of +heap-allocated data structures before a compute unit will be deallocated +from memory and any execution terminated. You can think of this as +roughly equivalent to the contents of a class destructor. + + + +Interface +_________ + + +Software Compute units communicate via abstracted input and output +interfaces, with the Software Compute instance itself not knowing +anything about where the data come from or where it should go. + +The Inputs data structure contains a collection of input queues for +each inputs modeled for the Software Compute Archetype. + +The Outputs data structure is similar to the Inputs data structure +with the difference that the contents are mutable, i.e. writable by +the Software Compute Archetype. + + +Internal State +______________ + +A Software Compute unit only concern +is with its own internal needs relevant to the implementation of +an algorithm or other logic block. + +For storing variables between execution cycles that have no relevance +for the reproducibility of computation results of a stateful +algorithm, a special Hidden State data structure can be defined. + + +Parameter +_________ + +The Parameters data structure contains any runtime Parameters required +by the Software Compute instance. A default parameter data structure +is defined for the archetype. It can be re-configured for each +instance of the Compute instance. + + Subchapter __________ @@ -94,6 +241,7 @@ Security Impact Safety Impact ============= +Strict repeatible design pattern, extensive code re-usablility make it easy to certify. License Impact ============== From 62c923dda8894ded02096ad5069aca458e1ca84f Mon Sep 17 00:00:00 2001 From: Stephanie Even <stephanie.even@mercedes-benz.com> Date: Tue, 28 Oct 2025 14:21:02 -0700 Subject: [PATCH 062/214] Document code generation requirements and architecture --- ...chitetcure_diagram_for_code_generation.svg | 4 + docs/features/code_generation/index.rst | 40 ++++++- .../code_generation/requirements/index.rst | 112 +++++++++++++++++- 3 files changed, 151 insertions(+), 5 deletions(-) create mode 100644 docs/_assets/architetcure_diagram_for_code_generation.svg diff --git a/docs/_assets/architetcure_diagram_for_code_generation.svg b/docs/_assets/architetcure_diagram_for_code_generation.svg new file mode 100644 index 00000000000..1c13baf355d --- /dev/null +++ b/docs/_assets/architetcure_diagram_for_code_generation.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Do not edit this file with editors other than draw.io --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg" style="background: #ffffff; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); color-scheme: light dark;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1211px" height="561px" viewBox="0 0 1211 561" content="<mxfile host="ac.draw.io" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36" version="28.2.8" scale="1" border="0"> <diagram id="JfDyz-ihmuc4lEJ1RNEB" name="Page-1"> <mxGraphModel dx="1934" dy="850" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-1" value="&lt;b&gt;Code Generator&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;|&lt;br&gt;&lt;br&gt;&lt;/b&gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxGeometry x="610" y="280" width="200" height="350" as="geometry" /> </mxCell> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-2" value="&lt;b&gt;Sensor / Accelerator&lt;br&gt;&lt;/b&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;gradientColor=#FFFFFF;gradientDirection=north;" vertex="1" parent="1"> <mxGeometry x="840" y="690" width="200" height="40" as="geometry" /> </mxCell> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-3" value="&lt;b&gt;Hardware Platform&lt;br&gt;&lt;/b&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1"> <mxGeometry x="680" y="800" width="590" height="40" as="geometry" /> </mxCell> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-4" value="&lt;b&gt;Communication&lt;br&gt;Mechanism Implementation&lt;br&gt;&lt;/b&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;gradientColor=#FFFFFF;gradientDirection=north;" vertex="1" parent="1"> <mxGeometry x="680" y="670" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-5" value="System Model Description" style="swimlane;fontStyle=1;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1"> <mxGeometry x="290" y="380" width="150" height="120" as="geometry" /> </mxCell> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-6" value="...." style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="Ayb2wKmMyzGbOmtrPlkw-5"> <mxGeometry y="30" width="150" height="30" as="geometry" /> </mxCell> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-7" value="...." style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="Ayb2wKmMyzGbOmtrPlkw-5"> <mxGeometry y="60" width="150" height="30" as="geometry" /> </mxCell> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-8" value="..." style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="Ayb2wKmMyzGbOmtrPlkw-5"> <mxGeometry y="90" width="150" height="30" as="geometry" /> </mxCell> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-9" value="Code-generated component&amp;nbsp;" style="rounded=0;whiteSpace=wrap;html=1;dashed=1;" vertex="1" parent="1"> <mxGeometry x="1380" y="353" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-10" value="Project/Application-&lt;br&gt;specific component" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1"> <mxGeometry x="1380" y="423" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-11" value="&lt;b&gt;Orchestration logic&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/b&gt;" style="rounded=0;whiteSpace=wrap;html=1;dashed=1;verticalAlign=top;" vertex="1" parent="1"> <mxGeometry x="843" y="283" width="197" height="139" as="geometry" /> </mxCell> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-13" value="Dynamic&lt;br&gt;implementation" style="shape=step;perimeter=stepPerimeter;whiteSpace=wrap;html=1;fixedSize=1;gradientColor=#ffffff;gradientDirection=north;fillColor=#FFF2CC;" vertex="1" parent="1"> <mxGeometry x="650" y="330" width="120" height="190" as="geometry" /> </mxCell> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-14" value="Common Software Tooling" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxGeometry x="1380" y="283" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="Ayb2wKmMyzGbOmtrPlkw-7" target="Ayb2wKmMyzGbOmtrPlkw-1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-16" value="Intermediate Representation" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontStyle=1" vertex="1" connectable="0" parent="Ayb2wKmMyzGbOmtrPlkw-15"> <mxGeometry x="-0.1497" y="-3" relative="1" as="geometry"> <mxPoint x="14" y="-18" as="offset" /> </mxGeometry> </mxCell> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-17" value="" style="shape=flexArrow;endArrow=classic;startArrow=classic;html=1;rounded=0;exitX=0.25;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="Ayb2wKmMyzGbOmtrPlkw-4" target="Ayb2wKmMyzGbOmtrPlkw-13"> <mxGeometry width="100" height="100" relative="1" as="geometry"> <mxPoint x="690" y="750" as="sourcePoint" /> <mxPoint x="769" y="700" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;strokeWidth=4;entryX=0.004;entryY=0.421;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="Ayb2wKmMyzGbOmtrPlkw-13" target="Ayb2wKmMyzGbOmtrPlkw-21"> <mxGeometry relative="1" as="geometry"> <mxPoint x="843" y="480" as="targetPoint" /> <Array as="points"> <mxPoint x="805" y="425" /> <mxPoint x="805" y="530" /> </Array> </mxGeometry> </mxCell> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-20" value="" style="group" vertex="1" connectable="0" parent="1"> <mxGeometry x="840" y="450" width="430" height="190" as="geometry" /> </mxCell> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-21" value="&lt;b&gt;Software Compute Unit archetype&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/b&gt;" style="rounded=0;whiteSpace=wrap;html=1;dashed=1;" vertex="1" parent="Ayb2wKmMyzGbOmtrPlkw-20"> <mxGeometry width="430" height="190" as="geometry" /> </mxCell> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-22" value="&lt;b&gt;Software Compute Unit Instance&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/b&gt;" style="rounded=0;whiteSpace=wrap;html=1;dashed=1;" vertex="1" parent="Ayb2wKmMyzGbOmtrPlkw-20"> <mxGeometry x="26.875" y="30" width="394.1666666666667" height="130" as="geometry" /> </mxCell> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-23" value="onUpdate(....)" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="Ayb2wKmMyzGbOmtrPlkw-20"> <mxGeometry x="170.20833333333334" y="80" width="107.5" height="60" as="geometry" /> </mxCell> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-24" value="onInit(...)" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="Ayb2wKmMyzGbOmtrPlkw-20"> <mxGeometry x="62.708333333333336" y="80" width="107.5" height="60" as="geometry" /> </mxCell> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-25" value="onReset(....)" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="Ayb2wKmMyzGbOmtrPlkw-20"> <mxGeometry x="277.70833333333337" y="80" width="107.5" height="60" as="geometry" /> </mxCell> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-26" value="&lt;b&gt;Base Libraries&lt;br&gt;&lt;/b&gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxGeometry x="1070" y="690" width="200" height="40" as="geometry" /> </mxCell> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-27" value="&lt;b&gt;POSIX-like HLOS&lt;br&gt;&lt;/b&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1"> <mxGeometry x="680" y="750" width="590" height="40" as="geometry" /> </mxCell> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-28" value="&lt;b&gt;Execution Manager logic&lt;/b&gt;" style="rounded=0;whiteSpace=wrap;html=1;dashed=1;verticalAlign=top;" vertex="1" parent="1"> <mxGeometry x="1070" y="284" width="197" height="139" as="geometry" /> </mxCell> <mxCell id="Ayb2wKmMyzGbOmtrPlkw-29" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;strokeWidth=4;" edge="1" parent="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="850" y="333" as="targetPoint" /> <Array as="points"> <mxPoint x="805" y="330" /> <mxPoint x="840" y="330" /> <mxPoint x="840" y="333" /> </Array> <mxPoint x="805" y="423" as="sourcePoint" /> </mxGeometry> </mxCell> </root> </mxGraphModel> </diagram> </mxfile> "><defs><linearGradient x1="0%" y1="100%" x2="0%" y2="0%" id="drawio-svg-MCMinqyYlBk5ojjIWS_3-gradient-light-dark_ffffff_121212_-1-light-dark_fff2cc_281d00_-1-s-0"><stop offset="0%" stop-color="#fff2cc" stop-opacity="1" style="stop-color: light-dark(rgb(255, 242, 204), rgb(40, 29, 0)); stop-opacity: 1;"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1" style="stop-color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stop-opacity: 1;"/></linearGradient></defs><rect fill="#ffffff" width="100%" height="100%" x="0" y="0" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212));"/><g><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-1"><g transform="translate(0.5,0.5)"><rect x="320" y="0" width="200" height="350" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 175px; margin-left: 321px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Code Generator<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />|<br /><br /></b></div></div></div></foreignObject><image x="321" y="17" width="198" height="320" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-2"><g transform="translate(0.5,0.5)"><rect x="550" y="410" width="200" height="40" fill="url(#drawio-svg-MCMinqyYlBk5ojjIWS_3-gradient-light-dark_ffffff_121212_-1-light-dark_fff2cc_281d00_-1-s-0)" stroke="#d6b656" pointer-events="all" style="fill: url("#drawio-svg-MCMinqyYlBk5ojjIWS_3-gradient-light-dark_ffffff_121212_-1-light-dark_fff2cc_281d00_-1-s-0"); stroke: light-dark(rgb(214, 182, 86), rgb(109, 81, 0));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 430px; margin-left: 551px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Sensor / Accelerator<br /></b></div></div></div></foreignObject><image x="551" y="423.5" width="198" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-3"><g transform="translate(0.5,0.5)"><rect x="390" y="520" width="590" height="40" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: light-dark(rgb(255, 242, 204), rgb(40, 29, 0)); stroke: light-dark(rgb(214, 182, 86), rgb(109, 81, 0));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 588px; height: 1px; padding-top: 540px; margin-left: 391px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Hardware Platform<br /></b></div></div></div></foreignObject><image x="391" y="533.5" width="588" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAACTAAAABECAYAAAC8/IjVAAAQAElEQVR4AezdB5Q1RZnG8csCooKBD5ekoAKiAgKKKIhiWDCAsouKGFBQUFcUBJRgTgiLgaBrWBFxRZHggqwgSlRy1EUQCUtUSZJWQEQJ+zzzTc/p6emq6r5puvv+PfVOdVdVh/r1vfcc+d5T/Q89/ocAAggggAACCCCAAAIIIIAAAl0XYH4IIIAAAggggAACCCCAAAIIINB9AWaIAAIItFaABKbWPjpuHAEEEEAAAQQQQGD8AlwRAQQQQAABBBBAAAEEEEAAAQS6L8AMEUAAAQQQQAABBMYtQALTuMW5HgIIIIBAr4cBAggggAACCCCAAAIIIIAAAgh0X4AZIoAAAggggAACCCCAAAIIIFBRgASmilBNHMY9IYAAAggggAACCCCAAAIIIIBA9wWYIQIIIIAAAggggAACCCCAAAIIdF+AGSIw6QIkME36J4D5I4AAAggggAACCCAwGQLMEgEEEEAAAQQQQAABBBBAAAEEui/ADBFAAAEEEECgpQIkMLX0wXHbCCCAAAIIzI8AV0UAAQQQQAABBBBAAAEEEEAAge4LMEMEEEAAAQQQQAABBBBAYLwCJDCN15urIbBQgL8IIIAAAggggAACCCCAAAIIINB9AWaIAAIIIIAAAggggAACCCCAAALdF2CGQxEggWkojJwEAQQQQAABBBBAAAEEEEBgVAKcFwEEEEAAAQQQQAABBBBAAAEEui/ADBFAAAEEJluABKbJfv7MHgEEEEAAAQQmR4CZIoAAAgiEBZZV13KBWELtdcujdEDofL6Wuik5gSW1vVRJuF3NlAkXeKzmH/o+VWn391Gn6KssoqNC11hafV0t/p3aRJPbSrGDYkfF9ootFYsqKAgggAACzRbg7hBAAAEEEEAAAQQQaKUACUytfGzcNAIIzJ8AV0YAAQQQQAABBBDomMCqms+tilsCsbva65bddEDofL7WWuqnLBRYTdW9intKwu1PVjtlsgUO1fRD36cq7Q/o+GsUxyu+rNhO8WhFlbKhBoWucYP6ulQW02Rsc6Vq/06drPooxcGKrym+rThGsbxiQgrTRAABBBBAAAEEEEAAAQQQQACBcQrMTwLTOGfItRBAAAEEEEAAAQQQQAABBBAIC/gf7cO9vV4/q42M4pyxe2xuX/rOUqvjpPrTV2BE2wUWH8IEVtE5Nlc4udAJUVdr26sLLaI6VmLf5cfFDmxZnx3+Q/dsm9VVUxBAAAEEEEAAAQQQQACBegKMRgABBIYgQALTEBA5BQIIIIAAAggggAACoxTg3AgggAACCCAwVIGn6GxeXeh81V4FTFVry7t1548E4hC1Vymv0qB3KSgIIIAAAgggMM8CXB4BBBBAAAEEEJhkARKYJvnpM3cEEEBgsgSYLQIIIIAAAggggAACCCCQF1hfO4crYistqbvRZcnI3S0V6ct3fTS/wzYCHRBgCggggAACCCCAAAIIIIAAAi0UIIGphQ9tfm+ZqyOAAAIIIIAAAggggAACCCCAQPcFJmaGTmLafWJmO3eiC9T0EgUFAQQQQAABBBBAAAEEEEBgIgWYNALNESCBqTnPgjtBAAEEEEAAAQQQQACBrgkwHwQQQACBNgjso5tcWzGJZbkKkz5TY74xHXerpiCAAAIIIIAAAggUBdhHAAEEEEAAgYEFSGAamJATIIAAAggggMCoBTg/AggggAACCCCAAAIBgV3U/v6S2ENtX1ecp6hStqsyqINjUglMm2nOGyt2nI77VFMQQACBkQlwYgQQQAABBBBAAAEEEJhcARKYJvfZM/PJE2DGCCCAAAIIIIAAAggggAACCHRN4GuakBOVivFFtTuxaUPVTsC5VnWsrBXrbFlfndv9x8jge9R3koKCAAIIIIAAAggggAACCCCAAALNE+jcHZHA1LlHyoQQQAABBBBAAAEEEEAAAQQGF2jMGZbRnWyh+IRif8X3FMco/Dont71L25soHquoU7zqSlkUz+Pkhm104k8pfqA4SrG8IlWcDOKVcXzPP9Rgx36qd1B4TqpqlyfqiLJ7dtsC9YXKourwmFAsrv5QsUfouNg1s/N5rm18fp7z2zQJPz8/91O17USWQ1X7dWv+TFSZv4Y3ovgVaFsn7mSdRP+g3U/XCd6u+Iziqwp/J/x9OkjbXi3Kphtoe9z/rc7fD122tNyv1ocUdctiOsBz+aRq/16dpfoaxa2KKxWnK/y5ep/q1RR1iz+fZeHva/5cqd8v3+dSOqAs3KeumbK+tvx7+znV/h74u/FBbb9GURyrppnyKG15zIdU+xgfu5e2X61YUUFBAAEEEEAAAQQQmHcBbgABBBBAoCkC4/6PIk2ZN/eBAAIIIIAAAgggMA4BroEAAggg0K/AS3Wg/5H/dtXHKT6r2FXhBIgtVf+rwm2HqD5Z4dc6fUv1yxWxhAR1956rP7cEwudTV+8x+uN/ZL9N9WGKTyveqthK4X/sV1VaNlerExQuVX2Awvf8ZtUOJ2kcrG3P6UuqU/epIbPK+doL3ffv1Bcq66kjdJzbfc8aUlr2VqvHlMX16ltEUVba+vzW1mSOV3i+31ft5+fn/gptb6rwa9Y+otqfiTtU/1TxQkUbykW6yZ8oQmVZdThJTtXQihNb3qGzOXnHK0A5AdFJPR9Qm78T/j7trG0n99n0XG3foHCSjJMAtTmn+Jy/VavP6fD3TLul5U1q9ZgsjtR+8XgnUqm5tNgkOzarY4leTgb0b9OdOpvn4mQt/15tpP1VFD7f6qpfpvDnyqtmXa3tixX+zqhKlmH+fn1YV/MqU2Wxm/pcXqQ/TuC7QLV/Hz+u2t8DfzcO1La/A9epfosiX2zhxE//3nmMf/N8jI/dVwNPVPxR4e/bM1RTEEAAgfYLMAMEEEAAAQQQQAABBAYUIIFpQEAORwABBMYhwDUQQAABBBBAAAEEJkbAq3V4ZZJfaMb+R35Vlcu7NfI0hROfnqo6VJzAEOpzUpH/4f1oDfA/squqVJbQKN+3/zHeCQrajRavRuJkgNi9FE9wTrEht+/EiKfk9vOb6+Z3Sra9skpJ81TTi6f+lv/x/TxS6Grr8/Nz/zfN5RJFLKFL3bOKV5Y5Ty1OwCmufqPmxhUn/sRuqp/VgELn8+o6Tsz5Tw1w8o6qSsWfYyfJOAnQCT5FV39n1tCZfE6HNqPFY7JwUtQgx/s8XlWs7IJOwrlMHV4d7nGq65TnabB/85xM5eRJ7QaL7z/U6c9xnd8vf19D53KfV+06WwOcwKcqWPzMDlevX1WoqreC/vh32ImfKQt/367SeK9YparX4w8CCCCAAAIIIIAAAggggAACkyowSQlMk/qMmTcCCCCAAAIIIIAAAggggEA7BPwP837dklcmGeSOX6KD/cqmpVX3U76sg/yP6qoqFScvOeGp7n1vq7Mfq6hafpYY+Pzp/mIVas/GhRIHnDgSS24qrubT1ufnhBE/vz0zkD5qr671Ix1nA1WNLX9J3NmSif6q3U5e8mvrvKJV1WPKxvkVa14JK7TSV9kx89H2bF3UvzlVkhc1NFi8KpV/E/zdCw5KdNT9/QqdzisvHRHqDLT7e+RXbLr2qlOBYaXNXrHKiU+lnTQigAACCCCAAAIIIIBAqQCNCCDQMQESmDr2QJkOAggggAACCCCAAALDEeAsCCAwDwL+x/s6iUOxW/SKIJ+PDQj0+ZVWOwX6Qs1OXnldqDPR7hVdEkNmur2iycxOycYLStrclHrFmVdXKUu8SSWfnOST56Ktz88JH37NV24qfW16NSafq6+Dx3TQqonr/DnRX7Xbr3es89mOndfPxq+Ci42Zzz4nSnr1JK+CNoz7eJVOcqiin9LP71foOv48h/pC7Ta4WZ11k5d0yFTxKnpTG/xBAAEEEEBgvAJcDQEEEEAAAQQQaIYACUzNeA7cBQIIIIBAVwWYFwIIIIAAAgi0XcCvAHJSQ534XB+T9ipGdV7ZVuUSXr3Fq+tUGdvvGCcv7N7vwTWPu03jL1SEStnr3rySSyoRyed7pv8UIrZy07Uae7UiK219fm/UBPw5UTWUsrPOsoWiicWv8kolpdw1hBv3akTbD+E8+VN4tbL8fpO2D9DNOHFH1dCKE7acjDS0E7bkRB/Wffo3SxWllQLcNAIIIIAAAggggAACCCCAwEACJDANxMfB4xLgOggggAACCCCAAAIIIIDAPAo48aFO9HOrm+ggr5qkKlicGPUG9b5M4VVZvqo6VdZJDRiw/4M63jaqkuU8jfiDYpByfORgvzpv8UL/cwr7od3nlXRsWNKWNf0425iu2/j8FtW976dIFSeoOCHnPRr4LUWq+HPa939vSp28z36/gs1zTSXa3Nrn+fOHpZKN/B3YRQdspvDqX9uo9ivHVAWLE68y0wc06l0KJ545fq7tUHGincdksZcG+ngnCL1d245vqI4Vj8nHr3ODnTSYmq+He36+thN0/BxiiYge7zhEf5qSzHOP7sWvBPyN6rrFx/p1k2dXONC/pf5trzCUIQgggAACCCCAAAIIIIBAuwW4ewTKBLL/+FHWRxsCCCCAAAIIIIAAAggggED7BLjjdgqkVgl6lqb1ScUxil8qnEDj1W421nasLBfrrNjnf4B3wsHhGu+4Q7XLk/TnU4pYuUqdTg7yK9qcELSS9jdQ+HyqapdTEkesVehft7Af2i17/VzM9sTCidr4/JxAE3vNmZM1VtM8d1N8R3Gw4r0Kz9XPVZulxf3DehVi6QUqNjppaQWNfaXiHIWTeFQFixNU7g/2Vu/w5z002qZrqvMghT9Dfi3iD7TthKKPq46VBdOdj6j2K9a+qdrxM9WhcpE6PCYLJ9L4eCcUfV99jv9WHSpe9cxj8pFfpcqfjdCxbvfxfoWj5+fEJb9i0IlMbnPtMaFwMo+PC/VXbQ/9flU93slbT9Bg/x44IdSfqdjnX0NnihPNnqg9r0rmZK+natsJbKqCxb/1wU46EEAAAQQQQACBggC7CCCAAAIIdEqABKZOPU4mgwACCCCAAALDE+BMCCCAAAIIjFXguZGrHaa+KxVlxUkXZe1Zm1/xlm3XrZ30sKoO8j/eO8Hnbdp2ZAkMO2g/Vpys4X/094otD+UGnq/tTRVOblBVq1yg0U5IUFVaiq99W7901NzGFxWanKQQWxGruJpKG5/fWwtzLu5urYZrFMVyqRpSiSWv05hxlTt1obJXPD6s9psUXqHISXPajJaTo73VOp00FbvWgTqN71XVnOLkojmNuQYnwuR2531zZd1BarUgJ3P5O6uhs4qTqJzQ5FW9ZnUUdnYt7NfZTf1+VTmXf+OcvOX7zcbfoo1XK1LlMxrgRDN/DrU5VW7U39Sr8VKrhOkUFAQQGL4AZ0QAAQQQQAABBBBAAIEmCJDA1ISnwD0g0GUB5oYAAggggAACCCCAAAJVBJzs4wSGsoi9Km6jKifvY8z+OmZHhV9Blf/HezXNlNTr2T6gkaFXcv2f+ryyiapa5UGN9so1qkpLmqSk9QAAEABJREFUMXnEqz6VDiw0OtEi/7qq9Qr9+d3jtFNcqaeNz8+vL9NUSos/c1eU9ixsvESVE0RUlRa/8qy0YwSNXqmnLOpeqsrr8VLn9Gv5TtCgsu+xPzc/Ul+oNGHVqtC9lbX7VZaz22fv7aPdPypi5bvqjK1I5NW8lteYuqXK71eVcx4RGHSd2s9TxEro+3Fx7CD1LaGgIIAAAggggAACCCCAAAIIINBcgRHeGQlMI8Tl1AgggAACCCCAAAIIIIAAAghUFNhb47YIRP51a4trjF/r9VrVTjI5S/Wwy2k64YcUocQldU2VZ0z9Lf9zuZpT93aSxhylqFtiCUx+TVN2viW1sYaiWA4pNkzvO1lierMXW7np+GxQrm7b83ua7j220kvMWIdOleIqVFON03+8etWK09ttqPwqxFCyXZ37d4LdW3SAXxlWjH9Re371MH8+/ZnzqmZ+jZsTfjSkNcWrq8Vu1r9PsX73/V1/9lXEStUkxOwcVX+/svGh2olV94U61f6/ilDx6nJeqams33PO/6YXx/g3vtjGPgIIIIAAAggggEAHBZgSAggggMBcARKY5prQggACCCCAAAIIINBuAe4eAQQQGKaAE3G+oBPWCa/Go0MGLn5F0zY6ywEKJ/v8XvXfFFcrvMKLVzjS5tDLkRXP+KzIOK+skkqA8uFn+E/NODUyfnX1LVC4hFaICiVW5FddyidC+Vz5qPqqsSY/PycY5edU3P6pGvx5i4VfbahhweLX8AU7G9RxuO7FCWiqRlL83978isHtdPaDFE7s82vk7tW2V7LyK8rG+co9XXYoxclXoRP5NzCUwFM8xh7Ftvx+WRJivr+4XfX3q3hccf/mYkNh38+w0DSzm1plKZ/INnMQGwgggAACfQlwEAIIIIAAAggggECHBPwfUTo0HaaCAAIIIDA8Ac6EAAIIIIAAAgggIAGvELSn6jpxtMb3WxbTgX61mhMbbtC2k0R2Ub2pIpV0oiFDKRdVOMsTNMav7VJVWvyKpdKOQqOTsQpNyV0n1TixLDTQr4Nz37r+Uwi/Es+2XiGl0NV74XSDn0Ho9Wq+rp/L9NA5lY9tw/N74pw7n9vgz1ss5h4xu2Xp2buN2/Nnwc9qW93Zw4phF89/V53Un/FfqT5UsbPCr32MfXc0pBUllqBW9fvviXqlI9ehWCbUEWiv8vsVOHRW80Oz9ubuOJl0buvCFr8ic+FWa/5yowgggAACCCCAAAIIIIAAAgjMvwAJTKN+BpwfAQQQQAABBBBAAAEEEEAAgWoCT9Kwnyu+p4itbqLukZa7Kpx9pcSYqquvOIkkcarSbq9AVdqhxiwR6fnaLpZsxSe/ZqrY58QStz3bfwJxXKC91+v12vT8qiQwRaZaqWuJSqPGP8ifuXfqsl5BzKsf+bVv2h1q2UBnu0Kxv2IVRReLk9tC87ox1FHSfmdJW77J36v8fmq7yu9X6hzz2T+KZLr5nA/XRgABBBBAAAEEEECgewLMCAEERiZAAtPIaDkxAggggAACCCCAAAII1BVgPAITLOAVWc7X/EMr/6hrbOXuCldaPjFm0UR/1n1HtlGz9iv1QodsON2R1dO7U9V5U397vaye3p2qnGjiZIn8q+SmOnJ/Tsxt5zfb9vwWz9/8iLbHcQ3ful+xGHrF48c04L2K1yjWVDxesarCrzj8u+pRlHV00nMVyyoo4xeo8vs1/rviiggggAACCCAwR4AGBBBAAAEEEECgKEACU1GEfQQQQAABBNovwAwQQAABBBBAoH0Cn9EtO4FGVbL49WfHapRfa7eGar+eStXQSuzVSNlF/pRtBGon9AS6ZjX3m+ThBJFZJ8rtbKxtJ6rYRpuzyoXTe1k9vTtT+fVz2QpOM43TG/eoLkt8UnOvbc+vS6+42kMPwN+FsthHfd9S/Ezh1//5GWpzZMVJW37tZNULXKWBTqbya+xiK39pWONK7NVvK9e42wWJsbcn+ovdVX6/isc0af+RJt0M99IKAW4SAQQQQAABBBBAAAEEEOiMAAlMnXmUTGT4ApwRAQQQQAABBBBAAAEEEBiLgF/ntWviSl75ZyuNebJiOcXrFV515neqH60Yd7kucUHfZ2LIVHfqVXRTg0r+3K+20GvknDz1BvWXlcumGy+ZrouVXzvnBKhiu/f9DMpW7Wnj80u9ZuvpmrATSwaJE3SOlpSh3eYrdabVFbHihKpNNMCfm2eq9uvsvqc69So1DWlUuTlyN/78RLpndcVeReeB/a7S5mMJBBBAAAEEEEAAAQQQQAABBHICbDZdgASmpj8h7g8BBBBAAAEEEEAAAQQQaIMA9ziIQNlKQfnzfVo7myl+pLhJkS9e8SV1fH78sLb/rBN5JShVpWXT0ta5jS+f21S5xQlFocG7lHScrbZsdZb7tF22cpWdQ57H65iyEhqfjW3i80slyzipxElOg0RZsldm0tV6y8TE/Co7v9LuVI0rroK1mtraVH4budm11beCokp5cWLQFYl+uhFAAAEEEEAAAQTGLcD1EEAAAQQQGJEACUwjguW0CCCAAAIIIIBAPwIcgwACCCAwkQJrRWbt1zT59WShIfOZ9JCtZlR2b14B6allHbk2v+Ztp9x+3c1TIgc4gaLYfVahwQlNhabeRsWG3H7oem18flfm5lW2+YKyxkLbYtpfKhCPUfskllUjkz5EfX6VnarSsmZpa3Mbf5m4tQ8k+t3tBMyPeCMSsddFRg5rbdfDrb1zbhwBBGoLcAACCCCAAAIIIIAAAgjMFiCBabYHewgg0A0BZoEAAggggAACCCCAQJsEYgkwoVedZfN7bbYxD3VqZZRP6J4WUYTKnurw695U9VWu1lFO8FJVqZxfGHVBYT+269WaQq/MauPz+6sme5oiVLxq1DNCnWr3f0/yilT3aLssrlf7JJaVI5O+PNLn78k/R/r77XKCUL/Hpo47IzHgo+pfUREr26rTq32pKi02K646VxzYtf1HujYh5oMAAggggAACCCCAAAIIIIBAVQH/B6fAWJoRQAABBBBAAAEEEEAAAQQQQGAMAg9GruEkktD/d99Ax31BESuhY3PH9L3pV9rFDt5enQcrvFKPqpni/QO05wQHVQOVY2ocfVFhbHG/0D1r97hZe7N32vr8YqsBObHMCUpLz57qzN4e2nqVIlRSq/OEjmt7uxPDQnOIrZa2qw7aXBEri8Y6A31VX+MWODzafK16T1DEyq/Vub6iWJywtbsa/fugKlgODPbQgQACCCCAAAIIIIAAAn0IcAgCCCDQbIFR/ofMZs+cu0MAAQQQQAABBBBAYJgCnAsBBBDoXyD2KrbVddp9FMsosuLXdu2mnZMUqeJkodSYfvtP14E/UcSKk5iu04BDFU5Ycu3Xl+2i/WGUKga+zm3683tFvngFJ68elG8Lbf881KH2tj6/b+veY/P3Z+8GjfFze6nq9RR+NeCpqvdVxEqdxLLYedrWd3Hkht+nvjcrHq3Iykra+Iriy4pU6SeByUmOH9OJvVLbK1Q/XTHMsn/iZMuq3yudHan6w4ptFP49O1N1KvnSn83DNY6CAAIIIIBA8wS4IwQQQAABBBBAAIGRCJDANBJWTooAAggg0K8AxyGAAAIIIIAAAhMo4NckxabtV63drgFOGDpLtf9h3wkPXiVHu9EyygQmX3gv/0mEXxG1ncZ8XuF6FdXDKqnXWGXXKVsR6CF1nqNIFXvHElPa+vzu0sS/qIgVf8b83H6hQV6xyqtuORFGu8HisUcHe7vdcWliej9Uv5Ppfqrar4e8UfVOiiol9F2+N3Hw3up3oqETz7yqlnaHVvwawiMqnO1NGuPP2mGqP6LYSJEqTvi6LzWog/0Pd3BOwSnRgQACCCCAAAIIIIAAAggggEBegASmvEZ3tpkJAggggAACCCCAAAIIIIBAewSc9OAkmdQdv0wDqvzDv4bNlCfNbI1mw8k7Xx/NqSud1W5OokgNPjcwoEoCk1cTir0mbj6fX2BalZv308jY6lLqrlX8PLbVEU4OUzVxxclbqUk7Kew1GrS2ok5ZEBh8faB9XM1OwHJS1jCvd6xO9gMFBQEEEEAAAQQQQAABBBBAYKEAfxGYCAESmCbiMTNJBBBAAAEEEEAAAQQQCAvQg8C8C3iVka0HuItY8oATJRYf4NxVDv24Bv1K0U+5UAc56UVV3+WECkf6NVZlw3z9svZ824n5nZLtNj+/v2k+WynOVgxa/Bw310m8qpCqiSz+PDkprJ/J/yFx0GaBfn/3bB/oHnmzV4f7J10l9juk7srFCYnvqDy6ewMf6d6UmBECCCCAAAJNEuBeEEAAAQQQQKDJAiQwNfnpcG8IIIAAAgi0SYB7RQABBBBAAIFBBJwkc0DNEzjhYR0d8yFFqGygjiMVoyx+FdkmukDdJJirdMzrFfcrBimnVDj4fwJjnPwR6JpprnL+Nj8/J79srNm+U+FtVbWLP4sv1lFnKia9fEoATmRSVbmcrJHrKg5RhMru6ni/oljuVMNuivksl+ni/gz5O63NvsvhOvK1itRr8TSEggAC8yrAxRFAAAEEEEAAAQQQQACBEQiQwDQCVE6JwCACHIsAAggggAACCCCAAAJjFUglz6T6y272L2WNuba/5rbzm05CeJ0arlWkync1wAkPv1Gdem3VChqTL6k59fP6Lycx+RV3u+QvFNn2/a+nfie+3K06VB4IdeTa/Qq32OovTlLyKkm5Q2Y2b9WW70FVaXFS1h2lPXMb2/z8HtZ0/ExWVv1FRdXihCfPe3Ud4M+iqqGXVDLLKFesiX1XPPeyyfoz62SuXdUZGqOuXk9/3P8J1V5dyZ+zVLLc8hpbVr6txuconEinqlaJ/V7FvpvFi1yphjUV71HEvo/qnlPOU4sToN6mOmau7l6qv87vV2zusb7UfYR+b3ycI9XvMQQCCCCAAAIIIIAAAggggEBHBJhGdQESmKpbMRIBBBBAAAEEEEAAAQQQQKBZAsO4G7/uahGdKBRfUF/dsr8OCJ3P7f6Hfg0pLcerdQ3FloqPKg5TOInmJ6q/othRsazCq+U44UGbPSfg+Lyh2NCDcuHVUkJj3R5KsMqdonTzQbUepFhS4ZWVvqr6WEV2/9/U9k6KFRW+/ywx5Zna93XL4ib1pYoTWJbToLLj3eZEKXUHy0rq8biycCKKuiuXNj8/T9IJK3toYxmF5+5kFH/unCTnBCWvFPR99XmVoY1UL1B45bBUUomG9V38OrGyZ5O11UlYqXsTXkkpu06xfnzkZH4134HqX03xdsXnFP+l8HfhKNX+XXmTan+X91bt746q3hH6U7xOft/JThpSWvy9diLUEupdRfESxRsVb1B4VaNXqH6roljOUEP+GvltfzfVXbl4HgdrtL/j/t7tpW2vquTXwl2ubf9WOaHQiVbf0f72iqcp/BtVdfUuzzN/j8XtOr9fX9K1i8dn+34tnrqDxb/P2dhivUPwqIUdW6gqHpPtp47VoXUTY5QAAAWfSURBVBQEEEAAAQQQQGAiBZg0AggggMAECJDANAEPmSkigAACCCCAAAJxAXoRQAABBBom4BVcfqx72lfh5A0nkvgfvD+o/W8o/qRocvHKJU5c2lk36USm7P7fp/1/V9ys6HJp+/Pzs/FryZxs42QUf+5erka/rvCVqp2Q81nV5yicsKKKEhDwSkRO+Pqk+p1M5O/C1treU3G0ok6yjYZXKk6euk4jz1I4aeoY1ScoTldcohhHcVKZE5X208W8qpKTgbw6k5MFndjkRCsnLzmJ6QaNoSCAAAIIjE2ACyGAAAIIIIAAAggg0FwBEpia+2y4MwQQaJsA94sAAggggAACCCCAAAIIIIAAAt0XYIYIIIAAAggggAACCCCAAAIIIDB0gcYlMA19hpwQAQQQQAABBBBAAAEEEEAAAQQaJ8ANIYAAAggggAACCCCAAAIIIIBA9wWYIQIIIFBVgASmqlKMQwABBBBAAAEEEECgeQLcEQIIIIAAAggggAACCCCAAAIIdF+AGSKAAAIIIIAAAp0XIIGp84+YCSKAAAIIpAUYgQACCCCAAAIIIIAAAggggAAC3RdghggggAACCCCAAAIIIIAAAk0VIIGpqU+mjffFPSOAAAIIIIAAAggggAACCCCAQPcFmCECCCCAAAIIIIAAAggggAACCHRfgBkiMGYBEpjGDM7lEEAAAQQQQAABBBBAAAELEAgggAACCCCAAAIIIIAAAggg0H0BZogAAggggAAC1QRIYKrmxCgEEEAAAQQQaKYAd4UAAggggAACCCCAAAIIIIAAAt0XYIYIIIAAAggggAACCCDQcQESmDr+gJkeAtUEGIUAAggggAACCCCAAAIIIIAAAt0XYIYIIIAAAggggAACCCCAAAIIINB9gXbOkASmdj437hoBBBBAAAEEEEAAAQQQQGC+BLguAggggAACCCCAAAIIIIAAAgh0X4AZIoAAAgiMVYAEprFyczEEEEAAAQQQQACBTIAaAQQQQAABBBBAAAEEEEAAAQS6L8AMEUAAAQQQQAABBBCoIkACUxUlxiCAAALNFeDOEEAAAQQQQAABBBBAAAEEEECg+wLMEAEEEEAAAQQQQAABBBBAAIFOC5DANPV4+YMAAggggAACCCCAAAIIIIAAAt0XYIYIIIAAAggggAACCCCAAAIIINB9AWaIAAJtFCCBqY1PjXtGAAEEEEAAAQQQQGA+Bbg2AggggAACCCCAAAIIIIAAAgh0X4AZIoAAAggggAACYxQggWmM2FwKAQQQQACBvADbCCCAAAIIIIAAAggggAACCCDQfQFmiAACCCCAAAIIIIAAAgggkBYggSltxIhmC3B3CCCAAAIIIIAAAggggAACCCDQfQFmiAACCCCAAAIIIIAAAggggAAC3RdghhMsQALTBD98po4AAggggAACCCCAAAKTJsB8EUAAAQQQQAABBBBAAAEEEECg+wLMEAEEEEAAgfYJkMDUvmfGHSOAAAIIIIDAfAtwfQQQQAABBBBAAAEEEEAAAQQQ6L4AM0QAAQQQQAABBBBAAIGxCZDANDZqLoQAAkUB9hFAAAEEEEAAAQQQQAABBBBAoPsCzBABBBBAAAEEEEAAAQQQQAABBLovMOgMSWAaVJDjEUAAAQQQQAABBBBAAAEEEBi9AFdAAAEEEEAAAQQQQAABBBBAAIHuCzBDBBBAYGIFSGCa2EfPxBFAAAEEEEAAgUkUYM4IIIAAAggggAACCCCAAAIIINB9AWaIAAIIIIAAAggg0DYBEpja9sS4XwQQQKAJAtwDAggggAACCCCAAAIIIIAAAgh0X4AZIoAAAggggAACCCCAAAIIIDAmARKYxgRddhnaEEAAAQQQQAABBBBAAAEEEECg+wLMEAEEEEAAAQQQQAABBBBAAAEEui/ADBFAYDCB/wcAAP//w0hGrAAAAAZJREFUAwCkvJPFCU0NrgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-4"><g transform="translate(0.5,0.5)"><rect x="390" y="390" width="120" height="60" fill="url(#drawio-svg-MCMinqyYlBk5ojjIWS_3-gradient-light-dark_ffffff_121212_-1-light-dark_fff2cc_281d00_-1-s-0)" stroke="#d6b656" pointer-events="all" style="fill: url("#drawio-svg-MCMinqyYlBk5ojjIWS_3-gradient-light-dark_ffffff_121212_-1-light-dark_fff2cc_281d00_-1-s-0"); stroke: light-dark(rgb(214, 182, 86), rgb(109, 81, 0));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 420px; margin-left: 391px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Communication<br />Mechanism Implementation<br /></b></div></div></div></foreignObject><image x="391" y="399" width="118" height="46" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-5"><g transform="translate(0.5,0.5)"><path d="M 0 130 L 0 100 L 150 100 L 150 130" fill="#fff2cc" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(255, 242, 204), rgb(40, 29, 0)); stroke: light-dark(rgb(214, 182, 86), rgb(109, 81, 0));"/><path d="M 0 130 L 0 220 L 150 220 L 150 130" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(214, 182, 86), rgb(109, 81, 0));"/><path d="M 0 130 L 150 130" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(214, 182, 86), rgb(109, 81, 0));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 115px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">System Model Description</div></div></div></foreignObject><image x="1" y="101" width="148" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-6"><g transform="translate(0.5,0.5)"><rect x="0" y="130" width="150" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 140px; height: 1px; padding-top: 145px; margin-left: 6px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; max-height: 26px; overflow: hidden; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">....</div></div></div></foreignObject><image x="6" y="138.5" width="140" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjAAAABECAYAAACf3Q+RAAAEyklEQVR4AezWPYoUQRgGYBVPYGAmYm4qeAUPIWbiWcQLmIngYbyFVzBRAxFrYXYYaqdrZvvvq59HetjZ6q3ut57P4H30wD8CBAgQIECAQGMCCkxjAxOXAAECBGoQkCFaQIGJnoD3EyBAgAABAvcWUGDuTWYDAQIE4gUkIDC6gAIz+v8A5ydAgAABAg0KKDANDk1kAvECEhAgQCBWQIGJ9fd2AgQIECBAYIaAAjMDzZZ4AQkIECBAYGwBBWbs+Ts9AQIECBBoUkCBmTU2mwgQIECAAIFIAQUmUt+7CRAgQIDASAIrnlWBWRHTowgQIECAAIF9BBSYfZy9hQABAgTiBSToSECB6WiYjkKAAAECBEYRUGBGmbRzEiAQLyABAQKrCSgwq1F6EAECBAgQILCXgAKzl7T3EIgXkIAAAQLdCCgw3YzSQQgQIECAwDgCCsw4s44/qQQECBAgQGAlAQVmJUiPIUCAAAECBPYTGKnA7KfqTQQIECBAgMCmAgrMprweToAAAQIEWheoM78CU+dcpCJAgAABAgQKAgpMAcctAgQIEIgXkIDAOQEF5pyKNQIECBAgQKBqAQWm6vEIR4BAvIAEBAjUKKDA1DgVmQgQIECAAIGigAJT5HGTQLyABAQIECBwV0CBuWtihQABAgQIEKhcQIGpfEDx8SQgQIAAAQL1CSgw9c1EIgIECBAgQOCCQPUF5kJ+twkQIECAAIEBBRSYAYfuyAQIECDQvUD3B1Rguh+xAxIgQIAAgf4EFJj+ZupEBAgQiBeQgMDGAgrMxsAeT4AAAQIECKwvoMCsb+qJBAjEC0hAgEDnAgpM5wN2PAIECBAg0KNAXmCepEN+SZ+v2edF+r10fUw38z1v0lrpep1u5ns+p7U8U1o6XnPzHR/gC4FdBLyEAAECBDYVyMvC0/S2d+nzNvs8T7+Xrg/pZr7nVVorXS/TzXzP+7T2OH2mrrn5pp5nnQABAgQIEGhQIC8wDR5B5DMClggQIECAQNcCCkzX43U4AgQIECDQp8A2BaZPK6ciQIAAAQIEKhHIC8yfiVy/J9Zvl3/efjn5+evk+7mvU8/8d+6PD2tz8x22+0GAAAECBOoVkOx6gbzA/EhbH575fE9rpetZupnv+5TWSte3dDPfc/P737Q+dc3NN/U86wQIECBAgECDAnmBafAIIhMgQIDAOgKeQqAdAQWmnVlJSoAAAQIECBwEFJgDhB8ECMQLSECAAIFrBRSYa6X8HQECBAgQIFCNgAJTzSgEiReQgAABAgRaEVBgWpmUnAQIECBAgMBRQIE5UsR/kYAAAQIECBC4TkCBuc7JXxEgQIAAAQIVCZwUmIpSiUKAAAECBAgQKAgoMAUctwgQIECAwEUBfxAioMCEsHspAQIECBAgsERAgVmiZy8BAgTiBSQgMKSAAjPk2B2aAAECBAi0LaDAtD0/6QnEC0hAgACBAAEFJgDdKwkQIECAAIFlAgrMMj+74wUkIECAAIEBBRSYAYfuyAQIECBAoHUBBWbpBO0nQIAAAQIEdhdQYHYn90ICBAgQIEBgqYACs1TQfgIECBAgQGB3AQVmd3IvJECAAIF4AQlaF1BgWp+g/AQIECBAYEABBWbAoTsyAQLxAhIQILBM4D8AAAD//+qSKX4AAAAGSURBVAMAMkgjibgEy9kAAAAASUVORK5CYII="/></switch></g></g></g><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-7"><g transform="translate(0.5,0.5)"><rect x="0" y="160" width="150" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 140px; height: 1px; padding-top: 175px; margin-left: 6px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; max-height: 26px; overflow: hidden; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">....</div></div></div></foreignObject><image x="6" y="168.5" width="140" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjAAAABECAYAAACf3Q+RAAAEyklEQVR4AezWPYoUQRgGYBVPYGAmYm4qeAUPIWbiWcQLmIngYbyFVzBRAxFrYXYYaqdrZvvvq59HetjZ6q3ut57P4H30wD8CBAgQIECAQGMCCkxjAxOXAAECBGoQkCFaQIGJnoD3EyBAgAABAvcWUGDuTWYDAQIE4gUkIDC6gAIz+v8A5ydAgAABAg0KKDANDk1kAvECEhAgQCBWQIGJ9fd2AgQIECBAYIaAAjMDzZZ4AQkIECBAYGwBBWbs+Ts9AQIECBBoUkCBmTU2mwgQIECAAIFIAQUmUt+7CRAgQIDASAIrnlWBWRHTowgQIECAAIF9BBSYfZy9hQABAgTiBSToSECB6WiYjkKAAAECBEYRUGBGmbRzEiAQLyABAQKrCSgwq1F6EAECBAgQILCXgAKzl7T3EIgXkIAAAQLdCCgw3YzSQQgQIECAwDgCCsw4s44/qQQECBAgQGAlAQVmJUiPIUCAAAECBPYTGKnA7KfqTQQIECBAgMCmAgrMprweToAAAQIEWheoM78CU+dcpCJAgAABAgQKAgpMAcctAgQIEIgXkIDAOQEF5pyKNQIECBAgQKBqAQWm6vEIR4BAvIAEBAjUKKDA1DgVmQgQIECAAIGigAJT5HGTQLyABAQIECBwV0CBuWtihQABAgQIEKhcQIGpfEDx8SQgQIAAAQL1CSgw9c1EIgIECBAgQOCCQPUF5kJ+twkQIECAAIEBBRSYAYfuyAQIECDQvUD3B1Rguh+xAxIgQIAAgf4EFJj+ZupEBAgQiBeQgMDGAgrMxsAeT4AAAQIECKwvoMCsb+qJBAjEC0hAgEDnAgpM5wN2PAIECBAg0KNAXmCepEN+SZ+v2edF+r10fUw38z1v0lrpep1u5ns+p7U8U1o6XnPzHR/gC4FdBLyEAAECBDYVyMvC0/S2d+nzNvs8T7+Xrg/pZr7nVVorXS/TzXzP+7T2OH2mrrn5pp5nnQABAgQIEGhQIC8wDR5B5DMClggQIECAQNcCCkzX43U4AgQIECDQp8A2BaZPK6ciQIAAAQIEKhHIC8yfiVy/J9Zvl3/efjn5+evk+7mvU8/8d+6PD2tz8x22+0GAAAECBOoVkOx6gbzA/EhbH575fE9rpetZupnv+5TWSte3dDPfc/P737Q+dc3NN/U86wQIECBAgECDAnmBafAIIhMgQIDAOgKeQqAdAQWmnVlJSoAAAQIECBwEFJgDhB8ECMQLSECAAIFrBRSYa6X8HQECBAgQIFCNgAJTzSgEiReQgAABAgRaEVBgWpmUnAQIECBAgMBRQIE5UsR/kYAAAQIECBC4TkCBuc7JXxEgQIAAAQIVCZwUmIpSiUKAAAECBAgQKAgoMAUctwgQIECAwEUBfxAioMCEsHspAQIECBAgsERAgVmiZy8BAgTiBSQgMKSAAjPk2B2aAAECBAi0LaDAtD0/6QnEC0hAgACBAAEFJgDdKwkQIECAAIFlAgrMMj+74wUkIECAAIEBBRSYAYfuyAQIECBAoHUBBWbpBO0nQIAAAQIEdhdQYHYn90ICBAgQIEBgqYACs1TQfgIECBAgQGB3AQVmd3IvJECAAIF4AQlaF1BgWp+g/AQIECBAYEABBWbAoTsyAQLxAhIQILBM4D8AAAD//+qSKX4AAAAGSURBVAMAMkgjibgEy9kAAAAASUVORK5CYII="/></switch></g></g></g><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-8"><g transform="translate(0.5,0.5)"><rect x="0" y="190" width="150" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 140px; height: 1px; padding-top: 205px; margin-left: 6px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; max-height: 26px; overflow: hidden; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">...</div></div></div></foreignObject><image x="6" y="198.5" width="140" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjAAAABECAYAAACf3Q+RAAAEsUlEQVR4AezWPYoUQRgGYBVPYGAmYm4qeAUPIWbiWcQLmIngYbyFVzBRAxFrYXcZartreqd/vvp5lm5mpqqr66vn2+B99MAfAQIECBAgQKAxAQGmsYYplwABAgRqEFBDtIAAE90B+xMgQIAAAQL3FhBg7k1mAQECBOIFVEBgdAEBZvT/AOcnQIAAAQINCggwDTZNyQTiBVRAgACBWAEBJtbf7gQIECBAgMAFAgLMBWiWxAuogAABAgTGFhBgxu6/0xMgQIAAgSYFBJiL2mYRAQIECBAgECkgwETq25sAAQIECIwksOFZBZgNMb2KAAECBAgQOEZAgDnG2S4ECBAgEC+ggo4EBJiOmukoBAgQIEBgFAEBZpROOycBAvECKiBAYDMBAWYzSi8iQIAAAQIEjhIQYI6Stg+BeAEVECBAoBsBAaabVjoIAQIECBAYR0CAGafX8SdVAQECBAgQ2EhAgNkI0msIECBAgACB4wRGCjDHqdqJAAECBAgQ2FVAgNmV18sJECBAgEDrAnXWL8DU2RdVESBAgAABAgUBAaaAY4oAAQIE4gVUQGBKQICZUjFGgAABAgQIVC0gwFTdHsURIBAvoAICBGoUEGBq7IqaCBAgQIAAgaKAAFPkMUkgXkAFBAgQIHBXQIC5a2KEAAECBAgQqFxAgKm8QfHlqYAAAQIECNQnIMDU1xMVESBAgAABAmcEqg8wZ+o3TYAAAQIECAwoIMAM2HRHJkCAAIHuBbo/oADTfYsdkAABAgQI9CcgwPTXUyciQIBAvIAKCOwsIMDsDOz1BAgQIECAwPYCAsz2pt5IgEC8gAoIEOhcQIDpvMGOR4AAAQIEehTIA8yTdMgv6f6a3S/S79L1MU3ma96ksdL1Ok3maz6nsbymNOQi0JiAcgkQIEBgV4E8LDxNu71L99vsfp5+l64PaTJf8yqNla6XaTJf8z6NPU63iwABAgQIECAwK5AHmNkHTTQloFgCBAgQINC1gADTdXsdjgABAgQI9CmwT4Dp08qpCBAgQIAAgUoE8gDzZ6au3zPjN8M/b76cfP46+T71de6d/6YeNkaAAAECBHoXcL7lAnmA+ZGWPpy4v6ex0vUsTebrPqWx0vUtTeZrrn7/TeMuAgQIECBAgMCsQB5gZh80QYAAAQK9CzgfgXYEBJh2eqVSAgQIECBA4FpAgLmG8EGAQLyACggQILBUQIBZKuU5AgQIECBAoBoBAaaaVigkXkAFBAgQINCKgADTSqfUSYAAAQIECNwKCDC3FPFfVECAAAECBAgsExBgljl5igABAgQIEKhI4CTAVFSVUggQIECAAAECBQEBpoBjigABAgQInBXwQIiAABPCblMCBAgQIEBgjYAAs0bPWgIECMQLqIDAkAICzJBtd2gCBAgQINC2gADTdv9UTyBeQAUECBAIEBBgAtBtSYAAAQIECKwTEGDW+VkdL6ACAgQIEBhQQIAZsOmOTIAAAQIEWhcQYNZ20HoCBAgQIEDgcAEB5nByGxIgQIAAAQJrBQSYtYLWEyBAgAABAocLCDCHk9uQAAECBOIFVNC6gADTegfVT4AAAQIEBhQQYAZsuiMTIBAvoAICBNYJ/AcAAP//zeTDGQAAAAZJREFUAwBkVhqJTl6YZwAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-9"><g transform="translate(0.5,0.5)"><rect x="1090" y="73" width="120" height="60" fill="#ffffff" stroke="#000000" stroke-dasharray="3 3" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 103px; margin-left: 1091px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Code-generated component </div></div></div></foreignObject><image x="1091" y="89" width="118" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-10"><g transform="translate(0.5,0.5)"><rect x="1090" y="143" width="120" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: light-dark(rgb(255, 242, 204), rgb(40, 29, 0)); stroke: light-dark(rgb(214, 182, 86), rgb(109, 81, 0));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 173px; margin-left: 1091px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Project/Application-<br />specific component</div></div></div></foreignObject><image x="1091" y="159" width="118" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-11"><g transform="translate(0.5,0.5)"><rect x="553" y="3" width="197" height="139" fill="#ffffff" stroke="#000000" stroke-dasharray="3 3" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 195px; height: 1px; padding-top: 10px; margin-left: 554px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Orchestration logic<br /><br /><br /><br /><br /><br /><br /><br /></b></div></div></div></foreignObject><image x="554" y="10.5" width="195" height="118" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAwwAAAHYCAYAAADgT29rAAAQAElEQVR4AezdCfwt4V8P8GsniYQWpCgJCSGlRXsqkiTa0F4qUdFCO5VCqbRnaSHtaZG0IpVCCqXSntJOWbLk+7n/e+7/3LmznXPmnDPPzPu+Zu7MmXnmmed5P/M7Z76z/swH/hEgQIAAAQIECBAgQGBAQMAwAGMygfYElJgAAQIECBAgsLyAgGF5UzkSIECAAIHLBCxNgACBFQkIGFbUGIpCgAABAgQIECCwLYEt1EbAsIVWVAcCBAgQIECAAAECVxIQMFwJVratCSgvAQIECBAgQIBAn4CAoU/FNAIECBBoV0DJCRAgQGBRAQHDopwyW7FAtvVnr/I9X/XPW/2zVf8zqtcRIECAAAECKxVQrHUIZCdqHSVRCgLLCWS7fvHK7h2r//zq/2v1/7f6H6n+26v/zup/vPr/V/0PVP8Z1b9N9b+leh0BArcR+EW1mt830P/emq47T+CX1mLPOdDX5F13OUj0CiUwtN09S83TESDQI5Adq57JJhE4RWA1aX92leR1qv+G6r+q+g+sPj8M2TGp0d7uV9TU16r+Q6v/+ur/WfWvXH1+WGqw6e7Vq3Y/PdD/i5quI3BNgZeqzBPQ9/VfWvN+VvW60wTyHfjDtcj3D/R7PyiSM8v/pGz6trlM++01T0eAQI+AgKEHxaQmBX5Nlfqrq/8H1f/G6s/tfk8t+IXVf0H1OVJXg812Y0fT8sO62Yqr2IiAWVsWEIRtuXXVjcAVBQQMV8SV9c0EXrrWlLMKSx4depXK819W/5ur1xGYI5BL34bO2LzAnAwaTPNmVeahOn9czdMRIHBHAasmsJSAgGEpSfncS+B31oq/ovqxy45q9lndr62lvrL6569eR2BKYGwb/PlTCzc6/xeOlPtZR+aZRYAAAQINCQgY7t5YCnCBQC5D+twLlp+zaHYC/1El/CXV6wgQIECAAAECuxMQMOyuyTdT4Z9XNclNarlpuUZndf+pUn1i9bnP4XtqOLf79ZXwk6vXERgXMJcAAQIECGxQQMCwwUbdSZX+eNVzzs3NCQxerdLmBuZfV8M3rP51q//V1T9X9X+s+v9W/VSXpy294lQi8wkQmC2Qe4Tyd9zX/5HKJY9CroGOwGIC+a5/vcqtb5vLtNwLV7Of0fmfAIFnCggYnmlhrB2BXA/+PjOK+yWVJjdC54lHP1rj3S7vYPj7NTFp/n0Np7r3nEpgPgECswV+qFL+3YH+U2u6jsDSAnn3zt+rTIe2u7yfp2brCBDoCjQeMHSr4/NOBN6o6jl1KdKHVZo86egHazjVfWsl+N3VJ7CowWCXR64OnWV49lqq72VJmV6zHne5lOoP1qc/X/3HVp+Xxs19SdXzVPo3qP69qv+I6j+t+r9V/btX/yeqf7nqc9akBot3L1g5vkP1H1V97htJn/Jn3S9Z0/L89xqc3eXm2ZzF+cuVw9+uPveN5Fn8n1TjH1T9n6o+Z4hqcFGX9cT7jSuX96s+hl9Xw6wr600g+pb1OXW65bs4sp1cc/vJjfs5u5ZtJ+8cyU5TLs37kKrrn6s+21X+Bm75m5B19dU50+JRxTqpe6FKne0kdUt7fnN9zkGBb6th3q+Sv7V3q/E8KOHUx4vmIEVu4u723UcT5+8g7zf5M7WeOGf7yvBP1+dM/1U1bKnL98nrV4Hzt56/ybyrJqbfXdO+pvrPqT5/n3l3TdeiZp3V5e887fgBtfQnVJ/2zPfMH6rxtHENHne5xyzbS1//OFFn5Dnqc1/6TKtZJ3VZ/2vUEn+x+rTzp9Qw31n5HnuLGs93Wr47a1RHoG2BfGG3XQOl36NALiMaq/d/qZnZIf8/NZzb5VR1fqSm0r/2QIK8RbrvZUl5q/RhkbxULmcyPrMmvH/1b1J9Xhr3fDUc6/Jm0rxI7XsrUX5A8+OZndqUJYFCdgITOOSMyn+uNBl/kRou0aVs/7gy+o/VZ8fgzWuYHZ/0KX/W/c9rWsqW+p26k50f6ey0/sSDBw9yT8q7VF65NCDBXnbsc/lAApUEgAnssnOfndtKdlKX77rXryVyH0t2JvPIz3euzzHMGaasK+v9CzUtwVjq9I01HudfXMO+7k1rYnZGD319HOzytK1DugwTfB4nvsb2k53XBNdZX+qdo6rZdt6mVvxHq097vV0NDztm2cayvSZoGnqccPL8d7VM8kz/12t8qMtlRUlz6LMzdZw2wXff30ymxSNtdpx+aDw7qynTN1WCbCepW9oz9x7lwEKedhbv/K29b6XJju731TBBY+pTo5Ndtrt8R3T7n6wlE8inrLFOkJJg+q/V9Dhn+8rwg+tzpmdHO9t7tvuatNouO+YJBvJ9kvu+8reev8m8+C2mCXwSeP3+qkH+PvPumlhkR3no76WSjnYvXnOzDebvPO14CGTTnvme+fSanzbOd+Avr/F0+W7K9tLX/7Yk6PQJ+HJmqy99piVo7izS+zFBQLbnPEr5H1aK964+7ZxtPt9Z+R77yJqW77R8d+Y751Xr86nfj7WIjsA6BPIlt46SKAWBeQI5ipWdgbHU2eH572MJBuZ9e03PjmQNBrscTRqcOTIjPyA5opudl5FkT8zK0ascFc2bSef+kCWDBBH/tkbyg3/JjknOWMTklSqvqS47EalfgpW5R29zL0l+pLPTOpX/YX527rPDkJ2v7LQcpo8NX7Rm5s3f2fFJOevjrC73yCR4yE5e3w70r6xc0p6Hvj4OdmnLQ7oMf9lgyv4Zp24/2YnNTu7fqeyyvhrM6mKaoCnXcv/NWiJ/bzV43GUHOy7JM/3jGQMjSXPou4ZT28nUzlXOFn1WrTc7qylTjc7ush3kbz1Gedra1IKp91CaX1Azktdc62zv2e5fs5ZbY5egMjvmCQZOLV+20/y9vOKJCyYgyN/onO+5HDBIEPqbah0/t/qhrq/Npra5vmWO8882GZ8EAQkOjueNjec3K2ewcxAigdFYWvMIrFJAwLDKZlGoEYGpL9ucXfj4keWnZuXI/1ia7FDN2cE4ziNHGXPk7Xja1Hh2aL6sEuWoaA3O6vKDnyPb2Xk8NYPsgH32qQtV+hylHzvqXEkedjm6n/tHHn4447+c4cjO3nNPLJuAKUchczR0Iung7Ozsf3HNfd7q79Gduv2kvf9pFTRHg2twdvdWtWSCrOwk1eiqumer0mQH7NKd7hjlcqVcBlNZntXlbztB+qkLJ/BNW5263LXSp51zZiQ775esI38vX1QZ5G+0BpNddsDTTyY8SpB15GDKLR93nWDiY6oMl/jkezWB0ctWPjoCrQg8LKeA4SGD/xoSeOmJsmZn9ZyzC4dsczp86obLXN9+SD81zA9bjrpPpTuen6NgufY5R9OPp58znqO7H33OgrVMyl6Dk7u3rSXGjHJmIfcPVLKLugRVCWq6R8EPmcYxR32T7jDt3GHyyE5QLmk4N49zlksbnLr95PKItPs56+suk4D1lCOp3eWv8Tk7tnnM8dR3wdx15yBAgvNYz13mON25Pllf7g1IfY7zu9d4Li3KvRdLrT9nAXN2byy/XE527g54LjlbajsfK+NhXs685dKsw+dLhjkbe+6lW5es17IEzhYQMJxNZ8E7CUwd5c21zJcWLZdjjOWRR7KOze/Oy45Bd9rY5/xon7YzNJbbgwc50peb78ZTLTv37Qeyy5HcS84sdLPNmYNcgtadns9vVv/luusajHY5KzWa4NHM7KDk0oJHH282OGX7eeEq1VI7NZXVwy5njR6OrOS/lCfb9JLFSdCQMwVL5jknr/xdvtichFdOkyPfH3iFdeS+mbHLhs4NFq5Q1NEsc6nUe4ymOG1mDkDkLOtpS0lN4I4CAoY74lv1WQJT135/11m5PrnQdzz58alPeafDUxMXmpBT7HN+uHNTbm6kzJN9cj3t1OrPuWTiOM8c0c0PXC4dyKUgx/P6xnNDbd/3S25k7Et/PC2XweQGwuwY5kxEbjQ9nt8d/7M1oe/Sjrx/o2b1djF7+ZqTMuaypVxu8IL1OUf+ajDYHd/PkZvXc9nOoR9cqGbkUo9Dugxz421NXryL2VimeS9JgrnYpP65HnzqjFp2auOUfP9X/ZebhVOH9Ll/oCb1drnROmkOfbaf3oQnTMxR2b8xI33OGOQG5xw1zxNscmPq1GLZ5i49q5dtNdtQbtrNMJ+n1pvt7ok0d/iQJ/xMrTZ/M7HP33D+5vJ3OlW/XPKVpwX15Z2HOWRHvG/e8bQE9GnPbLvH0285ngc+TK0v23vuecq9P/l+nkqfh2zke2cqnfkEViFw+BFYRWEUgsAMgamAYYkfldy0N1aUqTKMLXuYl5dWfV59yM5aboSr0YddnuTzcGTkv+y0vlTNz5mIP1nDHFXOjnyNDna5bCI3iQ4mGJiRpzrlyHrKlafp5Gh+djaz7oFFHk9O8PP4Q41kxzxPWarR3i47H6lbHv/54ZUiRyfftYa57CA75zU62GUH5nhmLvMYOxuQJ6/kySU//WihvCQsl6PlcqkER48mPzU4vuk9N5bnSSiH/qnERxNyWdEhXYZ5+szR7JNHh7afsR3elDc3iuYpPQn6Uv88AjLbRi63GCvEIUiO13Fd8qjNoeW+tmakrod+zk57LTLaJcCZOuOSMyy5YT+BQgK1BA5/oHLN2aZsYzU62OWG5MGZEzPyZLZs89mGcllehnnaUHa0xxbN39fY/GvPy9OEEjyOrSc7wnnyWh4PmwMaufQzf6dZNt8RY8smwOjbMZ46Yp9AIcFqHu2a9syZ3YznO3NsfUvPy2VVecrWWL4JTNPWb12JEgjk+/n4u6ImP9VlO066p2aYsCmBzVRGwLCZptxNRQ6P0xuq8A8PzThh+lTQcW7AkJ28/PjkFP3vqvLkByU7a9mxqo8Pu7Ed6iTITk+empTxQ5+XEWVHPkc0D9P6hgks+qaPTXuZmvkt1Xe7nN3IjbXd6cef87zz489TN6hmZ61btyyfxyDmyPlYu2TnLGkPfW5Mzw/y4XN3mCccdacdPue+h8N4d5jgJYFPd/otPk9tPwmSxo7Yps3yGMi+sk7tzGdHuG+5W0/rBobd9edvauihB7n5fezemuSV7SyXi2T8lD7r/Cu1QP4Wa/C4S2CYx2k+ntAzksuBeibfbNLUd07qlR3hn+opUZ5WlG0uR9d7Zj+clMu9suP/8MOj/35HDccuu0xg9xKVJgFpgtQafdjlHRD5W8+Zx4cTbvBfHpc7tppcypbAtPsY7xwQytm1sWUTcI3NN4/AagQEDKtpCgWZKTC24zK2Qzmc/dNzfvTpSU9MGbrJ9olEnQ/Zuc5z53OU93935h0+pm45hX/43B3mPQvZ6elOP3zO5UmH8b7hqQFDfpTHArA8XaZvPYdpeUndYTzDsaNpOUqZMwpJ19dnB+Kd+mY8mpadkgQJjz4+6K77MP0wzA5yLjPIkcOfc5j4aBjnBHR9fe6ZyE7Lo6Q3G8zZfnKTd3ZSUrdun5vDcyP9UIGXvidgaD2XTM/9hI+uKgAAEABJREFULwnYhvLI02dS/6H5mZ6zeXk6UcaH+rEd2b5lsm1mh7pvXqbl0cQpW8b7+qn7svqWWXJaXog2ll8ChrH5qX/O4oylyZnD4/ndR+wez8t4ziwOBSEJIHJjf85AJO21+7Ezlan7mM/U2ZAph2vXTf4EZgsIGGZTSbgSgRxtHipKdhqX2KanjjD+2FABRqbnMp6ho7uHxcYuJ0mavPE0w6E+R+dzjXGuoe3r/9XQggPTx3bgs0iOeGc41Hd3xHNZwVDa7OB2j8520351d0Lnc3bwD5Oyk3YYHxrmMoIEPTlymie6vGMlTACRM0CpW19/fDaokt+sm7P95AhnXmqYy2+6fd4unp2bQ4FzeVqC01xqlvd15CjpYd5ahzniPFa2BLgPxhI8mpdA8dFo72AssO1bIC8Uy70dffMO0/rO0h3m3XP4/LXyse+7HDkfO2hQiz/s8t00tgOf+xUeJnz0X9b7aLR3MPXd8z9rqVvcMJ2DQ2Pfy/ne+vEqy1AXu1y+2fd9nGlZfmhZ0wmsSmCJnatVVUhhNi8w9qOUyi9xuUiulU1eQ31+BIbm9U3PU4F+om9GZ9rUzY95C2pnkSc+5sxFrjHONbR9/alPkJq6gTxnBZ4oQOdDynOYlGuYE9AdPneHuf47946M9V/RXajz+fgyowQBU+U7XjxH2HNtdgKIvLE2l0LkRvHDtfvHaW89Pnf76StXvuNz2UPqknsXUr8Ertkev74WyI2reV9Hja6+y/0XY4VM3cbmH+blLN9x8HSYfhgmkDqMzxnGcSrdOQcZpvJcYv5vmMgkNxtPJHk4OzvwX/5wrP+/XHaV74DD3Bc4jPQMc8NwttGeWU9MypnAJyZc4cNUYDP1nZQi5VLAvu/jTMuLB5NG3y9g6ooE8mOyouIoCoFJgR+cSDG1sz+x+MPZU3mMneV4mEHnv7HLEY6TPvvxh57x7+yZdq1J2aGaep9FdsrH1v8LjmaO3U9wSJaAYqo/pO0bdnfu/2pfopnTcq9Ibu5NcJgbg3Oz5cxFF082d/s5XnG2pRzZzJHtnFlKXXKPSM6gzGmL47zWMt69J6Zbrh/pThj5PHYG6tS2zjYysqqHs3JT/cORlf3X/ZvpFu97uxNGPk8dYMgll4fFxw6OJKA7pBsbLnUJ6tg68lSusflj29HYcuYRaE5AwNBck62swLcvztSP89TO/pwST11TfMqOSdY3VeakSX/8g5rP3T5HvrvTrvU5R/qXzHuqbkusK5cSHeeTneQlTvm/XmWaJ93kyUo1evNu7vZzKFhuQv2m+pDLScau+a8kTXVjDxtI+5xSmbHge2w9fevI2Zq+6S1MS2A5Vs7vG5vZmTe1A3+8rrEzG1P3kB1WG/cc2Dh8vsbwuMx9+c85E9K3nGkEmhMQMDTXZLsvcHaExhCOr2MfSzc2b+pa6VN3Tub+AOZ62bFy5Wa/sflrnnd8OcK1ytkNGOKVp1C92wIrzFH5XKd9j8t35m4/qWaewpVL18auS0+63t5EAisQmDrrcShingqWv8vD52sMf/5EplP3rkwsbjaBdgQEDO20lZI+Q2DqmtE883vq0avPyKn//zwFp/tEj27Kr+xOmPh8fC3/WNI8gnFs/i12usfWf8m8ex2Jy7XVuaE310zn2fFT98BM1TGXJ12yfU3l3zd/7vaTm8ynHq17nH8C3zxZK48SPfUJWsf53Gp87FLAU99lcPxErW75x9bTTdv656lgtO+FiEN1zuWEQ/My/XhdYwd+5h70ucXf4fen4CP9tQOWkVVPzpKAwKICAoZFOWV2A4Fc3zp1GjrXbp9blLzsaWzZPDnn+IdvLO2p84YeI3jIZ+oa7kO6NQ6nbvrMZT85snhJP/bysTwvPs/wf+7CyXX8eRRitqX6eFKXHYS8sOqkhW6U+JVrPVM7zh9dafJ431wilhdN5cV/eSLNqZfZVTY376Yuzcq2M7dQYzezTu0kzl1HC+mm2v34QQJT9Zm6lPP4O+CbRzLLU4m6Zwv7ki9x+WlfvsfTvuP4Q8/4qZev9WRhEoE2BAQM92wn6z5HIDcP5gk2Y8u+S8085+hTniYzdcnJF1Xe1+qmbqDLy47G1p0dpq+pBEP9qY+LrKwW66ZO3WcHLoHYJf3UTdqpTB7dmjNEeSpTLt/JD34eQZrH0U4FbFk+/W/NfyvsX2uiTHl51ltUmi+uvvsoyJyBqcmr7v7DROnmbt95ClICv6HsTn2a2FA+LUzPWaaxco69g+B4uVy687LHEzrjWU8e+3uY/K2HkYHh1BOxslgOMmR4zX7qrO+csyGfUgUc+k5+25qnI9CEgIChiWZSyI5AjpJ2Jj31MY+izM7gUzMGJuSlUHnE5MDsx5NzI+3jDwuPTB3NyqM/x1aZFzDlkqqhPjvLY8tfe97YYxCn3sCbsuX76llrZKivWY+7D6+xzxjocyS+Zj3sctQ6N0bncbTZBrIz+ZEP5wz/92J9s1YwLeUfKsbH1YyxQHvODlplcdcugd5YAXKgYGz+YV7et3EY7xvmJXl907c4LWfexi7Ty1m5Od+jef/H2H0z3RdOZr1jnrm0dGx+LilL2cbSLDEv35ljj2dOkD52qWhu7s59VEPfyXkfyhLllAeBqwvkB/jqK7ECAgsL5AVleVb3WLYvXzP/dfU5a1CD0S47kEmbZ4WPJcz13lNHxsaWn5o39sOdZd+q/hs7ipdn7VeSwe7fDM65zYwc2R5aU4Kh1xma+Wh6zgrkcrSh/vgoeY6M5se8r89LzB5l+dTgG2pKnOcEj5V0dpe3MM9OfGbCsUtCxnZ6cvPoa565zrHFck/F2PxT52Unc+xJPHk6VLajsXwTGE1dUjb3fQ5j62lpXgLmsfJOBVg5WzN2OWDy7h4smDpblCeS5e8wy3b7XCaVe4m605f8fJzX2OVTuQTwnY8Td8YTSHUmPfHxnEcmP5GBDwRuJSBguJW09Swt8J4zMsxNeHkG/btW2pep/viZ2jlqlmu537+mf2H1+dGrwWiXtKMJFpiZI8Fj2eSm1pS9myZBT67N704/fE6ANeeSnUP6awy7Ow3ddaRuuX65Oz2f0365eTnjfX2CiOMzNGM/xNkRyRHKvnwO08as8hSiQ7q5w3MukZub9yFdbvA+jHeHx8FUd17u+Zna0T4n4Mn9It11XfI5T73KjetjeXxuzRwKnPP3PtV2n1zLT12GUkk21X3URG0SqH9opekLAPPY3vytZVhJerscCEm7HM/8uvqQ790aDHZ5E3Iu53m5SpG/11z+k5edJdgY+66r5It2OVM5luH71My+M6S5zPIta95Yl9+nsfnmEViNQLsBw2oIFeROAjnLkMuO5qz+L1WiL68+N93lKGXeMZAXwOV+hPwY1qzJ7n0rxdiRppq9SJf1jGWU0/4p+2dVovx4vkkNP7b6qR/f96s09+6yYzF1uUd2JD6iCpoAKGeHct19Pqf9avJglyOOx9dIJ5/BxDUjZxJySUOCyuNLCnKUPsHom1eaoS43vg/NG5qenYocNU29cpbonB3wobwP08fqnCAp68+15of0uWk0927MecHdOeXNEf880vY1aoU545cdqBq9qJtzSWDS5GxW2vENam25VCk7ffl7nzowEI9aZFddtuccUBir9NvUzJyhzLs9EpDluydnXDNt6szsB9ayfU/6SrvUrNEul/PkQEMOBnx1pfyw6qfasJIs2uV3JvdgjGUav5yZSp2yzeXvPfdE5ft6aLk8eOFeT48bKpPpBAYFBAyDNGY0IJCd5fzYnVLUHAnLTuIpy3xmJc7ORw2u3uWHMUfzplaUS0jy45lgIQ5j6b+sZn5e9Wvoep9C1SlYjsolAMrRt8+veflcg8EuZxfeuzP3Szufux+z05Ed5QSP2Zn5gUqQH++80Os9anysyw2MffNTjr7pmZad57zHIfVKe2QnOtOX7BMEjeWX9edob0y/vhJ+V/Vzb7o8DqpqscddXp71+EPPSALgXPKSHfjuUeae5JOTclN8btyeSpgAJe34CZUwZ6ZyaVqNjnYfU3OzU1qD3XVvPaPGCQxyNioBWb578jje/B2NLZod7aTtS5PLQNM+ffPWNC0HInKWeqpMOeuRbS11mrpEK98VHzCVofkE1iQgYFhTayjLqQK5bCTXo2cn6NRl56bPozffqBLn6Uw1uEm39KVPOZJ+k4LPWEnOFGRHbkbS2Ulev1J2LyPJZQtvX9PndjkSOLXzk7wSZGRHJ+PdPttKd9otPycQmVpf6pizNrm5eyrt8fw8gev482E8Ae5h/FbD7Ngn8Fpyfbk34p2WzLCxvLLtztkpnlOt4zT52xy7VC7fBdl5Pl5mjeM5aBSjpcr2DpXR1CNtK4mOwHoEBAzraQslOU/g+2qxPIEiR6NrdNEuOyW5eXbqKOqiK63MUqc3reESXY5kD+3gLpH/OXnkdP3Utehz801QkCPYfelzecln9804c1ouO8glB0OL55KXoXm3mJ6zbecetcwO81gZX21gZv7ubr3Dl3sZcnlV2mOgWCdNzgGHnJHoPmr2pEw2kDjbzpyzm3OrmrOgXzuROI+SznfsOdvQ1P1eE6s+aXaelvTGtcQ55azFnuhyQChB7xMTfSCwToFnlkrA8EwLY+0K5NKKl67iL/kDkmv+s7OdSyAq65t3qUtO+Z+74vyw5TGra7kU6bge2eHLWY+02SVH7fIEkg85zrgznvXkxWSx7Mw6+WOCx1xPncuXhhbO9d25bnlo/i2m54htAodT1pVAJ++WGHPK0fdct97NN0dJ05bd6df+nPuRXrVWcmlAmO3vxSufb6l+7112ivN44WxDl1jku+eVKoPPqX5Ol6Az299Q4N+XR+6L6Nsej9Pm7//486XjuUco9x+lfufmlUsnr3Em59zyWI7AbAEBw2wqCVcukMuTclQ+z73++AvKmiPfuRk0X+q5dnVuVmM/Iinb3HyO0+UNvC9YE/L0oBr0dz1Tcw1tlstp9J7ZjyeNlesnH6caHpl6Gdv/GF704ZzcJJh3GuSa9DG/h4mP/ss10XkCT25GPJrcO5qA77BdzEnfzSSBQq5Nzs5pzvx05x9/Th1yo3YChxy1Pp43NZ5lh9KMtVN3mbRJXmCWa83H8sxymZ97SnL2IO+jyIMEMn2of66BGbmP5kVq3hdUf0o3tX1M7fDlzF8uSczOaXY6T1l32ifBZJ7KNeeyqqxrKP+pemS5sTSntG/yGuunzMbKkXyzfHZq8z366ZlwYp9lc4/Y1LbUzTaBdl6gmIMI+Q7O526aBHc5A/J8NSPvaXiWGo51+dvvzp/6Tp/yydna/D7k3pxu3mOfczYs21qCsRiPpTWPwCoFBAyrbBaFukAgTzLKTcC5Vjs7Eu9VeeXIVY665kcol15kZyHj+RLPEcoEB/mhyg9QjpYmTS12UvdslTrPs+/rs2Ncs8/q8t6H160ln6f6PH0jp7KzY5YdpJQzP6L5nKPDeQaUL8AAABAASURBVL58rjXPPRe5ibcWGe1y9qGvvJmWRxiOLlwzswOdtEP9N1aaqS4/4HkRX3ZG84OaOubsTsqWuuWpSgmYcu9AzvjEOTfqfv9Uxp352S5yRiI7QrkB9u1qfnbsE1RlPXlPQdaZYCRPzkralCeBwtQLwyqrx11unM71yQlosq7svOfSjLxjIsNXqZR5RGzqVaOPu9RryPHU7eenKtcPrj6PUs02kUvAsvOX7T2WeTpLzpbkvo3s+KQNKvmDBFRDZcj0BBdJ19enrRN4/LyamQcL5O/pD9f4a1efdsslP9038+aei+Q71OeIdy0+2WXnNIFnXlyXp1vl6T35mzj8jaRtcxYlj0zNmZIczU77JN3ce5OS/1A5x16Idyh8vmOGln+FQ6IHDx5cOpr6DK0n079p5gry95L2yyOcs+3mEaf5rsyTzvLdmZuZsw1/auWXG33z6NM8gSs7xPkbqMlnddnW8x2ctsyTuZ6jcskjibOv8qI1nr/bPJigRh/kfQwZDvV934E5EBKHoT5nEYbyO0zPpWv5W8jfbLb5fI/kN+bYJk92yoGbBO75e8j3QIKNQx6GBJoTyB9hc4VWYAIzBHJEMDsSebpRjlxlBzg/Qjk69Jy1fMbzJZ4jlNlBzQ/V1NGlWuxuXW7qzaNDs0OUH6nswKQu+RHN5xxFz8vG+o6q3a3QJ6w4R1nzg5o6ZucqO5mpW3auEzDl5VHZoc9R8ROyfSppdoTySNocqcyOfS7bynryQq+sM8FIdqiz85zyPJXBzAnZ2c26spOeSzM+rZbLMG+8zY5WLuWpSVftEhhnm3j3Wkt2/rK9xzIBUXb0xm5GrUXO6hKs5Lr0/D0lSMnjTNNueWpVnsx0VqYzF8qObALqnDnI38ThbyRtm8fZ5gbcD6q8Uo60T43qJgRy5inbbi7/yXflS1T6fHe+UA3zt5nAM4/OTfCXs1s1ebEubZS/kx+qHPuOyidIqVmDXX4DBmcuMCPfRQlM8z2S35hjmwSBOXCTwD1/DwusThbtCWyrxAKGbbWn2hAgQIAAgbUL5CldedTuUD/29uTULWeD8z6IjPf1OQPSN900AgTOFBAwnAlnsW0IqAUBAgQI3FwglwblMrWhPmd9c0ldX8ESLOQSoFwy2Dc/0xKIZKgnQGAhAQHDQpCyIUCAAIG7Clh5OwLfVkXNvSU1GOxyD0puon71SvGS1edRurlcMPejJdCoSYNd7ukanGkGAQKnCwgYTjezBAECBAgQIHCZQO6NGMshD67IzcV5Q3juBcqbynPTet44PbZcAo05Ny+P5WHe3QUUYG0CAoa1tYjyECBAgACB7Qt8ZFUxN6rXYNEuDy5YNEOZESDw4IGAwVZwtoAFCRAgQIDAmQJ58lsev7vkDcp5OtYpj0E+s+gWI7A/AQHD/tpcjQkQINAV8JnAPQTyLpc8HjXvQ7lk/XnPRh6PnMecXpKPZQkQGBAQMAzAmEyAAAECBAhcXSBBQ96H8ry1prz4Le8PqdHJLpcz5UWLeUFn3rORFzBOLrSPBGpJYHkBAcPypnIkQIAAAQIEThP47kqepyLlxZrPXuMvXH1egPaGNXzr6t+g+lxylBek5aWVeYFc7lfICzprlo4AgWsKCBiuqTuSt1kECBAgQIBAr8CP1dRvqv5Lqv/E6j+i+k+qPpccfVUNv6d6HQECNxQQMNwQ26oIENikgEoRIECAAIFNCwgYNt28KkeAAAECBAjMF5CSAIE+AQFDn4ppBAgQIECAAAECBAg8FGgyYHhYcv8RIECAAAECBAgQIHB1AQHD1YmtgACBEQGzCBAgQIAAgZULCBhW3kCKR4AAAQIE2hBQSgIEtiogYNhqy6oXAQIECBAgQIAAgXMEOssIGDogPhIgQIAAAQIECBAg8EwBAcMzLYwRaE1AeQkQIECAAAECVxcQMFyd2AoIECBAgMCUgPkECBBYr4CAYb1to2QECBAgQIAAAQKtCWywvAKGDTaqKhEgQIAAAQIECBBYSkDAsJSkfFoTUF4CBAgQIECAAIEZAgKGGUiSECBAgMCaBZSNAAECBK4pIGC4pq68CRAgQIAAAQIE5gtIuUoBAcMqm0WhCBAgQIAAAQIECKxDQMCwjnZorRTKS4AAAQIECBAgsBMBAcNOGlo1CRAg0C9gKgECBAgQGBcQMIz7mEuAAAECBAgQaENAKQlcSUDAcCVY2RIgQIAAAQIECBDYgoCA4fataI0ECBAgQIAAAQIEmhEQMDTTVApKgMD6BJSIAAECBAhsX0DAsP02VkMCBAgQIEBgSsB8AgQGBQQMgzRmECBAgAABAgQIECDQWsCgxQgQIECAAAECBAgQuKGAgOGG2FZFgMCxgHECBAgQIECgBQEBQwutpIwECBAgQGDNAspGgMCmBQQMm25elSNAgAABAgQIECAwX6AvpYChT8U0AgQIECBAgAABAgQeCggYHjL4j0BrAspLgAABAgQIELiNgIDhNs7WQoAAAQIE+gVMJUCAwMoFBAwrbyDFI0CAAAECBAgQaENgq6UUMGy1ZdWLAAECBAgQIECAwAICAoYFEGXRmoDyEiBAgAABAgQIzBUQMMyVko4AAQIE1iegRAQIECBwdQEBw9WJrYAAAQIECBAgQGBKwPz1CggY1ts2SkaAAAECBAgQIEDg7gIChrs3QWsFUF4CBAgQIECAAIE9CQgY9tTa6kqAAIFjAeMECBAgQGCGgIBhBpIkBAgQIECAAIE1CygbgWsKCBiuqStvAgQIECBAgAABAo0LCBhu2oBWRoAAAQIECBAgQKAtAQFDW+2ltAQIrEVAOQgQIECAwE4EBAw7aWjVJECAAAECBPoFTCVAYFxAwDDuYy4BAgQIECBAgACBXQs0FDDsup1UngABAgQIECBAgMBdBAQMd2G3UgI7F1B9AgQIECBAoBkBAUMzTaWgBAgQIEBgfQJKRIDA9gUEDNtvYzUkQIAAAQIECBAgMCUwOF/AMEhjBgECBAgQIECAAAECAgbbAIHWBJSXAAECBAgQIHBDAQHDDbGtigABAgQIHAsYJ0CAQAsCAoYWWkkZCRAgQIAAAQIE1iyw6bIJGDbdvCpHgAABAgQIECBA4DIBAcNlfpZuTUB5CRAgQIAAAQIEThIQMJzEJTEBAgQIrEVAOQgQIEDgNgIChts4WwsBAgQIECBAgEC/gKkrFxAwrLyBFI8AAQIECBAgQIDAPQUEDPfUb23dykuAAAECBAgQILA7AQHD7ppchQkQIPDgAQMCBAgQIDBXQMAwV0o6AgQIECBAgMD6BJSIwNUFBAxXJ7YCAgQIECBAgAABAu0KCBhu1XbWQ4AAAQIECBAgQKBBAQFDg42myAQI3FfA2gkQIECAwJ4EBAx7am11JUCAAAECBI4FjBMgMENAwDADSRICBAgQIECAAAECexVoI2DYa+uoNwECBAgQIECAAIE7CwgY7twAVk9gbwLqS4AAAQIECLQlIGBoq72UlgABAgQIrEVAOQgQ2ImAgGEnDa2aBAgQIECAAAECBPoFxqcKGMZ9zCVAgAABAgQIECCwawEBw66bX+VbE1BeAgQIECBAgMCtBQQMtxa3PgIECBAg8OABAwIECDQjIGBopqkUlAABAgQIECBAYH0C2y+RgGH7bayGBAgQIECAAAECBM4WEDCcTWfB1gSUlwABAgQIECBA4HQBAcPpZpYgQIAAgfsKWDsBAgQI3FBAwHBDbKsiQIAAAQIECBA4FjDegoCAoYVWUkYCBAgQIECAAAECdxIQMNwJvrXVKi8BAgQIECBAgMA+BQQM+2x3tSZAYL8Cak6AAAECBE4SEDCcxCUxAQIECBAgQGAtAspB4DYCAobbOFsLAQIECBAgQIAAgSYFBAw3aDarIECAAAECBAgQINCqgICh1ZZTbgIE7iFgnQQIECBAYHcCAobdNbkKEyBAgAABAg8eMCBAYK6AgGGulHQECBAgQIAAAQIEdiiw+oBhh22iygQIECBAgAABAgRWIyBgWE1TKAiBzQuoIAECBAgQINCggIChwUZTZAIECBAgcF8BaydAYE8CAoY9tba6EiBAgAABAgQIEDgWmDEuYJiBJAkBAgQIECBAgACBvQoIGPba8urdmoDyEiBAgAABAgTuIiBguAu7lRIgQIDAfgXUnAABAm0JCBjaai+lJUCAAAECBAgQWIvATsohYNhJQ6smAQIECBAgQIAAgXMEBAznqFmmNQHlJUCAAAECBAgQOFNAwHAmnMUIECBA4B4C1kmAAAECtxYQMNxa3PoIECBAgAABAgQePGDQjICAoZmmUlACBAgQIECAAAECtxcQMNzevLU1Ki8BAgQIECBAgMCOBQQMO258VSdAYG8C6kuAAAECBE4XEDCcbmYJAgQIECBAgMB9BaydwA0FBAw3xLYqAgQIECBAgAABAq0JCBiu22JyJ0CAAAECBAgQINC0gICh6eZTeAIEbidgTQQIECBAYJ8CAoZ9trtaEyBAgACB/QqoOQECJwkIGE7ikpgAAQIECBAgQIDAvgTWHDDsqyXUlgABAgQIECBAgMAKBQQMK2wURSKwPQE1IkCAAAECBFoVEDC02nLKTYAAAQIE7iFgnQQI7E5AwLC7JldhAgQIECBAgAABAg8ezDUQMMyVko4AAQIECBAgQIDADgUEDDtsdFVuTUB5CRAgQIAAAQL3ExAw3M/emgkQIEBgbwLqS4AAgQYFBAwNNpoiEyBAgAABAgQI3FdgT2sXMOyptdWVAAECBAgQIECAwIkCAoYTwSRvTUB5CRAgQIAAAQIELhEQMFyiZ1kCBAgQuJ2ANREgQIDAXQQEDHdht1ICBAgQIECAwH4F1LwtAQFDW+2ltAQIECBAgAABAgRuKiBguCl3aytTXgIECBAgQIAAgb0LCBj2vgWoPwEC+xBQSwIECBAgcKaAgOFMOIsRIECAAAECBO4hYJ0Ebi0gYLi1uPURIECAAAECBAgQaEhAwHC1xpIxAQIECBAgQIAAgfYFBAztt6EaECBwbQH5EyBAgACBHQsIGHbc+KpOgAABAgT2JqC+BAicLiBgON3MEgQIECBAgAABAgR2I7DSgGE3/ipKgAABAgQIECBAYNUCAoZVN4/CEdiAgCoQIECAAAECTQsIGJpuPoUnQIAAAQK3E7AmAgT2KSBg2Ge7qzUBAgQIECBAgMB+BU6quYDhJC6JCRAgQIAAAQIECOxLQMCwr/ZW29YElJcAAQIECBAgcGcBAcOdG8DqCRAgQGAfAmpJgACBVgUEDK22nHITIECAAAECBAjcQ2B36xQw7K7JVZgAAQIECBAgQIDAfAEBw3wrKVsTUF4CBAgQIECAAIGLBQQMFxPKgAABAgSuLSB/AgQIELifgIDhfvbWTIAAAQIECBDYm4D6NiggYGiw0RSZAAECBAgQIECAwK0EBAy3km5tPcpLgAABAgQIECBAoAQEDIWgI0CAwJYF1I0AAQIECFxv/hzsAAAQAElEQVQiIGC4RM+yBAgQIECAAIHbCVgTgbsICBjuwm6lBAgQIECAAAECBNoQEDBco53kSYAAAQIECBAgQGAjAgKGjTSkahAgcB0BuRIgQIAAgb0LCBj2vgWoPwECBAgQ2IeAWhIgcKaAgOFMOIsRIECAAAECBAgQ2IPA+gKGPairIwECBAgQIECAAIFGBAQMjTSUYhJoUUCZCRAgQIAAgfYFBAztt6EaECBAgACBawvInwCBHQsIGHbc+KpOgAABAgQIECCwN4HT6ytgON3MEgQIECBAgAABAgR2IyBg2E1Tq2hrAspLgAABAgQIEFiDgIBhDa2gDAQIECCwZQF1I0CAQNMCAoamm0/hCRAgQIAAAQIEbiewzzUJGPbZ7mpNgAABAgQIECBAYJaAgGEWk0StCSgvAQIECBAgQIDAMgIChmUc5UKAAAEC1xGQKwECBAjcWUDAcOcGsHoCBAgQIECAwD4E1LJVAQFDqy2n3AQIECBAgAABAgRuICBguAFya6tQXgIECBAgQIAAAQIHAQHDQcKQAAEC2xNQIwIECBAgcLGAgOFiQhkQIECAAAECBK4tIH8C9xMQMNzP3poJECBAgAABAgQIrF5AwLBwE8mOAAECBAgQIECAwJYEBAxbak11IUBgSQF5ESBAgAABAiUgYCgEHQECBAgQILBlAXUjQOASAQHDJXqWJUCAAAECBAgQILBxgVUFDBu3Vj0CBAgQIECAAAECzQkIGJprMgUm0ISAQhIgQIAAAQIbERAwbKQhVYMAAQIECFxHQK4ECOxdQMCw9y1A/QkQIECAAAECBPYhcGYtBQxnwlmMAAECBAgQIECAwB4EBAx7aGV1bE1AeQkQIECAAAECqxEQMKymKRSEAAECBLYnoEYECBBoX0DA0H4bqgEBAgQIECBAgMC1BXacv4Bhx42v6gQIECBAgAABAgSmBAQMU0LmtyagvAQIECBAgAABAgsKCBgWxJQVAQIECCwpIC8CBAgQWIOAgGENraAMBAgQIECAAIEtC6hb0wIChqabT+EJECBAgAABAgQIXFdAwHBd39ZyV14CBAgQIECAAAECTwgIGJ7g8IEAAQJbEVAPAgQIECCwjICAYRlHuRAgQIAAAQIEriMgVwJ3FhAw3LkBrJ4AAQIECBAgQIDAmgUEDMu1jpwIECBAgAABAgQIbE5AwLC5JlUhAgQuF5ADAQIECBAgcBAQMBwkDAkQIECAAIHtCagRAQIXCwgYLiaUAQECBAgQIECAAIHtCqwlYNiusJoRIECAAAECBAgQaFhAwNBw4yk6gXUKKBUBAgQIECCwJQEBw5ZaU10IECBAgMCSAvIiQIBACQgYCkFHgAABAgQIECBAYMsCl9RNwHCJnmUJECBAgAABAgQIbFxAwLDxBla91gSUlwABAgQIECCwLgEBw7raQ2kIECBAYCsC6kGAAIGNCAgYNtKQqkGAAAECBAgQIHAdgb3nKmDY+xag/gQIECBAgAABAgRGBAQMIzhmtSagvAQIECBAgAABAksLCBiWFpUfAQIECFwuIAcCBAgQWI2AgGE1TaEgBAgQIECAAIHtCahR+wIChvbbUA0IECBAgAABAgQIXE1AwHA12tYyVl4CBAgQIECAAAECTwsIGJ42MYUAAQJtCyg9AQIECBBYUEDAsCCmrAgQIECAAAECSwrIi8AaBAQMa2gFZSBAgAABAgQIECCwUgEBwyINIxMCBAgQIECAAAEC2xQQMGyzXdWKAIFzBSxHgAABAgQIPCEgYHiCwwcCBAgQIEBgKwLqQYDAMgIChmUc5UKAAAECBAgQIEBgkwIrCBg26apSBAgQIECAAAECBDYhIGDYRDOqBIGVCCgGAQIECBAgsDkBAcPmmlSFCBAgQIDA5QJyIECAwEFAwHCQMCRAgAABAgQIECCwPYGLayRguJhQBgQIECBAgAABAgS2KyBg2G7bqllrAspLgAABAgQIEFihgIBhhY2iSAQIECDQtoDSEyBAYEsCAoYttaa6ECBAgAABAgQILCkgrxIQMBSCjgABAgQIECBAgACBfgEBQ7+Lqa0JKC8BAgQIECBAgMBVBAQMV2GVKQECBAicK2A5AgQIEFiXgIBhXe2hNAQIECBAgACBrQiox0YEBAwbaUjVIECAAAECBAgQIHANAQHDNVRby1N5CRAgQIAAAQIECAwICBgGYEwmQIBAiwLKTIAAAQIElhYQMCwtKj8CBAgQIECAwOUCciCwGgEBw2qaQkEIECBAgAABAgQIrE9AwHBpm1ieAAECBAgQIECAwIYFBAwbblxVI0DgNAGpCRAgQIAAgacFBAxPm5hCgAABAgQItC2g9AQILCggYFgQU1YECBAgQIAAAQIEtiZw34Bha5rqQ4AAAQIECBAgQGBjAgKGjTWo6hC4l4D1EiBAgAABAtsUEDBss13VigABAgQInCtgOQIECDwhIGB4gsMHAgQIECBAgAABAlsRWKYeAoZlHOVCgAABAgQIECBAYJMCAoZNNqtKtSagvAQIECBAgACBtQoIGNbaMspFgAABAi0KKDMBAgQ2JyBg2FyTqhABAgQIECBAgMDlAnI4CAgYDhKGBAgQIECAAAECBAg8JSBgeIrEhNYElJcAAQIECBAgQOB6AgKG69nKmQABAgROE5CaAAECBFYoIGBYYaMoEgECBAgQIECgbQGl35KAgGFLrakuBAgQIECAAAECBBYWEDAsDNpadspLgAABAgQIECBAYExAwDCmYx4BAgTaEVBSAgQIECBwFQEBw1VYZUqAAAECBAgQOFfAcgTWJSBgWFd7KA0BAgQIECBAgACBVQkIGC5oDosSIECAAAECBAgQ2LqAgGHrLax+BAjMEZCGAAECBAgQGBAQMAzAmEyAAAECBAi0KKDMBAgsLSBgWFpUfgQIECBAgAABAgQ2JHC3gGFDhqpCgAABAgQIECBAYLMCAobNNq2KEbiZgBURIECAAAECGxYQMGy4cVWNAAECBAicJiA1AQIEnhYQMDxtYgoBAgQIECBAgACBtgUWLL2AYUFMWREgQIAAAQIECBDYmoCAYWstqj6tCSgvAQIECBAgQGDVAgKGVTePwhEgQIBAOwJKSoAAgW0KCBi22a5qRYAAAQIECBAgcK6A5Z4QEDA8weEDAQIECBAgQIAAAQLHAgKGYw3jrQkoLwECBAgQIECAwJUFBAxXBpY9AQIECMwRkIYAAQIE1iogYFhryygXAQIECBAgQKBFAWXenICAYXNNqkIECBAgQIAAAQIElhMQMCxn2VpOykuAAAECBAgQIEBgUkDAMEkkAQECBNYuoHwECBAgQOB6AgKG69nKmQABAgQIECBwmoDUBFYoIGBYYaMoEgECBAgQIECAAIG1CAgYzmsJSxEgQIAAAQIECBDYhYCAYRfNrJIECAwLmEOAAAECBAiMCQgYxnTMI0CAAAECBNoRUFICBK4iIGC4CqtMCRAgQIAAAQIECGxD4B4Bwzbk1IIAAQIECBAgQIDADgQEDDtoZFUkcD0BORMgQIAAAQJbFxAwbL2F1Y8AAQIECMwRkIYAAQIDAgKGARiTCRAgQIAAAQIECLQosHSZBQxLi8qPAAECBAgQIECAwIYEBAwbakxVaU1AeQkQIECAAAEC6xcQMKy/jZSQAAECBNYuoHwECBDYsICAYcONq2oECBAgQIAAAQKnCUj9tICA4WkTUwgQIECAAAECBAgQeCQgYHgEYdCagPISIECAAAECBAjcQkDAcAtl6yBAgACBYQFzCBAgQGDVAgKGVTePwhEgQIAAAQIE2hFQ0m0KCBi22a5qRYAAAQIECBAgQGARAQHDIoytZaK8BAgQIECAAAECBOYJCBjmOUlFgACBdQooFQECBAgQuLKAgOHKwLInQIAAAQIECMwRkIbAWgUEDGttGeUiQIAAAQIECBAgsAIBAcPJjWABAgQIECBAgAABAvsREDDsp63VlACBroDPBAgQIECAwKSAgGGSSAICBAgQIEBg7QLKR4DA9QQEDNezlTMBAgQIECBAgACB5gVuHDA076UCBAgQIECAAAECBHYlIGDYVXOrLIEFBWRFgAABAgQI7EJAwLCLZlZJAgQIECAwLGAOAQIExgQEDGM65hEgQIAAAQIECBBoR+AqJRUwXIVVpgQIECBAgAABAgS2ISBg2EY7qkVrAspLgAABAgQIEGhEQMDQSEMpJgECBAisU0CpCBAgsHUBAcPWW1j9CBAgQIAAAQIE5ghIMyAgYBiAMZkAAQIECBAgQIAAgQcPBAy2gvYElJgAAQIECBAgQOBmAgKGm1FbEQECBAh0BXwmQIAAgfULCBjW30ZKSIAAAQIECBBYu4DybVhAwLDhxlU1AgQIECBAgAABApcKCBguFWxteeUlQIAAAQIECBAgcIKAgOEELEkJECCwJgFlIUCAAAECtxAQMNxC2ToIECBAgAABAsMC5hBYtYCAYdXNo3AECBAgQIAAAQIE7isgYDjFX1oCBAgQIECAAAECOxMQMOyswVWXAIFnCPifAAECBAgQmCcgYJjnJBUBAgQIECCwTgGlIkDgygIChisDy54AAQIECBAgQIBAywK3CxhaVlJ2AgQIECBAgAABAjsVEDDstOFVm8AlApYlQIAAAQIE9iMgYNhPW6spAQIECBDoCvhMgACBSQEBwySRBAQIECBAgAABAgTWLnC98gkYrmcrZwIECBAgQIAAAQLNCwgYmm9CFWhNQHkJECBAgAABAi0JCBhaai1lJUCAAIE1CSgLAQIEdiEgYNhFM6skAQIECBAgQIDAsIA5YwIChjEd8wgQIECAAAECBAjsXEDAsPMNoLXqKy8BAgQIECBAgMBtBQQMt/W2NgIECBB4hoD/CRAgQKARAQFDIw2lmAQIECBAgACBdQoo1dYFBAxbb2H1I0CAAAECBAgQIHCBgIDhArzWFlVeAgQIECBAgAABAqcKCBhOFZOeAAEC9xdQAgIECBAgcDMBAcPNqK2IAAECBAgQINAV8JnA+gUEDOtvIyUkQIAAAQIECBAgcDcBAcNMeskIECBAgAABAgQI7FFAwLDHVldnAvsWUHsCBAgQIEDgBAEBwwlYkhIgQIAAAQJrElAWAgRuISBguIWydRAgQIAAAQIECBBoVOAmAUOjNopNgAABAgQIECBAYPcCAobdbwIACJwkIDEBAgQIECCwMwEBw84aXHUJECBAgMAzBPxPgACBeQIChnlOUhEgQIAAAQIECBBYp8CVSyVguDKw7AkQIECAAAECBAi0LCBgaLn1lL01AeUlQIAAAQIECDQnIGBorskUmAABAgTuL6AEBAgQ2I+AgGE/ba2mBAgQIECAAAECXQGfJwUEDJNEEhAgQIAAAQIECBDYr4CAYb9t31rNlZcAAQIECBAgQOAOAgKGO6BbJQECBPYtoPYECBAg0JKAgKGl1lJWAgQIECBAgMCaBJRlFwIChl00s0oSIECA/zUHiwAABPhJREFUAAECBAgQOE9AwHCeW2tLKS8BAgQIECBAgACBswQEDGexWYgAAQL3ErBeAgQIECBwWwEBw229rY0AAQIECBAg8AwB/xNoREDA0EhDKSYBAgQIECBAgACBewgIGKbVpSBAgAABAgQIECCwWwEBw26bXsUJ7FFAnQkQIECAAIFTBQQMp4pJT4AAAQIECNxfQAkIELiZgIDhZtRWRIAAAQIECBAgQKA9gWsHDO2JKDEBAgQIECBAgAABAo8FBAyPKYwQIDAuYC4BAgQIECCwRwEBwx5bXZ0JECBAYN8Cak+AAIETBAQMJ2BJSoAAAQIECBAgQGBNArcoi4DhFsrWQYAAAQIECBAgQKBRAQFDow2n2K0JKC8BAgQIECBAoE0BAUOb7abUBAgQIHAvAeslQIDAzgQEDDtrcNUlQIAAAQIECBB4hoD/5wkIGOY5SUWAAAECBAgQIEBglwIChl02e2uVVl4CBAgQIECAAIF7CQgY7iVvvQQIENijgDoTIECAQHMCAobmmkyBCRAgQIAAAQL3F1CC/QgIGPbT1mpKgAABAgQIECBA4GQBAcPJZK0toLwECBAgQIAAAQIEzhcQMJxvZ0kCBAjcVsDaCBAgQIDAHQQEDHdAt0oCBAgQIEBg3wJqT6AlAQFDS62lrAQIECBAgAABAgRuLCBgGAU3kwABAgQIECBAgMC+BQQM+25/tSewHwE1JUCAAAECBM4SEDCcxWYhAgQIECBA4F4C1kuAwG0FBAy39bY2AgQIECBAgAABAk0JXDFgaMpBYQkQIECAAAECBAgQ6BEQMPSgmESAQEfARwIECBAgQGC3AgKG3Ta9ihMgQIDAHgXUmQABAqcKCBhOFZOeAAECBAgQIECAwP0FblYCAcPNqK2IAAECBAgQIECAQHsCAob22kyJWxNQXgIECBAgQIBAwwIChoYbT9EJECBA4LYC1kaAAIE9CggY9tjq6kyAAAECBAgQ2LeA2p8gIGA4AUtSAgQIECBAgAABAnsTEDDsrcVbq6/yEiBAgAABAgQI3FVAwHBXfisnQIDAfgTUlAABAgTaFBAwtNluSk2AAAECBAgQuJeA9e5MQMCwswZXXQIECBAgQIAAAQKnCAgYTtFqLa3yEiBAgAABAgQIELhQQMBwIaDFCRAgcAsB6yBAgAABAvcSEDDcS956CRAgQIAAgT0KqDOB5gQEDM01mQITIECAAAECBAgQuJ2AgGHI2nQCBAgQIECAAAECBB4IGGwEBAhsXkAFCRAgQIAAgfMFBAzn21mSAAECBAgQuK2AtREgcAcBAcMd0K2SAAECBAgQIECAQCsC1wkYWqm9chIgQIAAAQIECBAgMCogYBjlMZMAAQIECBAgQIDAvgUEDPtuf7UnQIAAgf0IqCkBAgTOEhAwnMVmIQIECBAgQIAAAQL3ErjtegUMt/W2NgIECBAgQIAAAQJNCQgYmmouhW1NQHkJECBAgAABAq0LCBhab0HlJ0CAAIFbCFgHAQIEdisgYNht06s4AQIECBAgQGCPAup8qoCA4VQx6QkQIECAAAECBAjsSEDAsKPGbq2qykuAAAECBAgQIHB/AQHD/dtACQgQILB1AfUjQIAAgYYFBAwNN56iEyBAgAABAgRuK2BtexQQMOyx1dWZAAECBAgQIECAwEwBAcNMqNaSKS8BAgQIECBAgACBJQT+PwAAAP//0lSf6wAAAAZJREFUAwCpr2L8t+WQrgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-13"><g transform="translate(0.5,0.5)"><path d="M 360 50 L 460 50 L 480 145 L 460 240 L 360 240 L 380 145 Z" fill="url(#drawio-svg-MCMinqyYlBk5ojjIWS_3-gradient-light-dark_ffffff_121212_-1-light-dark_fff2cc_281d00_-1-s-0)" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: url("#drawio-svg-MCMinqyYlBk5ojjIWS_3-gradient-light-dark_ffffff_121212_-1-light-dark_fff2cc_281d00_-1-s-0"); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 145px; margin-left: 361px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Dynamic<br />implementation</div></div></div></foreignObject><image x="361" y="131" width="118" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-14"><g transform="translate(0.5,0.5)"><rect x="1090" y="3" width="120" height="60" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 33px; margin-left: 1091px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Common Software Tooling</div></div></div></foreignObject><image x="1091" y="19" width="118" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-15"><g transform="translate(0.5,0.5)"><path d="M 150 175 L 313.63 175" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 318.88 175 L 311.88 178.5 L 313.63 175 L 311.88 171.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-16"><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 161px; margin-left: 237px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; font-weight: bold; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; ">Intermediate Representation</div></div></div></foreignObject><image x="163" y="155" width="148" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlAAAAA/CAYAAAAv3/bjAAAQAElEQVR4AeydB7gkRRHHezGhmLOYDjNmDCiIeigiJkQRxYDfoYiIAVREEZU7BRUDknM6cs453pEzR845fOSco+83Ry/9ertqws7szr5X912/ma7O/+murq6u7p3naftnCBgChoAhYAgYAoaAIVAKgXmc/TMEDAFDwBAwBEYOAauwITBcBEyAGi7+VrohYAgYAoaAIWAIjCACJkCN4EezKhsCbUDA6mAIGAKGwGRGwASoyfz1re2GgCFgCBgChoAhUAkBE6AqwdaGRFYHQ8AQMAQMAUPAEBgWAiZADQt5K9cQMAQMAUPAEJiMCEyQNncFqIceeshdeumlSXfnnXdOkOZaMyYaAk8++aS7/vrrk+7RRx/taS59fM8993Sx23vvvd1jjz3WE98I5RG4+uqrk3wE7Iu4a6+91t1///3lC7YUhoAhMBQEnnrqKbfffvv18FX47LnnnjuUOg2i0K4ARUMXXHBBl3K//e1vB1EXK8MQKI3A7Nmz3Vvf+tak23XXXXvy22mnndzyyy/f47797W9nQlhPAiOURuDtb397ko+keEuKtsACC7iXvvSlrtPpuIUXXthNnz7dXXXVVaXrYQlEBCzAEKgVgQcffNAtu+yyPXwVXrvxxhvXWlabMusKUE8//bRYL6RLMXBAAbfddps77bTTetw555wzoBpYMW1EQOubWp9uW1vox6n+ffvtt7etqgOtz5lnnulmzJjh3vGOd7iUQDzQylhhhkBNCLR5vLe5bjXBX1s2XQGqthwbymiLLbZwiyyySI/76Ec/alsvDWFu2TaEQJTtI4884ujHqf5Nv4+iT1rvD37wAzdt2jTHanfSgmANH3kE2jze21y3Nn74kRGg2gie1ckQMAQGi8DMmTPdH//4x8EWaqUZAoaAIZBAYDIKUAkYjGQIGAKjggA2FWwzjEp9rZ6GgCEwMREwAWpifldrlYDAu971LvepT32qx3360592L3vZy4RURq4LgQ9+8INOcnybl7zkJYWKsoMthWCySBMOgXY26HnPe56bOnVqD1+F177//e9vZ6VrqJUJUDWAaFmMDgLY0Jx00kkudieccIJ7zWteMzoNGdGannfeeU5yl112mbvvvvvcTTfd5P7whz+oLZw1a5bZPqoIWaAhMDgE5p13Xnf88cf38FX47ERe7AxEgIIxHnHEEW6rrbZym222mTv00EOze2IwWBvcJx5fEncHcfcP9eGUz9///ne34447usMPP9zddddd4yPX4ONE2MUXX+wOPvhgt+mmm7rtttuudK5PPPGEu+SSS7I6brPNNm6PPfZwJ598srvjjjvUvDjBOGvWrOwUE+Wecsopfd+zQ3vOP/98t8suu7j//e9/bp111nH//e9/szJmz57t6vi21JvvscMOO7gNNtjA7bzzzo68U/c7qQA0EHjNNddk/Zj28z1x9Ce+B0futdOBDVRnXJbgg0AIbuuvv372bXz92PoaZt3GVVTwzD///O4f//hHVm8hSkaGr2QvBf7UNd4LFJVF4RswVg855BDHWD3mmGMc/TkLrPkPY+3ss8929D/G4lFHHZVbwt13353136233tqtu+667q9//WvGnw866KBaroyAh5511llZneCta6yxhvv3v/+d8Qd4EXd95VYyJ0LTbUgVf/PNN2c8iLliww03dPvuu6/jnqN77703FX0gtDbzoioA0HfA9Z///KdD+Jo2bZr78Y9/nC2qmGMYSw8//HCVrHPTwFPKyCqVBah77rnHcd/Lm9/8Zhc7jmNTUxq62GKLufe85z3uS1/6kltllVXcL37xC/fVr341uyfmhS98ofvLX/7iyIv4sZs+fbr75je/mbnNN988Du76v/Wtb2VxiLvWWmt16fELAgiT8Pve9z7H3UHc/UN9KGfttdd2K664ovvyl7/sXvWqV2XPAw44IM6ix3/FFVdkd9Zwb03sbrnlliw+Uviiiy7qKHfppZd2v/zlLx1lZoFjfy688MIeDD2mXEro6/3ud7/bvfe9783qtvLKK7vvfve7DnzRnOC/4YYbxnJ79j/fgfJe97rXucUXX9xximmllVbK1KzUlZNfCCjPpsh/g1HAbF//+te7D33oQ26FFVZwv/nNbzIGDJOkjKlTpzq+LXjCXPJzHR/jxBNPdJ///Ocd9eZ7/OhHP8oG0g9/+MNMTUx7EQwQ4sanzPf95z//Eb8XzFHLAUEVA2a+zdve9rasH9N+vieO/sT34Mj9G97wBkefuuCCC5JZIkzTX3H032SkMSKTL3G8Q2gdIyf/01fAnNXgZz/7WQduaHL4Xr5+fHPqBr2pCT1ZuQpE+pWWDAy1cD9uGHd1jfd//etfyf6zzDLL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"/></switch></g></g></g></g><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-17"><g transform="translate(0.5,0.5)"><path d="M 425 370.5 L 435.5 370.5 L 420 389.5 L 404.5 370.5 L 415 370.5 L 415 259.5 L 404.5 259.5 L 420 240.5 L 435.5 259.5 L 425 259.5 Z" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-19"><g><path d="M 480 145 L 515 145 L 515 250 L 539.75 249.99" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 547.25 249.99 L 537.25 254.99 L 539.75 249.99 L 537.25 244.99 Z" fill="#000000" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-20"><g transform="translate(0.5,0.5)"/><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-21"><g transform="translate(0.5,0.5)"><rect x="550" y="170" width="430" height="190" fill="#ffffff" stroke="#000000" stroke-dasharray="3 3" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 428px; height: 1px; padding-top: 265px; margin-left: 551px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Software Compute Unit archetype<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></b></div></div></div></foreignObject><image x="551" y="179" width="428" height="176" xlink:href="data:image/png;base64,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gLYSIECAAIGLCfzPkZp1fI4AWU2AAIGFCfxutedDanzuGn+wxlMHvw+nytmOwFkCNiZAgMC6BCSw1nW8tJYAAQIECBAgQGApAtoxReA3q9BT1fjUHWOW/14tNxAgQIDAsgS+oZrzKjX+tRpfu8Yn1PiCNT5djU9T4/vVeO73t9+HQjQQIECAAAECwwKLSWANN9NaAgQIECBAgAABAgRWKvAH1e7f7xizvBYbCBDYmoB4Fy/wa9XCb6zxq2v8NzV+fY0/UuNv1zjnkN8Bvw9ziqqLAAECBAg0JiCB1dgBFQ4BApsTEDABAgQIECBAgAABAgQIECDQvoAICRAgsDkBCazNHXIBEyBAgAABAgQI3N0xIECAAAECBAgQIECAAAECBJYsME8Ca8kRahsBAgQIECBAgAABAgQIECAwj4BaCBAgQIAAAQIECFxJQALrStB2Q4AAgS4BywgQIECAAAECBAgQIECAAIH2BURIgAABAscLSGAdb2YLAgQIECBAgACB2wrYOwECBAgQIECAAAECBAgQINC4wB+/u2s8QuERIECAAAECBAgQIECAAAECd3d3EAgQIECAAAECBAisR8AVWOs5VlpKgMDSBLSHAAECBAgQIECAAAECBAgQaF9AhAQIECBwEwEJrJuw2ykBAgQIECBAYLsCIidAgAABAgQIECBAgAABAgTaFzg3QgmscwVtT4AAAQIECBAgQIAAAQIELi9gDwQIECBAgAABAgQ2JSCBtanDLVgCBB4XMEeAAAECBAgQIECAAAECBAi0LyBCAgQIEFirgATWWo+cdhMgQIAAAQIEbiFgnwQIECBAgAABAgQIECBAgED7AguIUAJrAQdBEwgQIECAAAECBAgQIECgbQHRESBAgAABAgQIECBwnIAE1nFeShMgsAwBrSBAgAABAgQIECBAgAABAgTaFxAhAQIECGxYQAJrwwdf6AQIECBAgMDWBMRLgAABAgQIECBAgAABAgQItC/QRoQSWG0cR1EQIECAAAECBAgQIECAwKUE1EuAAAECBAgQIECAwNUFJLCuTm6HBAgQIECAAAECBAgQIECAAAECBNoXECEBAgQIEDhHQALrHD3bEiBAgAABAgSuJ2BPBAgQIECAAAECBAgQIECAQPsCIrwvIIF1H8KEAAECBAgQIECAAAECBFoUEBMBAgQIECBAgAABAmsUkMBa41HTZgK3FLBvAgQIECBAgAABAgQIECBAoH0BERIgQIAAgRsLSGDd+ADYPQECBAgQILANAVESIECAAAECBAgQIECAAAEC7QuIcD4BCaz5LNVEgAABAgQIECBAgAABAvMKqI0AAQIECBAgQIAAgY0KSGBt9MALe6sC4iZAgAABAgQIECBAgAABAgTaFxAhAQIECBBYv4AE1vqPoQgIECBAgACBSwuonwABAgQIECBAgAABAgQIEGhfQISLEpDAWtTh0BgCBAgQIECAAAECBAi0IyASAgQIECBAgAABAgQInCoggXWqnO0IXF/AHgkQIECAAAECBAgQIECAAIH2BURIgAABAgQIuaTJuwAAEABJREFUlIAEViEYCBAgQIAAgZYFxEaAAAECBAgQIECAAAECBAi0LyDC1gQksFo7ouIhQIAAAQIECBAgQIDAHALqIECAAAECBAgQIECAwA0FJLBuiG/X2xIQLQECBAgQIECAAAECBAgQINC+gAgJECBAgACBeQQksOZxVAsBAgQIECBwGQG1EiBAgAABAgQIECBAgAABAu0LiJDAIwISWI+QWECAAAECBAgQIECAAIG1C2g/AQIECBAgQIAAAQIE1i0ggbXu46f11xKwHwIECBAgQIAAAQIECBAgQKB9ARESIECAAAECixGQwFrModAQAgQIECDQnoCICBAgQIAAAQIECBAgQIAAgfYFREjgEgISWJdQVScBAgQIECBAgAABAgROF7AlAQIECBAgQIAAAQIENi8ggbX5t8AWAMRIgAABAgQIECBAgAABAgQItC8gQgIECBAgQKAlAQmslo6mWAgQIECAwJwC6iJAgAABAgQIECBAgAABAgTaFxAhgYUKSGAt9MBoFgECBAgQIECAAAEC6xTQagIECBAgQIAAAQIECBA4X0AC63xDNVxWQO0ECBAgQIAAAQIECBAgQIBA+wIiJECAAAECBAg8JCCB9RCHFwQIECBAoBUBcRAgQIAAAQIECBAgQIAAAQLtC4iQQLsCEljtHluRESBAgAABAgQIECBwrIDyBAgQIECAAAECBAgQILAIAQmsRRyGdhshMgIECBAgQIAAAQIECBAgQKB9ARESIECAAAECBOYWkMCaW1R9BAgQIEDgfAE1ECBAgAABAgQIECBAgAABAu0LiJAAgQEBCawBHKsIECBAgAABAgQIEFiTgLYSIECAAAECBAgQIECAQCsCElitHMlLxKFOAgQIECBAgAABAgQIECBAoH0BERIgQIAAAQIEFigggbXAg6JJBAgQILBuAa0nQIAAAQIECBAgQIAAAQIE2hcQIQEClxWQwLqsr9oJECBAgAABAgQIEJgmoBQBAgQIECBAgAABAgQIEHggIIH1gKK1GfEQIECAAAECBAgQIECAAAEC7QuIkAABAgQIECDQpoAEVpvHVVQECBAgcKqA7QgQIECAAAECBAgQIECAAIH2BURIgMDiBSSwFn+INJAAAQIECBAgQIDA8gW0kAABAgQIECBAgAABAgQIzCkggTWn5nx1qYkAAQIECBAgQIAAAQIECBBoX0CEBAgQIECAAAECPQISWD0wFhMgQIDAGgW0mQABAgQIECBAgAABAgQIEGhfQIQECGxBQAJrC0dZjAQIECBAgAABAgSGBKwjQIAAAQIECBAgQIAAAQILE5DAusABUSUBAgQIECBAgAABAgQIECDQvoAICRAgQIAAAQIELicggXU5WzUTIECAwHECShMgQIAAAQIECBAgQIAAAQLtC4iQAAECkwQksCYxKUSAAAECBAgQIEBgqQLaRYAAAQIECBAgQIAAAQIE2hOQwDo8pl4TIECAAAECBAgQIECAAAEC7QuIkAABAgQIECBAYNECEliLPjwaR4AAgfUIaCkBAgQIECBAgAABAgQIECDQvoAICRAgcC0BCaxrSdsPAQIECBAgQIAAgUcFLCFAgAABAgQIECBAgAABAgQ6BBpLYHVEaBEBAgQIECBAgAABAgQIECDQmIBwCBAgQIAAAQIEWheQwGr9CIuPAAECUwSUIUCAAAECBAgQIECAAAECBNoXECEBAgRWJCCBtaKDpakECBAgQIAAAQLLEtAaAgQIECBAgAABAgQIECBA4DICS0pgXSZCtRIgQIAAAQIECBAgQIAAAQJLEtAWAgQIECBAgAABAqMCElijRAoQIEBg6QLaR4AAAQIECBAgQIAAAQIECLQvIEICBAhsS0ACa1vHW7QECBAgQIAAAQI7AVMCBAgQIECAAAECBAgQIEBgsQKzJbAWG6GGESBAgAABAgQIECBAgAABArMJqIgAAQIECBAgQIDANQQksK6hbB8ECBDoF7CGAAECBAgQIECAAAECBAgQaF9AhAQIECBwpIAE1pFgihMgQIAAAQIECCxBQBsIECBAgAABAgQIECBAgACBlgUeS2C1HKHYCBAgQIAAAQIECBAgQIAAgccE/EuAAAECBAgQIEBgJQISWCs5UJpJgMAyBbSKAAECBAgQIECAAAECBAgQaF9AhAQIECBwfQEJrOub2yMBAgQIECBAYOsC4idAgAABAgQIECBAgAABAgTaFzgrQgmss/hsTIAAAQIECBAgQIAAAQIEriVgPwQIECBAgAABAgS2IyCBtZ1jLVICBA4FvCZAgAABAgQIECBAgAABAgTaFxAhAQIECKxSQAJrlYdNowkQIECAAAECtxOwZwIECBAgQIAAAQIECBAgQKB9gVtHKIF16yNg/wQIECBAgAABAgQIECCwBQExEiBAgAABAgQIECBwhIAE1hFYihIgsCQBbSFAgAABAgQIECBAgAABAgTaFxAhAQIECGxVQAJrq0de3AQIECBAgMA2BURNgAABAgQIECBAgAABAgQItC/QQIQSWA0cRCEQIECAAAECBAgQIECAwGUF1E6AAAECBAgQIECAwHUFJLCu621vBAg8JuBfAgQIECBAgAABAgQIECBAoH0BERIgQIAAgZMFJLBOprMhAQIECBAgQODaAvZHgAABAgQIECBAgAABAgQItC8gwghIYEXBSIAAAQIECBAgQIAAAQLtCoiMAAECBAgQIECAAIHVCUhgre6QaTCB2wtoAQECBAgQIECAAAECBAgQINC+gAgJECBAgMAtBSSwbqlv3wQIECBAgMCWBMRKgAABAgQIECBAgAABAgQItC8gwpkEJLBmglQNAQIECBAgQIAAAQIECFxCQJ0ECBAgQIAAAQIECGxRQAJri0ddzNsWED0BAgQIECBAgAABAgQIECDQvoAICRAgQIDAygUksFZ+ADWfAAECBAgQuI6AvRAgQIAAAQIECBAgQIAAAQLtC4hwOQISWMs5FlpCgAABAgQIECBAgACB1gTEQ4AAAQIECBAgQIAAgZMEJLBOYrMRgVsJ2C8BAgQIECBAgAABAgQIECDQvoAICRAgQIAAAQks7wECBAgQIECgfQEREiBAgAABAgQIECBAgAABAu0LiLApAQmspg6nYAgQIECAAAECBAgQIDCfgJoIECBAgAABAgQIECBwKwEJrFvJ2+8WBcRMgAABAgQIECBAgAABAgQItC8gQgIECBAgQGAGAQmsGRBVQYAAAQIECFxSQN0ECBAgQIAAAQIECBAgQIBA+wIiJPCwgATWwx5eESBAgAABAgQIECBAoA0BURAgQIAAAQIECBAgQGDFAhJYKz54mn5dAXsjQIAAAQIECBAgQIAAAQIE2hcQIQECBAgQILAMAQmsZRwHrSBAgAABAq0KiIsAAQIECBAgQIAAAQIECBBoX0CEBGYXkMCanVSFBAgQIECAAAECBAgQOFfA9gQIECBAgAABAgQIENi2gATWto//dqIXKQECBAgQIECAAAECBAgQINC+gAgJECBAgACBZgQksJo5lAIhQIAAAQLzC6iRAAECBAgQIECAAAECBAgQaF9AhASWKCCBtcSjok0ECBAgQIAAAQIECKxZQNsJECBAgAABAgQIECBA4EwBCawzAW1+DQH7IECAAAECBAgQIECAAAECBNoXECEBAgQIECBA4HEBCazHLcwRIECAAIG2BERDgAABAgQIECBAgAABAgQItC8gQgKNCkhgNXpghUWAAAECBAgQIECAwGkCtiJAgAABAgQIECBAgACB2wtIYN3+GLTeAvERIECAAAECBAgQIECAAAEC7QuIkAABAgQIECAwq4AE1qycKiNAgAABAnMJqIcAAQIECBAgQIAAAQIECBBoX0CEBAj0CUhg9clYToAAAQIECBAgQIDA+gS0mAABAgQIECBAgAABAgSaEJDAauIwXi4INRMgQIAAAQIECBAgQIAAAQLtC4iQAAECBAgQILA0AQmspR0R7SFAgACBFgTEQIAAAQIECBAgQIAAAQIECLQvIEICBC4oIIF1QVxVEyBAgAABAgQIECBwjICyBAgQIECAAAECBAgQIEDgMQEJrMcc2vxXVAQIECBAgAABAgQIECBAgED7AiIkQIAAAQIECDQoIIHV4EEVEgECBAicJ2BrAgQIECBAgAABAgQIECBAoH0BERIgsGwBCaxlHx+tI0CAAAECBAgQILAWAe0kQIAAAQIECBAgQIAAAQKzCUhgzUY5d0XqI0CAAAECBAgQIECAAAECBNoXECEBAgQIECBAgECXgARWl4plBAgQILBeAS0nQIAAAQIECBAgQIAAAQIE2hcQIQECzQtIYDV/iAVIgAABAgQIECBAYFxACQIECBAgQIAAAQIECBAgsCQBCazLHA21EiBAgAABAgQIECBAgAABAu0LiJAAAQIECBAgQOBCAhJYF4JVLQECBAicImAbAgQIECBAgAABAgQIECBAoH0BERIgQGBcQAJr3EgJAgQIECBAgAABAssW0DoCBAgQIECAAAECBAgQINCYgARWxwG1iAABAgQIECBAgAABAgQIEGhfQIQECBAgQIAAAQLLFZDAWu6x0TICBAisTUB7CRAgQIAAAQIECBAgQIAAgfYFREiAAIGrCEhgXYXZTggQIECAAAECBAj0CVhOgAABAgQIECBAgAABAgQIHAq0l8A6jNBrAgQIECBAgAABAgQIECBAoD0BEREgQIAAAQIECDQtIIHV9OEVHAECBKYLKEmAAAECBAgQIECAAAECBAi0LyBCAgQIrEVAAmstR0o7CRAgQIAAAQIEliigTQQIECBAgAABAgQIECBAgMAFBBaWwLpAhKokQIAAAQIECBAgQIAAAQIEFiagOQQIECBAgAABAgSGBSSwhn2sJUCAwDoEtJIAAQIECBAgQIAAAQIECBBoX0CEBAgQ2JCABNaGDrZQCRAgQIAAAQIEHhbwigABAgQIECBAgAABAgQIEFimwJwJrGVGqFUECBAgQIAAAQIECBAgQIDAnALqIkCAAAECBAgQIHBxAQmsixPbAQECBMYErCdAgAABAgQIECBAgAABAgTaFxAhAQIECBwjIIF1jJayBAgQIECAAAECyxHQEgIECBAgQIAAAQIECBAgQKBZgQcJrGYjFBgBAgQIECBAgAABAgQIECDwQMAMAQIECBAgQIAAgTUISGCt4ShpIwECSxbQNgIECBAgQIAAAQIECBAgQKB9ARESIECAwJUFJLCuDG53BAgQIECAAAECETASIECAAAECBAgQIECAAAEC7QucHqEE1ul2tiRAgAABAgQIECBAgAABAtcVsDcCBAgQIECAAAECGxGQwNrIgRYmAQLdApYSIECAAAECBAgQIECAAAEC7QuIkAABAgTWJyCBtb5jpsUECBAgQIAAgVsL2D8BAgQIECBAgAABAgQIECDQvsBNI5TAuim/nRMgQIAAAQIECBAgQIDAdqZ9D5EAABAASURBVARESoAAAQIECBAgQIDAVAEJrKlSyhEgsDwBLSJAgAABAgQIECBAgAABAgTaFxAhAQIECGxSQAJrk4dd0AQIECBAgMCWBcROgAABAgQIECBAgAABAgQItC+w9gglsNZ+BLWfAAECBAgQIECAAAECBK4hYB8ECBAgQIAAAQIECFxRQALrith2RYDAvoB5AgQIECBAgAABAgQIECBAoH0BERIgQIAAgdMEJLBOc7MVAQIECBAgQOA2AvZKgAABAgQIECBAgAABAgQItC8gwjsJLG8CAgQIECBAgAABAgQIEGheQIAECBAgQIAAAQIECKxLQAJrXcdLawksRUA7CBAgQIAAAQIECBAgQIAAgfYFREiAAAECBG4mIIF1M3o7JkCAAAECBLYnIGICBAgQIECAAAECBAgQIECgfQERziEggTWHojoIECBAgAABAgQIECBA4HICaiZAgAABAgQIECBAYHMCElibO+QCJnB3x4AAAQIECBAgQIAAAQIECBBoX0CEBAgQIEBgzQISWGs+etpOgAABAgQIXFPAvggQIECAAAECBAgQIECAAIH2BUS4EAEJrIUcCM0gQIAAAQIECBAgQIBAmwKiIkCAAAECBAgQIECAwPECEljHm9mCwG0F7J0AAQIECBAgQIAAAQIECBBoX0CEBAgQIEBg4wISWBt/AwifAAECBAhsRUCcBAgQIECAAAECBAgQIECAQPsCImxHQAKrnWMpEgIECBAgQIAAAQIECMwtoD4CBAgQIECAAAECBAjcREAC6ybsdrpdAZETIECAAAECBAgQIECAAAEC7QuIkAABAgQIEDhXQALrXEHbEyBAgAABApcXsAcCBAgQIECAAAECBAgQIECgfQEREtgTkMDawzBLgAABAgQIECBAgACBlgTEQoAAAQIECBAgQIAAgbUKSGCt9chp9y0E7JMAAQIECBAgQIAAAQIECBBoX0CEBAgQIECAwAIEJLAWcBA0gQABAgQItC0gOgIECBAgQIAAAQIECBAgQKB9ARESmFdAAmteT7URIECAAAECBAgQIEBgHgG1ECBAgAABAgQIECBAYMMCElgbPvhbC128BAgQIECAAAECBAgQIECAQPsCIiRAgAABAgTaEJDAauM4ioIAAQIECFxKQL0ECBAgQIAAAQIECBAgQIBA+wIiJLA4AQmsxR0SDSJAgAABAgQIECBAYP0CIiBAgAABAgQIECBAgACBcwQksM7Rs+31BOyJAAECBAgQIECAAAECBAgQaF9AhAQIECBAgACB+wISWPchTAgQIECAQIsCYiJAgAABAgQIECBAgAABAgTaFxAhgRYFJLBaPKpiIkCAAAECBAgQIEDgHAHbEiBAgAABAgQIECBAgMCNBSSwbnwAtrF7URIgQIAAAQIECBAgQIAAAQLtC4iQAAECBAgQIDCfgATWfJZqIkCAAAEC8wqojQABAgQIECBAgAABAgQIEGhfQIQECHQKSGB1slhIgAABAgQIECBAgMBaBbSbAAECBAgQIECAAAECBNYvIIG1/mN46QjUT4AAAQIECBAgQIAAAQIECLQvIEICBAgQIECAwKIEJLAWdTg0hgABAgTaERAJAQIECBAgQIAAAQIECBAg0L6ACAkQuJSABNalZNVLgAABAgQIECBAgMDxArYgQIAAAQIECBAgQIAAAQIlIIFVCC0PYiNAgAABAgQIECBAgAABAgTaFxAhAQIECBAgQKA1AQms1o6oeAgQIEBgDgF1ECBAgAABAgQIECBAgAABAu0LiJAAgQULSGAt+OBoGgECBAgQIECAAIF1CWgtAQIECBAgQIAAAQIECBCYR0ACax7Hy9SiVgIECBAgQIAAAQIECBAgQKB9ARESIECAAAECBAg8IiCB9QiJBQQIECCwdgHtJ0CAAAECBAgQIECAAAECBNoXECEBAm0LSGC1fXxFR4AAAQIECBAgQGCqgHIECBAgQIAAAQIECBAgQGAxAhJYFzsUKiZAgAABAgQIECBAgAABAgTaFxAhAQIECBAgQIDAJQQksC6hqk4CBAgQOF3AlgQIECBAgAABAgQIECBAgED7AiIkQIDAiIAE1giQ1QQIECBAgAABAgTWIKCNBAgQIECAAAECBAgQIECgJQEJrO6jaSkBAgQIECBAgAABAgQIECDQvoAICRAgQIAAAQIEFioggbXQA6NZBAgQWKeAVhMgQIAAAQIECBAgQIAAAQLtC4iQAAEClxeQwLq8sT0QIECAAAECBAgQGBawlgABAgQIECBAgAABAgQIEHhIoMkE1kMRekGAAAECBAgQIECAAAECBAg0KSAoAgQIECBAgACBdgUksNo9tiIjQIDAsQLKEyBAgAABAgQIECBAgAABAu0LiJAAAQKrEJDAWsVh0kgCBAgQIECAAIHlCmgZAQIECBAgQIAAAQIECBAgMLfA8hJYc0eoPgIECBAgQIAAAQIECBAgQGB5AlpEgAABAgQIECBAYEBAAmsAxyoCBAisSUBbCRAgQIAAAQIECBAgQIAAgfYFREiAAIGtCEhgbeVIi5MAAQIECBAgQKBLwDICBAgQIECAAAECBAgQIEBggQIzJ7AWGKEmESBAgAABAgQIECBAgAABAjMLqI4AAQIECBAgQIDAZQUksC7rq3YCBAhME1CKAAECBAgQIECAAAECBAgQaF9AhAQIECAwWUACazKVggQIECBAgAABAksT0B4CBAgQIECAAAECBAgQIECgTYH9BFabEYqKAAECBAgQIECAAAECBAgQ2BcwT4AAAQIECBAgQGDxAhJYiz9EGkiAwPIFtJAAAQIECBAgQIAAAQIECBBoX0CEBAgQIHBNAQmsa2rbFwECBAgQIECAwOMC5ggQIECAAAECBAgQIECAAIH2BU6MUALrRDibESBAgAABAgQIECBAgACBWwjYJwECBAgQIECAAIEtCEhgbeEoi5EAgSEB6wgQIECAAAECBAgQIECAAIH2BURIgAABAisTkMBa2QHTXAIECBAgQIDAMgS0ggABAgQIECBAgAABAgQIEGhf4HYRSmDdzt6eCRAgQIAAAQIECBAgQGBrAuIlQIAAAQIECBAgQGCSgATWJCaFCBBYqoB2ESBAgAABAgQIECBAgAABAu0LiJAAAQIEticggbW9Yy5iAgQIECBAgAABAgQIECBAgAABAgQIECBAoH2BVUcogbXqw6fxBAgQIECAAAECBAgQIHA9AXsiQIAAAQIECBAgQOBaAhJY15K2HwIEHhWwhAABAgQIECBAgAABAgQIEGhfQIQECBAgQOAEAQmsE9BsQoAAAQIECBC4pYB9EyBAgAABAgQIECBAgAABAu0LbD1CCaytvwPET4AAAQIECBAgQIAAgW0IiJIAAQIECBAgQIAAgRUJSGCt6GBpKoFlCWgNAQIECBAgQIAAAQIECBAg0L6ACAkQIECAwG0EJLBu426vBAgQIECAwFYFxE2AAAECBAgQIECAAAECBAi0LyDCswUksM4mVAEBAgQIECBAgAABAgQIXFpA/QQIECBAgAABAgQIbEtAAmtbx1u0BHYCpgQIECBAgAABAgQIECBAgED7AiIkQIAAAQKrFZDAWu2h03ACBAgQIEDg+gL2SIAAAQIECBAgQIAAAQIECLQvIMIlCEhgLeEoaAMBAgQIECBAgAABAgRaFhAbAQIECBAgQIAAAQIEjhSQwDoSTHECSxDQBgIECBAgQIAAAQIECBAgQKB9ARESIECAAIEtC0hgbfnoi50AAQIECGxLQLQECBAgQIAAAQIECBAgQIBA+wIibERAAquRAykMAgQIECBAgAABAgQIXEZArQQIECBAgAABAgQIELi+gATW9c3tcesC4idAgAABAgQIECBAgAABAgTaFxAhAQIECBAgcJaABNZZfDYmQIAAAQIEriVgPwQIECBAgAABAgQIECBAgED7AiIksBOQwNpJmBIgQIAAAQIECBAgQKA9ARERIECAAAECBAgQIEBglQISWKs8bBp9OwF7JkCAAAECBAgQIECAAAECBNoXECEBAgQIECBwawEJrFsfAfsnQIAAAQJbEBAjAQIECBAgQIAAAQIECBAg0L6ACAnMKCCBNSOmqggQIECAAAECBAgQIDCngLoIECBAgAABAgQIECCwVQEJrK0e+W3GLWoCBAgQIECAAAECBAgQIECgfQEREiBAgAABAg0ISGA1cBCFQIAAAQIELiugdgIECBAgQIAAAQIECBAgQKB9ARESWJaABNayjofWECBAgAABAgQIECDQioA4CBAgQIAAAQIECBAgQOBkAQmsk+lseG0B+yNAgAABAgQIECBAgAABAgTaFxAhAQIECBAgQCACElhRMBIgQIAAgXYFREaAAAECBAgQIECAAAECBAi0LyBCAs0JSGA1d0gFRIAAAQIECBAgQIDA+QJqIECAAAECBAgQIECAAIFbCkhg3VJ/S/sWKwECBAgQIECAAAECBAgQINC+gAgJECBAgAABAjMJSGDNBKkaAgQIECBwCQF1EiBAgAABAgQIECBAgAABAu0LiJAAgUcFJLAeNbGEAAECBAgQIECAAIF1C2g9AQIECBAgQIAAAQIECKxcQAJr5QfwOs23FwIECBAgQIAAAQIECBAgQKB9ARESIECAAAECBJYjIIG1nGOhJQQIECDQmoB4CBAgQIAAAQIECBAgQIAAgfYFREiAwEUEJLAuwqpSAgQIECBAgAABAgROFbAdAQIECBAgQIAAAQIECBCQwGr/PSBCAgQIECBAgAABAgQIECBAoH0BERIgQIAAAQIEmhKQwGrqcAqGAAECBOYTUBMBAgQIECBAgAABAgQIECDQvoAICRBYqoAE1lKPjHYRIECAAAECBAgQWKOANhMgQIAAAQIECBAgQIAAgRkEJLBmQLxkFeomQIAAAQIECBAgQIAAAQIE2hcQIQECBAgQIECAwMMCElgPe3hFgAABAm0I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QIAAAQIECBA4TUAC6zQ3W91GwF4JECBAgAABAgQIECBAgACB9gVESIAAAQIECBC4k8DyJiBAgAABAs0LCJAAAQIECBAgQIAAAQIECBBoX0CEBNoSkMBq63iKhgABAgQIECBAgACBuQTUQ4AAAQIECBAgQIAAAQI3E5DAuhn99nYsYgIECBAgQIAAAQIECBAgQKB9ARESIECAAAECBOYQkMCaQ1EdBAgQIEDgcgJqJkCAAAECBAgQIECAAAECBNoXECEBAgcCElgHIF4SIECAAAECBAgQINCCgBgIECBAgAABAgQIECBAYM0CElhrPnrXbLt9ESBAgAABAgQIECBAgAABAu0LiJAAAQIECBAgsBABCayFHAjNIECAAIE2BURFgAABAgQIECBAgAABAgQItC8gQgIE5heQwJrfVI0ECBAgQIAAAQIECJwnYGsCBAgQIECAAAECBAgQ2LiABNYm3gCCJECAAAECBAgQIECAAAECBNoXECEBAgQIECBAoB0BCax2jqVICBAgQGBuAfURIECAAAECBAgQIECAAAEC7QuIkACBRQpIYC3ysGgUAQIECBAgQIAAgfUKaDkBAgQIECBAgAABAgQIEDhXQALrXMHLb28PBAgQIECAAAECBAgQIECAQPsCIiRAgAABAgQIENgTkMDawzBLgAABAi0JiIUAAQIECBAgQIAAAQIECBBoX0CEBAi0KiCB1eqRFRcBAgQIECBAgACBUwRsQ4AAAQIECBAgQIAAAQIEFiAggXXhg6B6AgQIECBAgAABAgQIECBAoH0BERIgQIAAAQIECMwrIIE1r6faCBAgQGAeAbUQIECAAAECBAgQIECAAAEC7QuIkAABAr0CEli9NFYQIECAAAECBAgQWJuA9hIgQIAAAQIECBAgQIAAgTYEJLCGjqN1BAgQIECAAAECBAgQIECAQPsCIiRAgAABAgQIEFicgATW4g6JBhEgQGD9AiIgQIAAAQIECBAgQIAAAQIE2hcQIQECBC4pIIF1SV11EyBAgAABAgQIEJguoCQBAgQIECBAgAABAgQIECBwX6DhBNb9CE0IECBAgAABAgQIECBAgACBhgWERoAAAQIECBAg0KKABFaLR1VMBAgQOEfAtgQIECBAgAABAgQIECBAgED7AiIkQIDAwgUksBZ+gDSPAAECBAgQIEBgHQJaSYAAAQIECBAgQIAAAQIECMwnsNQE1nwRqokAAQIECBAgQIAAAQIECBBYqoB2ESBAgAABAgQIEOgUkMDqZLGQAAECaxXQbgIECBAgQIAAAQIECBAgQKB9ARESIECgfQEJrPaPsQgJECBAgAABAgTGBKwnQIAAAQIECBAgQIAAAQIEFiVwkQTWoiLUGAIECBAgQIAAAQIECBAgQOAiAiolQIAAAQIECBAgcCkBCaxLyaqXAAECxwvYggABAgQIECBAgAABAgQIEGhfQIQECBAgMEFAAmsCkiIECBAgQIAAAQJLFtA2AgQIECBAgAABAgQIECBAoDWBRxNYrUUoHgIECBAgQIAAAQIECBAgQOBRAUsIECBAgAABAgQILFhAAmvBB0fTCBBYl4DWEiBAgAABAgQIECBAgAABAu0LiJAAAQIEriMggXUdZ3shQIAAAQIECBDoFrCUAAECBAgQIECAAAECBAgQaF/g6AglsI4mswEBAgQIECBAgAABAgQIELi1gP0TIECAAAECBAgQaFtAAqvt4ys6AgSmCihHgAABAgQIECBAgAABAgQItC8gQgIECBBYjYAE1moOlYYSIECAAAECBJYnoEUECBAgQIAAAQIECBAgQIBA+wK3iFAC6xbq9kmAAAECBAgQIECAAAECWxYQOwECBAgQIECAAAECIwISWCNAVhMgsAYBbSRAgAABAgQIECBAgAABAgTaFxAhAQIECGxJQAJrS0dbrAQIECBAgACBfQHzBAgQIECAAAECBAgQIECAQPsCK41QAmulB06zCRAgQIAAAQIECBAgQOA2AvZKgAABAgQIECBAgMDlBSSwLm9sDwQIDAtYS4AAAQIECBAgQIAAAQIECLQvIEICBAgQIHCUgATWUVwKEyBAgAABAgSWIqAdBAgQIECAAAECBAgQIECAQPsC241QAmu7x17kBAgQIECAAAECBAgQ2J6AiAkQIECAAAECBAgQWIWABNYqDpNGEliugJYRIECAAAECBAgQIECAAAEC7QuIkAABAgQIXFtAAuva4vZHgAABAgQIELi7Y0CAAAECBAgQIECAAAECBAi0LyDCMwQksM7AsykBAgQIECBAgAABAgQIXFPAvggQIECAAAECBAgQ2IqABNZWjrQ4CXQJWEaAAAECBAgQIECAAAECBAi0LyBCAgQIECCwQgEJrBUeNE0mQIAAAQIEbitg7wQIECBAgAABAgQIECBAgED7AiK8rYAE1m397Z0AAQIECBAgQIAAAQJbERAnAQIECBAgQIAAAQIEJgtIYE2mUpDA0gS0hwABAgQIECBAgAABAgQIEGhfQIQECBAgQGCbAhJY2zzuoiZAgAABAtsVEDkBAgQIECBAgAABAgQIECDQvoAIVy8ggbX6QygAAgQIECBAgAABAgQIXF7AHggQIECAAAECBAgQIHBNAQmsa2rbF4HHBcwRIECAAAECBAgQIECAAAEC7QuIkAABAgQIEDhRQALrRDibESBAgAABArcQsE8CBAgQIECAAAECBAgQIECgfQEREri7k8DyLiBAgAABAgQIECBAgEDrAuIjQIAAAQIECBAgQIDAygQksFZ2wDR3GQJaQYAAAQIECBAgQIAAAQIECLQvIEICBAgQIEDgdgISWLezt2cCBAgQILA1AfESIECAAAECBAgQIECAAAEC7QuIkMAsAhJYszCqhAABAgQIECBAgAABApcSUC8BAgQIECBAgAABAgS2JyCBtb1jLmICBAgQIECAAAECBAgQIECAQPsCIiRAgAABAgRWLSCBterDp/EECBAgQOB6AvZEgAABAgQIECBAgAABAgQItC8gQgJLEZDAWsqR0A4CBAgQIECAAAECBFoUEBMBAgQIECBAgAABAgQInCAggXUCmk1uKWDfBAgQIECAAAECBAgQIECAQPsCIiRAgAABAgS2LiCBtfV3gPgJECBAYBsCoiRAgAABAgQIECBAgAABAgTaFxAhgYYEJLAaOphCIUCAAAECBAgQIEBgXgG1ESBAgAABAgQIECBAgMBtBCSwbuO+1b2KmwABAgQIECBAgAABAgQIEGhfQIQECBAgQIAAgbMFJLDOJlQBAQIECBC4tID6CRAgQIAAAQIECBAgQIAAgfYFREiAwL6ABNa+hnkCBAgQIECAAAECBNoREAkBAgQIECBAgAABAgQIrFZAAmu1h+76DbdHAgQIECBAgAABAgQIECBAoH0BERIgQIAAAQIEliAggbWEo6ANBAgQINCygNgIECBAgAABAgQIECBAgACB9gVESIDAzAISWDODqo4AAQIECBAgQIAAgTkE1EGAAAECBAgQIECAAAECWxaQwNrK0RcnAQIECBAgQIAAAQIECBAg0L6ACAkQIECAAAECjQhIYDVyaHMKaAAAEABJREFUIIVBgAABApcRUCsBAgQIECBAgAABAgQIECDQvoAICRBYnoAE1vKOiRYRIECAAAECBAgQWLuA9hMgQIAAAQIECBAgQIAAgbMEJLDO4rvWxvZDgAABAgQIECBAgAABAgQItC8gQgIECBAgQIAAgZ2ABNZOwpQAAQIE2hMQEQECBAgQIECAAAECBAgQINC+gAgJEGhSQAKrycMqKAIECBAgQIAAAQKnC9iSAAECBAgQIECAAAECBAjcWkAC6/JHwB4IECBAgAABAgQIECBAgACB9gVESIAAAQIECBAgMKOABNaMmKoiQIAAgTkF1EWAAAECBAgQIECAAAECBAi0LyBCAgQIdAtIYHW7WEqAAAECBAgQIEBgnQJaTYAAAQIECBAgQIAAAQIEGhCQwBo5iFYTIECAAAECBAgQIECAAAEC7QuIkAABAgQIECBAYFkCEljLOh5aQ4AAgVYExEGAAAECBAgQIECAAAECBAi0LyBCAgQIXExAAutitComQIAAAQIECBAgcKyA8gQIECBAgAABAgQIECBAgEAE2k5gJUIjAQIECBAgQIAAAQIECBAg0LaA6AgQIECAAAECBJoTkMBq7pAKiAABAucLqIEAAQIECBAgQIAAAQIECBBoX0CEBAgQWLKABNaSj462ESBAgAABAgQIrElAWwkQIECAAAECBAgQIECAAIGZBBacwJopQtUQIECAAAECBAgQIECAAAECCxbQNAIECBAgQIAAAQKPCkhgPWpiCQECBNYtoPUECBAgQIAAAQIECBAgQIBA+wIiJECAQOMCEliNH2DhESBAgAABAgQITBNQigABAgQIECBAgAABAgQIEFiOwKUSWMuJUEsIECBAgAABAgQIECBAgACBSwmolwABAgQIECBAgMBFBCSwLsKqUgIECJwqYDsCBAgQIECAAAECBAgQIECgfQEREiBAgMCYgATWmJD1BAgQIECAAAECyxfQQgIECBAgQIAAAQIECBAgQKApgc4EVlMRCoYAAQIECBAgQIAAAQIECBDoFLCQAAECBAgQIECAwFIFJLCWemS0iwCBNQpoMwECBAgQIECAAAECBAgQINC+gAgJECBA4AoCElhXQLYLAgQIECBAgACBIQHrCBAgQIAAAQIECBAgQIAAgfYFjotQAus4L6UJECBAgAABAgQIECBAgMAyBLSCAAECBAgQIECAQMMCElgNH1yhESBwnIDSBAgQIECAAAECBAgQIECAQPsCIiRAgACBdQhIYK3jOGklAQIECBAgQGCpAtpFgAABAgQIECBAgAABAgQItC9w9QglsK5ObocECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJDAhJYQzrWESCwHgEtJUCAAAECBAgQIECAAAECBNoXECEBAgQIbEZAAmszh1qgBAgQIECAAIFHBSwhQIAAAQIECBAgQIAAAQIE2hdYY4QSWGs8atpMgAABAgQIECBAgAABArcUsG8CBAgQIECAAAECBC4sIIF1YWDVEyAwRUAZAgQIECBAgAABAgQIECBAoH0BERIgQIAAgekCEljTrZQkQIAAAQIECCxLQGsIECBAgAABAgQIECBAgACB9gU2GqEE1kYPvLAJECBAgAABAgQIECCwVQFxEyBAgAABAgQIECCwfAEJrOUfIy0ksHQB7SNAgAABAgQIECBAgAABAgTaFxAhAQIECBC4qoAE1lW57YwAAQIECBAgsBMwJUCAAAECBAgQIECAAAECBNoXEOGpAhJYp8rZjgABAgQIECBAgAABAgSuL2CPBAgQIECAAAECBAhsQkACaxOHWZAE+gWsIUCAAAECBAgQIECAAAECBNoXECEBAgQIEFibgATW2o6Y9hIgQIAAAQJLENAGAgQIECBAgAABAgQIECBAoH0BEd5QQALrhvh2TYAAAQIECBAgQIAAgW0JiJYAAQIECBAgQIAAAQLTBCSwpjkpRWCZAlpFgAABAgQIECBAgAABAgQItC8gQgIECBAgsEEBCawNHnQhEyBAgACBrQuInwABAgQIECBAgAABAgQIEGhfQITrFpDAWvfx03oCBAgQIECAAAECBAhcS8B+CBAgQIAAAQIECBAgcDUBCayrUdsRgUMBrwkQIECAAAECBAgQIECAAIH2BURIgAABAgQInCIggXWKmm0IECBAgACB2wnYMwECBAgQIECAAAECBAgQINC+gAg3LyCBtfm3AAACBAgQIECAAAECBLYgIEYCBAgQIECAAAECBAisSUACa01HS1uXJKAtBAgQIECAAAECBAgQIECAQPsCIiRAgAABAgRuJCCBdSN4uyVAgAABAtsUEDUBAgQIECBAgAABAgQIECDQvoAICZwvIIF1vqEaCBAgQIAAAQIECBAgcFkBtRMgQIAAAQIECBAgQGBjAhJYGzvgwn1MwL8ECBAgQIAAAQIECBAgQIBA+wIiJECAAAECBNYrIIG13mOn5QQIECBA4NoC9keAAAECBAgQIECAAAECBAi0LyBCAosQkMBaxGHQCAIECBAgQIAAAQIE2hUQGQECBAgQIECAAAECBAgcKyCBdayY8rcX0AICBAgQIECAAAECBAgQIECgfQEREiBAgAABApsWkMDa9OEXPAECBAhsSUCsBAgQIECAAAECBAgQIECAQPsCIiTQioAEVitHUhwECBAgQIAAAQIECFxCQJ0ECBAgQIAAAQIECBAgcAMBCawboG97l6InQIAAAQIECBAgQIAAAQIE2hcQIQECBAgQIEDgPAEJrPP8bE2AAAECBK4jYC8ECBAgQIAAAQIECBAgQIBA+wIiJEDggYAE1gMKMwQIECBAgAABAgQItCYgHgIECBAgQIAAAQIECBBYp4AE1jqP261abb8ECBAgQIAAAQIECBAgQIBA+wIiJECAAAECBAjcXEAC6+aHQAMIECBAoH0BERIgQIAAAQIECBAgQIAAAQLtC4iQAIE5BSSw5tRUFwECBAgQIECAAAEC8wmoiQABAgQIECBAgAABAgQ2KyCBtaFDL1QCBAgQIECAAAECBAgQIECgfQEREiBAgAABAgRaEJDAauEoioEAAQIELimgbgIECBAgQIAAAQIECBAgQKB9ARESILAwAQmshR0QzSFAgAABAgQIECDQhoAoCBAgQIAAAQIECBAgQIDA6QISWKfbXXdLeyNAgAABAgQIECBAgAABAgTaFxAhAQIECBAgQIDAPQEJrHsM/iFAgACBVgXERYAAAQIECBAgQIAAAQIECLQvIEICBNoTkMBq75iKiAABAgQIECBAgMC5ArYnQIAAAQIECBAgQIAAAQI3FZDAugq/nRAgQIAAAQIECBAgQIAAAQLtC4iQAAECBAgQIEBgLgEJrLkk1UOAAAEC8wuokQABAgQIECBAgAABAgQIEGhfQIQECBDoEJDA6kCxiAABAgQIECBAgMCaBbSdAAECBAgQIECAAAECBAisXUACa/wIKkGAAAECBAgQIECAAAECBAi0LyBCAgQIECBAgACBBQlIYC3oYGgKAQIE2hIQDQECBAgQIECAAAECBAgQINC+gAgJECBwGQEJrMu4qpUAAQIECBAgQIDAaQK2IkCAAAECBAgQIECAAAECBO6aT2A5xgQIECBAgAABAgQIECBAgED7AiIkQIAAAQIECBBoS0ACq63jKRoCBAjMJaAeAgQIECBAgAABAgQIECBAoH0BERIgQGCxAhJYiz00GkaAAAECBAgQILA+AS0mQIAAAQIECBAgQIAAAQIE5hBYdgJrjgjVQYAAAQIECBAgQIAAAQIECCxbQOsIECBAgAABAgQIHAhIYB2AeEmAAIEWBMRAgAABAgQIECBAgAABAgQItC8gQgIECLQsIIHV8tEVGwECBAgQIECAwDECyhIgQIAAAQIECBAgQIAAAQILEbhgAmshEWoGAQIECBAgQIAAAQIECBAgcEEBVRMgQIAAAQIECBCYX0ACa35TNRIgQOA8AVsTIECAAAECBAgQIECAAAEC7QuIkAABAgQGBSSwBnmsJECAAAECBAgQWIuAdhIgQIAAAQIECBAgQIAAAQLtCPQlsNqJUCQECBAgQIAAAQIECBAgQIBAn4DlBAgQIECAAAECBBYpIIG1yMOiUQQIrFdAywkQIECAAAECBAgQIECAAIH2BURIgAABApcWkMC6tLD6CRAgQIAAAQIExgWUIECAAAECBAgQIECAAAECBNoXOCJCCawjsBQlQIAAAQIECBAgQIAAAQJLEtAWAgQIECBAgAABAq0KSGC1emTFRYDAKQK2IUCAAAECBAgQIECAAAECBNoXECEBAgQIrEBAAmsFB0kTCRAgQIAAAQLLFtA6AgQIECBAgAABAgQIECBAoH2B60YogXVdb3sjQIAAAQIECBAgQIAAAQKPCfiXAAECBAgQIECAAIFeAQmsXhorCBBYm4D2EiBAgAABAgQIECBAgAABAu0LiJAAAQIEtiEggbWN4yxKAgQIECBAgECfgOUECBAgQIAAAQIECBAgQIBA+wKri1ACa3WHTIMJECBAgAABAgQIECBA4PYCWkCAAAECBAgQIECAwCUFJLAuqatuAgSmCyhJgAABAgQIECBAgAABAgQItC8gQgIECBAgMFFAAmsilGIECBAgQIAAgSUKaBMBAgQIECBAgAABAgQIECDQvsAWI5TA2uJRFzMBAgQIECBAgAABAgS2LSB6AgQIECBAgAABAgQWLiCBtfADpHkE1iGglQQIECBAgAABAgQIECBAgED7AiIkQIAAAQLXE5DAup61PREgQIAAAQIEHhbwigABAgQIECBAgAABAgQIEGhfQIQnCUhgncRmIwIECBAgQIAAAQIECBC4lYD9EiBAgAABAgQIECDQvoAEVvvHWIQExgSsJ0CAAAECBAgQIECAAAECBNoXECEBAgQIEFiVgATWqg6XxhIgQIAAAQLLEdASAgQIECBAgAABAgQIECBAoH0BEd5KQALrVvL2S4AAAQIECBAgQIAAgS0KiJkAAQIECBAgQIAAAQITBCSwJiApQmDJAtpGgAABAgQIECBAgAABAgQItC8gQgIECBAgsDUBCaytHXHxEiBAgAABAhEwEiBAgAABAgQIECBAgAABAu0LiHDFAhJYKz54mk6AAAECBAgQIECAAIHrCtgbAQIECBAgQIAAAQIEriMggXUdZ3sh0C1gKQECBAgQIECAAAECBAgQINC+gAgJECBAgACBowUksI4mswEBAgQIECBwawH7J0CAAAECBAgQIECAAAECBNoXEOG2BSSwtn38RU+AAAECBAgQIECAwHYEREqAAAECBAgQIECAAIHVCEhgreZQaejyBLSIAAECBAgQIECAAAECBAgQaF9AhAQIECBAgMAtBCSwbqFunwQIECBAYMsCYidAgAABAgQIECBAgAABAgTaFxAhgTMFJLDOBLQ5AQIECBAgQIAAAQIEriFgHwQIECBAgAABAghiyNMAABAASURBVAQIENiSgATWlo62WPcFzBMgQIAAAQIECBAgQIAAAQLtC4iQAAECBAgQWKmABNZKD5xmEyBAgACB2wjYKwECBAgQIECAAAECBAgQINC+gAgJ3F5AAuv2x0ALCBAgQIAAAQIECBBoXUB8BAgQIECAAAECBAgQIHCUgATWUVwKL0VAOwgQIECAAAECBAgQIECAAIH2BURIgAABAgQIbFdAAmu7x17kBAgQILA9ARETIECAAAECBAgQIECAAAEC7QuIkEATAhJYTRxGQRAgQIAAAQIECBAgcDkBNRMgQIAAAQIECBAgQIDAtQUksK4tbn93dwwIECBAgAABAgQIECBAgACB9gVESIAAAQIECBA4Q0AC6ww8mxIgQIAAgWsK2BcBAgQIECBAgAABAgQIECDQvoAICRB4TEAC6zEH/xIgQIAAAQIECBAg0KaAqAgQIECAAAECBAgQIEBghQISWCs8aLdtsr0TIECAAAECBAgQIECAAAEC7QuIkAABAgQIECBwWwEJrNv62zsBAgQIbEVAnAQIECBAgAABAgQIECBAgED7AiIkQGA2AQms2ShVRIAAAQIECBAgQIDA3ALqI0CAAAECBAgQIECAAIFtCkhgbeu4i5YAAQIECBAgQIAAAQIECBBoX0CEBAgQIECAAIHVC0hgrf4QCoAAAQIELi9gDwQIECBAgAABAgQIECBAgED7AiIkQGBJAhJYSzoa2kKAAAECBAgQIECgJQGxECBAgAABAgQIECBAgACBEwUksE6Eu8Vm9kmAAAECBAgQIECAAAECBAi0LyBCAgQIECBAgACBuzsJLO8CAgQIEGhdQHwECBAgQIAAAQIECBAgQIBA+wIiJECgMQEJrMYOqHAIECBAgAABAgQIzCOgFgIECBAgQIAAAQIECBAgcDsBCaxr2dsPAQIECBAgQIAAAQIECBAg0L6ACAkQIECAAAECBGYRkMCahVElBAgQIHApAfUSIECAAAECBAgQIECAAAEC7QuIkAABAocCEliHIl4TIECAAAECBAgQWL+ACAgQIECAAAECBAgQIECAwKoFJLAmHT6FCBAgQIAAAQIECBAgQIAAgfYFREiAAAECBAgQILAUAQmspRwJ7SBAgECLAmIiQIAAAQIECBAgQIAAAQIE2hcQIQECBC4gIIF1AVRVEiBAgAABAgQIEDhHwLYECBAgQIAAAQIECBAgQGDrAltIYG39GIufAAECBAgQIECAAAECBAhsQUCMBAgQIECAAAECDQlIYDV0MIVCgACBeQXURoAAAQIECBAgQIAAAQIECLQvIEICBAgsU0ACa5nHRasIECBAgAABAgTWKqDdBAgQIECAAAECBAgQIECAwNkCi09gnR2hCggQIECAAAECBAgQIECAAIHFC2ggAQIECBAgQIAAgX0BCax9DfMECBBoR0AkBAgQIECAAAECBAgQIECAQPsCIiRAgECzAhJYzR5agREgQIAAAQIECBwvYAsCBAgQIECAAAECBAgQIEBgCQKXTWAtIUJtIECAAAECBAgQIECAAAECBC4roHYCBAgQIECAAAECMwtIYM0MqjoCBAjMIaAOAgQIECBAgAABAgQIECBAoH0BERIgQIBAv4AEVr+NNQQIECBAgAABAusS0FoCBAgQIECAAAECBAgQIECgEYGBBFYjEQqDAAECBAgQIECAAAECBAgQGBCwigABAgQIECBAgMDyBCSwlndMtIjA/8+e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BAgQIECAAAECBO4TUGDdZ+kkAvcKOI0AAQIECBAgQIAAAQIECBDIF5CQAAECBAgQeCigwHrI4kMCBAgQIECgq4C5CRAgQIAAAQIECBAgQIAAgXwBCfMFFFj5O5aQAAECBAgQIECAAAEC7wR8T4AAAQIECBAgQIAAgVICCqxS6zBMjoAkBAgQIECAAAECBAgQIECAQL6AhAQIECBAgMAoAQXWKFnnEiBAgAABAucFvEGAAAECBAgQIECAAAECBAjkC0hI4ICAAusAkkcIECBAgAABAgQIECBQWcBsBAgQIECAAAECBAgQSBNQYKVtVJ47BJxBgAABAgQIECBAgAABAgQI5AtISIAAAQIECBQWUGAVXo7RCBAgQIBALwHTEiBAgAABAgQIECBAgAABAvkCEhKYI6DAmuPsFgIECBAgQIAAAQIECDwW8CkBAgQIECBAgAABAgQIfBNQYH0j8UF3AfMTIECAAAECBAgQIECAAAEC+QISEiBAgAABAtkCCqzs/UpHgAABAgSOCniOAAECBAgQIECAAAECBAgQyBeQkEAbAQVWm1UZlAABAgQIECBAgACBegImIkCAAAECBAgQIECAAIERAgqsEarOvC7gTQIECBAgQIAAAQIECBAgQCBfQEICBAgQIECAwBsBBdYbIF8TIECAAIEOAmYkQIAAAQIECBAgQIAAAQIE8gUkJLCTgAJrp23LSoAAAQIECBAgQIDAnwJ+JkCAAAECBAgQIECAAIGiAgqsoovpOZapCRAgQIAAAQIECBAgQIAAgXwBCQkQIECAAAEC4wUUWOON3UCAAAECBF4L+JYAAQIECBAgQIAAAQIECBDIF5CQAIFTAgqsU1weJkCAAAECBAgQIECgioA5CBAgQIAAAQIECBAgQCBXQIGVu9uzyTxPgAABAgQIECBAgAABAgQI5AtISIAAAQIECBBoIaDAarEmQxIgQIBAXQGTESBAgAABAgQIECBAgAABAvkCEhIgMFtAgTVb3H0ECBAgQIAAAQIECPz4wYAAAQIECBAgQIAAAQIECLwQUGC9wOn0lVkJECBAgAABAgQIECBAgACBfAEJCRAgQIAAAQK7CCiwdtm0nAQIECDwSMBnBAgQIECAAAECBAgQIECAQL6AhAQINBRQYDVcmpEJECBAgAABAgQIrBVwOwECBAgQIECAAAECBAgQGCugwBrre+x0TxEgQIAAAQIECBAgQIAAAQL5AhISIECAAAECBAgcFlBgHabyIAECBAhUEzAPAQIECBAgQIAAAQIECBAgkC8gIQECewoosPbcu9QECBAgQIAAAQL7CkhOgAABAgQIECBAgAABAgTKCyiwPl6RAwgQIECAAAECBAgQIECAAIF8AQkJECBAgAABAgRmCiiwZmq7iwABAgS+BPxEgAABAgQIECBAgAABAgQI5AtISIAAgYsCCqyLcF4jQIAAAQIECBAgsELAnQQIECBAgAABAgQIECBAYAeB3QusHXYsIwECBAgQIECAAAECBAgQ2F1AfgIECBAgQIAAgWYCCqxmCzMuAQIEagiYggABAgQIECBAgAABAgQIEMgXkJAAAQLrBP4DAAD//+duNegAAAAGSURBVAMAR9lNCHn1vC8AAAAASUVORK5CYII="/></switch></g></g></g><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-22"><g transform="translate(0.5,0.5)"><rect x="576.88" y="200" width="394.17" height="130" fill="#ffffff" stroke="#000000" stroke-dasharray="3 3" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 392px; height: 1px; padding-top: 265px; margin-left: 578px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Software Compute Unit Instance<br /><br /><br /><br /><br /><br /><br /></b></div></div></div></foreignObject><image x="578" y="215" width="392" height="104" xlink:href="data:image/png;base64,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IECAAAECBG4voAQECBAgQIAAAQIECBAgMCUgADElZP36BZSQAAECBAgQIECAAAECBAgQaF9ADQkQIEBgcwICEJs7ZApMgAABAgQIELi9gBIQIECAAAECBAgQIECAAIEpAQGIKaH1r1dCAgQIECBAgAABAgQIECBAoH0BNSRAgAABApsTEIDY3CFTYAIECBAgQOD2AkpAgAABAgQIECBAgAABAgQITAlsPwAxVUPrCRAgQIAAAQIECBAgQIAAge0LqAEBAgQIECCwOQEBiM0dMgUmQIAAAQK3F1ACAgQIECBAgAABAgQIECBAoH2Bc2soAHGuoO0JECBAgAABAgQIECBAgMDlBeyBAAECBAgQILA5AQGIzR0yBSZAgACB2wsoAQECBAgQIECAAAECBAgQINC+gBqeKyAAca6g7QkQIECAAAECBAgQIEDg8gL2QIAAAQIECBAgsDkBAYjNHTIFJkCAwO0FlIAAAQIECBAgQIAAAQIECBBoX0ANCZwrIABxrqDtCRAgQIAAAQIECBAgcHkBeyBAgAABAgQIECCwOQEBiM0dMgUmQOD2AkpAgAABAgQIECBAgAABAgQItC+ghgQInCsgAHGuoO0JECBAgAABAgQIELi8gD0QIECAAAECBAgQILA5AQGIzR0yBSZwewElIECAAAECBAgQIECAAAECBNoXUEMCBAicKyAAca6g7QkQIECAAAECBAhcXsAeCBAgQIAAAQIECBAgsDkBAYjNHTIFvr2AEhAgQIAAAQIECBAgQIAAAQLtC6ghAQIECJwrIABxrqDtCRAgQIAAAQIELi9gDwQIECBAgAABAgQIECCwOQEBiM0dstsXWAkIECBAgAABAgQIECBAgACB9gXUkAABAgQInCsgAHGuoO0JECBAgAABApcXsAcCBAgQIECAAAECBAgQILA5AQGIkw+ZDQgQIECAAAECBAgQIECAAIH2BdSQAAECBAgQOFdAAOJcQdsTIECAAAEClxewBwIECBAgQIAAAQIECBAgQGBzAicHIDZXQwUmQIAAAQIECBAgQIAAAQIEThawAQECBAgQIEDgXAEBiHMFbU+AAAECBC4vYA8ECBAgQIAAAQIECBAgQIBA+wLN1VAAorlDqkIECBAgQIAAAQIECBAgcL6AHAgQIECAAAECBM4VEIA4V9D2BAgQIHB5AXsgQIAAAQIECBAgQIAAAQIE2hdQw+YEBCCaO6QqRIAAAQIECBAgQIAAgfMF5ECAAAECBAgQIEDgXAEBiHMFbU+AAIHLC9gDAQIECBAgQIAAAQIECBAg0L6AGhJoTkAAorlDqkIECBAgQIAAAQIECJwvIAcCBAgQIECAAAECBM4VEIA4V9D2BAhcXsAeCBAgQIAAAQIECBAgQIAAgfYF1JAAgeYEBCCaO6QqRIAAAQIECBAgQOB8ATkQIECAAAECBAgQIEDgXAEBiHMFbU/g8gL2QIAAAQIECBAgQIAAAQIECLQvoIYECBBoTkAAorlDqkIECBAgQIAAAQLnC8iBAAECBAgQIECAAAECBM4VEIA4V9D2lxewBwIECBAgQIAAAQIECBAgQKB9ATUkQIAAgeYEBCCaO6QqRIAAAQIECBA4X0AOBAgQIECAAAECBAgQIEDgXAEBiHMFL7+9PRAgQIAAAQIECBAgQIAAAQLtC6ghAQIECBBoTkAAorlDqkIECBAgQIDA+QJyIECAAAECBAgQIECAAAECBM4VWH8A4twa2p4AAQIECBAgQIAAAQIECBBYv4ASEiBAgAABAs0JCEA0d0hViAABAgQInC8gBwIECBAgQIAAAQIECBAgQKB9gUvXUADi0sLyJ0CAAAECBAgQIECAAAEC0wJSECBAgAABAgSaExCAaO6QqhABAgQInC8gBwIECBAgQIAAAQIECBAgQKB9ATW8tIAAxKWF5U+AAAECBAgQIECAAAEC0wJSECBAgAABAgQINCcgANHcIVUhAgQInC8gBwIECBAgQIAAAQIECBAgQKB9ATUkcGkBAYhLC8ufAAECBAgQIECAAAEC0wJSECBAgAABAgQIEGhOQACiuUOqQgQInC8gBwIECBAgQIAAAQIECBAgQKB9ATUkQODSAgIQlxaWPwECBAgQIECAAAEC0wJSECBAgAABAgQIECDQnIAARHOHVIUInC8gBwIECBAgQIAAAQIECBAgQKB9ATUkQIDApQUEIC4tLH8CBAgQIECAAAEC0wJSECBAgAABAgQIECBAoDkBAYjmDqkKnS8gBwIECBAgQIAAAQIECBAgQKB9ATUkQIAAgUsLCEBcWlj+BAgQIECAAAEC0wJSECBAgAABAgQIECBAgEBzAgIQzR3S8yskBwIECBAgQIAAAQIECBAgQKB9ATUkQIAAAQKXFhCAuLSw/AkQIECAAAEC0wJSECBAgAABAgQIECBAgACB5gQEIJ44pBYQIECAAAECBAgQIECAAAEC7QuoIQECBAgQIHBpAQGISwvLnwABAgQIEJgWkIIAAQIECBAgQIAAAQIECBBoTuCJAERzNVQhAgQIECBAgAABAgQIECBA4AkBCwgQIECAAAEClxYQgLi0sPwJECBAgMC0gBQECBAgQIAAAQIECBAgQIBA+wK7q6EAxO4OuQoTIECAAAECBAgQIECAwN0dAwIECBAgQIAAgUsLCEBcWlj+BAgQIDAtIAUBAgQIECBAgAABAgQIECDQvoAa7k5AAGJ3h1yFCRAgQIAAAQIECBAgcHfHgAABlQpriwAAEABJREFUAgQIECBAgMClBQQgLi0sfwIECEwLSEGAAAECBAgQIECAAAECBAi0L6CGBHYnIACxu0OuwgQIECBAgAABAgQI3N0xIECAAAECBAgQIEDg0gICEJcWlj8BAtMCUhAgQIAAAQIECBAgQIAAAQLtC6ghAQK7ExCA2N0hV2ECBAgQIECAAAECd3cMCBAgQIAAAQIECBAgcGkBAYhLC8ufwLSAFAQIECBAgAABAgQIECBAgED7AmpIgACB3QkIQOzukKswAQIECBAgQIDA3R0DAgQIECBAgAABAgQIELi0gADEpYXlPy0gBQECBAgQIECAAAECBAgQINC+gBoSIECAwO4EBCB2d8hVmAABAgQIECBwd8eAAAECBAgQIECAAAECBAhcWkAA4tLC0/lLQYAAAQIECBAgQIAAAQIECLQvoIYECBAgQGB3AgIQuzvkKkyAAAECBAjc3TEgQIAAAQIECBAgQIAAAQIELi1w+wDEpWsofwIECBAgQIAAAQIECBAgQOD2AkpAgAABAgQI7E5AAGJ3h1yFCRAgQIDA3R0DAgQIECBAgAABAgQIECBAoH2BW9dQAOLWR8D+CRAgQIAAAQIECBAgQGAPAupIgAABAgQIENidgADE7g65ChMgQIDA3R0DAgQIECBAgAABAgQIECBAoH0BNby1gADErY+A/RMgQIAAAQIECBAgQGAPAupIgAABAgQIECCwOwEBiN0dchUmQIDA3R0DAgQIECBAgAABAgQIECBAoH0BNSRwawEBiFsfAfsnQIAAAQIECBAgQGAPAupIgAABAgQIECBAYHcCAhC7O+QqTIDA3R0DAgQIECBAgAABAgQIECBAoH0BNSRA4NYCAhC3PgL2T4AAAQIECBAgQGAPAupIgAABAgQIECBAgMDuBAQgdnfIVZjA3R0DAgQIECBAgAABAgQIECBAoH0BNSRAgMCtBQQgbn0E7J8AAQIECBAgQGAPAupIgAABAgQIECBAgACB3QkIQOzukKvw3R0DAgQIECBAgAABAgQIECBAoH0BNSRAgACBWwsIQNz6CNg/AQIECBAgQGAPAupIgAABAgQIECBAgAABArsTEIDY3SG/u1NlAgQIECBAgAABAgQIECBAoH0BNSRAgAABArcWEIC49RGwfwIECBAgQGAPAupIgAABAgQIECBAgAABAgR2J7DDAMTujrEKEyBAgAABAgQIECBAgACBHQqoMgECBAgQIHBrAQGIWx8B+ydAgAABAnsQUEcCBAgQIECAAAECBAgQIECgfYFODQUgOiBeEiBAgAABAgQIECBAgACBFgTUgQABAgQIECBwawEBiFsfAfsnQIAAgT0IqCMBAgQIECBAgAABAgQIECDQvoAadgQEIDogXhIgQIAAAQIECBAgQIBACwLqQIAAAQIECBAgcGsBAYhbHwH7J0CAwB4E1JEAAQIECBAgQIAAAQIECBBoX0ANCXQEBCA6IF4SIECAAAECBAgQIECgBQF1IECAAAECBAgQIHBrAQGIWx8B+ydAYA8C6kiAAAECBAgQIECAAAECBAi0L6CGBAh0BAQgOiBeEiBAgAABAgQIECDQgoA6ECBAgAABAgQIECBwawEBiFsfAfsnsAcBdSRAgAABAgQIECBAgAABAgTaF1BDAgQIdAQEIDogXhIgQIAAAQIECBBoQUAdCBAgQIAAAQIECBAgcGsBAYhbHwH734OAOhIgQIAAAQIECBAgQIAAAQLtC6ghAQIECHQEBCA6IF4SIECAAAECBAi0IKAOBAgQIECAAAECBAgQIHBrAQGIWx+BPexfHQkQIECAAAECBAgQIECAAIH2BdSQAAECBAh0BAQgOiBeEiBAgAABAgRaEFAHAgQIECBAgAABAgQIECBwawEBiMsfAXsgQIAAAQIECBAgQIAAAQIE2hdQQwIECBAgQKAjIADRAfGSAAECBAgQaEFAHQgQIECAAAECBAgQIECAAIFbC1w+AHHrGto/AQIECBAgQIAAAQIECBAgcHkBeyBAgAABAgQIdAQEIDogXhIgQIAAgRYE1IEAAQIECBAgQIAAAQIECBBoX2DtNRSAWPsRUj4CBAgQIECAAAECBAgQ2IKAMhIgQIAAAQIECHQEBCA6IF4SIECAQAsC6kCAAAECBAgQIECAAAECBAi0L6CGaxcQgFj7EVI+AgQIECBAgAABAgQIbEFAGQkQIECAAAECBAh0BAQgOiBeEiBAoAUBdSBAgAABAgQIECBAgAABAgTaF1BDAmsXEIBY+xFSPgIECBAgQIAAAQIEtiCgjAQIECBAgAABAgQIdAQEIDogXhIg0IKAOhAgQIAAAQIECBAgQIAAAQLtC6ghAQJrFxCAWPsRUj4CBAgQIECAAAECWxBQRgIECBAgQIAAAQIECHQEBCA6IF4SaEFAHQgQIECAAAECBAgQIECAAIH2BdSQAAECaxcQgFj7EVI+AgQIECBAgACBLQgoIwECBAgQIECAAAECBAh0BAQgOiBetiCgDgQIECBAgAABAgQIECBAgED7AmpIgAABAmsXEIBY+xFSPgIECBAgQIDAFgSUkQABAgQIECBAgAABAgQIdAQEIDogLbxUBwIECBAgQIAAAQIECBAgQKB9ATUkQIAAAQJrFxCAWPsRUj4CBAgQIEBgCwLKSIAAAQIECBAgQIAAAQIECHQEGgxAdGroJQECBAgQIECAAAECBAgQINCggCoRIECAAAECaxcQgFj7EVI+AgQIECCwBQFlJECAAAECBAgQIECAAAECBNoXOLGGAhAngklOgAABAgQIECBAgAABAgTWIKAMBAgQIECAAIG1CwhArP0IKR8BAgQIbEFAGQkQIECAAAECBAgQIECAAIH2BdTwRAEBiBPBJCdAgAABAgQIECBAgACBNQgoAwECBAgQIECAwNoFBCDWfoSUjwABAlsQUEYCBAgQIECAAAECBAgQIECgfQE1JHCigADEiWCSEyBAgAABAgQIECBAYA0CykCAAAECBAgQIEBg7QICEGs/QspHgMAWBJSRAAECBAgQIECAAAECBAgQaF9ADQkQOFFAAOJEMMkJECBAgAABAgQIEFiDgDIQIECAAAECBAgQILB2AQGItR8h5SOwBQFlJECAAAECBAgQIECAAAECBNoXUEMCBAicKCAAcSKY5AQIECBAgAABAgTWIKAMBAgQIECAAAECBAgQWLuAAMTaj5DybUFAGQkQIECAAAECBAgQIECAAIH2BdSQAAECBE4UEIA4EUxyAgQIECBAgACBNQgoAwECBAgQIECAAAECBAisXUAAYu1HaAvlU0YCBAgQIECAAAECBAgQIECgfQE1JECAAAECJwoIQJwIJjkBAgQIECBAYA0CykCAAAECBAgQIECAAAECBNYuIABx/hGSAwECBAgQIECAAAECBAgQINC+gBoSIECAAAECJwoIQJwIJjkBAgQIECCwBgFlIECAAAECBAgQIECAAAECBNYucH4AYu01VD4CBAgQIECAAAECBAgQIEDgfAE5ECBAgAABAgROFBCAOBFMcgIECBAgsAYBZSBAgAABAgQIECBAgAABAgTaF9h6DQUgtn4ElZ8AAQIECBAgQIAAAQIEriFgHwQIECBAgAABAicKCECcCCY5AQIECKxBQBkIECBAgAABAgQIECBAgACB9gXUcOsCAhBbP4LKT4AAAQIECBAgQIAAgWsI2AcBAgQIECBAgACBEwUEIE4Ek5wAAQJrEFAGAgQIECBAgAABAgQIECBAoH0BNSSwdQEBiK0fQeUnQIAAAQIECBAgQOAaAvZBgAABAgQIECBAgMCJAgIQJ4JJToDAGgSUgQABAgQIECBAgAABAgQIEGhfQA0JENi6gADE1o+g8hMgQIAAAQIECBC4hoB9ECBAgAABAgQIECBA4EQBAYgTwSQnsAYBZSBAgAABAgQIECBAgAABAgTaF1BDAgQIbF1AAGLrR1D5CRAgQIAAAQIEriFgHwQIECBAgAABAgQIECBwooAAxIlgkq9BQBkIECBAgAABAgQIECBAgACB9gXUkAABAgS2LiAAsfUjqPwECBAgQIAAgWsI2AcBAgQIECBAgAABAgQIEDhRQADiRLA1JFcGAgQIECBAgAABAgQIECBAoH0BNSRAgAABAlsXEIDY+hFUfgIECBAgQOAaAvZBgAABAgQIECBAgAABAgQInCiwwQDEiTWUnAABAgQIECBAgAABAgQIENiggCITIECAAAECWxcQgNj6EVR+AgQIECBwDQH7IECAAAECBAgQIECAAAECBNoXWLiGAhALg8qOAAECBAgQIECAAAECBAgsISAPAgQIECBAgMDWBQQgtn4ElZ8AAQIEriFgHwQIECBAgAABAgQIECBAgED7Amq4sIAAxMKgsiNAgAABAgQIECBAgACBJQTkQYAAAQIECBAgsHUBAYitH0HlJ0CAwDUE7IMAAQIECBAgQIAAAQIECBBoX0ANCSwsIACxMKjsCBAgQIAAAQIECBAgsISAPAgQIECAAAECBAhsXUAAYutHUPkJELiGgH0QIECAAAECBAgQIECAAAEC7QuoIQECCwsIQCwMKjsCBAgQIECAAAECBJYQkAcBAgQIECBAgAABAlsXEIDY+hFUfgLXELAPAgQIECBAgAABAgQIECBAoH0BNSRAgMDCAgIQC4PKjgABAgQIECBAgMASAvIgQIAAAQIECBAgQIDA1gUEILZ+BJX/GgL2QYAAAQIECBAgQIAAAQIECLQvoIYECBAgsLCAAMTCoLIjQIAAAQIECBBYQkAeBAgQIECAAAECBAgQILB1AQGIrR/Ba5TfPggQIECAAAECBAgQIECAAIH2BdSQAAECBAgsLCAAsTCo7AgQIECAAAECSwjIgwABAgQIECBAgAABAgQIbF1AAGL6CEpBgAABAgQIECBAgAABAgQItC+ghgQIECBAgMDCAgIQC4PKjgABAgQIEFhCQB4ECBAgQIAAAQIECBAgQIDA1gWmAxBbr6HyEyBAgAABAgQIECBAgAABAtMCUhAgQIAAAQIEFhYQgFgYVHYECBAgQGAJAXkQIECAAAECBAgQIECAAAEC7Qu0XkMBiNaPsPoRIECAAAECBAgQIECAwBwBaQgQIECAAAECBBYWEIBYGFR2BAgQILCEgDwIECBAgAABAgQIECBAgACB9gXUsHUBAYjWj7D6ESBAgAABAgQIECBAYI6ANAQIECBAgAABAgQWFhCAWBhUdgQIEFhCQB4ECBAgQIAAAQIECBAgQIBA+wJqSKB1AQGI1o+w+hEgQIAAAQIECBAgMEdAGgIECBAgQIAAAQIEFhYQgFgYVHYECCwhIA8CBAgQIECAAAECBAgQIECgfQE1JECgdQEBiNaPsPoRIECAAAECBAgQmCMgDQECBAgQIECAAAECBBYWEIBYGFR2BJYQkAcBAgQIECBAgAABAgQIECDQvoAaEiBAoHUBAYjWj4hKy3QAABAASURBVLD6ESBAgAABAgQIzBGQhgABAgQIECBAgAABAgQWFhCAWBhUdksIyIMAAQIECBAgQIAAAQIECBBoX0ANCRAgQKB1AQGI1o+w+hEgQIAAAQIE5ghIQ4AAAQIECBAgQIAAAQIEFhYQgFgYdIns5EGAAAECBAgQIECAAAECBAi0L6CGBAgQIECgdQEBiNaPsPoRIECAAAECcwSkIUCAAAECBAgQIECAAAECBBYWWGEAYuEayo4AAQIECBAgQIAAAQIECBBYoYAiESBAgAABAq0LCEC0foTVjwABAgQIzBGQhgABAgQIECBAgAABAgQIEGhf4Mo1FIC4MrjdESBAgAABAgQIECBAgACBCBgJECBAgAABAq0LCEC0foTVjwABAgTmCEhDgAABAgQIECBAgAABAgQItC+ghlcWEIC4MrjdESBAgAABAgQIECBAgEAEjAQIECBAgAABAq0LCEC0foTVjwABAnMEpCFAgAABAgQIECBAgAABAgTaF1BDAlcWEIC4MrjdESBAgAABAgQIECBAIAJGAgQIECBAgAABAq0LCEC0foTVjwCBOQLSECBAgAABAgQIECBAgAABAu0LqCEBAlcWEIC4MrjdESBAgAABAgQIECAQASMBAgQIECBAgAABAq0LCEC0foTVj8AcAWkIECBAgAABAgQIECBAgACB9gXUkAABAlcWEIC4MrjdESBAgAABAgQIEIiAkQABAgQIECBAgAABAq0LCEC0foTVb46ANAQIECBAgAABAgQIECBAgED7AmpIgAABAlcWEIC4MrjdESBAgAABAgQIRMBIgAABAgQIECBAgAABAq0LCEC0foTn1E8aAgQIECBAgAABAgQIECBAoH0BNSRAgAABAlcWEIC4MrjdESBAgAABAgQiYCRAgAABAgQIECBAgAABAq0LCEDc3bV+jNWPAAECBAgQIECAAAECBAgQuLtjQIAAAQIECFxZQADiyuB2R4AAAQIECETASIAAAQIECBAgQIAAAQIECLQu8KvuWq+h+hEgQIAAAQIECBAgQIAAAQJ3dwwIECBAgAABAlcWcAfElcHtjgABAgQIRMBIgAABAgQIECBAgAABAgQItC+w9xoKQOz9DFB/AgQIECBAgAABAgQI7ENALQkQIECAAAECBK4sIABxZXC7I0CAAIEIGAkQIECAAAECBAgQIECAAIH2BdRw7wICEHs/A9SfAAECBAgQIECAAIF9CKglAQIECBAgQIAAgSsLCEBcGdzuCBAgEAEjAQIECBAgQIAAAQIECBAg0L6AGhLYu4AAxN7PAPUnQIAAAQIECBAgsA8BtSRAgAABAgQIECBA4MoCAhBXBrc7AgQiYCRAgAABAgQIECBAgAABAgTaF1BDAgT2LiAAsfczQP0JECBAgAABAgT2IaCWBAgQIECAAAECBAgQuLKAAMSVwe2OQASMBAgQIECAAAECBAgQIECAQPsCakiAAIG9CwhA7P0MUH8CBAgQIECAwD4E1JIAAQIECBAgQIAAAQIEriwgAHFlcLuLgJEAAQIECBAgQIAAAQIECBBoX0ANCRAgQGDvAgIQez8D1J8AAQIECBDYh4BaEiBAgAABAgQIECBAgACBKwsIQFwZPLszEiBAgAABAgQIECBAgAABAu0LqCEBAgQIENi7gADE3s8A9SdAgAABAvsQUEsCBAgQIECAAAECBAgQIEDgygI3CEBcuYZ2R4AAAQIECBAgQIAAAQIECNxAwC4JECBAgACBvQsIQOz9DFB/AgQIENiHgFoSIECAAAECBAgQIECAAAEC7QusrIYCECs7IIpDgAABAgQIECBAgAABAm0IqAUBAgQIECBAYO8CAhB7PwPUnwABAvsQUEsCBAgQIECAAAECBAgQIECgfQE1XJmAAMTKDojiECBAgAABAgQIECBAoA0BtSBAgAABAgQIENi7gADE3s8A9SdAYB8CakmAAAECBAgQIECAAAECBAi0L6CGBFYmIACxsgOiOAQIECBAgAABAgQItCGgFgQIECBAgAABAgT2LiAAsfczQP0J7ENALQkQIECAAAECBAgQIECAAIH2BdSQAIGVCQhArOyAKA4BAgQIECBAgACBNgTUggABAgQIECBAgACBvQsIQOz9DFD/fQioJQECBAgQIECAAAECBAgQINC+gBoSIEBgZQICECs7IIpDgAABAgQIECDQhoBaECBAgAABAgQIECBAYO8CAhB7PwP2UX+1JECAAAECBAgQIECAAAECBNoXUEMCBAgQWJmAAMTKDojiECBAgAABAgTaEFALAgQIECBAgAABAgQIENi7gADEHs4AdSRAgAABAgQIECBAgAABAgTaF1BDAgQIECCwMgEBiJUdEMUhQIAAAQIE2hBQCwIECBAgQIAAAQIECBAgsHeBPQQg9n6M1Z8AAQIECBAgQIAAAQIECOxBQB0JECBAgACBlQkIQKzsgCgOAQIECBBoQ0AtCBAgQIAAAQIECBAgQIAAgfYFxmsoADHuYy0BAgQIECBAgAABAgQIENiGgFISIECAAAECBFYmIACxsgOiOAQIECDQhoBaECBAgAABAgQIECBAgAABAu0LqOG4gADEuI+1BAgQIECAAAECBAgQILANAaUkQIAAAQIECBBYmYAAxMoOiOIQIECgDQG1IECAAAECBAgQIECAAAECBNoXUEMC4wICEOM+1hIgQIAAAQIECBAgQGAbAkpJgAABAgQIECBAYGUCAhArOyCKQ4BAGwJqQYAAAQIECBAgQIAAAQIECLQvoIYECIwLCECM+1hLgAABAgQIECBAgMA2BJSSAAECBAgQIECAAIGVCQhArOyAKA6BNgTUggABAgQIECBAgAABAgQIEGhfQA0JECAwLiAAMe5jLQECBAgQIECAAIFtCCglAQIECBAgQIAAAQIEViYgALGyA6I4bQioBQECBAgQIECAAAECBAgQINC+gBoSIECAwLiAAMS4j7UECBAgQIAAAQLbEFBKAgQIECBAgAABAgQIEFiZgADEyg5IG8VRCwIECBAgQIAAAQIECBAgQKB9ATUkQIAAAQLjAgIQ4z7WEiBAgAABAgS2IaCUBAgQIECAAAECBAgQIEBgZQICEBc4ILIkQIAAAQIECBAgQIAAAQIE2hdQQwIECBAgQGBcQABi3MdaAgQIECBAYBsCSkmAAAECBAgQIECAAAECBAisTOACAYiV1VBxCBAgQIAAAQIECBAgQIAAgQsIyJIAAQIECBAgMC4gADHuYy0BAgQIENiGgFISIECAAAECBAgQIECAAAEC7QtsrIYCEBs7YIpLgAABAgQIECBAgAABAusQUAoCBAgQIECAAIFxAQGIcR9rCRAgQGAbAkpJgAABAgQIECBAgAABAgQItC+ghhsTEIDY2AFTXAIECBAgQIAAAQIECKxDQCkIECBAgAABAgQIjAsIQIz7WEuAAIFtCCglAQIECBAgQIAAAQIECBAg0L6AGhLYmIAAxMYOmOISIECAAAECBAgQILAOAaUgQIAAAQIECBAgQGBcQABi3MdaAgS2IaCUBAgQIECAAAECBAgQIECAQPsCakiAwMYEBCA2dsAUlwABAgQIECBAgMA6BJSCAAECBAgQIECAAAEC4wICEOM+1hLYhoBSEiBAgAABAgQIECBAgAABAu0LqCEBAgQ2JiAAsbEDprgECBAgQIAAAQLrEFAKAgQIECBAgAABAgQIEBgXEIAY97F2GwJKSYAAAQIECBAgQIAAAQIECLQvoIYECBAgsDEBAYiNHTDFJUCAAAECBAisQ0ApCBAgQIAAAQIECBAgQIDAuIAAxLjPNtYqJQECBAgQIECAAAECBAgQINC+gBoSIECAAIGNCQhAbOyAKS4BAgQIECCwDgGlIECAAAECBAgQIECAAAECBMYFWghAjNfQWgIECBAgQIAAAQIECBAgQKAFAXUgQIAAAQIENiYgALGxA6a4BAgQIEBgHQJKQYAAAQIECBAgQIAAAQIECLQvcF4NBSDO87M1AQIECBAgQIAAAQIECBC4joC9ECBAgAABAgQ2JiAAsbEDprgECBAgsA4BpSBAgAABAgQIECBAgAABAgTaF1DD8wQEIM7zszUBAgQIECBAgAABAgQIXEfAXggQIECAAAECBDYmIACxsQOmuAQIEFiHgFIQIECAAAECBAgQIECAAAEC7QuoIYHzBAQgzvOzNQECBAgQIECAAAECBK4jYC8ECBAgQIAAAQIENiYgALGxA6a4BAisQ0ApCBAgQIAAAQIECBAgQIAAgfYF1JAAgfMEBCDO87M1AQIECBAgQIAAAQLXEbAXAgQIECBAgAABAgQ2JiAAsbEDprgE1iGgFAQIECBAgAABAgQIECBAgED7AmpIgACB8wQEIM7zszUBAgQIECBAgACB6wjYCwECBAgQIECAAAECBDYmIACxsQOmuOsQUAoCBAgQIECAAAECBAgQIECgfQE1JECAAIHzBAQgzvOzNQECBAgQIECAwHUE7IUAAQIECBAgQIAAAQIENiYgALGxA7aO4ioFAQIECBAgQIAAAQIECBAg0L6AGhIgQIAAgfMEBCDO87M1AQIECBAgQOA6AvZCgAABAgQIECBAgAABAgQ2JiAA8YADZhMCBAgQIECAAAECBAgQIECgfQE1JECAAAECBM4TEIA4z8/WBAgQIECAwHUE7IUAAQIECBAgQIAAAQIECBDYmMADAhAbq6HiEiBAgAABAgQIECBAgAABAg8QsAkBAgQIECBA4DwBAYjz/GxNgAABAgSuI2AvBAgQIECAAAECBAgQIECAQPsCjdVQAKKxA6o6BAgQIECAAAECBAgQILCMgFwIECBAgAABAgTOExCAOM/P1gQIECBwHQF7IUCAAAECBAgQIECAAAECBNoXUMPGBAQgGjugqkOAAAECBAgQIECAAIFlBORCgAABAgQIECBA4DwBAYjz/GxNgACB6wjYCwECBAgQIECAAAECBAgQINC+gBoSaExAAKKxA6o6BAgQIECAAAECBAgsIyAXAgQIECBAgAABAgTOExCAOM/P1gQIXEfAXggQIECAAAECBAgQIECAAIH2BdSQAIHGBAQgGjugqkOAAAECBAgQIEBgGQG5ECBAgAABAgQIECBA4DwBAYjz/GxN4DoC9kKAAAECBAgQIECAAAECBAi0L6CGBAgQaExAAKKxA6o6BAgQIECAAAECywjIhQABAgQIECBAgAABAgTOExCAOM/P1tcRsBcCBAgQIECAAAECBAgQIECgfQE1JECAAIHGBAQgGjugqkOAAAECBAgQWEZALgQIECBAgAABAgQIECBA4DwBAYjz/K6ztb0QIECAAAECBAgQIECAAAEC7QuoIQECBAgQaExAAKKxA6o6BAgQIECAwDICciFAgAABAgQIECBAgAABAgTOE9hCAOK8GtqaAAECBAgQIECAAAECBAgQ2IKAMhIgQIAAAQKNCQhANHZ/87pIAAAJMUlEQVRAVYcAAQIECCwjIBcCBAgQIECAAAECBAgQIECgfYHL1lAA4rK+cidAgAABAgQIECBAgAABAvMEpCJAgAABAgQINCYgANHYAVUdAgQIEFhGQC4ECBAgQIAAAQIECBAgQIBA+wJqeFkBAYjL+sqdAAECBAgQIECAAAECBOYJSEWAAAECBAgQINCYgABEYwdUdQgQILCMgFwIECBAgAABAgQIECBAgACB9gXUkMBlBQQgLusrdwIECBAgQIAAAQIECMwTkIoAAQIECBAgQIBAYwICEI0dUNUhQGAZAbkQIECAAAECBAgQIECAAAEC7QuoIQEClxUQgLisr9wJECBAgAABAgQIEJgnIBUBAgQIECBAgAABAo0JCEA0dkBVh8AyAnIhQIAAAQIECBAgQIAAAQIE2hdQQwIECFxWQADisr5yJ0CAAAECBAgQIDBPQCoCBAgQIECAAAECBAg0JiAA0dgBVZ1lBORCgAABAgQIECBAgAABAgQItC+ghgQIECBwWQEBiMv6yp0AAQIECBAgQGCegFQECBAgQIAAAQIECBAg0JiAAERjB3SZ6siFAAECBAgQIECAAAECBAgQaF9ADQkQIECAwGUFBCAu6yt3AgQIECBAgMA8AakIECBAgAABAgQIECBAgEBjAgIQPQfUIgIECBAgQIAAAQIECBAgQKB9ATUkQIAAAQIELisgAHFZX7kTIECAAAEC8wSkIkCAAAECBAgQIECAAAECBBoT6AlANFZD1SFAgAABAgQIECBAgAABAgR6BCwiQIAAAQIECFxWQADisr5yJ0CAAAEC8wSkIkCAAAECBAgQIECAAAECBNoX2FkNBSB2dsBVlwABAgQIECBAgAABAgQeCfifAAECBAgQIEDgsgICEJf1lTsBAgQIzBOQigABAgQIECBAgAABAgQIEGhfQA13JiAAsbMDrroECBAgQIAAAQIECBB4JOB/AgQIECBAgAABApcVEIC4rK/cCRAgME9AKgIECBAgQIAAAQIECBAgQKB9ATUksDMBAYidHXDVJUCAAAECBAgQIEDgkYD/CRAgQIAAAQIECBC4rIAAxGV95U6AwDwBqQgQIECAAAECBAgQIECAAIH2BdSQAIGdCQhA7OyAqy4BAgQIECBAgACBRwL+J0CAAAECBAgQIECAwGUFBCAu6yt3AvMEpCJAgAABAgQIECBAgAABAgTaF1BDAgQI7ExAAGJnB1x1CRAgQIAAAQIEHgn4nwABAgQIECBAgAABAgQuKyAAcVlfuc8TkIoAAQIECBAgQIAAAQIECBBoX0ANCRAgQGBnAgIQOzvgqkuAAAECBAgQeCTgfwIECBAgQIAAAQIECBAgcFkBAYjL+s7LXSoCBAgQIECAAAECBAgQIECgfQE1JECAAAECOxMQgNjZAVddAgQIECBA4JGA/wkQIECAAAECBAgQIECAAIHLCqwhAHHZGsqdAAECBAgQIECAAAECBAgQWIOAMhAgQIAAAQI7ExCA2NkBV10CBAgQIPBIwP8ECBAgQIAAAQIECBAgQIBA+wK3raEAxG397Z0AAQIECBAgQIAAAQIE9iKgngQIECBAgACBnQkIQOzsgKsuAQIECDwS8D8BAgQIECBAgAABAgQIECDQvoAa3lZAAOK2/vZOgAABAgQIECBAgACBvQioJwECBAgQIECAwM4EBCB2dsBVlwABAo8E/E+AAAECBAgQIECAAAECBAi0L6CGBG4rIABxW397J0CAAAECBAgQIEBgLwLqSYAAAQIECBAgQGBnAgIQOzvgqkuAwCMB/xMgQIAAAQIECBAgQIAAAQLtC6ghAQK3FRCAuK2/vRMgQIAAAQIECBDYi4B6EiBAgAABAgQIECCwMwEBiJ0dcNUl8EjA/wQIECBAgAABAgQIECBAgED7AmpIgACB2woIQNzW394JECBAgAABAgT2IqCeBAgQIECAAAECBAgQ2JmAAMTODrjqPhLwPwECBAgQIECAAAECBAgQINC+gBoSIECAwG0FBCBu62/vBAgQIECAAIG9CKgnAQIECBAgQIAAAQIECOxMQABiZwf8UXX9T4AAAQIECBAgQIAAAQIECLQvoIYECBAgQOC2AgIQt/W3dwIECBAgQGAvAupJgAABAgQIECBAgAABAgR2JrDLAMTOjrHqEiBAgAABAgQIECBAgACBXQqoNAECBAgQIHBbAQGI2/rbOwECBAgQ2IuAehIgQIAAAQIECBAgQIAAAQLtC9yroQDEPQ4vCBAgQIAAAQIECBAgQIBAKwLqQYAAAQIECBC4rYAAxG397Z0AAQIE9iKgngQIECBAgAABAgQIECBAgED7Amp4T0AA4h6HFwQIECBAgAABAgQIECDQioB6ECBAgAABAgQI3FZAAOK2/vZOgACBvQioJwECBAgQIECAAAECBAgQINC+gBoSuCcgAHGPwwsCBAgQIECAAAECBAi0IqAeBAgQIECAAAECBG4rIABxW397J0BgLwLqSYAAAQIECBAgQIAAAQIECLQvoIYECNwTEIC4x+EFAQIECBAgQIAAAQKtCKgHAQIECBAgQIAAAQK3FRCAuK2/vRPYi4B6EiBAgAABAgQIECBAgAABAu0LqCEBAgTuCQhA3OPwggABAgQIECBAgEArAupBgAABAgQIECBAgACB2woIQNzW3973IqCeBAgQIECAAAECBAgQIECAQPsCakiAAAEC9wQEIO5xeEGAAAECBAgQINCKgHoQIECAAAECBAgQIECAwG0FBCBu67+XvasnAQIECBAgQIAAAQIECBAg0L6AGhIgQIAAgXsCAhD3OLwgQIAAAQIECLQioB4ECBAgQIAAAQIECBAgQOC2AgIQ1/C3DwIECBAgQIAAAQIECBAgQKB9ATUkQIAAAQIE7gkIQNzj8IIAAQIECBBoRUA9CBAgQIAAAQIECBAgQIAAgdsKXCMAcdsa2jsBAgQIECBAgAABAgQIECBwDQH7IECAAAECBAjcExCAuMfhBQECBAgQaEVAPQgQIECAAAECBAgQIECAAIH2BdZdQwGIdR8fpSNAgAABAgQIECBAgACBrQgoJwECBAgQIECAwD0BAYh7HF4QIECAQCsC6kGAAAECBAgQIECAAAECBAi0L6CG6xb4nwAAAP//0RoFxwAAAAZJREFUAwBEA6O5l8X+XwAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-23"><g transform="translate(0.5,0.5)"><rect x="720.21" y="250" width="107.5" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: light-dark(rgb(255, 242, 204), rgb(40, 29, 0)); stroke: light-dark(rgb(214, 182, 86), rgb(109, 81, 0));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 106px; height: 1px; padding-top: 280px; margin-left: 721px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">onUpdate(....)</div></div></div></foreignObject><image x="721" y="273.5" width="106" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-24"><g transform="translate(0.5,0.5)"><rect x="612.71" y="250" width="107.5" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: light-dark(rgb(255, 242, 204), rgb(40, 29, 0)); stroke: light-dark(rgb(214, 182, 86), rgb(109, 81, 0));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 106px; height: 1px; padding-top: 280px; margin-left: 614px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">onInit(...)</div></div></div></foreignObject><image x="614" y="273.5" width="106" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-25"><g transform="translate(0.5,0.5)"><rect x="827.71" y="250" width="107.5" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: light-dark(rgb(255, 242, 204), rgb(40, 29, 0)); stroke: light-dark(rgb(214, 182, 86), rgb(109, 81, 0));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 106px; height: 1px; padding-top: 280px; margin-left: 829px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">onReset(....)</div></div></div></foreignObject><image x="829" y="273.5" width="106" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-26"><g transform="translate(0.5,0.5)"><rect x="780" y="410" width="200" height="40" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 430px; margin-left: 781px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Base Libraries<br /></b></div></div></div></foreignObject><image x="781" y="423.5" width="198" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-27"><g transform="translate(0.5,0.5)"><rect x="390" y="470" width="590" height="40" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: light-dark(rgb(255, 242, 204), rgb(40, 29, 0)); stroke: light-dark(rgb(214, 182, 86), rgb(109, 81, 0));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 588px; height: 1px; padding-top: 490px; margin-left: 391px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>POSIX-like HLOS<br /></b></div></div></div></foreignObject><image x="391" y="483.5" width="588" height="17" xlink:href="data:image/png;base64,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fGuyvj/1LHxvXtf356lp75OsZ1V9j2rcdhSI5S0FAQIECBAgQIDAOgEvCRAgQGAFBBQwrcCH7BYJECBAgAABAt0CegkQIEBghQTqj/dVoFSFQTWLzW1y79dNVjFRFdpcLa+rwOmuaauopgqKquAom3OPKpqqIohjcuYq7np82iomqOupvEe2q9Dq8LR1HZ9JW2wRqCUAAATSSURBVNefRhDYLVAz4FRB1t9k63nJ+yerqOmWaWu2sMekrVl3agmxvBQ7LFC/v2N5/tS11DOlni1/GpeaWakKler7U8/C38y++v7UEo9V2FTPqnpmZbcgQIDAIgu4dgIECBAgQIAAAQLjFVDANN7PxpURILBoAq6XAAECBAgQIECAAAECBAgQWH4Bd0iAAAECBAgQIECAAAECBAjMXWB0BUxzv0MnJECAAAECBAgQIECAAAECBEYn4IIIECBAgAABAgQIECBAgACB5RdwhwQIEBgqoIBpqJRxBAgQIECAAAECBMYn4IoIECBAgAABAgQIECBAgACB5RdwhwQIECBAgACBpRdQwLT0H7EbJECAAIF+ASMIECBAgAABAgQIECBAgACB5RdwhwQIECBAgAABAgQIECAwVgEFTGP9ZBbxulwzAQIECBAgQIAAAQIECBAgsPwC7pAAAQIECBAgQIAAAQIECBBYfgF3SGCbBRQwbTO4tyNAgAABAgQIECBAgEAJSAIECBAgQIAAAQIECBAgQGD5BdwhAQIECBAgMExAAdMwJ6MIECBAgACBcQq4KgIECBAgQIAAAQIECBAgQGD5BdwhAQIECBAgQIAAAQJLLqCAack/YLdHYJiAUQQIECBAgAABAgQIECBAgMDyC7hDAgQIECBAgAABAgQIECBAYPkFFvMOFTAt5ufmqgkQIECAAAECBAgQIEBgpwS8LwECBAgQIECAAAECBAgQILD8Au6QAAECBLZVQAHTtnJ7MwIECBAgQIAAgTUBLQECBAgQIECAAAECBAgQILD8Au6QAAECBAgQIECAwBABBUxDlIwhQIDAeAVcGQECBAgQIECAAAECBAgQILD8Au6QAAECBAgQIECAAAECBAgstYACpt0frx8ECBAgQIAAAQIECBAgQIDA8gu4QwIECBAgQIAAAQIECBAgQGD5BdwhAQKLKKCAaRE/NddMgAABAgQIECBAYCcFvDcBAgQIECBAgAABAgQIECCw/ALukAABAgQIECCwjQIKmLYR21sRIECAAIH1Al4TIECAAAECBAgQIECAAAECyy/gDgkQIECAAAECBAgQIECgX0ABU7+REeMWcHUECBAgQIAAAQIECBAgQIDA8gu4QwIECBAgQIAAAQIECBAgQGD5BdzhCgsoYFrhD9+tEyBAgAABAgQIECCwagLulwABAgQIECBAgAABAgQIEFh+AXdIgAABAgQWT0AB0+J9Zq6YAAECBAgQ2GkB70+AAAECBAgQIECAAAECBAgsv4A7JECAAAECBAgQIEBg2wQUMG0btTciQGBSwDYBAgQIECBAgAABAgQIECCw/ALukAABAgQIECBAgAABAgQIEFh+gc3eoQKmzQo6ngABAgQIECBAgAABAgQIbL2AdyBAgAABAgQIECBAgAABAgSWX8AdEiBAYGUFFDCt7EfvxgkQIECAAAECqyjgngkQIECAAAECBAgQIECAAIHlF3CHBAgQIECAAAECiyaggGnRPjHXS4AAgTEIuAYCBAgQIECAAAECBAgQIEBg+QXcIQECBAgQIECAAAECBAgQ2CYBBUzbBN30NvYRIECAAAECBAgQIECAAAECyy/gDgkQIECAAAECBAgQIECAAIHlF3CHBAhsTuC/AAAA//8JZS3DAAAABklEQVQDAPcXrcVEHQQeAAAAAElFTkSuQmCC"/></switch></g></g></g><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-28"><g transform="translate(0.5,0.5)"><rect x="780" y="4" width="197" height="139" fill="#ffffff" stroke="#000000" stroke-dasharray="3 3" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 195px; height: 1px; padding-top: 11px; margin-left: 781px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Execution Manager logic</b></div></div></div></foreignObject><image x="781" y="11.5" width="195" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="Ayb2wKmMyzGbOmtrPlkw-29"><g><path d="M 515 143 L 515 50 L 550 50 L 550 53 L 548.03 53" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 555.53 53 L 545.53 58 L 548.03 53 L 545.53 48 Z" fill="#000000" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g></g></g></g></svg> \ No newline at end of file diff --git a/docs/features/code_generation/index.rst b/docs/features/code_generation/index.rst index e6064498144..c6fd560cf22 100644 --- a/docs/features/code_generation/index.rst +++ b/docs/features/code_generation/index.rst @@ -114,7 +114,7 @@ Let's define a software unit an entity that implements a specific input-output algorithmic function as part of a larger graph algorithm. This would be a ROS node or an ARA Application. -We want to support both functional programming stylem or Object +We want to support both functional programming style or Object Oriented programming style. In object-oriented programming languages, such as C++, a software unit would be implemented as a trivially default-constructible class with public methods and no defined @@ -201,7 +201,39 @@ by the Software Compute instance. A default parameter data structure is defined for the archetype. It can be re-configured for each instance of the Compute instance. +Error Handling +______________ + +There shall be a error management framework defining error type, +category of errors, mechanism for the propagation of error. In Rust or +modern C++, monadic behavior would be recommended. The recovery logic +should be modelable in the Modeling Language. + + + +Static analysis of the system +_____________________________ + +The system would be modeled using a specific description language. +The description language consists of three primary concepts: +**Interface Lists** these are collections of data types of the data to + be exchanged. They are modeled similarly to common IDLs; + +**Software Compyte Unit Archetype Lists** these are collections of + metadata descriptions of human-written Software Compyte Unit + implementations. One can think of them as similar to application + manifests in Adaptive Autosar or the Android Framework. + +**Software Compyte Unit Instance Lists** these are used to describe + the deployment of (instantiate) Software Compyte Unit Archetypes in + an operating system context, including both standard and user-defined + configuration parameters. + +The above are parsed as files into an intermediate representation that +represents the entire modeled system. The intermediate representation +open the doors to a static system analysis (resources analysis and +checks, resource allocation, static schedling). Subchapter __________ @@ -210,6 +242,10 @@ __________ .. .. image:: _assets/sample_image.svg .. :alt: Name +.. example for image embedding +.. .. image:: _assets/architetcure_diagram_for_code_generation.svg +.. :alt: Architecture Diagram + uml example: @@ -241,7 +277,7 @@ Security Impact Safety Impact ============= -Strict repeatible design pattern, extensive code re-usablility make it easy to certify. +Strict repeatible design pattern, extensive code re-usablility, is easy to certify. License Impact ============== diff --git a/docs/features/code_generation/requirements/index.rst b/docs/features/code_generation/requirements/index.rst index bb9307520bf..5893e80bf74 100644 --- a/docs/features/code_generation/requirements/index.rst +++ b/docs/features/code_generation/requirements/index.rst @@ -17,12 +17,118 @@ Requirements ============ -.. feat_req:: Example 1 - :id: feat_req__code_generation__example1 +.. feat_req:: Definition language should be a human-readible format + :id: feat_req__code_generation__definitionlanguage :reqtype: Functional :security: NO :safety: ASIL_B :satisfies: stkh_req__ai_platform__enablement :status: valid - Example Text. + In our case, the system is modeled in YAML-syntax files that use a + specific description language. A major advantage of YAML is that it + is easy to find parser for YAML either in Rust or C++. Advantage of + YAML over JSON is the easy syntax (no begin and end closure). + +.. feat_req:: Software Compute Units should signal initialization failures by returning an Error indicating failure. + :id: feat_req__code_generation__initialization + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__ai_platform__enablement + :status: valid + + Software Compute Unit Instances that fail to initialize are considered to have + failed permanently. + +.. feat_req:: Software Compute Unit are responsible for correct deallocation of any dynamically allocated memory in the onShutdown function. + :id: feat_req__code_generation__deinitialization + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__ai_platform__enablement + :status: valid + + Developers can assume that onInit and onShutdown will only ever be called once during the lifecycle of a Software Compute Unit Instance. + +.. feat_req:: Software Compute Units may not spawn a variable number of threads. + :id: feat_req__code_generation__nomultithreading + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__ai_platform__enablement + :status: valid + + If Software Compute Units are to spawn any threads at all, which is + not recommended, Software Compute Units must have a predetermined + number of threads that are spawned. Software Compute Units may not dynamically + spawn and join or detach worker threads. + +.. feat_req:: Software Compute Unit may not throw exceptions or "panic". + :id: feat_req__code_generation__error_handling1 + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__ai_platform__enablement + :status: valid + + Any exceptions in e.g. dependency libraries must be handled + completely inside the standard interface functions of the + Software Compute Unit. The only allowed way for a Software Compute Unit to signal an error is + by returning an Error that contains an + ErrorCode other than Success. Any unhandled exceptions + will cause the Software Compute Unit to terminate + execution. + +.. feat_req:: Software Compute Units should not attempt to trigger program termination. + :id: feat_req__code_generation__error_handling2 + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__ai_platform__enablement + :status: valid + + Software Compute Unit are not responsible for managing their own + lifecycle. The correct way to handle errors is to return an Error + with a suitable Errorcode and to follow the defined error + propagation mechanism. + +.. feat_req:: Software Compute Units should not call their own standard interface methods. + :id: feat_req__code_generation__error_handling3 + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__ai_platform__enablement + :status: valid + + Software Compute Units must not interfere with their external + lifecycle management by calling their own interface methods + (onInit, onUpdate, onReset, onShutdown) with the exception that + onShutdown() may call onReset() if this is required for avoiding + code duplication. + +.. feat_req:: Software Compute Units should implement transient error recovery mechanisms in onReset. + :id: feat_req__code_generation__error_handling4 + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__ai_platform__enablement + :status: valid + + Software Compute Units should signal transient errors as a failure of + onUpdate. The triggering of onReset to recovery from transient + errors should be done by the responsible Software Compute Unit based on logic modeled + for the Archetype. + +.. feat_req:: Software Compute Units should signal reset and recovery failures via the Error return value of onReset. + :id: feat_req__code_generation__error_handling5 + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__ai_platform__enablement + :status: valid + + Software Compute Units that return a failure on onReset are considered to have failed permanently. + + + From 45d88d53a6502454315bbef7180abcb3e87f210d Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres <frank.scholter_peres@mercedes-benz.com> Date: Fri, 31 Oct 2025 15:47:03 +0100 Subject: [PATCH 063/214] fix: changed wording and fixed sth_req --- .../code_generation/requirements/index.rst | 115 +++++++++--------- 1 file changed, 55 insertions(+), 60 deletions(-) diff --git a/docs/features/code_generation/requirements/index.rst b/docs/features/code_generation/requirements/index.rst index 5893e80bf74..53e316698c5 100644 --- a/docs/features/code_generation/requirements/index.rst +++ b/docs/features/code_generation/requirements/index.rst @@ -17,118 +17,113 @@ Requirements ============ -.. feat_req:: Definition language should be a human-readible format +Okay, I will rephrase the Sphinx requirements to fit the provided schema ("The component shall detect if a key-value pair got corrupted and set its status to INVALID during every restart of the SW platform"). + +Here are the modified requirements: + +.. feat_req:: The system shall use a human-readable definition language. :id: feat_req__code_generation__definitionlanguage :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: stkh_req__ai_platform__enablement + :satisfies: stkh_req__dev_experience__idl_support :status: valid - In our case, the system is modeled in YAML-syntax files that use a - specific description language. A major advantage of YAML is that it - is easy to find parser for YAML either in Rust or C++. Advantage of - YAML over JSON is the easy syntax (no begin and end closure). - -.. feat_req:: Software Compute Units should signal initialization failures by returning an Error indicating failure. + The system shall be modeled in YAML-syntax files. This means the system should + use YAML due to the availability of parsers in Rust and C++. The + system should prefer YAML over JSON due to its simpler syntax. + +.. feat_req:: Software Compute Units shall signal initialization failures by returning an Error indicating failure. :id: feat_req__code_generation__initialization :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: stkh_req__ai_platform__enablement + :satisfies: stkh_req__execution_model__processes :status: valid - Software Compute Unit Instances that fail to initialize are considered to have - failed permanently. - -.. feat_req:: Software Compute Unit are responsible for correct deallocation of any dynamically allocated memory in the onShutdown function. + Software Compute Unit Instances shall be considered to have failed + permanently if they fail to initialize. + +.. feat_req:: Software Compute Units shall correctly deallocate any dynamically allocated memory in the onShutdown function. :id: feat_req__code_generation__deinitialization :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: stkh_req__ai_platform__enablement + :satisfies: stkh_req__execution_model__processes :status: valid - Developers can assume that onInit and onShutdown will only ever be called once during the lifecycle of a Software Compute Unit Instance. - -.. feat_req:: Software Compute Units may not spawn a variable number of threads. + Software Compute Unit instances shall have onInit and onShutdown + called only once during their lifecycle. + +.. feat_req:: Software Compute Units shall not spawn a variable number of threads. :id: feat_req__code_generation__nomultithreading :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: stkh_req__ai_platform__enablement + :satisfies: stkh_req__execution_model__processes :status: valid - If Software Compute Units are to spawn any threads at all, which is - not recommended, Software Compute Units must have a predetermined - number of threads that are spawned. Software Compute Units may not dynamically - spawn and join or detach worker threads. - -.. feat_req:: Software Compute Unit may not throw exceptions or "panic". + Software Compute Units shall have a predetermined number of threads + if they spawn any threads at all. Software Compute Units shall not + dynamically spawn and join or detach worker threads. + +.. feat_req:: Software Compute Units shall not throw exceptions or "panic". :id: feat_req__code_generation__error_handling1 :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: stkh_req__ai_platform__enablement + :satisfies: stkh_req__execution_model__processes :status: valid - Any exceptions in e.g. dependency libraries must be handled - completely inside the standard interface functions of the - Software Compute Unit. The only allowed way for a Software Compute Unit to signal an error is - by returning an Error that contains an - ErrorCode other than Success. Any unhandled exceptions - will cause the Software Compute Unit to terminate - execution. - -.. feat_req:: Software Compute Units should not attempt to trigger program termination. + Software Compute Units shall handle any exceptions in dependency + libraries completely inside the standard interface functions. Software Compute Units shall signal an error by returning an Error that contains an ErrorCode other than Success. Software Compute Units shall terminate execution if unhandled exceptions occur. + +.. feat_req:: Software Compute Units shall not attempt to trigger program termination. :id: feat_req__code_generation__error_handling2 :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: stkh_req__ai_platform__enablement + :satisfies: stkh_req__execution_model__processes :status: valid - Software Compute Unit are not responsible for managing their own - lifecycle. The correct way to handle errors is to return an Error - with a suitable Errorcode and to follow the defined error - propagation mechanism. - -.. feat_req:: Software Compute Units should not call their own standard interface methods. + Software Compute Units shall return an Error with a suitable + Errorcode and follow the defined error propagation mechanism to + handle errors. Software Compute Units shall not manage their own + lifecycle. + +.. feat_req:: Software Compute Units shall not call their own standard interface methods. :id: feat_req__code_generation__error_handling3 :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: stkh_req__ai_platform__enablement + :satisfies: stkh_req__ai_platform__runtime_determinism :status: valid - Software Compute Units must not interfere with their external + Software Compute Units shall not interfere with their external lifecycle management by calling their own interface methods - (onInit, onUpdate, onReset, onShutdown) with the exception that - onShutdown() may call onReset() if this is required for avoiding - code duplication. - -.. feat_req:: Software Compute Units should implement transient error recovery mechanisms in onReset. + (onInit, onUpdate, onReset, onShutdown). Software Compute Units may + call onReset() from onShutdown() if required for avoiding code + duplication. + +.. feat_req:: Software Compute Units shall implement transient error recovery mechanisms in onReset. :id: feat_req__code_generation__error_handling4 :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: stkh_req__ai_platform__enablement + :satisfies: tkh_req__ai_platform__runtime_determinism :status: valid - Software Compute Units should signal transient errors as a failure of - onUpdate. The triggering of onReset to recovery from transient - errors should be done by the responsible Software Compute Unit based on logic modeled - for the Archetype. - -.. feat_req:: Software Compute Units should signal reset and recovery failures via the Error return value of onReset. + Software Compute Units shall signal transient errors as a failure of + onUpdate. The responsible Software Compute Unit shall trigger + onReset to recover from transient errors based on logic modeled for + the Archetype. + +.. feat_req:: Software Compute Units shall signal reset and recovery failures via the Error return value of onReset. :id: feat_req__code_generation__error_handling5 :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: stkh_req__ai_platform__enablement + :satisfies: stkh_req__ai_platform__runtime_determinism :status: valid - Software Compute Units that return a failure on onReset are considered to have failed permanently. - - - + Software Compute Units shall be considered to have failed permanently if they return a failure on onReset. From 29343a9c82aa688ff387edececdc615b5c429a85 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres <frank.scholter_peres@mercedes-benz.com> Date: Fri, 31 Oct 2025 15:52:58 +0100 Subject: [PATCH 064/214] removed intro --- docs/features/code_generation/requirements/index.rst | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/features/code_generation/requirements/index.rst b/docs/features/code_generation/requirements/index.rst index 53e316698c5..6f65994ea86 100644 --- a/docs/features/code_generation/requirements/index.rst +++ b/docs/features/code_generation/requirements/index.rst @@ -17,10 +17,6 @@ Requirements ============ -Okay, I will rephrase the Sphinx requirements to fit the provided schema ("The component shall detect if a key-value pair got corrupted and set its status to INVALID during every restart of the SW platform"). - -Here are the modified requirements: - .. feat_req:: The system shall use a human-readable definition language. :id: feat_req__code_generation__definitionlanguage :reqtype: Functional From 00b9bcf14975464144142cb095d6ae6363b44146 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres <frank.scholter_peres@mercedes-benz.com> Date: Fri, 31 Oct 2025 16:08:39 +0100 Subject: [PATCH 065/214] fixed: typo --- docs/features/code_generation/requirements/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/code_generation/requirements/index.rst b/docs/features/code_generation/requirements/index.rst index 6f65994ea86..e987794ef5e 100644 --- a/docs/features/code_generation/requirements/index.rst +++ b/docs/features/code_generation/requirements/index.rst @@ -106,7 +106,7 @@ Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: tkh_req__ai_platform__runtime_determinism + :satisfies: stkh_req__ai_platform__runtime_determinism :status: valid Software Compute Units shall signal transient errors as a failure of From e72bae1ee1eb5d4eaca25ebfd0fd2404e62b8b68 Mon Sep 17 00:00:00 2001 From: Tim Kliefoth <tim.kliefoth@mercedes-benz.com> Date: Tue, 2 Dec 2025 09:00:56 +0100 Subject: [PATCH 066/214] fix: requirements title errors --- .../code_generation/requirements/index.rst | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/features/code_generation/requirements/index.rst b/docs/features/code_generation/requirements/index.rst index e987794ef5e..64455cc0650 100644 --- a/docs/features/code_generation/requirements/index.rst +++ b/docs/features/code_generation/requirements/index.rst @@ -17,7 +17,7 @@ Requirements ============ -.. feat_req:: The system shall use a human-readable definition language. +.. feat_req:: The system uses a human-readable definition language. :id: feat_req__code_generation__definitionlanguage :reqtype: Functional :security: NO @@ -29,7 +29,7 @@ Requirements use YAML due to the availability of parsers in Rust and C++. The system should prefer YAML over JSON due to its simpler syntax. -.. feat_req:: Software Compute Units shall signal initialization failures by returning an Error indicating failure. +.. feat_req:: Software Compute Units signal initialization failures by returning an Error indicating failure. :id: feat_req__code_generation__initialization :reqtype: Functional :security: NO @@ -40,7 +40,7 @@ Requirements Software Compute Unit Instances shall be considered to have failed permanently if they fail to initialize. -.. feat_req:: Software Compute Units shall correctly deallocate any dynamically allocated memory in the onShutdown function. +.. feat_req:: Software Compute Units correctly deallocate any dynamically allocated memory in the onShutdown function. :id: feat_req__code_generation__deinitialization :reqtype: Functional :security: NO @@ -51,7 +51,7 @@ Requirements Software Compute Unit instances shall have onInit and onShutdown called only once during their lifecycle. -.. feat_req:: Software Compute Units shall not spawn a variable number of threads. +.. feat_req:: Software Compute Units do not spawn a variable number of threads. :id: feat_req__code_generation__nomultithreading :reqtype: Functional :security: NO @@ -63,7 +63,7 @@ Requirements if they spawn any threads at all. Software Compute Units shall not dynamically spawn and join or detach worker threads. -.. feat_req:: Software Compute Units shall not throw exceptions or "panic". +.. feat_req:: Software Compute Units do not throw exceptions or "panic". :id: feat_req__code_generation__error_handling1 :reqtype: Functional :security: NO @@ -74,7 +74,7 @@ Requirements Software Compute Units shall handle any exceptions in dependency libraries completely inside the standard interface functions. Software Compute Units shall signal an error by returning an Error that contains an ErrorCode other than Success. Software Compute Units shall terminate execution if unhandled exceptions occur. -.. feat_req:: Software Compute Units shall not attempt to trigger program termination. +.. feat_req:: Software Compute Units do not attempt to trigger program termination. :id: feat_req__code_generation__error_handling2 :reqtype: Functional :security: NO @@ -87,7 +87,7 @@ Requirements handle errors. Software Compute Units shall not manage their own lifecycle. -.. feat_req:: Software Compute Units shall not call their own standard interface methods. +.. feat_req:: Software Compute Units do not call their own standard interface methods. :id: feat_req__code_generation__error_handling3 :reqtype: Functional :security: NO @@ -101,7 +101,7 @@ Requirements call onReset() from onShutdown() if required for avoiding code duplication. -.. feat_req:: Software Compute Units shall implement transient error recovery mechanisms in onReset. +.. feat_req:: Software Compute Units implement transient error recovery mechanisms in onReset. :id: feat_req__code_generation__error_handling4 :reqtype: Functional :security: NO @@ -114,7 +114,7 @@ Requirements onReset to recover from transient errors based on logic modeled for the Archetype. -.. feat_req:: Software Compute Units shall signal reset and recovery failures via the Error return value of onReset. +.. feat_req:: Software Compute Units signal reset and recovery failures via the Error return value of onReset. :id: feat_req__code_generation__error_handling5 :reqtype: Functional :security: NO From cc659e0a9a3b3792f736ae0d4a72d7cc92db1802 Mon Sep 17 00:00:00 2001 From: Tim Kliefoth <tim.kliefoth@mercedes-benz.com> Date: Wed, 17 Dec 2025 08:32:29 +0100 Subject: [PATCH 067/214] fix: missing security field in FR --- docs/features/code_generation/index.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/features/code_generation/index.rst b/docs/features/code_generation/index.rst index c6fd560cf22..35f519fcbc3 100644 --- a/docs/features/code_generation/index.rst +++ b/docs/features/code_generation/index.rst @@ -21,6 +21,13 @@ Code Generation :id: doc__code_generation :status: draft :safety: ASIL_B + :security: NO + :tags: feature_request + :realizes: wp__code_generation + +.. workproduct:: Code Generation – Feature Description + :id: wp__code_generation + :status: draft :tags: feature_request .. toctree:: From 1aefc9fdd4608515327b7f42898da70f36c5be0c Mon Sep 17 00:00:00 2001 From: Tim Kliefoth <tim.kliefoth@mercedes-benz.com> Date: Wed, 17 Dec 2025 08:38:35 +0100 Subject: [PATCH 068/214] fix: wp link in FR --- docs/features/code_generation/index.rst | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/docs/features/code_generation/index.rst b/docs/features/code_generation/index.rst index 35f519fcbc3..ba2da205bb7 100644 --- a/docs/features/code_generation/index.rst +++ b/docs/features/code_generation/index.rst @@ -23,12 +23,7 @@ Code Generation :safety: ASIL_B :security: NO :tags: feature_request - :realizes: wp__code_generation - -.. workproduct:: Code Generation – Feature Description - :id: wp__code_generation - :status: draft - :tags: feature_request + :realizes: wp__feat_request .. toctree:: :maxdepth: 1 From 6f3a1a6bb4f60c535b681590307a38f535ca7d39 Mon Sep 17 00:00:00 2001 From: Tim Kliefoth <tim.kliefoth@mercedes-benz.com> Date: Wed, 17 Dec 2025 10:30:15 +0100 Subject: [PATCH 069/214] docs: updated FR safety impact --- docs/features/code_generation/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/features/code_generation/index.rst b/docs/features/code_generation/index.rst index ba2da205bb7..39af4084a59 100644 --- a/docs/features/code_generation/index.rst +++ b/docs/features/code_generation/index.rst @@ -280,6 +280,7 @@ Safety Impact ============= Strict repeatible design pattern, extensive code re-usablility, is easy to certify. +Requires tool qualification for the code generator for ASIL relevant components. License Impact ============== From 3ef4995c55ccbc63701687691bc36fa256983636 Mon Sep 17 00:00:00 2001 From: Tim Kliefoth <tim.kliefoth@mercedes-benz.com> Date: Wed, 26 Nov 2025 15:45:25 +0100 Subject: [PATCH 070/214] docs: updated diagnostic FR updated requirements updated FR for v1.0 scope --- docs/features/diagnostics/index.rst | 26 ++++++++- .../diagnostics/requirements/index.rst | 56 ++++++++++++++++--- 2 files changed, 72 insertions(+), 10 deletions(-) diff --git a/docs/features/diagnostics/index.rst b/docs/features/diagnostics/index.rst index fc1bdd387b0..a523eb0ed62 100644 --- a/docs/features/diagnostics/index.rst +++ b/docs/features/diagnostics/index.rst @@ -97,10 +97,10 @@ The next diagram shows the concept in a distributed view to highlight components .. image:: _assets/score-diagnostics-distributed.drawio.svg :alt: Diagnostic stack component architecture -In scope components -------------------- +In scope components (full stack) +-------------------------------- -The following components are considered in scope of this feature request. +The following components are considered in scope of this feature request for the long term implementation of the diagnostic system (beyond v1.0). Fault Library @@ -183,6 +183,26 @@ UDS2SOVD Proxy - UDS transport layer (e.g. DoIP or other vendor specific transports) shared with Classic Diagnostic Adapter. - Central component and unique per ECU (one per ECU or per System is possible). +In scope components (v1.0) +-------------------------- + +The following use-cases are considered in scope of this feature request for S-CORE v1.0. + +- Read DTCs through the SOVD API. +- Report new faults from platform and app components via the Fault API and handle them in the DFM. +- Clear DTCs over SOVD. +- Reach an UDS ECU through the Classic Diagnostic Adapter, at least for read/clear DTC paths. +- A sample Diagnostic service can be triggered via SOVD (Diagnostic service = a function which can be triggered via SOVD). +- OPTIONAL: Retrieve ECU- and app-level metadata (HW revision, SW version) via SOVD. +- OPTIONAL: Read/write component configuration through SOVD, backed by the S-CORE configuration service. + +The following components are considered in scope of this feature request for S-CORE v1.0. + +- all componenets are in scope for v1.0 but with limited functionality as described above. +- the requirements can be found in :doc:`requirements/index`. + +Further information can be found here: <https://github.com/eclipse-opensovd/opensovd/blob/main/docs/design/mvp.md> + Out of scope components ----------------------- diff --git a/docs/features/diagnostics/requirements/index.rst b/docs/features/diagnostics/requirements/index.rst index 6c1d5055be0..78ee1b0a978 100644 --- a/docs/features/diagnostics/requirements/index.rst +++ b/docs/features/diagnostics/requirements/index.rst @@ -27,6 +27,7 @@ Diagnostic and Fault Management :safety: QM :satisfies: stkh_req__diagnostics__via_sovd :status: valid + :valid_from: v1.0.0 The SOVD implementation shall conform to the SOVD standard as defined in ISO/DIS 17978 (or the latest available draft or final publication). @@ -37,8 +38,9 @@ Diagnostic and Fault Management :safety: QM :satisfies: stkh_req__diagnostics__via_sovd, stkh_req__diagnostics__secure_access :status: valid + :valid_from: v1.0.0 - The diagnostic system shall include a central SOVD server that exposes diagnostic functionality via a standard REST interface, dispatches incoming requests to backend services, and enforces authentication and access control. + The diagnostic system shall include a central SOVD server that exposes diagnostic functionality via a standard REST interface. .. feat_req:: SOVD Configuration :id: feat_req__diagnostics__sovd_config @@ -47,6 +49,7 @@ Diagnostic and Fault Management :safety: QM :satisfies: stkh_req__diagnostics__via_sovd :status: valid + :valid_from: v1.5.0 The system shall provide configuration management for SOVD components, including protocol parameters and security settings. @@ -57,6 +60,7 @@ Diagnostic and Fault Management :safety: QM :satisfies: stkh_req__diagnostics__via_sovd :status: valid + :valid_from: v1.5.0 The SOVD server shall integrate with the S-CORE Configuration Manager to support runtime access and modification of configuration data. @@ -67,8 +71,9 @@ Diagnostic and Fault Management :safety: QM :satisfies: stkh_req__diagnostics__secure_access :status: valid + :valid_from: v1.5.0 - The SOVD server shall integrate with the S-CORE Authentication Manager to enforce access control and validate client credentials. + The SOVD server shall enforce access control and validate client credentials. .. feat_req:: SOVD Gateway :id: feat_req__diagnostics__sovd_gateway @@ -77,6 +82,7 @@ Diagnostic and Fault Management :safety: QM :satisfies: stkh_req__diagnostics__distributed_support :status: valid + :valid_from: v1.0.0 The system shall include a SOVD gateway to route diagnostic requests between different network domains and protocols. @@ -87,6 +93,7 @@ Diagnostic and Fault Management :safety: QM :satisfies: stkh_req__diagnostics__via_sovd, stkh_req__diagnostics__secure_access :status: valid + :valid_from: v1.0.0 The system shall provide a SOVD client to allow external applications to communicate with the SOVD server. @@ -97,6 +104,7 @@ Diagnostic and Fault Management :safety: QM :satisfies: stkh_req__diagnostics__via_sovd :status: valid + :valid_from: v1.0.0 The SOVD client shall be designed as a reusable core component that can be deployed in off-board, on-board, or cloud environments. @@ -107,8 +115,9 @@ Diagnostic and Fault Management :safety: QM :satisfies: stkh_req__diagnostics__custom_services :status: valid + :valid_from: v1.0.0 - The diagnostic system shall include a base service application (AKA routine) that is triggered from the SOVD Server and used to derive custom service applications. + The diagnostic system shall include a base service application (AKA routine) that is triggered by the SOVD Server and used to derive custom service applications. .. feat_req:: OEM Diagnostic Plug In :id: feat_req__diagnostics__oem_plugin @@ -117,6 +126,7 @@ Diagnostic and Fault Management :safety: QM :satisfies: stkh_req__diagnostics__custom_services :status: valid + :valid_from: v1.5.0 The diagnostic system shall provide a plug-in mechanism to include OEM-specific features. @@ -127,8 +137,20 @@ Diagnostic and Fault Management :safety: QM :satisfies: stkh_req__diagnostics__fault_reporting :status: valid + :valid_from: v1.0.0 - The system shall include a fault reporting library that provides an IPC-based interface for applications and platform components to report diagnostic faults, including metadata. + The system shall include a fault reporting library that provides an interface for applications and platform components to report diagnostic faults including metadata. + +.. feat_req:: Fault Library Catalog + :id: feat_req__diagnostics__fault_lib_catalog + :reqtype: Functional + :security: YES + :safety: QM + :satisfies: stkh_req__diagnostics__fault_reporting + :status: valid + :valid_from: v1.0.0 + + The fault library shall provide the ability to define faults via a component fault catalog for the scope of the respective parent component. .. feat_req:: Fault Library Debouncing :id: feat_req__diagnostics__fault_lib_debounce @@ -137,6 +159,7 @@ Diagnostic and Fault Management :safety: QM :satisfies: stkh_req__diagnostics__fault_reporting :status: valid + :valid_from: v1.5.0 The fault library shall support configurable error debouncing. @@ -147,8 +170,20 @@ Diagnostic and Fault Management :safety: QM :satisfies: stkh_req__diagnostics__fault_reporting, stkh_req__diagnostics__dtc_read_sovd :status: valid + :valid_from: v1.0.0 + + The system shall include a central diagnostic fault manager that aggregates data from fault libraries, provides DTC status to the SOVD server, and interfaces with a persistent diagnostic database. + +.. feat_req:: Fault Catalog Aggregation + :id: feat_req__diagnostics__fault_catalog_agg + :reqtype: Functional + :security: YES + :safety: QM + :satisfies: stkh_req__diagnostics__fault_reporting + :status: valid + :valid_from: v1.0.0 - The system shall include a central diagnostic fault manager that aggregates data from fault libraries, provides fault status to the SOVD server, and interfaces with a persistent diagnostic database. + The Diagnostic Fault Manager shall be configureable via the aggregated fault catalog derived from all fault libraries in the system. .. feat_req:: Diagnostic Database :id: feat_req__diagnostics__db @@ -157,8 +192,9 @@ Diagnostic and Fault Management :safety: QM :satisfies: stkh_req__diagnostics__fault_reporting, stkh_req__diagnostics__dtc_read_sovd :status: valid + :valid_from: v1.0.0 - The system shall include a diagnostic database using the S-CORE::Persistency module to store DTCs, occurrence counts, and associated metadata for fault events. + The system shall include a diagnostic database to store DTCs, occurrence counts, and associated metadata for fault events. .. feat_req:: Diagnostic Database Persistence :id: feat_req__diagnostics__db_persistence @@ -167,8 +203,9 @@ Diagnostic and Fault Management :safety: QM :satisfies: stkh_req__diagnostics__fault_reporting :status: valid + :valid_from: v1.0.0 - The diagnostic database shall store all diagnostic data persistently using the S-CORE::Persistency infrastructure. + The diagnostic database shall store all diagnostic data persistently. .. feat_req:: Classic Diagnostic Adapter :id: feat_req__diagnostics__classic_adapter @@ -177,6 +214,7 @@ Diagnostic and Fault Management :safety: QM :satisfies: stkh_req__diagnostics__uds_ecus :status: valid + :valid_from: v1.0.0 The system shall include a classic diagnostic adapter to translate SOVD requests into UDS commands. @@ -187,6 +225,7 @@ Diagnostic and Fault Management :safety: QM :satisfies: stkh_req__diagnostics__uds_ecus :status: valid + :valid_from: v1.0.0 The classic diagnostic adapter shall support configuration via ODX files that describe the UDS command mappings and behavior per ECU. @@ -197,6 +236,7 @@ Diagnostic and Fault Management :safety: QM :satisfies: stkh_req__diagnostics__uds_tester_compat :status: valid + :valid_from: v1.5.0 The system shall include a proxy to translate UDS diagnostic requests to SOVD protocol requests. @@ -207,6 +247,7 @@ Diagnostic and Fault Management :safety: QM :satisfies: stkh_req__diagnostics__uds_tester_compat :status: valid + :valid_from: v1.5.0 The UDS2SOVD proxy shall support configuration via standardized ODX files to define which SOVD services are exposed via the UDS interface. @@ -217,5 +258,6 @@ Diagnostic and Fault Management :safety: QM :satisfies: stkh_req__diagnostics__via_sovd, stkh_req__diagnostics__dtc_read_sovd :status: valid + :valid_from: v1.0.0 All internal communication between diagnostic components that do not use UDS or SOVD protocols shall be implemented using the S-CORE::COM middleware. From 2edb82d0657a2c80c9d499c89074dbe9c17779bc Mon Sep 17 00:00:00 2001 From: Tim Kliefoth <tim.kliefoth@mercedes-benz.com> Date: Wed, 26 Nov 2025 16:08:49 +0100 Subject: [PATCH 071/214] docs: diagnostic FR, minor formatting --- docs/features/diagnostics/index.rst | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/features/diagnostics/index.rst b/docs/features/diagnostics/index.rst index a523eb0ed62..5f1c46b2b27 100644 --- a/docs/features/diagnostics/index.rst +++ b/docs/features/diagnostics/index.rst @@ -198,11 +198,9 @@ The following use-cases are considered in scope of this feature request for S-CO The following components are considered in scope of this feature request for S-CORE v1.0. -- all componenets are in scope for v1.0 but with limited functionality as described above. -- the requirements can be found in :doc:`requirements/index`. - -Further information can be found here: <https://github.com/eclipse-opensovd/opensovd/blob/main/docs/design/mvp.md> +- All componenets are in scope for v1.0 but with limited functionality to support the use-cases described above. +Further information can be found here: https://github.com/eclipse-opensovd/opensovd/blob/main/docs/design/mvp.md Out of scope components ----------------------- From 8839e71abe3b0139b81c8acede13516c112833a9 Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Fri, 19 Dec 2025 08:54:00 +0100 Subject: [PATCH 072/214] enlarge tailoring safety analysis --- docs/platform_management_plan/safety_management.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/platform_management_plan/safety_management.rst b/docs/platform_management_plan/safety_management.rst index c2f22063c7b..bdf7d955203 100644 --- a/docs/platform_management_plan/safety_management.rst +++ b/docs/platform_management_plan/safety_management.rst @@ -125,7 +125,8 @@ The following ISO 26262 defined safety work products are not relevant for the S * Because in the S-CORE SW platform integration of safety-related systems not developed according to ISO 26262 is not planned: :need:`std_wp__iso26262__support_1651` -* Because in the S-CORE SW platform no ASIL decomposition is planned: :need:`std_wp__iso26262__analysis_551`, :need:`std_wp__iso26262__analysis_552` +* Because in the S-CORE SW platform no ASIL decomposition is planned: :need:`std_wp__iso26262__analysis_551`, :need:`std_wp__iso26262__analysis_552`. + According to that also :need:`std_req__iso26262__analysis_641`, :need:`std_req__iso26262__analysis_642`, :need:`std_req__iso26262__analysis_643`, :need:`std_req__iso26262__analysis_644` are tailored out for safety analyses. * Because HSI is coming from HW (and systems) engineering which are not part of S-CORE and the standard only asks for refinement during SW development. As the input is missing, there is nothing to refine. From 98947e38b649eb87ffa6c169d2db35f82fd8f7d3 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres <frank.scholter_peres@mercedes-benz.com> Date: Fri, 19 Dec 2025 09:45:18 +0000 Subject: [PATCH 073/214] added tls --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 35d78ae2ea9..4bd7dc39d4f 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -43,7 +43,7 @@ verification/ @eclipse-score/automotive-score-committers # /docs/safety/ @eclipse-score/safety-managers /docs/safety/ @aschemmel-tech @PhilipPartsch @masc2023 @PandaeDo # /docs/score_releases/ @eclipse-score/automotive-score-project-leads -/docs/score_releases/ @thilo-schmitt @HartmannNico @skappel29 @grandyholger +/docs/score_releases/ @thilo-schmitt @HartmannNico @skappel29 @grandyholger @antonkri @FScholPer @qor-lb @johannes-esr @AlexanderLanin /docs/score_tools/ @eclipse-score/automotive-score-committers # /docs/security/ @eclipse-score/security-managers /docs/security/ @masc2023 @PandaeDo From f8ac0d9bb6e5ace7563a3d6747a874963f91a996 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres <frank.scholter_peres@mercedes-benz.com> Date: Fri, 19 Dec 2025 09:53:09 +0000 Subject: [PATCH 074/214] removed non tl pl --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 4bd7dc39d4f..29d0470de72 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -43,7 +43,7 @@ verification/ @eclipse-score/automotive-score-committers # /docs/safety/ @eclipse-score/safety-managers /docs/safety/ @aschemmel-tech @PhilipPartsch @masc2023 @PandaeDo # /docs/score_releases/ @eclipse-score/automotive-score-project-leads -/docs/score_releases/ @thilo-schmitt @HartmannNico @skappel29 @grandyholger @antonkri @FScholPer @qor-lb @johannes-esr @AlexanderLanin +/docs/score_releases/ @thilo-schmitt @HartmannNico @skappel29 @grandyholger @antonkri @FScholPer @qor-lb @johannes-esr /docs/score_tools/ @eclipse-score/automotive-score-committers # /docs/security/ @eclipse-score/security-managers /docs/security/ @masc2023 @PandaeDo From b670ac2dc518294aeb5c6f1386b04e013719eef9 Mon Sep 17 00:00:00 2001 From: Philipp Ahmann <philipp.ahmann@de.bosch.com> Date: Fri, 19 Dec 2025 10:30:20 +0000 Subject: [PATCH 075/214] add manual test execution guidelines to software verification plan Resolves: #1091 Signed-off-by: Philipp Ahmann <philipp.ahmann@de.bosch.com> --- .../software_verification.rst | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/platform_management_plan/software_verification.rst b/docs/platform_management_plan/software_verification.rst index ca7fbf69a5b..76f54fd8350 100644 --- a/docs/platform_management_plan/software_verification.rst +++ b/docs/platform_management_plan/software_verification.rst @@ -361,6 +361,25 @@ Test execution and result analysis The execution of the tests is based on a full automation defined by build pipelines. The analysis of the test results needs to be performed by the contributor. +Manual test execution +^^^^^^^^^^^^^^^^^^^^^ + +The automation rate for test case execution is expected to be above 99%. + +Automated tests can be executed locally by the contributor before pushing code to the repository. +To support local test execution respective `bazel test ...` commands are provided as part of the module and feature documentation. + +When a manual test is considered to verify a requirement or architectural element, the respective links need to be established as for any other automated test case. +The script for manual testing uses the same templates as any other automated test including the Record Properties. +Therefore, these test cases require a script to be provided which describes how to execute the test case manually step by step. +The script and its execution will be part of the test reporting and traceability and need to be reviewed in the PR as part of the verification activities. +Within the review an approver confirms that automation is not feasible for the specific test case. + +In contrast to automated result comparison of an automated test case, the feedback from the test executor is logged for manual tests. +The script will wait for the user input to proceed to the next step and describe the expected result after each step. +The user input can be judged as confirmation that the expected result is achieved. +The final result will be `PASSED` or `FAILED`, based on the test executors confirmation. + Test selection and regression testing ------------------------------------- From bb75bb53355e473214963bdab62d6c5edcaba109 Mon Sep 17 00:00:00 2001 From: Philipp Ahmann <2428012+pahmann@users.noreply.github.com> Date: Fri, 19 Dec 2025 15:40:29 +0100 Subject: [PATCH 076/214] Refine test level in PMP (#2350) Signed-off-by: Philipp Ahmann <philipp.ahmann@de.bosch.com> --- .../software_verification.rst | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/docs/platform_management_plan/software_verification.rst b/docs/platform_management_plan/software_verification.rst index ca7fbf69a5b..27cc55ac021 100644 --- a/docs/platform_management_plan/software_verification.rst +++ b/docs/platform_management_plan/software_verification.rst @@ -108,25 +108,26 @@ Levels of integration and verification There are the following different levels of integration and verification defined: -1. Software unit (incl. detailed design) and component verification to verify the integration of +1. **Software unit verification** (incl. detailed design) and component verification to verify the integration of units to a component and also the integration of smaller component(s) to a complex component based on #. detailed design and #. component architecture and #. component requirements -2. Software feature verification to verify the integration of components to a feature based on +2. **Software integration verification** on feature level to verify the integration of components to a feature based on #. feature architecture and #. feature requirements -3. Platform testing (on reference hardware) +3. **Software platform verification** as Platform Integration Testing of the integrated software element (on reference hardware) based on #. Stakeholder requirements - **Note:** These three levels translate to the levels of ISO 26262 part 6 clauses 9 to 11. The platform - testing will be executed by the integrator. S-CORE project only executes tests on reference hardware. + **Note:** These three levels translate to the levels of ISO 26262 part 6 clauses 9 to 11, where compliant testing with full coverage is tailored out for the embedded software. + The specific tailoring is described in the :need:`doc__score_platform_safety_plan`. + The full Platform Integration Testing will be executed by the integrator. S-CORE project only executes tests on reference hardware. These tests serve as an optional base for the integrator and will also be part of the :need:`wp__verification_platform_ver_report`, but more on an informative character. The full scope of clause 11 is tailored out accordingly for S-CORE. Practically, this means S-CORE will implement @@ -156,35 +157,35 @@ method is to be used as meta data (*TestType* and *DerivationTechnique*). - Applicable for QM / ASIL B * - Static Code Analysis - static-code-analysis - - 1, -, - + - 1 Unit/Component, -, - - QM & ASIL B * - Structural Statement Coverage (Code coverage) - structural-statement-coverage - - 1, -, - + - 1 Unit/Component, -, - - QM & ASIL B * - Structural Branch Coverage (Code coverage) - structural-branch-coverage - - 1, -, - + - 1 Unit/Component, -, - - QM & ASIL B * - Walkthrough - walkthrough - - 1, 2, 3 + - All level 1, 2, 3 - QM * - Inspection - inspection - - 1, 2, 3 + - 1 Unit/Component, 2 Feature Integration, - - ASIL B * - Interface Test - interface-test - - 1, 2, - + - 1 Unit/Component, 2 Feature Integration, - - QM & ASIL B * - Requirements-based Test - requirements-based - - 1, 2, - + - All level 1, 2, 3 - QM & ASIL B * - Resource Usage Evaluation (only on reference environment) - resource-usage - - -, 2, - + - -, 2 Feature Integration, - - QM & ASIL B @@ -233,19 +234,19 @@ Test Derivation Methods - Applicable for QM / ASIL B * - Analysis of Requirements - requirements-analysis - - 1, 2, 3 + - All level 1, 2, 3 - QM, ASIL B * - Analysis of Boundary Values - boundary-values - - 1, 2, - + - 1 Unit/Component, 2 Feature Integration, - - ASIL B * - Analysis of Equivalence Classes - equivalence-classes - - 1, 2, - + - All level 1, 2, 3 - ASIL B * - Fuzzy Testing (focus security) - fuzz-testing - - 1, 2, - + - 1 Unit/Component, 2 Feature Integration, - - QM, ASIL B The ``fuzz-testing`` should especially be taken into account to increase security of the software. From c78cf903c4787fae705a38283a3640b6adc31ac6 Mon Sep 17 00:00:00 2001 From: Anton Krivoborodov <Anton.Krivoborodov@bmw.de> Date: Fri, 5 Dec 2025 16:31:45 +0100 Subject: [PATCH 077/214] Add template for v0.5 beta release --- docs/score_releases/score_releases/index.rst | 1 + .../score_releases/score_v0_5_alpha.rst | 2 +- .../score_releases/score_v0_5_beta.rst | 139 ++++++++++++++++++ 3 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 docs/score_releases/score_releases/score_v0_5_beta.rst diff --git a/docs/score_releases/score_releases/index.rst b/docs/score_releases/score_releases/index.rst index af5ec410fd5..69e7290bb87 100644 --- a/docs/score_releases/score_releases/index.rst +++ b/docs/score_releases/score_releases/index.rst @@ -6,3 +6,4 @@ S-CORE Releases :maxdepth: 1 score_v0_5_alpha.rst + score_v0_5_beta.rst diff --git a/docs/score_releases/score_releases/score_v0_5_alpha.rst b/docs/score_releases/score_releases/score_v0_5_alpha.rst index 88b0f2c4aa8..e3a5d950641 100644 --- a/docs/score_releases/score_releases/score_v0_5_alpha.rst +++ b/docs/score_releases/score_releases/score_v0_5_alpha.rst @@ -17,7 +17,7 @@ S-Core v0.5-alpha release notes .. document:: S-Core v0.5-alpha release note :id: doc__score_v05_alpha_release_note - :status: draft + :status: valid :safety: ASIL_B :security: YES :realizes: wp__platform_sw_release_note diff --git a/docs/score_releases/score_releases/score_v0_5_beta.rst b/docs/score_releases/score_releases/score_v0_5_beta.rst new file mode 100644 index 00000000000..2dae400e50f --- /dev/null +++ b/docs/score_releases/score_releases/score_v0_5_beta.rst @@ -0,0 +1,139 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +S-Core v0.5-beta release notes +=============================== + +.. document:: S-Core v0.5-beta release note + :id: doc__score_v05_beta_release_note + :status: draft + :safety: ASIL_B + :security: YES + :realizes: wp__platform_sw_release_note + +| **Platform Name**: S-CORE +| **Release Tag**: v0.5.0-beta +| **Origin Release Tag**: none - first published release +| **Release Date**: 2025-12-18 + +Overview +^^^^^^^^^ +TBD + +| + +Highlights +----------- +TBD + +Timeline +--------- +TBD + +| + +For a detailed and always up-to-date planning view, see the `GitHub project <https://github.com/orgs/eclipse-score/projects/17/views/26>`_. + +Eclipse S-CORE book +------------------- +TBD + +Improvements +^^^^^^^^^^^^^ +TBD + +Bug Fixes +^^^^^^^^^^^^ +TBD + +Integrated Software Modules +----------------------------- + +Communication +~~~~~~~~~~~~~ +TBD + +Fixed Execution Order Framework(FEO) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +TBD + +Baselibs +~~~~~~~~~~~~~ +TBD + + +Persistency +~~~~~~~~~~~~~ +TBD + + +Orchestrator (Kyron and orchestration framework) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +TBD + + +Reference integration +~~~~~~~~~~~~~~~~~~~~~~ +TBD + +Reference QNX image ++++++++++++++++++++++ +TBD + +Reference Red Hat AutoSD Linux image (Experimental) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +TBD + +Reference Elektrobit corbos Linux for Safety Applications Linux image (Experimental) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +TBD + +Associated Infrastructure Modules +----------------------------------- + +process_description +~~~~~~~~~~~~~~~~~~~~~~~ +TBD + +docs-as-code +~~~~~~~~~~~~~~ +TBD + +tooling +~~~~~~~~~~~~~~ +TBD + +ITF (Integration Testing Framework) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +TBD + +Test Scenarios +~~~~~~~~~~~~~~~ +TBD + +Performed Verification +---------------------- +TBD + +Known Issues +---------------------- +- see release notes of every module seperately + +Upgrade Instructions +---------------------- +- TBD + +Contact Information +---------------------- +For any questions or support, please contact the *Project lead* or raise an issue/discussion. From 4425da0df72c911124ccf4149a85bbbd523acee2 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres <frank.scholter_peres@mercedes-benz.com> Date: Fri, 12 Dec 2025 09:36:36 +0000 Subject: [PATCH 078/214] fix: handbook --- docs/handbook/own_application/index.rst | 35 ++++++++++++++++--------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/docs/handbook/own_application/index.rst b/docs/handbook/own_application/index.rst index edfea1b76e0..3d7c0ba787c 100644 --- a/docs/handbook/own_application/index.rst +++ b/docs/handbook/own_application/index.rst @@ -33,7 +33,7 @@ To integrate the communication module into your project, follow these steps: 1. Setup ----------- -Start by creating a new project in your preferred IDE (e.g., Visual Studio Code). A ready-to-use devcontainer is available under: +Start by creating a new project in your preferred IDE (e.g., Visual Studio Code). A ready-to-use devcontainer is available under: - https://github.com/eclipse-score/devcontainer @@ -54,7 +54,7 @@ Reference documentation for the communication module: module(name = "use_com_test") - bazel_dep(name = "score_toolchains_gcc", version = "0.4", dev_dependency=True) + bazel_dep(name = "score_toolchains_gcc", version = "0.5", dev_dependency=True) gcc = use_extension("@score_toolchains_gcc//extensions:gcc.bzl", "gcc", dev_dependency=True) gcc.toolchain( @@ -84,8 +84,16 @@ Reference documentation for the communication module: ) bazel_dep(name = "boost.program_options", version = "1.87.0") - bazel_dep(name = "score-baselibs", version = "0.1.3") - bazel_dep(name = "communication", version = "0.1.1") + bazel_dep(name = "score_baselibs", version = "0.1.3") + bazel_dep(name = "score_communication", version = "0.1.1") + + # TRLC dependency for requirements traceability + bazel_dep(name = "trlc", version = "0.0.0") + git_override( + module_name = "trlc", + commit = "ede35c4411d41abe42b8f19e78f8989ff79ad3d8", + remote = "https://github.com/bmw-software-engineering/trlc.git", + ) Be aware that the version numbers change over time. Always check the latest versions in the respective bazel registry @@ -108,7 +116,8 @@ Be aware that the version numbers change over time. Always check the latest vers common --@score-baselibs//score/json:base_library=nlohmann common --@communication//score/mw/com/flags:tracing_library=stub - common --registry=https://raw.githubusercontent.com/eclipse-score/bazel_registry/refs/heads/main/ + common --registry=https://raw.githubusercontent.com/eclipse-score/bazel_registry/v0.5.0-alpha/ + common --registry=https://bcr.bazel.build ^^^^^^^^^^^^^ @@ -116,14 +125,14 @@ Be aware that the version numbers change over time. Always check the latest vers ^^^^^^^^^^^^^ If you start with an empty project, add an empty file named ``BUILD`` into your project root. -Now you can now run build the project with the command bazel ``bazel build //...`` +Now you can now run build the project with the command bazel ``bazel build //...`` (At this point nothing happens yet, because no targets are defined). You can now either continue with this guide to create a minimal consumer-producer example or start coding your own application ------------ -2. Use it :) +1. Use it :) ------------ Once your project is set up, you can start sending and receiving messages. @@ -133,9 +142,9 @@ Once your project is set up, you can start sending and receiving messages. ^^^^^^^^^^^^^^^^^^^^ Create a folder named ``src`` in your root project directory. -Inside ``src``, create the following folders: +Inside ``src``, create the following folders: -- ``consumer`` +- ``consumer`` - ``producer`` additional folders if needed. @@ -278,11 +287,11 @@ After that, create the file ``producer.cpp``. The constructor initializes the communication skeleton ``create_result``. -``RunProducer``: +``RunProducer``: - checks if the initialization of ``create_result`` was successful -- offers service -- enters a loop and sends our messages +- offers service +- enters a loop and sends our messages - stops offering the service at the end @@ -298,4 +307,4 @@ Navigate to the ``consumer`` directory and create a new file called ``consumer.h ^^^^^^^^^^^^^^ For a complete example implementation, see the example folder -https://github.com/eclipse-score/communication/tree/main/score/mw/com/example/ipc_bridge \ No newline at end of file +https://github.com/eclipse-score/communication/tree/main/score/mw/com/example/ipc_bridge From 2a64f4d86e792e2757b40c238f8881289720a3a5 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres <frank.scholter_peres@mercedes-benz.com> Date: Fri, 12 Dec 2025 13:07:58 +0000 Subject: [PATCH 079/214] added code_of_conduct and fixed contribution guidelines --- CODE_OF_CONDUCT.md | 93 ++++++++++++++++++++++++++++++++++++++++++++++ CONTRIBUTION.md | 44 +++++++++++++++++----- 2 files changed, 128 insertions(+), 9 deletions(-) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000000..faa735b35e4 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,93 @@ +# Community Code of Conduct + +**Version 2.0 +January 1, 2023** + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as community members, contributors, Committers[^1], and Project Leads (collectively "Contributors") pledge to make participation in our projects and our community a harassment-free and inclusive experience for everyone. + +This Community Code of Conduct ("Code") outlines our behavior expectations as members of our community in all Eclipse Foundation activities, both offline and online. It is not intended to govern scenarios or behaviors outside of the scope of Eclipse Foundation activities. Nor is it intended to replace or supersede the protections offered to all our community members under the law. Please follow both the spirit and letter of this Code and encourage other Contributors to follow these principles into our work. Failure to read or acknowledge this Code does not excuse a Contributor from compliance with the Code. + +## Our Standards + +Examples of behavior that contribute to creating a positive and professional environment include: + +- Using welcoming and inclusive language; +- Actively encouraging all voices; +- Helping others bring their perspectives and listening actively. If you find yourself dominating a discussion, it is especially important to encourage other voices to join in; +- Being respectful of differing viewpoints and experiences; +- Gracefully accepting constructive criticism; +- Focusing on what is best for the community; +- Showing empathy towards other community members; +- Being direct but professional; and +- Leading by example by holding yourself and others accountable + +Examples of unacceptable behavior by Contributors include: + +- The use of sexualized language or imagery; +- Unwelcome sexual attention or advances; +- Trolling, insulting/derogatory comments, and personal or political attacks; +- Public or private harassment, repeated harassment; +- Publishing others' private information, such as a physical or electronic address, without explicit permission; +- Violent threats or language directed against another person; +- Sexist, racist, or otherwise discriminatory jokes and language; +- Posting sexually explicit or violent material; +- Sharing private content, such as emails sent privately or non-publicly, or unlogged forums such as IRC channel history; +- Personal insults, especially those using racist or sexist terms; +- Excessive or unnecessary profanity; +- Advocating for, or encouraging, any of the above behavior; and +- Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +With the support of the Eclipse Foundation employees, consultants, officers, and directors (collectively, the "Staff"), Committers, and Project Leads, the Eclipse Foundation Conduct Committee (the "Conduct Committee") is responsible for clarifying the standards of acceptable behavior. The Conduct Committee takes appropriate and fair corrective action in response to any instances of unacceptable behavior. + +## Scope + +This Code applies within all Project, Working Group, and Interest Group spaces and communication channels of the Eclipse Foundation (collectively, "Eclipse spaces"), within any Eclipse-organized event or meeting, and in public spaces when an individual is representing an Eclipse Foundation Project, Working Group, Interest Group, or their communities. Examples of representing a Project or community include posting via an official social media account, personal accounts, or acting as an appointed representative at an online or offline event. Representation of Projects, Working Groups, and Interest Groups may be further defined and clarified by Committers, Project Leads, or the Staff. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the Conduct Committee via conduct@eclipse-foundation.org. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. Without the explicit consent of the reporter, the Conduct Committee is obligated to maintain confidentiality with regard to the reporter of an incident. The Conduct Committee is further obligated to ensure that the respondent is provided with sufficient information about the complaint to reply. If such details cannot be provided while maintaining confidentiality, the Conduct Committee will take the respondent‘s inability to provide a defense into account in its deliberations and decisions. Further details of enforcement guidelines may be posted separately. + +Staff, Committers and Project Leads have the right to report, remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code, or to block temporarily or permanently any Contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. Any such actions will be reported to the Conduct Committee for transparency and record keeping. + +Any Staff (including officers and directors of the Eclipse Foundation), Committers, Project Leads, or Conduct Committee members who are the subject of a complaint to the Conduct Committee will be recused from the process of resolving any such complaint. + +## Responsibility + +The responsibility for administering this Code rests with the Conduct Committee, with oversight by the Executive Director and the Board of Directors. For additional information on the Conduct Committee and its process, please write to <conduct@eclipse-foundation.org>. + +## Investigation of Potential Code Violations + +All conflict is not bad as a healthy debate may sometimes be necessary to push us to do our best. It is, however, unacceptable to be disrespectful or offensive, or violate this Code. If you see someone engaging in objectionable behavior violating this Code, we encourage you to address the behavior directly with those involved. If for some reason, you are unable to resolve the matter or feel uncomfortable doing so, or if the behavior is threatening or harassing, please report it following the procedure laid out below. + +Reports should be directed to <conduct@eclipse-foundation.org>. It is the Conduct Committee’s role to receive and address reported violations of this Code and to ensure a fair and speedy resolution. + +The Eclipse Foundation takes all reports of potential Code violations seriously and is committed to confidentiality and a full investigation of all allegations. The identity of the reporter will be omitted from the details of the report supplied to the accused. Contributors who are being investigated for a potential Code violation will have an opportunity to be heard prior to any final determination. Those found to have violated the Code can seek reconsideration of the violation and disciplinary action decisions. Every effort will be made to have all matters disposed of within 60 days of the receipt of the complaint. + +## Actions +Contributors who do not follow this Code in good faith may face temporary or permanent repercussions as determined by the Conduct Committee. + +This Code does not address all conduct. It works in conjunction with our [Communication Channel Guidelines](https://www.eclipse.org/org/documents/communication-channel-guidelines/), [Social Media Guidelines](https://www.eclipse.org/org/documents/social_media_guidelines.php), [Bylaws](https://www.eclipse.org/org/documents/eclipse-foundation-be-bylaws-en.pdf), and [Internal Rules](https://www.eclipse.org/org/documents/ef-be-internal-rules.pdf) which set out additional protections for, and obligations of, all contributors. The Foundation has additional policies that provide further guidance on other matters. + +It’s impossible to spell out every possible scenario that might be deemed a violation of this Code. Instead, we rely on one another’s good judgment to uphold a high standard of integrity within all Eclipse Spaces. Sometimes, identifying the right thing to do isn’t an easy call. In such a scenario, raise the issue as early as possible. + +## No Retaliation + +The Eclipse community relies upon and values the help of Contributors who identify potential problems that may need to be addressed within an Eclipse Space. Any retaliation against a Contributor who raises an issue honestly is a violation of this Code. That a Contributor has raised a concern honestly or participated in an investigation, cannot be the basis for any adverse action, including threats, harassment, or discrimination. If you work with someone who has raised a concern or provided information in an investigation, you should continue to treat the person with courtesy and respect. If you believe someone has retaliated against you, report the matter as described by this Code. Honest reporting does not mean that you have to be right when you raise a concern; you just have to believe that the information you are providing is accurate. + +False reporting, especially when intended to retaliate or exclude, is itself a violation of this Code and will not be accepted or tolerated. + +Everyone is encouraged to ask questions about this Code. Your feedback is welcome, and you will get a response within three business days. Write to <conduct@eclipse-foundation.org>. + +## Amendments + +The Eclipse Foundation Board of Directors may amend this Code from time to time and may vary the procedures it sets out where appropriate in a particular case. + +### Attribution + +This Code was inspired by the [Contributor Covenant](https://www.contributor-covenant.org/), version 1.4, available [here](https://www.contributor-covenant.org/version/1/4/code-of-conduct/). + +[^1]: Capitalized terms used herein without definition shall have the meanings assigned to them in the Bylaws. \ No newline at end of file diff --git a/CONTRIBUTION.md b/CONTRIBUTION.md index dcc54e64cb3..191ae63fe78 100644 --- a/CONTRIBUTION.md +++ b/CONTRIBUTION.md @@ -1,21 +1,48 @@ -# Eclipse Safe Open Vehicle Core (SCORE) +# Eclipse Safe Open Vehicle Core (S-CORE) The [Eclipse Safe Open Vehicle Core](https://projects.eclipse.org/projects/automotive.score) project aims to develop an open-source core stack for Software Defined Vehicles (SDVs), specifically targeting embedded high-performance Electronic Control Units (ECUs). -Please check the [documentation](https://eclipse-score.github.io) for more information. +Please check the [documentation](https://eclipse-score.github.io/score/main/) for more information. The source code is hosted at [GitHub](https://github.com/eclipse-score). -The communication mainly takes place via the [`score-dev` mailing list](https://accounts.eclipse.org/mailing-list/score-dev) and GitHub issues & pull requests (PR). And we have a chatroom for community discussions here [Eclipse SCORE chatroom](https://chat.eclipse.org/#/room/#automotive.score:matrix.eclipse.org). +The communication mainly takes place via the [`score-dev` mailing list](https://accounts.eclipse.org/mailing-list/score-dev), [Discussions] (https://github.com/orgs/eclipse-score/discussions) and GitHub issues & pull requests (PR). +We have a Slack channel for community discussions here [Eclipse S-CORE Slack Channel](https://sdvworkinggroup.slack.com/archives/C083Z4VL90B). -Please note that for the project the [Eclipse Foundation’s Terms of Use](https://www.eclipse.org/legal/terms-of-use/) apply. -In addition, you need to sign the [ECA](https://www.eclipse.org/legal/ECA.php) and the [DCO](https://www.eclipse.org/legal/dco/) to contribute to the project. ## Contributing + +### Code of Conduct + +Please be familiar with the [Code of Conduct](CODE_OF_CONDUCT.md). + +## Eclipse Contributor Agreement & Developer Certificate of Origin + +Please note that for the project the [Eclipse Foundation’s Terms of Use](https://www.eclipse.org/legal/terms-of-use/) apply. + +Before your contribution can be accepted by the project team contributors must +electronically sign the Eclipse Contributor Agreement (ECA). + +* https://www.eclipse.org/legal/eca/ + + +For more information, please see the Eclipse Committer Handbook: +https://www.eclipse.org/projects/handbook/#resources-commit + +To complete and submit a ECA, log into the +[Eclipse projects forge](https://www.eclipse.org/contribute/cla/) +(you will need to create an account with the Eclipse Foundation if you have not already done so). +Click on "Eclipse Contributor Agreement" and complete the form. +Be sure to use the same email address when you register for the account +that you intend to use when you commit to Git. + +In addition, you need to sign the [DCO](https://www.eclipse.org/legal/dco/) to contribute to the project. + + ### Getting the source code & building the project Please refer to the [README.md](README.md) for further information. ### Getting involved #### Setup Phase -This phase is part of the eclipse Incubation Phase and shall establish all the processes needed for a safe development of functions. Only after this phase it will be possible to contribute code to the project. As the development in this project is driven by requirements, the processes and needed infrastructure incl. tooling will be established based on non-functional Stakeholder_Requirements<!-- TODO: fill link to correct page with requirements -->. During setup phase the contributions are Bug Fixes and Improvements (both on processes and infrastructure). +This phase is part of the eclipse Incubation Phase and shall establish all the processes needed for a safe development of functions. Only after this phase it will be possible to contribute code to the project. As the development in this project is driven by requirements, the processes and needed infrastructure incl. tooling will be established based on }[Non-functional Stakeholder_Requirements](https://eclipse-score.github.io/score/main/requirements/stakeholder/index.html). During setup phase the contributions are Bug Fixes and Improvements (both on processes and infrastructure). #### Bug Fixes and Improvements Improvements are adding/changing processes and infrastructure, bug fixes can be also on development work products like code. @@ -23,13 +50,12 @@ In case you want to fix a bug or contribute an improvement, please perform the f 1) Create a PR by using the corresponding template ([Bugfix PR template](.github/PULL_REQUEST_TEMPLATE/bug_fix.md) or [Improvement PR template](.github/PULL_REQUEST_TEMPLATE/improvement.md)). Please mark your PR as draft until it's ready for review by the Committers (see the [Eclipse Foundation Project Handbook](https://www.eclipse.org/projects/handbook/#contributing-committers) for more information on the role definitions). Improvements are requested by the definition or modification of [Stakeholder Requirements](docs/stakeholder_requirements) or [Tool Requirements](docs/tool_requirements) and may be implemented after acceptance/merge of the request by a second Improvement PR. The needed reviews are automatically triggered via the [CODEOWNERS](.github/CODEOWNERS) file in the repository. 2) Initiate content review by opening a corresponding issue for the PR when it is ready for review. Review of the PR and final merge into the project repository is in responsibility of the Committers. Use the [Bugfix Issue template](.github/ISSUE_TEMPLATE/bug_fix.md) or [Improvement Issue template](.github/ISSUE_TEMPLATE/improvement.md) for this. -Please check here for our Git Commit Rules in the [Configuration_Tool_Guidelines](https://eclipse-score.github.io/score/process_description/guidelines/index.html). +Please check here for our Git Commit Rules in the [Git Guidelines](https://eclipse-score.github.io/score/main/contribute/general/git.html). -Please use the [Stakeholder and Tool Requirements Template](https://eclipse-score.github.io/score/process_description/templates/index.html) when defining these requirements. ![Contribution guide workflow](./docs/_assets/contribution_guide.svg "Contribution guide workflow") #### Additional Information Please note, that all Git commit messages must adhere the rules described in the [Eclipse Foundation Project Handbook](https://www.eclipse.org/projects/handbook/#resources-commit). -Please find process descriptions here: [process description](https://eclipse-score.github.io/score/process_description/). +Please find process descriptions here: [process description](https://eclipse-score.github.io/process_description/main/index.html). From 51cd11c777cca14feed5dda29c9c2e21c2227246 Mon Sep 17 00:00:00 2001 From: "markus.schu" <markus.schu@accenture.com> Date: Fri, 12 Dec 2025 14:34:07 +0100 Subject: [PATCH 080/214] add process_description update link to release notes add link to maturity levels --- .../score_releases/score_v0_5_beta.rst | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/docs/score_releases/score_releases/score_v0_5_beta.rst b/docs/score_releases/score_releases/score_v0_5_beta.rst index 2dae400e50f..cead9ed3d45 100644 --- a/docs/score_releases/score_releases/score_v0_5_beta.rst +++ b/docs/score_releases/score_releases/score_v0_5_beta.rst @@ -103,8 +103,20 @@ Associated Infrastructure Modules ----------------------------------- process_description -~~~~~~~~~~~~~~~~~~~~~~~ -TBD +~~~~~~~~~~~~~~~~~~~ +Provides a process model establishing organizational rules for developing open source software +in the automotive domain, suitable for safety and security contexts. + +- **Version:** ``process description v1.4.0`` +- **Standards alignment:** + + - ASPICE 4.0 + - ISO 26262 + - ISO 21434 + - ISO PAS 8926 + +- **Release notes**: `process_description release notes <https://github.com/eclipse-score/process_description/releases/tag/v1.4.0>`_ +- **Process maturity**: `process_description maturity levels <https://eclipse-score.github.io/process_description/main/>`_ docs-as-code ~~~~~~~~~~~~~~ From fa28574860d7b6bdb38f22ec90be11823a8b6862 Mon Sep 17 00:00:00 2001 From: Pawel Rutka <pawel.rutka.ext@qorix.ai> Date: Mon, 15 Dec 2025 15:41:06 +0100 Subject: [PATCH 081/214] release: add kyron & orchestrator notes --- .../score_releases/score_v0_5_beta.rst | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/docs/score_releases/score_releases/score_v0_5_beta.rst b/docs/score_releases/score_releases/score_v0_5_beta.rst index cead9ed3d45..21f142b07f4 100644 --- a/docs/score_releases/score_releases/score_v0_5_beta.rst +++ b/docs/score_releases/score_releases/score_v0_5_beta.rst @@ -78,9 +78,37 @@ Persistency TBD -Orchestrator (Kyron and orchestration framework) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -TBD +Orchestrator +~~~~~~~~~~~~~ + +**Improvements** + +- Support `log` frontend exchange to: `log`, `tracing` or `score-log` (not yet implemented in this release) +- Increased CIT coverage and stability improvements +- Split of kyron into separate repositories: `orchestrator` and `kyron` + +:Version: ``orchestrator v0.0.4`` +:Source / tag: `Orchestrator GitHub release <https://github.com/eclipse-score/orchestrator/releases/tag/v0.0.4>`__ +:Further reading: See below + + - `Orchestrator scope and design <https://github.com/eclipse-score/orchestrator/blob/main/src/orchestration/doc/features.md>`__ + - `Orchestrator examples <https://github.com/eclipse-score/orchestrator/tree/main/src/orchestration/examples>`__ + +Kyron +~~~~~~ + +**Improvements** + +- Support `log` frontend exchange to: `log`, `tracing` or `score-log` (not yet implemented in this release) +- Increased CIT coverage and stability improvements +- Split of kyron into separate repositories: `orchestrator` and `kyron` + +:Version: ``kyron v0.0.3`` +:Source / tag: `Kyron GitHub release <https://github.com/eclipse-score/kyron/releases/tag/v0.0.3>`__ +:Further reading: See below + + - `Kyron scope and design <https://github.com/eclipse-score/kyron/blob/main/src/kyron/doc/features.md>`__ + - `Kyron examples <https://github.com/eclipse-score/kyron/tree/main/src/kyron/examples>`__ Reference integration From 0e2d4b8c8d0b354b77b494ba7fa2c9d4e43a483c Mon Sep 17 00:00:00 2001 From: Piotr Korkus <piotr.korkus.ext@qorix.ai> Date: Tue, 16 Dec 2025 11:37:30 +0100 Subject: [PATCH 082/214] release: add test scenarios notes --- docs/score_releases/score_releases/score_v0_5_beta.rst | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/score_releases/score_releases/score_v0_5_beta.rst b/docs/score_releases/score_releases/score_v0_5_beta.rst index 21f142b07f4..b40e4fc3a17 100644 --- a/docs/score_releases/score_releases/score_v0_5_beta.rst +++ b/docs/score_releases/score_releases/score_v0_5_beta.rst @@ -160,7 +160,13 @@ TBD Test Scenarios ~~~~~~~~~~~~~~~ -TBD + +**Improvements** +- Refactor tracing subscriber by externalizing it's initialization +- Remove baselibs dependency from C++ scenarios in JSON parsing + +:Version: ``Test Scenarios v0.3.1`` +:Source / tag: `Test Scenarios GitHub release <https://github.com/eclipse-score/testing_tools/releases/tag/v0.3.1>`__ Performed Verification ---------------------- From e774c3e91450942bfbcb64b78e86d48b6a36adaa Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres <frank.scholter_peres@mercedes-benz.com> Date: Wed, 17 Dec 2025 11:46:31 +0000 Subject: [PATCH 083/214] fixes naming --- docs/features/baselibs/index.rst | 2 +- docs/features/communication/index.rst | 2 +- docs/features/frameworks/feo/index.rst | 4 +- docs/features/orchestration/index.rst | 2 +- docs/features/persistency/index.rst | 2 +- .../score_releases/score_v0_5_beta.rst | 42 ++++++++++++++++--- 6 files changed, 43 insertions(+), 11 deletions(-) diff --git a/docs/features/baselibs/index.rst b/docs/features/baselibs/index.rst index c1f16888004..c6a06a9dade 100644 --- a/docs/features/baselibs/index.rst +++ b/docs/features/baselibs/index.rst @@ -14,7 +14,7 @@ .. _baselibs_feature: -Base Libraries (v0.5 alpha) +Base Libraries (v0.5 beta) ########################### .. document:: Base Libraries diff --git a/docs/features/communication/index.rst b/docs/features/communication/index.rst index 176d1806f10..62000c6fc91 100644 --- a/docs/features/communication/index.rst +++ b/docs/features/communication/index.rst @@ -14,7 +14,7 @@ .. _com_feature: -Communication (v0.5 alpha) +Communication (v0.5 beta) ########################## .. document:: Communication diff --git a/docs/features/frameworks/feo/index.rst b/docs/features/frameworks/feo/index.rst index 80ce3f51d73..827455b72c8 100644 --- a/docs/features/frameworks/feo/index.rst +++ b/docs/features/frameworks/feo/index.rst @@ -12,8 +12,8 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -Fixed execution order framework (FEO) -##################################### +Fixed execution order framework (FEO) (v0.5 beta) +################################################# .. document:: Fixed execution order framework :id: doc__frameworks_feo diff --git a/docs/features/orchestration/index.rst b/docs/features/orchestration/index.rst index 54a121fa107..fe5dcb9db09 100644 --- a/docs/features/orchestration/index.rst +++ b/docs/features/orchestration/index.rst @@ -15,7 +15,7 @@ .. _orch_feature: -Orchestration (v0.5 alpha) +Orchestration (v0.5 beta) ########################## .. document:: Orchestration diff --git a/docs/features/persistency/index.rst b/docs/features/persistency/index.rst index 6f6246e5f34..ded30f1e54b 100644 --- a/docs/features/persistency/index.rst +++ b/docs/features/persistency/index.rst @@ -12,7 +12,7 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -Persistency (v0.5 alpha) +Persistency (v0.5 beta) ######################## .. document:: Persistency diff --git a/docs/score_releases/score_releases/score_v0_5_beta.rst b/docs/score_releases/score_releases/score_v0_5_beta.rst index b40e4fc3a17..44d2932f167 100644 --- a/docs/score_releases/score_releases/score_v0_5_beta.rst +++ b/docs/score_releases/score_releases/score_v0_5_beta.rst @@ -29,7 +29,20 @@ S-Core v0.5-beta release notes Overview ^^^^^^^^^ -TBD +This is the second milestone build of the **Eclipse S-CORE platform** (v0.5.0-beta). It brings +together the initial set of core modules, reference integrations, and supporting infrastructure needed to +build and run example applications such as the `scrample <https://github.com/eclipse-score/scrample>`_ +demo on multiple target images. The software architecture and implemented modules are illustrated in the diagram below. + +This release of Eclipse S-CORE is an early beta version intended solely for experimentation, test driving project processes, gaining experience in release creation and soliciting feedback. +Please be aware, that features may be incomplete, the software may exhibit instability or unexpected behavior, and breaking changes and alterations in scope are likely as development progresses. + + +.. image:: ../_assets/architecture.drawio.svg + :width: 1000 + :alt: Architecture overview + :align: center + | @@ -39,7 +52,12 @@ TBD Timeline --------- -TBD +The current timeline for Eclipse S-CORE releases is shown below. + +.. image:: ../_assets/score_release_plan.drawio.svg + :width: 800 + :alt: Architecture overview + :align: center | @@ -47,11 +65,21 @@ For a detailed and always up-to-date planning view, see the `GitHub project <htt Eclipse S-CORE book ------------------- -TBD +The `Eclipse S-CORE book <https://eclipse-score.github.io/score/main/handbook/index.html>`_ +is a “how-to” guide for users getting started with the project or who want to contribute new modules. +It introduces the core concepts of Eclipse S-CORE and walks through building +the ``scrample`` application step by step on top of the platform modules. +It also includes a tutorial for the first application on top of the existing modules. Improvements ^^^^^^^^^^^^^ -TBD +Main focus of this release is to improve the overall stability and performance of the platform, as well as to enhance the usability. +This does include + +- Static code analysis and Execution of Unit testing as part of the `Reference Integration https://github.com/eclipse-score/reference_integration`_. +- A new combined build toolchain of qcc and gcc `bazel cpp toolchain https://github.com/eclipse-score/bazel_cpp_toolchains`_. +- Improved doc-as-code and process description +- Bug Fixes ^^^^^^^^^^^^ @@ -62,7 +90,11 @@ Integrated Software Modules Communication ~~~~~~~~~~~~~ -TBD +Zero-copy, shared-memory based inter-process communication for minimal-latency intra-ECU messaging. + +- **Version:** ``communication v0.1.2`` +- **Source / tag:** `Communication GitHub release <https://github.com/eclipse-score/communication/archive/refs/tags/v0.1.2.tar.gz>`_ +- **Release notes:** :need:`doc__communication_release_note` Fixed Execution Order Framework(FEO) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 15c6b01601b4846b7d82f48cdd82d6e70e9fcdbb Mon Sep 17 00:00:00 2001 From: Oliver Pajonk <oliver.pajonk@elektrobit.com> Date: Wed, 17 Dec 2025 11:12:37 +0000 Subject: [PATCH 084/214] Add release notes for EBcLfSA reference integration --- docs/score_releases/score_releases/score_v0_5_beta.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/score_releases/score_releases/score_v0_5_beta.rst b/docs/score_releases/score_releases/score_v0_5_beta.rst index 44d2932f167..222935b5fdd 100644 --- a/docs/score_releases/score_releases/score_v0_5_beta.rst +++ b/docs/score_releases/score_releases/score_v0_5_beta.rst @@ -157,7 +157,11 @@ TBD Reference Elektrobit corbos Linux for Safety Applications Linux image (Experimental) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -TBD + +**Improvements** + +- New ``fastdev`` base image snapshot and corresponding toolchain which include latest security patches and updates. +- Updated packages avoid misleading errors during image start and shutdown, which could be confusing for users. Associated Infrastructure Modules ----------------------------------- From c6abec41c1516b64afb4c7e72d77379499863287 Mon Sep 17 00:00:00 2001 From: Oliver Pajonk <oliver.pajonk@elektrobit.com> Date: Wed, 17 Dec 2025 11:12:48 +0000 Subject: [PATCH 085/214] bump devcontainer --- .devcontainer/devcontainer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 1a3b163c06d..e88d473e821 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,4 +1,4 @@ { "name": "eclipse-s-core", - "image": "ghcr.io/eclipse-score/devcontainer:1.0.0" + "image": "ghcr.io/eclipse-score/devcontainer:v1.1.0" } From 2506a3b803f2d2bc146f858caa8e6c947de98b1e Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres <frank.scholter_peres@mercedes-benz.com> Date: Wed, 17 Dec 2025 12:31:58 +0000 Subject: [PATCH 086/214] added descriptions --- .../score_releases/score_v0_5_beta.rst | 59 ++++++++++++++----- 1 file changed, 45 insertions(+), 14 deletions(-) diff --git a/docs/score_releases/score_releases/score_v0_5_beta.rst b/docs/score_releases/score_releases/score_v0_5_beta.rst index 222935b5fdd..376ab9c9731 100644 --- a/docs/score_releases/score_releases/score_v0_5_beta.rst +++ b/docs/score_releases/score_releases/score_v0_5_beta.rst @@ -48,7 +48,7 @@ Please be aware, that features may be incomplete, the software may exhibit insta Highlights ----------- -TBD + Timeline --------- @@ -76,14 +76,15 @@ Improvements Main focus of this release is to improve the overall stability and performance of the platform, as well as to enhance the usability. This does include -- Static code analysis and Execution of Unit testing as part of the `Reference Integration https://github.com/eclipse-score/reference_integration`_. +- Static code analysis with CodeQL and Execution of Unit testing as part of the `Reference Integration https://github.com/eclipse-score/reference_integration`_. - A new combined build toolchain of qcc and gcc `bazel cpp toolchain https://github.com/eclipse-score/bazel_cpp_toolchains`_. - Improved doc-as-code and process description - -Bug Fixes -^^^^^^^^^^^^ -TBD +Bug Fixes Platform +^^^^^^^^^^^^^^^^^^ + +https://github.com/eclipse-score/score/issues?q=is%3Aissue%20state%3Aclosed%20type%3ABug Integrated Software Modules ----------------------------- @@ -98,7 +99,9 @@ Zero-copy, shared-memory based inter-process communication for minimal-latency i Fixed Execution Order Framework(FEO) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -TBD +- **Version:** ``feo v0.1.2`` +- **Source / tag:** `Communication GitHub release <https://github.com/eclipse-score/communication/archive/refs/tags/v0.1.2.tar.gz>`_ +- **Stays at v0.5-alpha** Baselibs ~~~~~~~~~~~~~ @@ -107,8 +110,11 @@ TBD Persistency ~~~~~~~~~~~~~ -TBD +Ensures long-term storage and retrieval of data and provides a reliable mechanism for +preserving application state and data integrity over time. +- **Version:** ``persistency v0.2.1`` +- **Source / tag:** `Persistency GitHub release <https://github.com/eclipse-score/persistency/archive/refs/tags/v0.2.1.tar.gz>`_ Orchestrator ~~~~~~~~~~~~~ @@ -145,7 +151,11 @@ Kyron Reference integration ~~~~~~~~~~~~~~~~~~~~~~ -TBD +Central integration of Eclipse S-CORE modules + +- **Version:** ``reference integration v0.5.0-beta`` +- **Source / tag:** `Reference Integration GitHub release <https://github.com/eclipse-score/reference_integration/releases/tag/v0.5.0-beta>`_ + Reference QNX image +++++++++++++++++++++ @@ -184,15 +194,25 @@ in the automotive domain, suitable for safety and security contexts. docs-as-code ~~~~~~~~~~~~~~ -TBD +Tooling for linking and generation of documentation. + +- **Version:** ``docs-as-code v2.2.1`` +- **Source / tag:** `docs-as-code GitHub release <https://github.com/eclipse-score/docs-as-code/releases/tag/v2.2.1>`_ tooling ~~~~~~~~~~~~~~ -TBD +Tooling for S-CORE development. + +- **Version:** ``tooling v1.0.4`` +- **Source / tag:** `tooling GitHub release <https://github.com/eclipse-score/tooling/releases/tag/v1.0.4>`_ + ITF (Integration Testing Framework) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -TBD +Framework for executing feature integration tests on the reference image. + +- **Version:** ``itf v0.1.0`` +- **Source / tag:** `ITF GitHub release <https://github.com/eclipse-score/itf/archive/refs/tags/0.1.0.tar.gz>`_ Test Scenarios ~~~~~~~~~~~~~~~ @@ -206,15 +226,26 @@ Test Scenarios Performed Verification ---------------------- -TBD +The following tests were executed as part of this release: + +- All C++ modules built successfully with GCC and QCC toolchains. +- All Rust modules built successfully with the Rust toolchain. +- Each module executed its unit tests. +- Basic integration tests were executed on the reference QNX image in QEMU via the + `release verification <https://github.com/eclipse-score/reference_integration/blob/37aa2fc1409f6907bf5d9f3c2643489bb937f90e/.github/workflows/release_verification.yml#L56>`_ workflow +- for **persistency** and **orchestration** modules, component and feature integration tests were executed using the ``score-test-scenarios`` framework; see + `feature_showcase <https://github.com/eclipse-score/reference_integration/tree/main/feature_showcase>`_ and + `feature_integration_tests <https://github.com/eclipse-score/reference_integration/tree/main/feature_integration_tests>`_ for more details. +- Static code analysis of all dependencies with CodeQL MISRA C++2023 package. The results you can find here: https://github.com/eclipse-score/reference_integration/actions/workflows/codeql-multiple-repo-scan.yml Known Issues ---------------------- -- see release notes of every module seperately +- see release notes of every module separately Upgrade Instructions ---------------------- -- TBD +- Increase to newest bazel registry versions: https://github.com/eclipse-score/bazel_registry/tree/main/modules + Contact Information ---------------------- From da4eacd351ff879b5d6d8372423c17a92468f21c Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres <frank.scholter_peres@mercedes-benz.com> Date: Wed, 17 Dec 2025 12:51:21 +0000 Subject: [PATCH 087/214] added platform --- .../score_releases/score_v0_5_beta.rst | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/docs/score_releases/score_releases/score_v0_5_beta.rst b/docs/score_releases/score_releases/score_v0_5_beta.rst index 376ab9c9731..0a1d6f7cf2a 100644 --- a/docs/score_releases/score_releases/score_v0_5_beta.rst +++ b/docs/score_releases/score_releases/score_v0_5_beta.rst @@ -24,7 +24,7 @@ S-Core v0.5-beta release notes | **Platform Name**: S-CORE | **Release Tag**: v0.5.0-beta -| **Origin Release Tag**: none - first published release +| **Origin Release Tag**: v0.5.0-alpha | **Release Date**: 2025-12-18 Overview @@ -76,14 +76,19 @@ Improvements Main focus of this release is to improve the overall stability and performance of the platform, as well as to enhance the usability. This does include -- Static code analysis with CodeQL and Execution of Unit testing as part of the `Reference Integration https://github.com/eclipse-score/reference_integration`_. -- A new combined build toolchain of qcc and gcc `bazel cpp toolchain https://github.com/eclipse-score/bazel_cpp_toolchains`_. +- Static code analysis with CodeQL and Execution of Unit testing as part of the `Reference Integration <https://github.com/eclipse-score/reference_integration>`_. +- A new combined build toolchain of qcc and gcc `bazel cpp toolchain <https://github.com/eclipse-score/bazel_cpp_toolchains>`_. - Improved doc-as-code and process description -- -Bug Fixes Platform + +S-CORE Platform ^^^^^^^^^^^^^^^^^^ +- **Version:** ``score v0.5.2`` +- **Source / tag:** `S-CORE Platform GitHub release <https://github.com/eclipse-score/score/archive/refs/tags/v0.5.2.tar.gz>`_ +- **Release notes**: `S-CORE Platform release notes <https://github.com/eclipse-score/score/releases/tag/v0.5.2>`_ + + https://github.com/eclipse-score/score/issues?q=is%3Aissue%20state%3Aclosed%20type%3ABug Integrated Software Modules From 0a78a5ff7a9abb4db9464043c5e067e7b86da80d Mon Sep 17 00:00:00 2001 From: "Frank Scholter Peres(MBTI)" <145544737+FScholPer@users.noreply.github.com> Date: Wed, 17 Dec 2025 13:52:21 +0100 Subject: [PATCH 088/214] Update CONTRIBUTION.md Co-authored-by: AndreasMittag <andreas.mittag@etas.com> Signed-off-by: Frank Scholter Peres(MBTI) <145544737+FScholPer@users.noreply.github.com> --- CONTRIBUTION.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTION.md b/CONTRIBUTION.md index 191ae63fe78..0700a9596bf 100644 --- a/CONTRIBUTION.md +++ b/CONTRIBUTION.md @@ -3,7 +3,7 @@ The [Eclipse Safe Open Vehicle Core](https://projects.eclipse.org/projects/autom Please check the [documentation](https://eclipse-score.github.io/score/main/) for more information. The source code is hosted at [GitHub](https://github.com/eclipse-score). -The communication mainly takes place via the [`score-dev` mailing list](https://accounts.eclipse.org/mailing-list/score-dev), [Discussions] (https://github.com/orgs/eclipse-score/discussions) and GitHub issues & pull requests (PR). +The communication mainly takes place via the [`score-dev` mailing list](https://accounts.eclipse.org/mailing-list/score-dev), [Discussions](https://github.com/orgs/eclipse-score/discussions) and GitHub issues & pull requests (PR). We have a Slack channel for community discussions here [Eclipse S-CORE Slack Channel](https://sdvworkinggroup.slack.com/archives/C083Z4VL90B). From 0f67e7a7c0de48ae2f046323e36a146ecd81d05b Mon Sep 17 00:00:00 2001 From: Anton Krivoborodov <Anton.Krivoborodov@bmw.de> Date: Wed, 17 Dec 2025 15:49:55 +0100 Subject: [PATCH 089/214] add further content --- docs/score_releases/index.rst | 18 +++- .../score_releases/score_v0_5_alpha.rst | 13 --- .../score_releases/score_v0_5_beta.rst | 90 ++++++++++++------- 3 files changed, 75 insertions(+), 46 deletions(-) diff --git a/docs/score_releases/index.rst b/docs/score_releases/index.rst index 035bba0399a..4a841321d57 100644 --- a/docs/score_releases/index.rst +++ b/docs/score_releases/index.rst @@ -24,7 +24,23 @@ See also the project life cycle within the `Eclipse Development Process <https:/ S-CORE Releases Overview ======================== +Timeline +--------- +The current timeline for Eclipse S-CORE releases is shown below. + +.. image:: ./_assets/score_release_plan.drawio.svg + :width: 800 + :alt: Architecture overview + :align: center + +| + +For a detailed and always up-to-date planning view, see the `GitHub project <https://github.com/orgs/eclipse-score/projects/17/views/26>`_. + +List of S-CORE released versions +--------------------------------- + .. toctree:: - :maxdepth: 1 + :maxdepth: 2 score_releases/index.rst diff --git a/docs/score_releases/score_releases/score_v0_5_alpha.rst b/docs/score_releases/score_releases/score_v0_5_alpha.rst index e3a5d950641..c10a5782c8d 100644 --- a/docs/score_releases/score_releases/score_v0_5_alpha.rst +++ b/docs/score_releases/score_releases/score_v0_5_alpha.rst @@ -52,19 +52,6 @@ Highlights - Initial set of communication, persistency, orchestration, and base utility modules. - Experimental reference images for QNX, Red Hat AutoSD Linux, and EB corbos Linux for Safety Applications. -Timeline ---------- -The current timeline for Eclipse S-CORE releases is shown below. - -.. image:: ../_assets/score_release_plan.drawio.svg - :width: 800 - :alt: Architecture overview - :align: center - -| - -For a detailed and always up-to-date planning view, see the `GitHub project <https://github.com/orgs/eclipse-score/projects/17/views/26>`_. - Eclipse S-CORE book ------------------- The first version of the `Eclipse S-CORE book <https://eclipse-score.github.io/score/main/handbook/index.html>`_ diff --git a/docs/score_releases/score_releases/score_v0_5_beta.rst b/docs/score_releases/score_releases/score_v0_5_beta.rst index 0a1d6f7cf2a..ab9c68861ef 100644 --- a/docs/score_releases/score_releases/score_v0_5_beta.rst +++ b/docs/score_releases/score_releases/score_v0_5_beta.rst @@ -49,20 +49,6 @@ Please be aware, that features may be incomplete, the software may exhibit insta Highlights ----------- - -Timeline ---------- -The current timeline for Eclipse S-CORE releases is shown below. - -.. image:: ../_assets/score_release_plan.drawio.svg - :width: 800 - :alt: Architecture overview - :align: center - -| - -For a detailed and always up-to-date planning view, see the `GitHub project <https://github.com/orgs/eclipse-score/projects/17/views/26>`_. - Eclipse S-CORE book ------------------- The `Eclipse S-CORE book <https://eclipse-score.github.io/score/main/handbook/index.html>`_ @@ -71,16 +57,37 @@ It introduces the core concepts of Eclipse S-CORE and walks through building the ``scrample`` application step by step on top of the platform modules. It also includes a tutorial for the first application on top of the existing modules. + Improvements ^^^^^^^^^^^^^ Main focus of this release is to improve the overall stability and performance of the platform, as well as to enhance the usability. This does include -- Static code analysis with CodeQL and Execution of Unit testing as part of the `Reference Integration <https://github.com/eclipse-score/reference_integration>`_. -- A new combined build toolchain of qcc and gcc `bazel cpp toolchain <https://github.com/eclipse-score/bazel_cpp_toolchains>`_. +- Static code analysis with CodeQL: **//TODO:** add link to the results. +- Execution of Unit tests as part of the Reference Integration `test_integration workflow <https://github.com/eclipse-score/reference_integration/blob/main/.github/workflows/test_integration.yml>`_. +- Unit-test coverage measurement results are now automatically part of Release Assests for every component: **//TODO:** link to an example. +- A new combined build toolchain of qcc and gcc, see `bazel_cpp_toolchain <#bazel-cpp-toolchain>`_. - Improved doc-as-code and process description +Software Development Process status +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +The following image provides an overview of the current status of the software development process, the associated tooling, +and the progress of its application to the software modules. + +.. image:: https://raw.githubusercontent.com/eclipse-score/process_description/bec1931b56464543cb70385e75c15fcb1625f0d0/process/_assets/score_process_area_overview.drawio.svg + :width: 1000 + :alt: Architecture overview + :align: center + + +| + +For more details please refer to +`Documentation Management Plan <https://eclipse-score.github.io/score/main/platform_management_plan/documentation_management.html>`_, that +provides overview on the process workproduct level for every software module and process area. + + S-CORE Platform ^^^^^^^^^^^^^^^^^^ @@ -94,6 +101,11 @@ https://github.com/eclipse-score/score/issues?q=is%3Aissue%20state%3Aclosed%20ty Integrated Software Modules ----------------------------- + +Baselibs +~~~~~~~~~~~~~ +TBD + Communication ~~~~~~~~~~~~~ Zero-copy, shared-memory based inter-process communication for minimal-latency intra-ECU messaging. @@ -108,10 +120,6 @@ Fixed Execution Order Framework(FEO) - **Source / tag:** `Communication GitHub release <https://github.com/eclipse-score/communication/archive/refs/tags/v0.1.2.tar.gz>`_ - **Stays at v0.5-alpha** -Baselibs -~~~~~~~~~~~~~ -TBD - Persistency ~~~~~~~~~~~~~ @@ -164,11 +172,11 @@ Central integration of Eclipse S-CORE modules Reference QNX image +++++++++++++++++++++ -TBD +- No changes compared to the previous software version. Reference Red Hat AutoSD Linux image (Experimental) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -TBD +- No changes compared to the previous software version. Reference Elektrobit corbos Linux for Safety Applications Linux image (Experimental) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -189,10 +197,10 @@ in the automotive domain, suitable for safety and security contexts. - **Version:** ``process description v1.4.0`` - **Standards alignment:** - - ASPICE 4.0 - - ISO 26262 - - ISO 21434 - - ISO PAS 8926 + - ASPICE 4.0 + - ISO 26262 + - ISO 21434 + - ISO PAS 8926 - **Release notes**: `process_description release notes <https://github.com/eclipse-score/process_description/releases/tag/v1.4.0>`_ - **Process maturity**: `process_description maturity levels <https://eclipse-score.github.io/process_description/main/>`_ @@ -214,20 +222,38 @@ Tooling for S-CORE development. ITF (Integration Testing Framework) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Framework for executing feature integration tests on the reference image. +- **Improvements** + + - Improved ITF `user documentation <https://github.com/eclipse-score/itf/blob/main/README.md>`_ - **Version:** ``itf v0.1.0`` - **Source / tag:** `ITF GitHub release <https://github.com/eclipse-score/itf/archive/refs/tags/0.1.0.tar.gz>`_ Test Scenarios ~~~~~~~~~~~~~~~ +- **Improvements** -**Improvements** -- Refactor tracing subscriber by externalizing it's initialization -- Remove baselibs dependency from C++ scenarios in JSON parsing + - Refactor tracing subscriber by externalizing it's initialization + - Remove baselibs dependency from C++ scenarios in JSON parsing + +- **Version:** ``Test Scenarios v0.3.1`` +- **Source / tag:** `Test Scenarios GitHub release <https://github.com/eclipse-score/testing_tools/releases/tag/v0.3.1>`_ + +Bazel CPP Toolchain +~~~~~~~~~~~~~~~~~~~~ +- **What is in** + + - support for following platform configurations: *x86_64_linux*, *x86_64_qnx*, *arm64_qnx* + - complete feature flag set for the host toolchain (*x86_64_linux*): *minimal*, *strict*, *all_warnings* + +- **What is not in** -:Version: ``Test Scenarios v0.3.1`` -:Source / tag: `Test Scenarios GitHub release <https://github.com/eclipse-score/testing_tools/releases/tag/v0.3.1>`__ + - feature flag set for the target toolchain (infrastructure is already set-up) + - arm64_linux configuration is missing + +- **Version:** ``bazel_cpp_toolchains v0.1.0`` +- **Source / tag:** `Bazel CPP Toolchain release <https://github.com/eclipse-score/bazel_cpp_toolchains/archive/refs/tags/v0.1.0.tar.gz>`_ +- **Release notes**: `Bazel CPP Toolchain release notes <https://github.com/eclipse-score/bazel_cpp_toolchains/releases/tag/v0.1.0>`_ Performed Verification ---------------------- From 982a88f922f0a463423487716a0dc20a4e9eb373 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres <frank.scholter_peres@mercedes-benz.com> Date: Fri, 19 Dec 2025 09:21:29 +0000 Subject: [PATCH 090/214] updated to new --- .../score_releases/score_v0_5_beta.rst | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/docs/score_releases/score_releases/score_v0_5_beta.rst b/docs/score_releases/score_releases/score_v0_5_beta.rst index ab9c68861ef..ada367bf5c1 100644 --- a/docs/score_releases/score_releases/score_v0_5_beta.rst +++ b/docs/score_releases/score_releases/score_v0_5_beta.rst @@ -63,14 +63,14 @@ Improvements Main focus of this release is to improve the overall stability and performance of the platform, as well as to enhance the usability. This does include -- Static code analysis with CodeQL: **//TODO:** add link to the results. +- Static code analysis with CodeQL MISRA C++ 2023: `release link <https://github.com/eclipse-score/reference_integration/releases/tag/v0.5.0-beta>`. - Execution of Unit tests as part of the Reference Integration `test_integration workflow <https://github.com/eclipse-score/reference_integration/blob/main/.github/workflows/test_integration.yml>`_. -- Unit-test coverage measurement results are now automatically part of Release Assests for every component: **//TODO:** link to an example. +- Unit-test coverage measurement results are now automatically part of Release Assests for every component: **//TODO:** link to an example. - A new combined build toolchain of qcc and gcc, see `bazel_cpp_toolchain <#bazel-cpp-toolchain>`_. - Improved doc-as-code and process description -Software Development Process status +Software Development Process status ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The following image provides an overview of the current status of the software development process, the associated tooling, and the progress of its application to the software modules. @@ -83,7 +83,7 @@ and the progress of its application to the software modules. | -For more details please refer to +For more details please refer to `Documentation Management Plan <https://eclipse-score.github.io/score/main/platform_management_plan/documentation_management.html>`_, that provides overview on the process workproduct level for every software module and process area. @@ -126,8 +126,8 @@ Persistency Ensures long-term storage and retrieval of data and provides a reliable mechanism for preserving application state and data integrity over time. -- **Version:** ``persistency v0.2.1`` -- **Source / tag:** `Persistency GitHub release <https://github.com/eclipse-score/persistency/archive/refs/tags/v0.2.1.tar.gz>`_ +- **Version:** ``persistency v0.2.2`` +- **Source / tag:** `Persistency GitHub release <https://github.com/eclipse-score/persistency/archive/refs/tags/v0.2.2.tar.gz>`_ Orchestrator ~~~~~~~~~~~~~ @@ -176,7 +176,12 @@ Reference QNX image Reference Red Hat AutoSD Linux image (Experimental) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- No changes compared to the previous software version. +- Use sub-module structure +- os_images does not need to be a sub-module since it does not use bazel +- Use AutoSD tools to build RPMs (toolchain + bazelrc file) +- Use built RPMs in os_images +- Uses 0.5 modules, similar setup to upstream reference_instegration +- e2e workflow defined in github actions Reference Elektrobit corbos Linux for Safety Applications Linux image (Experimental) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -209,8 +214,8 @@ docs-as-code ~~~~~~~~~~~~~~ Tooling for linking and generation of documentation. -- **Version:** ``docs-as-code v2.2.1`` -- **Source / tag:** `docs-as-code GitHub release <https://github.com/eclipse-score/docs-as-code/releases/tag/v2.2.1>`_ +- **Version:** ``docs-as-code v2.2.0`` +- **Source / tag:** `docs-as-code GitHub release <https://github.com/eclipse-score/docs-as-code/releases/tag/v2.2.0>`_ tooling ~~~~~~~~~~~~~~ @@ -250,7 +255,7 @@ Bazel CPP Toolchain - feature flag set for the target toolchain (infrastructure is already set-up) - arm64_linux configuration is missing - + - **Version:** ``bazel_cpp_toolchains v0.1.0`` - **Source / tag:** `Bazel CPP Toolchain release <https://github.com/eclipse-score/bazel_cpp_toolchains/archive/refs/tags/v0.1.0.tar.gz>`_ - **Release notes**: `Bazel CPP Toolchain release notes <https://github.com/eclipse-score/bazel_cpp_toolchains/releases/tag/v0.1.0>`_ From 0250ac8407c06801799ef029c27423e28c246458 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres <frank.scholter_peres@mercedes-benz.com> Date: Fri, 19 Dec 2025 09:43:25 +0000 Subject: [PATCH 091/214] add_beta --- docs/score_releases/score_releases/score_v0_5_beta.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/score_releases/score_releases/score_v0_5_beta.rst b/docs/score_releases/score_releases/score_v0_5_beta.rst index ada367bf5c1..d358efd9648 100644 --- a/docs/score_releases/score_releases/score_v0_5_beta.rst +++ b/docs/score_releases/score_releases/score_v0_5_beta.rst @@ -25,7 +25,7 @@ S-Core v0.5-beta release notes | **Platform Name**: S-CORE | **Release Tag**: v0.5.0-beta | **Origin Release Tag**: v0.5.0-alpha -| **Release Date**: 2025-12-18 +| **Release Date**: 2025-12-19 Overview ^^^^^^^^^ From af51dac15e293b63edbe412010c8e1e647a00f6b Mon Sep 17 00:00:00 2001 From: Anton Krivoborodov <Anton.Krivoborodov@bmw.de> Date: Fri, 19 Dec 2025 12:11:16 +0100 Subject: [PATCH 092/214] add logging daemon desciption --- .../score_releases/score_v0_5_beta.rst | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/docs/score_releases/score_releases/score_v0_5_beta.rst b/docs/score_releases/score_releases/score_v0_5_beta.rst index d358efd9648..303c0d77300 100644 --- a/docs/score_releases/score_releases/score_v0_5_beta.rst +++ b/docs/score_releases/score_releases/score_v0_5_beta.rst @@ -68,6 +68,13 @@ This does include - Unit-test coverage measurement results are now automatically part of Release Assests for every component: **//TODO:** link to an example. - A new combined build toolchain of qcc and gcc, see `bazel_cpp_toolchain <#bazel-cpp-toolchain>`_. - Improved doc-as-code and process description +- `bazel_tools_cc <https://github.com/eclipse-score/bazel-tools-cc>`_ introduces a clang-tidy integration into S-CORE bazel infrasturture: + + - Check exhaustive `bazel_tools_cc README <https://github.com/eclipse-score/bazel-tools-cc/blob/main/README.md>`_ and an + `example project <https://github.com/eclipse-score/bazel-tools-cc/tree/main/test>`_ for instructions how to set-up + clang-tidy checks for your module + - In the upcoming releases clang-tidy will be extended with custom S-CORE checks to meet necessary process requirements. +- Platform functionality was extended with `logging daemon <#logging-daemon>`_. Software Development Process status @@ -145,8 +152,34 @@ Orchestrator - `Orchestrator scope and design <https://github.com/eclipse-score/orchestrator/blob/main/src/orchestration/doc/features.md>`__ - `Orchestrator examples <https://github.com/eclipse-score/orchestrator/tree/main/src/orchestration/examples>`__ +Logging Daemon +~~~~~~~~~~~~~~~~~~ + +**Improvements** + +The Eclipse SCORE Logging module provides a comprehensive logging framework for automotive embedded systems, +featuring remote DLT (Diagnostic Log and Trace) capabilities with high-performance, lock-free communication +between applications and the datarouter daemon. + +This is the initial open-source release of the logging framework, +consolidating the complete project structure with build system, dependencies, +and tooling for integration into Eclipse SCORE projects. + +The module is designed for Bazel-based builds and provides both the middleware logging +library (score/mw/log) that includes all supported recorders with respective backends and +the datarouter daemon (score/datarouter). The shared memory implementation between the middleware +library and datarouter daemon guarantees Freedom From Interference (FFI), +enabling safe logging from real-time and safety-critical contexts. + +:Version: ``logging v0.0.3`` +:Source / tag: `logging release <https://github.com/eclipse-score/logging/archive/refs/tags/v0.0.3.tar.gz>`__ +:Further reading: See below + + - `Logging release notes <https://github.com/eclipse-score/logging/releases/tag/v0.0.3>`__ + - `Logging ReadMe <https://github.com/eclipse-score/logging/tree/main/score/datarouter>`__ + Kyron -~~~~~~ +~~~~~~~~~~~~~~ **Improvements** From b76be2b6ca8f7895fe2dec5dd599bd7a91af5b8c Mon Sep 17 00:00:00 2001 From: "markus.schu" <markus.schu@accenture.com> Date: Fri, 19 Dec 2025 12:35:22 +0100 Subject: [PATCH 093/214] replace maturity link for process with current status image --- .../_assets/score_process_area_overview.drawio.svg | 4 ++++ .../score_releases/score_releases/score_v0_5_beta.rst | 11 ++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 docs/score_releases/_assets/score_process_area_overview.drawio.svg diff --git a/docs/score_releases/_assets/score_process_area_overview.drawio.svg b/docs/score_releases/_assets/score_process_area_overview.drawio.svg new file mode 100644 index 00000000000..6bfc2a76b5f --- /dev/null +++ b/docs/score_releases/_assets/score_process_area_overview.drawio.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Do not edit this file with editors other than draw.io --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1019px" height="1111px" viewBox="-0.5 -0.5 1019 1111" content="<mxfile host="Electron" modified="2025-12-16T09:59:37.869Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.6.5 Chrome/114.0.5735.243 Electron/25.3.1 Safari/537.36" etag="z4vkbFWl28wgfiui7sJG" version="21.6.5" type="device"> <diagram id="9aBNZYUphsUlN37Ga501" name="Page-1"> <mxGraphModel dx="2734" dy="1800" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> <mxCell id="3" value="&lt;b&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Process Areas - Support&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&lt;/b&gt;" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="-1658" y="-329" width="970" height="90" as="geometry" /> </mxCell> <mxCell id="4" value="&lt;b&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Process Areas - Development&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&lt;/b&gt;" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="-1658" y="-455" width="970" height="120" as="geometry" /> </mxCell> <mxCell id="5" value="&lt;span style=&quot;&quot;&gt;Introduction&lt;/span&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1"> <mxGeometry x="-1658" y="-620" width="970" height="30" as="geometry" /> </mxCell> <mxCell id="6" value="&lt;b&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Process Areas - Management&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&lt;/b&gt;" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="-1658" y="-550" width="970" height="90" as="geometry" /> </mxCell> <mxCell id="7" value="Requirements&lt;br style=&quot;font-size: 10px;&quot;&gt;Engineering" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;fontSize=10;verticalAlign=middle;" parent="1" vertex="1"> <mxGeometry x="-1648" y="-428" width="70" height="80" as="geometry" /> </mxCell> <mxCell id="8" value="Safety&lt;br style=&quot;font-size: 10px;&quot;&gt;Management" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;fontSize=10;verticalAlign=middle;" parent="1" vertex="1"> <mxGeometry x="-1568" y="-515" width="70" height="50" as="geometry" /> </mxCell> <mxCell id="9" value="Change Management&lt;br&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;fontSize=10;verticalAlign=middle;" parent="1" vertex="1"> <mxGeometry x="-1328" y="-515" width="70" height="50" as="geometry" /> </mxCell> <mxCell id="10" value="Documentation&lt;br style=&quot;font-size: 10px;&quot;&gt;Management" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;fontSize=10;" parent="1" vertex="1"> <mxGeometry x="-1488" y="-302" width="70" height="50" as="geometry" /> </mxCell> <mxCell id="11" value="&lt;span style=&quot;&quot;&gt;General Concepts&lt;/span&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1"> <mxGeometry x="-1658" y="-586" width="970" height="30" as="geometry" /> </mxCell> <mxCell id="12" value="&lt;span style=&quot;&quot;&gt;Standards&lt;/span&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1"> <mxGeometry x="-1658" y="-129" width="970" height="30" as="geometry" /> </mxCell> <mxCell id="13" value="&lt;span style=&quot;&quot;&gt;Roles&lt;/span&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1"> <mxGeometry x="-1658" y="-233" width="970" height="30" as="geometry" /> </mxCell> <mxCell id="14" value="&lt;br style=&quot;font-size: 10px;&quot;&gt;&lt;br style=&quot;font-size: 10px;&quot;&gt;Architecture&lt;br style=&quot;font-size: 10px;&quot;&gt;&lt;br style=&quot;font-size: 10px;&quot;&gt;&lt;br style=&quot;font-size: 10px;&quot;&gt;&lt;br style=&quot;font-size: 10px;&quot;&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;verticalAlign=middle;fontSize=10;" parent="1" vertex="1"> <mxGeometry x="-1568" y="-428" width="70" height="80" as="geometry" /> </mxCell> <mxCell id="15" value="&lt;font style=&quot;font-size: 10px;&quot;&gt;&lt;font style=&quot;font-size: 10px;&quot;&gt;&lt;br style=&quot;font-size: 10px;&quot;&gt;Imple-mentation&lt;/font&gt;&lt;br style=&quot;font-size: 10px;&quot;&gt;&lt;span style=&quot;font-size: 10px;&quot;&gt;(Detailed Design, &lt;/span&gt;&lt;br style=&quot;font-size: 10px;&quot;&gt;&lt;span style=&quot;font-size: 10px;&quot;&gt;Coding)&lt;/span&gt;&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=10;" parent="1" vertex="1"> <mxGeometry x="-1488" y="-428" width="70" height="80" as="geometry" /> </mxCell> <mxCell id="16" value="Problem Resolution" style="rounded=0;whiteSpace=wrap;html=1;fontSize=10;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1"> <mxGeometry x="-1248" y="-515" width="70" height="50" as="geometry" /> </mxCell> <mxCell id="17" value="ML 4" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#008a00;strokeColor=#005700;fontColor=#ffffff;" parent="1" vertex="1"> <mxGeometry x="-1658" y="386" width="60" height="54" as="geometry" /> </mxCell> <mxCell id="18" value="ML 2" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1"> <mxGeometry x="-1658" y="226" width="60" height="54" as="geometry" /> </mxCell> <mxCell id="19" value="ML 1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1"> <mxGeometry x="-1658" y="146" width="60" height="54" as="geometry" /> </mxCell> <mxCell id="20" value="Verification&lt;br style=&quot;font-size: 10px;&quot;&gt;&lt;br style=&quot;font-size: 10px;&quot;&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=10;" parent="1" vertex="1"> <mxGeometry x="-1408" y="-428" width="70" height="80" as="geometry" /> </mxCell> <mxCell id="21" value="Configuration&lt;br style=&quot;font-size: 10px;&quot;&gt;Management" style="rounded=0;whiteSpace=wrap;html=1;fontSize=10;fillColor=#e1d5e7;strokeColor=#9673a6;verticalAlign=middle;" parent="1" vertex="1"> <mxGeometry x="-1648" y="-302" width="70" height="50" as="geometry" /> </mxCell> <mxCell id="22" value="Tool&lt;br style=&quot;font-size: 10px;&quot;&gt;Management" style="rounded=0;whiteSpace=wrap;html=1;fontSize=10;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1"> <mxGeometry x="-1568" y="-302" width="70" height="50" as="geometry" /> </mxCell> <mxCell id="23" value="Quality&lt;br style=&quot;font-size: 10px;&quot;&gt;Management" style="rounded=0;whiteSpace=wrap;html=1;fontSize=10;fillColor=#e1d5e7;strokeColor=#9673a6;verticalAlign=middle;" parent="1" vertex="1"> <mxGeometry x="-1408" y="-515" width="70" height="50" as="geometry" /> </mxCell> <mxCell id="24" value="Platform&lt;br style=&quot;font-size: 10px;&quot;&gt;Management" style="rounded=0;whiteSpace=wrap;html=1;fontSize=10;fillColor=#e1d5e7;strokeColor=#9673a6;verticalAlign=middle;" parent="1" vertex="1"> <mxGeometry x="-1648" y="-515" width="70" height="50" as="geometry" /> </mxCell> <mxCell id="25" value="&lt;b&gt;Maturity Level&lt;/b&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> <mxGeometry x="-1668" y="16" width="100" height="30" as="geometry" /> </mxCell> <mxCell id="26" value="ML 0" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="-1658" y="66" width="60" height="54" as="geometry" /> </mxCell> <mxCell id="27" value="&lt;br style=&quot;font-size: 10px;&quot;&gt;Safety&lt;br style=&quot;font-size: 10px;&quot;&gt;Analysis&lt;br style=&quot;font-size: 10px;&quot;&gt;&lt;br style=&quot;font-size: 10px;&quot;&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;fontSize=10;" parent="1" vertex="1"> <mxGeometry x="-1328" y="-428" width="70" height="80" as="geometry" /> </mxCell> <mxCell id="28" value="&lt;span style=&quot;&quot;&gt;Work Products&lt;/span&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1"> <mxGeometry x="-1658" y="-199" width="970" height="30" as="geometry" /> </mxCell> <mxCell id="29" value="&lt;span style=&quot;&quot;&gt;Workflows&lt;/span&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1"> <mxGeometry x="-1658" y="-165" width="970" height="30" as="geometry" /> </mxCell> <mxCell id="30" value="ML 3" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1"> <mxGeometry x="-1658" y="306" width="60" height="54" as="geometry" /> </mxCell> <mxCell id="31" value="&lt;b&gt;Plan&lt;/b&gt; -&amp;nbsp;&lt;br&gt;&lt;span style=&quot;color: rgb(51, 51, 51);&quot;&gt;Process definition&amp;nbsp;planned&lt;br&gt;Documents not available&amp;nbsp;&lt;/span&gt;or most empty" style="rounded=0;whiteSpace=wrap;html=1;align=left;" parent="1" vertex="1"> <mxGeometry x="-1578" y="66" width="920" height="54" as="geometry" /> </mxCell> <mxCell id="32" value="&lt;b&gt;Initial&lt;/b&gt; -&amp;nbsp;&lt;br&gt;&lt;span style=&quot;background-color: initial;&quot;&gt;Process definition in&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: initial;&quot;&gt;place, but not yet compliant,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: center;&quot;&gt;consistency across S-CORE platform, modules and repeatability of processes may not be possible.&lt;br&gt;Documents are mostly available, main parts done, principles clear, all top level questions addressed, well structured.&lt;br&gt;&lt;/span&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;align=left;" parent="1" vertex="1"> <mxGeometry x="-1578" y="146" width="928" height="54" as="geometry" /> </mxCell> <mxCell id="33" value="&lt;b&gt;Managed&lt;/b&gt; -&lt;br&gt;&lt;span style=&quot;color: rgb(0, 0, 0); background-color: initial;&quot;&gt;Process definition in place but not&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0); background-color: initial;&quot;&gt;yet deployed in S-CORE, but&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: center;&quot;&gt;execution would allow consistency across S-CORE platform and modules, repeatability of processes possible&lt;br&gt;Documents are complete, documented on a comprehensible systematic approach, verified, only minor questions open, Process requirements (of highest priority) enforced by implemented Tool Requirements (or a feasible manual work around is defined).&lt;br&gt;&lt;/span&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;align=left;" parent="1" vertex="1"> <mxGeometry x="-1578" y="226" width="928" height="54" as="geometry" /> </mxCell> <mxCell id="34" value="&lt;b&gt;Defined/Practiced&lt;/b&gt; -&amp;nbsp;&lt;br&gt;&lt;span style=&quot;color: rgb(0, 0, 0); background-color: initial;&quot;&gt;Deployed (at least once) in S-CORE platform or one Module,&amp;nbsp;&lt;/span&gt;&lt;font color=&quot;#000000&quot;&gt;The processes have been practiced, and evidence exists to demonstrate that this has occurred.&amp;nbsp;&lt;/font&gt;&lt;br&gt;&lt;font color=&quot;#000000&quot;&gt;Documents are complete, verified and released, Process Requirements (of high/ medium priority)&amp;nbsp;&lt;/font&gt;&lt;span style=&quot;text-align: center;&quot;&gt;enforced by implemented Tool Requirements, Tool evaluation performed&lt;/span&gt;&lt;span style=&quot;text-align: center;&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;br&gt;&amp;nbsp;Initial Safety Audit passed.&lt;/font&gt;&lt;br&gt;&lt;/span&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;align=left;" parent="1" vertex="1"> <mxGeometry x="-1578" y="306" width="928" height="54" as="geometry" /> </mxCell> <mxCell id="35" value="Improving -&amp;nbsp;&lt;br&gt;&lt;span style=&quot;background-color: initial;&quot;&gt;Deployed on S-CORE platform and various S-CORE Modules and&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: initial;&quot;&gt;constantly improving, u&lt;/span&gt;&lt;span style=&quot;text-align: center;&quot;&gt;sing suitable process metrics, S-CORE commiter control the effectiveness and performance of the platform and modules and demonstrate continuous improvement in these areas. Tool qualification available.&lt;/span&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#008a00;strokeColor=#005700;fontColor=#FFFFFF;align=left;" parent="1" vertex="1"> <mxGeometry x="-1578" y="386" width="928" height="54" as="geometry" /> </mxCell> <mxCell id="36" value="Release&lt;br style=&quot;font-size: 10px;&quot;&gt;Management" style="rounded=0;whiteSpace=wrap;html=1;fontSize=10;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1"> <mxGeometry x="-1168" y="-515" width="70" height="50" as="geometry" /> </mxCell> <mxCell id="37" value="&lt;span style=&quot;&quot;&gt;Trustable&lt;/span&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1"> <mxGeometry x="-1658" y="-95" width="970" height="30" as="geometry" /> </mxCell> <mxCell id="38" value="&lt;span style=&quot;&quot;&gt;Folder Templates&lt;/span&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=1;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1"> <mxGeometry x="-1658" y="-61" width="970" height="30" as="geometry" /> </mxCell> <mxCell id="39" value="Security&lt;br style=&quot;font-size: 10px;&quot;&gt;Management" style="rounded=0;whiteSpace=wrap;html=1;fontSize=10;fillColor=#fff2cc;strokeColor=#d6b656;verticalAlign=middle;" parent="1" vertex="1"> <mxGeometry x="-1488" y="-515" width="70" height="50" as="geometry" /> </mxCell> <mxCell id="40" value="Security&lt;br style=&quot;font-size: 10px;&quot;&gt;Analysis" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=10;" parent="1" vertex="1"> <mxGeometry x="-1248" y="-428" width="70" height="80" as="geometry" /> </mxCell> </root> </mxGraphModel> </diagram> </mxfile> "><defs/><g><rect x="10" y="341" width="970" height="90" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 968px; height: 1px; padding-top: 386px; margin-left: 11px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b><br /><br /><br /><br /><br /><br /><br />Process Areas - Support<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /> </b></div></div></div></foreignObject><text x="495" y="390" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Process Areas - Support...</text></switch></g><rect x="10" y="215" width="970" height="120" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 968px; height: 1px; padding-top: 275px; margin-left: 11px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b><br /><br /><br /><br />Process Areas - Development<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /> </b></div></div></div></foreignObject><text x="495" y="279" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Process Areas - Development...</text></switch></g><rect x="10" y="50" width="970" height="30" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 968px; height: 1px; padding-top: 65px; margin-left: 11px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><span style="">Introduction</span></div></div></div></foreignObject><text x="495" y="69" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" font-weight="bold">Introduction</text></switch></g><rect x="10" y="120" width="970" height="90" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 968px; height: 1px; padding-top: 165px; margin-left: 11px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b><br /><br /><br /><br /><br /><br /><br /><br /><br />Process Areas - Management<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /> </b></div></div></div></foreignObject><text x="495" y="169" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Process Areas - Management...</text></switch></g><rect x="20" y="242" width="70" height="80" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 282px; margin-left: 21px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Requirements<br style="font-size: 10px;" />Engineering</div></div></div></foreignObject><text x="55" y="285" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px" text-anchor="middle">Requirements...</text></switch></g><rect x="100" y="155" width="70" height="50" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 180px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Safety<br style="font-size: 10px;" />Management</div></div></div></foreignObject><text x="135" y="183" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px" text-anchor="middle">Safety...</text></switch></g><rect x="340" y="155" width="70" height="50" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 180px; margin-left: 341px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Change Management<br /></div></div></div></foreignObject><text x="375" y="183" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px" text-anchor="middle">Change Managem...</text></switch></g><rect x="180" y="368" width="70" height="50" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 393px; margin-left: 181px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Documentation<br style="font-size: 10px;" />Management</div></div></div></foreignObject><text x="215" y="396" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px" text-anchor="middle">Documentation...</text></switch></g><rect x="10" y="84" width="970" height="30" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 968px; height: 1px; padding-top: 99px; margin-left: 11px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><span style="">General Concepts</span></div></div></div></foreignObject><text x="495" y="103" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" font-weight="bold">General Concepts</text></switch></g><rect x="10" y="541" width="970" height="30" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 968px; height: 1px; padding-top: 556px; margin-left: 11px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><span style="">Standards</span></div></div></div></foreignObject><text x="495" y="560" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" font-weight="bold">Standards</text></switch></g><rect x="10" y="437" width="970" height="30" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 968px; height: 1px; padding-top: 452px; margin-left: 11px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><span style="">Roles</span></div></div></div></foreignObject><text x="495" y="456" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" font-weight="bold">Roles</text></switch></g><rect x="100" y="242" width="70" height="80" fill="#fff2cc" stroke="#d6b656" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 282px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><br style="font-size: 10px;" /><br style="font-size: 10px;" />Architecture<br style="font-size: 10px;" /><br style="font-size: 10px;" /><br style="font-size: 10px;" /><br style="font-size: 10px;" /></div></div></div></foreignObject><text x="135" y="285" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px" text-anchor="middle">Architecture...</text></switch></g><rect x="180" y="242" width="70" height="80" fill="#fff2cc" stroke="#d6b656" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 282px; margin-left: 181px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font style="font-size: 10px;"><font style="font-size: 10px;"><br style="font-size: 10px;" />Imple-mentation</font><br style="font-size: 10px;" /><span style="font-size: 10px;">(Detailed Design, </span><br style="font-size: 10px;" /><span style="font-size: 10px;">Coding)</span></font></div></div></div></foreignObject><text x="215" y="285" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px" text-anchor="middle">Imple-mentatio...</text></switch></g><rect x="420" y="155" width="70" height="50" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 180px; margin-left: 421px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Problem Resolution</div></div></div></foreignObject><text x="455" y="183" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px" text-anchor="middle">Problem Resolu...</text></switch></g><rect x="10" y="1056" width="60" height="54" fill="#008a00" stroke="#005700" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 1083px; margin-left: 11px;"><div data-drawio-colors="color: #ffffff; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ML 4</div></div></div></foreignObject><text x="40" y="1087" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">ML 4</text></switch></g><rect x="10" y="896" width="60" height="54" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 923px; margin-left: 11px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ML 2</div></div></div></foreignObject><text x="40" y="927" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ML 2</text></switch></g><rect x="10" y="816" width="60" height="54" fill="#fff2cc" stroke="#d6b656" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 843px; margin-left: 11px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ML 1</div></div></div></foreignObject><text x="40" y="847" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ML 1</text></switch></g><rect x="260" y="242" width="70" height="80" fill="#fff2cc" stroke="#d6b656" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 282px; margin-left: 261px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Verification<br style="font-size: 10px;" /><br style="font-size: 10px;" /></div></div></div></foreignObject><text x="295" y="285" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px" text-anchor="middle">Verification...</text></switch></g><rect x="20" y="368" width="70" height="50" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 393px; margin-left: 21px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Configuration<br style="font-size: 10px;" />Management</div></div></div></foreignObject><text x="55" y="396" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px" text-anchor="middle">Configuration...</text></switch></g><rect x="100" y="368" width="70" height="50" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 393px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Tool<br style="font-size: 10px;" />Management</div></div></div></foreignObject><text x="135" y="396" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px" text-anchor="middle">Tool...</text></switch></g><rect x="260" y="155" width="70" height="50" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 180px; margin-left: 261px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Quality<br style="font-size: 10px;" />Management</div></div></div></foreignObject><text x="295" y="183" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px" text-anchor="middle">Quality...</text></switch></g><rect x="20" y="155" width="70" height="50" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 180px; margin-left: 21px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Platform<br style="font-size: 10px;" />Management</div></div></div></foreignObject><text x="55" y="183" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px" text-anchor="middle">Platform...</text></switch></g><rect x="0" y="686" width="100" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 701px; margin-left: 50px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><b>Maturity Level</b></div></div></div></foreignObject><text x="50" y="705" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Maturity Level</text></switch></g><rect x="10" y="736" width="60" height="54" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 763px; margin-left: 11px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ML 0</div></div></div></foreignObject><text x="40" y="767" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ML 0</text></switch></g><rect x="340" y="242" width="70" height="80" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 282px; margin-left: 341px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><br style="font-size: 10px;" />Safety<br style="font-size: 10px;" />Analysis<br style="font-size: 10px;" /><br style="font-size: 10px;" /></div></div></div></foreignObject><text x="375" y="285" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px" text-anchor="middle">Safety...</text></switch></g><rect x="10" y="471" width="970" height="30" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 968px; height: 1px; padding-top: 486px; margin-left: 11px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><span style="">Work Products</span></div></div></div></foreignObject><text x="495" y="490" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" font-weight="bold">Work Products</text></switch></g><rect x="10" y="505" width="970" height="30" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 968px; height: 1px; padding-top: 520px; margin-left: 11px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><span style="">Workflows</span></div></div></div></foreignObject><text x="495" y="524" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" font-weight="bold">Workflows</text></switch></g><rect x="10" y="976" width="60" height="54" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 1003px; margin-left: 11px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ML 3</div></div></div></foreignObject><text x="40" y="1007" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ML 3</text></switch></g><rect x="90" y="736" width="920" height="54" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 918px; height: 1px; padding-top: 763px; margin-left: 92px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Plan</b> - <br /><span style="color: rgb(51, 51, 51);">Process definition planned<br />Documents not available </span>or most empty</div></div></div></foreignObject><text x="92" y="767" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">Plan -...</text></switch></g><rect x="90" y="816" width="928" height="54" fill="#fff2cc" stroke="#d6b656" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 926px; height: 1px; padding-top: 843px; margin-left: 92px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Initial</b> - <br /><span style="background-color: initial;">Process definition in </span><span style="background-color: initial;">place, but not yet compliant, </span><span style="text-align: center;">consistency across S-CORE platform, modules and repeatability of processes may not be possible.<br />Documents are mostly available, main parts done, principles clear, all top level questions addressed, well structured.<br /></span></div></div></div></foreignObject><text x="92" y="847" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">Initial -...</text></switch></g><rect x="90" y="896" width="928" height="54" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 926px; height: 1px; padding-top: 923px; margin-left: 92px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Managed</b> -<br /><span style="color: rgb(0, 0, 0); background-color: initial;">Process definition in place but not </span><span style="color: rgb(0, 0, 0); background-color: initial;">yet deployed in S-CORE, but </span><span style="text-align: center;">execution would allow consistency across S-CORE platform and modules, repeatability of processes possible<br />Documents are complete, documented on a comprehensible systematic approach, verified, only minor questions open, Process requirements (of highest priority) enforced by implemented Tool Requirements (or a feasible manual work around is defined).<br /></span></div></div></div></foreignObject><text x="92" y="927" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">Managed -...</text></switch></g><rect x="90" y="976" width="928" height="54" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 926px; height: 1px; padding-top: 1003px; margin-left: 92px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Defined/Practiced</b> - <br /><span style="color: rgb(0, 0, 0); background-color: initial;">Deployed (at least once) in S-CORE platform or one Module, </span><font color="#000000">The processes have been practiced, and evidence exists to demonstrate that this has occurred. </font><br /><font color="#000000">Documents are complete, verified and released, Process Requirements (of high/ medium priority) </font><span style="text-align: center;">enforced by implemented Tool Requirements, Tool evaluation performed</span><span style="text-align: center;"><font color="#000000"><br /> Initial Safety Audit passed.</font><br /></span></div></div></div></foreignObject><text x="92" y="1007" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">Defined/Practiced -...</text></switch></g><rect x="90" y="1056" width="928" height="54" fill="#008a00" stroke="#005700" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 926px; height: 1px; padding-top: 1083px; margin-left: 92px;"><div data-drawio-colors="color: #FFFFFF; " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Improving - <br /><span style="background-color: initial;">Deployed on S-CORE platform and various S-CORE Modules and </span><span style="background-color: initial;">constantly improving, u</span><span style="text-align: center;">sing suitable process metrics, S-CORE commiter control the effectiveness and performance of the platform and modules and demonstrate continuous improvement in these areas. Tool qualification available.</span></div></div></div></foreignObject><text x="92" y="1087" fill="#FFFFFF" font-family="Helvetica" font-size="12px">Improving -...</text></switch></g><rect x="500" y="155" width="70" height="50" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 180px; margin-left: 501px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Release<br style="font-size: 10px;" />Management</div></div></div></foreignObject><text x="535" y="183" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px" text-anchor="middle">Release...</text></switch></g><rect x="10" y="575" width="970" height="30" fill="#fff2cc" stroke="#d6b656" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 968px; height: 1px; padding-top: 590px; margin-left: 11px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><span style="">Trustable</span></div></div></div></foreignObject><text x="495" y="594" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" font-weight="bold">Trustable</text></switch></g><rect x="10" y="609" width="970" height="30" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 968px; height: 1px; padding-top: 624px; margin-left: 11px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><span style="">Folder Templates</span></div></div></div></foreignObject><text x="495" y="628" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" font-weight="bold">Folder Templates</text></switch></g><rect x="180" y="155" width="70" height="50" fill="#fff2cc" stroke="#d6b656" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 180px; margin-left: 181px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Security<br style="font-size: 10px;" />Management</div></div></div></foreignObject><text x="215" y="183" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px" text-anchor="middle">Security...</text></switch></g><rect x="420" y="242" width="70" height="80" fill="#fff2cc" stroke="#d6b656" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 282px; margin-left: 421px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Security<br style="font-size: 10px;" />Analysis</div></div></div></foreignObject><text x="455" y="285" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px" text-anchor="middle">Security...</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> diff --git a/docs/score_releases/score_releases/score_v0_5_beta.rst b/docs/score_releases/score_releases/score_v0_5_beta.rst index 303c0d77300..be001ad3395 100644 --- a/docs/score_releases/score_releases/score_v0_5_beta.rst +++ b/docs/score_releases/score_releases/score_v0_5_beta.rst @@ -70,11 +70,11 @@ This does include - Improved doc-as-code and process description - `bazel_tools_cc <https://github.com/eclipse-score/bazel-tools-cc>`_ introduces a clang-tidy integration into S-CORE bazel infrasturture: - - Check exhaustive `bazel_tools_cc README <https://github.com/eclipse-score/bazel-tools-cc/blob/main/README.md>`_ and an + - Check exhaustive `bazel_tools_cc README <https://github.com/eclipse-score/bazel-tools-cc/blob/main/README.md>`_ and an `example project <https://github.com/eclipse-score/bazel-tools-cc/tree/main/test>`_ for instructions how to set-up clang-tidy checks for your module - In the upcoming releases clang-tidy will be extended with custom S-CORE checks to meet necessary process requirements. -- Platform functionality was extended with `logging daemon <#logging-daemon>`_. +- Platform functionality was extended with `logging daemon <#logging-daemon>`_. Software Development Process status @@ -241,7 +241,12 @@ in the automotive domain, suitable for safety and security contexts. - ISO PAS 8926 - **Release notes**: `process_description release notes <https://github.com/eclipse-score/process_description/releases/tag/v1.4.0>`_ -- **Process maturity**: `process_description maturity levels <https://eclipse-score.github.io/process_description/main/>`_ +- **Process maturity overview**: + +.. figure:: ../_assets/score_process_area_overview.drawio.svg + :width: 100% + :align: center + :alt: Process area overview for the **Project** docs-as-code ~~~~~~~~~~~~~~ From f87217bc849eb29b1e96631500a339556d55dce5 Mon Sep 17 00:00:00 2001 From: Anton Krivoborodov <Anton.Krivoborodov@bmw.de> Date: Fri, 19 Dec 2025 12:55:42 +0100 Subject: [PATCH 094/214] add baselibs release notes --- .../score_releases/score_v0_5_beta.rst | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/score_releases/score_releases/score_v0_5_beta.rst b/docs/score_releases/score_releases/score_v0_5_beta.rst index be001ad3395..6fe48deecb8 100644 --- a/docs/score_releases/score_releases/score_v0_5_beta.rst +++ b/docs/score_releases/score_releases/score_v0_5_beta.rst @@ -108,10 +108,14 @@ https://github.com/eclipse-score/score/issues?q=is%3Aissue%20state%3Aclosed%20ty Integrated Software Modules ----------------------------- - Baselibs ~~~~~~~~~~~~~ -TBD +Selection of basic C++ utility libraries for common use in the S-CORE project + +- **Version:** ``baselibs v0.2.2`` +- **Source / tag:** `Baselibs GitHub release <https://github.com/eclipse-score/baselibs/archive/refs/tags/v0.2.2.tar.gz>`_ +- **Release notes**: `Baselibs release notes <https://github.com/eclipse-score/baselibs/releases/tag/v0.2.2>`_ + Communication ~~~~~~~~~~~~~ @@ -158,8 +162,8 @@ Logging Daemon **Improvements** The Eclipse SCORE Logging module provides a comprehensive logging framework for automotive embedded systems, -featuring remote DLT (Diagnostic Log and Trace) capabilities with high-performance, lock-free communication -between applications and the datarouter daemon. +featuring remote DLT (Diagnostic Log and Trace) capabilities with +lock-free communication between applications and the datarouter daemon. This is the initial open-source release of the logging framework, consolidating the complete project structure with build system, dependencies, From 4623422bbba6a3a92c79c4c3d37ff182623b7c80 Mon Sep 17 00:00:00 2001 From: Anton Krivoborodov <Anton.Krivoborodov@bmw.de> Date: Fri, 19 Dec 2025 13:19:50 +0100 Subject: [PATCH 095/214] further improvement --- .../score_releases/score_v0_5_beta.rst | 70 +++++++++---------- 1 file changed, 32 insertions(+), 38 deletions(-) diff --git a/docs/score_releases/score_releases/score_v0_5_beta.rst b/docs/score_releases/score_releases/score_v0_5_beta.rst index 6fe48deecb8..669febdf07e 100644 --- a/docs/score_releases/score_releases/score_v0_5_beta.rst +++ b/docs/score_releases/score_releases/score_v0_5_beta.rst @@ -66,7 +66,7 @@ This does include - Static code analysis with CodeQL MISRA C++ 2023: `release link <https://github.com/eclipse-score/reference_integration/releases/tag/v0.5.0-beta>`. - Execution of Unit tests as part of the Reference Integration `test_integration workflow <https://github.com/eclipse-score/reference_integration/blob/main/.github/workflows/test_integration.yml>`_. - Unit-test coverage measurement results are now automatically part of Release Assests for every component: **//TODO:** link to an example. -- A new combined build toolchain of qcc and gcc, see `bazel_cpp_toolchain <#bazel-cpp-toolchain>`_. +- A new combined build toolchain of qcc and gcc, see :ref:`bazel-cpp-toolchain <bazel_cpp_toolchain>`. - Improved doc-as-code and process description - `bazel_tools_cc <https://github.com/eclipse-score/bazel-tools-cc>`_ introduces a clang-tidy integration into S-CORE bazel infrasturture: @@ -74,25 +74,7 @@ This does include `example project <https://github.com/eclipse-score/bazel-tools-cc/tree/main/test>`_ for instructions how to set-up clang-tidy checks for your module - In the upcoming releases clang-tidy will be extended with custom S-CORE checks to meet necessary process requirements. -- Platform functionality was extended with `logging daemon <#logging-daemon>`_. - - -Software Development Process status -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The following image provides an overview of the current status of the software development process, the associated tooling, -and the progress of its application to the software modules. - -.. image:: https://raw.githubusercontent.com/eclipse-score/process_description/bec1931b56464543cb70385e75c15fcb1625f0d0/process/_assets/score_process_area_overview.drawio.svg - :width: 1000 - :alt: Architecture overview - :align: center - - -| - -For more details please refer to -`Documentation Management Plan <https://eclipse-score.github.io/score/main/platform_management_plan/documentation_management.html>`_, that -provides overview on the process workproduct level for every software module and process area. +- Platform functionality was extended with :ref:`logging daemon <logging_daemon>`. S-CORE Platform @@ -125,6 +107,7 @@ Zero-copy, shared-memory based inter-process communication for minimal-latency i - **Source / tag:** `Communication GitHub release <https://github.com/eclipse-score/communication/archive/refs/tags/v0.1.2.tar.gz>`_ - **Release notes:** :need:`doc__communication_release_note` + Fixed Execution Order Framework(FEO) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - **Version:** ``feo v0.1.2`` @@ -140,21 +123,7 @@ preserving application state and data integrity over time. - **Version:** ``persistency v0.2.2`` - **Source / tag:** `Persistency GitHub release <https://github.com/eclipse-score/persistency/archive/refs/tags/v0.2.2.tar.gz>`_ -Orchestrator -~~~~~~~~~~~~~ - -**Improvements** - -- Support `log` frontend exchange to: `log`, `tracing` or `score-log` (not yet implemented in this release) -- Increased CIT coverage and stability improvements -- Split of kyron into separate repositories: `orchestrator` and `kyron` - -:Version: ``orchestrator v0.0.4`` -:Source / tag: `Orchestrator GitHub release <https://github.com/eclipse-score/orchestrator/releases/tag/v0.0.4>`__ -:Further reading: See below - - - `Orchestrator scope and design <https://github.com/eclipse-score/orchestrator/blob/main/src/orchestration/doc/features.md>`__ - - `Orchestrator examples <https://github.com/eclipse-score/orchestrator/tree/main/src/orchestration/examples>`__ +.. _logging_daemon: Logging Daemon ~~~~~~~~~~~~~~~~~~ @@ -175,13 +144,31 @@ the datarouter daemon (score/datarouter). The shared memory implementation betwe library and datarouter daemon guarantees Freedom From Interference (FFI), enabling safe logging from real-time and safety-critical contexts. -:Version: ``logging v0.0.3`` -:Source / tag: `logging release <https://github.com/eclipse-score/logging/archive/refs/tags/v0.0.3.tar.gz>`__ -:Further reading: See below +- **Version:** ``logging v0.0.3`` +- **VSource / tag:** `logging release <https://github.com/eclipse-score/logging/archive/refs/tags/v0.0.3.tar.gz>`__ +- **Further reading:**: See below - `Logging release notes <https://github.com/eclipse-score/logging/releases/tag/v0.0.3>`__ - `Logging ReadMe <https://github.com/eclipse-score/logging/tree/main/score/datarouter>`__ + +Orchestrator +~~~~~~~~~~~~~ + +**Improvements** + +- Support `log` frontend exchange to: `log`, `tracing` or `score-log` (not yet implemented in this release) +- Increased CIT coverage and stability improvements +- Split of kyron into separate repositories: `orchestrator` and `kyron` + +:Version: ``orchestrator v0.0.4`` +:Source / tag: `Orchestrator GitHub release <https://github.com/eclipse-score/orchestrator/releases/tag/v0.0.4>`__ +:Further reading: See below + + - `Orchestrator scope and design <https://github.com/eclipse-score/orchestrator/blob/main/src/orchestration/doc/features.md>`__ + - `Orchestrator examples <https://github.com/eclipse-score/orchestrator/tree/main/src/orchestration/examples>`__ + + Kyron ~~~~~~~~~~~~~~ @@ -252,6 +239,11 @@ in the automotive domain, suitable for safety and security contexts. :align: center :alt: Process area overview for the **Project** +For more details please refer to +`Documentation Management Plan <https://eclipse-score.github.io/score/main/platform_management_plan/documentation_management.html>`_, that +provides process workproduct level overview for every software module and process area. + + docs-as-code ~~~~~~~~~~~~~~ Tooling for linking and generation of documentation. @@ -286,6 +278,8 @@ Test Scenarios - **Version:** ``Test Scenarios v0.3.1`` - **Source / tag:** `Test Scenarios GitHub release <https://github.com/eclipse-score/testing_tools/releases/tag/v0.3.1>`_ +.. _bazel_cpp_toolchain: + Bazel CPP Toolchain ~~~~~~~~~~~~~~~~~~~~ - **What is in** From cbdc05060c287fc17b8501e149268e2f818c42b4 Mon Sep 17 00:00:00 2001 From: Ulrich Huber <ulrich.uh.huber@bmw.de> Date: Fri, 19 Dec 2025 14:34:38 +0100 Subject: [PATCH 096/214] Add release notes for communication Signed-off-by: Ulrich Huber <ulrich.uh.huber@bmw.de> --- docs/score_releases/score_releases/score_v0_5_beta.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/score_releases/score_releases/score_v0_5_beta.rst b/docs/score_releases/score_releases/score_v0_5_beta.rst index 669febdf07e..ec431445ab3 100644 --- a/docs/score_releases/score_releases/score_v0_5_beta.rst +++ b/docs/score_releases/score_releases/score_v0_5_beta.rst @@ -107,6 +107,11 @@ Zero-copy, shared-memory based inter-process communication for minimal-latency i - **Source / tag:** `Communication GitHub release <https://github.com/eclipse-score/communication/archive/refs/tags/v0.1.2.tar.gz>`_ - **Release notes:** :need:`doc__communication_release_note` +**Improvements** + +- Enabled various code quality tools +- Extension of the Rust API (expect further extensive work on this API) +- Support explicit setting of application id in configuration (with fallback to PID) Fixed Execution Order Framework(FEO) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From e8c5cfbc4e4ae3fbb1d8844bf65574e51b50c049 Mon Sep 17 00:00:00 2001 From: "Frank Scholter Peres(MBTI)" <145544737+FScholPer@users.noreply.github.com> Date: Fri, 19 Dec 2025 17:12:13 +0100 Subject: [PATCH 097/214] Update CONTRIBUTION.md Co-authored-by: AndreasMittag <andreas.mittag@etas.com> Signed-off-by: Frank Scholter Peres(MBTI) <145544737+FScholPer@users.noreply.github.com> --- CONTRIBUTION.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTION.md b/CONTRIBUTION.md index 0700a9596bf..d8f89f084d3 100644 --- a/CONTRIBUTION.md +++ b/CONTRIBUTION.md @@ -42,7 +42,7 @@ Please refer to the [README.md](README.md) for further information. ### Getting involved #### Setup Phase -This phase is part of the eclipse Incubation Phase and shall establish all the processes needed for a safe development of functions. Only after this phase it will be possible to contribute code to the project. As the development in this project is driven by requirements, the processes and needed infrastructure incl. tooling will be established based on }[Non-functional Stakeholder_Requirements](https://eclipse-score.github.io/score/main/requirements/stakeholder/index.html). During setup phase the contributions are Bug Fixes and Improvements (both on processes and infrastructure). +This phase is part of the eclipse Incubation Phase and shall establish all the processes needed for a safe development of functions. Only after this phase it will be possible to contribute code to the project. As the development in this project is driven by requirements, the processes and needed infrastructure incl. tooling will be established based on [Non-functional Stakeholder_Requirements](https://eclipse-score.github.io/score/main/requirements/stakeholder/index.html). During setup phase the contributions are Bug Fixes and Improvements (both on processes and infrastructure). #### Bug Fixes and Improvements Improvements are adding/changing processes and infrastructure, bug fixes can be also on development work products like code. From a56b2f327c205a77b37d191917e1247028be3530 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres <frank.scholter_peres@mercedes-benz.com> Date: Fri, 19 Dec 2025 17:18:40 +0100 Subject: [PATCH 098/214] fixed review comments --- CODE_OF_CONDUCT.md | 93 ------------------- .../score_releases/score_v0_5_beta.rst | 14 +-- 2 files changed, 8 insertions(+), 99 deletions(-) delete mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index faa735b35e4..00000000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,93 +0,0 @@ -# Community Code of Conduct - -**Version 2.0 -January 1, 2023** - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as community members, contributors, Committers[^1], and Project Leads (collectively "Contributors") pledge to make participation in our projects and our community a harassment-free and inclusive experience for everyone. - -This Community Code of Conduct ("Code") outlines our behavior expectations as members of our community in all Eclipse Foundation activities, both offline and online. It is not intended to govern scenarios or behaviors outside of the scope of Eclipse Foundation activities. Nor is it intended to replace or supersede the protections offered to all our community members under the law. Please follow both the spirit and letter of this Code and encourage other Contributors to follow these principles into our work. Failure to read or acknowledge this Code does not excuse a Contributor from compliance with the Code. - -## Our Standards - -Examples of behavior that contribute to creating a positive and professional environment include: - -- Using welcoming and inclusive language; -- Actively encouraging all voices; -- Helping others bring their perspectives and listening actively. If you find yourself dominating a discussion, it is especially important to encourage other voices to join in; -- Being respectful of differing viewpoints and experiences; -- Gracefully accepting constructive criticism; -- Focusing on what is best for the community; -- Showing empathy towards other community members; -- Being direct but professional; and -- Leading by example by holding yourself and others accountable - -Examples of unacceptable behavior by Contributors include: - -- The use of sexualized language or imagery; -- Unwelcome sexual attention or advances; -- Trolling, insulting/derogatory comments, and personal or political attacks; -- Public or private harassment, repeated harassment; -- Publishing others' private information, such as a physical or electronic address, without explicit permission; -- Violent threats or language directed against another person; -- Sexist, racist, or otherwise discriminatory jokes and language; -- Posting sexually explicit or violent material; -- Sharing private content, such as emails sent privately or non-publicly, or unlogged forums such as IRC channel history; -- Personal insults, especially those using racist or sexist terms; -- Excessive or unnecessary profanity; -- Advocating for, or encouraging, any of the above behavior; and -- Other conduct which could reasonably be considered inappropriate in a professional setting - -## Our Responsibilities - -With the support of the Eclipse Foundation employees, consultants, officers, and directors (collectively, the "Staff"), Committers, and Project Leads, the Eclipse Foundation Conduct Committee (the "Conduct Committee") is responsible for clarifying the standards of acceptable behavior. The Conduct Committee takes appropriate and fair corrective action in response to any instances of unacceptable behavior. - -## Scope - -This Code applies within all Project, Working Group, and Interest Group spaces and communication channels of the Eclipse Foundation (collectively, "Eclipse spaces"), within any Eclipse-organized event or meeting, and in public spaces when an individual is representing an Eclipse Foundation Project, Working Group, Interest Group, or their communities. Examples of representing a Project or community include posting via an official social media account, personal accounts, or acting as an appointed representative at an online or offline event. Representation of Projects, Working Groups, and Interest Groups may be further defined and clarified by Committers, Project Leads, or the Staff. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the Conduct Committee via conduct@eclipse-foundation.org. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. Without the explicit consent of the reporter, the Conduct Committee is obligated to maintain confidentiality with regard to the reporter of an incident. The Conduct Committee is further obligated to ensure that the respondent is provided with sufficient information about the complaint to reply. If such details cannot be provided while maintaining confidentiality, the Conduct Committee will take the respondent‘s inability to provide a defense into account in its deliberations and decisions. Further details of enforcement guidelines may be posted separately. - -Staff, Committers and Project Leads have the right to report, remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code, or to block temporarily or permanently any Contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. Any such actions will be reported to the Conduct Committee for transparency and record keeping. - -Any Staff (including officers and directors of the Eclipse Foundation), Committers, Project Leads, or Conduct Committee members who are the subject of a complaint to the Conduct Committee will be recused from the process of resolving any such complaint. - -## Responsibility - -The responsibility for administering this Code rests with the Conduct Committee, with oversight by the Executive Director and the Board of Directors. For additional information on the Conduct Committee and its process, please write to <conduct@eclipse-foundation.org>. - -## Investigation of Potential Code Violations - -All conflict is not bad as a healthy debate may sometimes be necessary to push us to do our best. It is, however, unacceptable to be disrespectful or offensive, or violate this Code. If you see someone engaging in objectionable behavior violating this Code, we encourage you to address the behavior directly with those involved. If for some reason, you are unable to resolve the matter or feel uncomfortable doing so, or if the behavior is threatening or harassing, please report it following the procedure laid out below. - -Reports should be directed to <conduct@eclipse-foundation.org>. It is the Conduct Committee’s role to receive and address reported violations of this Code and to ensure a fair and speedy resolution. - -The Eclipse Foundation takes all reports of potential Code violations seriously and is committed to confidentiality and a full investigation of all allegations. The identity of the reporter will be omitted from the details of the report supplied to the accused. Contributors who are being investigated for a potential Code violation will have an opportunity to be heard prior to any final determination. Those found to have violated the Code can seek reconsideration of the violation and disciplinary action decisions. Every effort will be made to have all matters disposed of within 60 days of the receipt of the complaint. - -## Actions -Contributors who do not follow this Code in good faith may face temporary or permanent repercussions as determined by the Conduct Committee. - -This Code does not address all conduct. It works in conjunction with our [Communication Channel Guidelines](https://www.eclipse.org/org/documents/communication-channel-guidelines/), [Social Media Guidelines](https://www.eclipse.org/org/documents/social_media_guidelines.php), [Bylaws](https://www.eclipse.org/org/documents/eclipse-foundation-be-bylaws-en.pdf), and [Internal Rules](https://www.eclipse.org/org/documents/ef-be-internal-rules.pdf) which set out additional protections for, and obligations of, all contributors. The Foundation has additional policies that provide further guidance on other matters. - -It’s impossible to spell out every possible scenario that might be deemed a violation of this Code. Instead, we rely on one another’s good judgment to uphold a high standard of integrity within all Eclipse Spaces. Sometimes, identifying the right thing to do isn’t an easy call. In such a scenario, raise the issue as early as possible. - -## No Retaliation - -The Eclipse community relies upon and values the help of Contributors who identify potential problems that may need to be addressed within an Eclipse Space. Any retaliation against a Contributor who raises an issue honestly is a violation of this Code. That a Contributor has raised a concern honestly or participated in an investigation, cannot be the basis for any adverse action, including threats, harassment, or discrimination. If you work with someone who has raised a concern or provided information in an investigation, you should continue to treat the person with courtesy and respect. If you believe someone has retaliated against you, report the matter as described by this Code. Honest reporting does not mean that you have to be right when you raise a concern; you just have to believe that the information you are providing is accurate. - -False reporting, especially when intended to retaliate or exclude, is itself a violation of this Code and will not be accepted or tolerated. - -Everyone is encouraged to ask questions about this Code. Your feedback is welcome, and you will get a response within three business days. Write to <conduct@eclipse-foundation.org>. - -## Amendments - -The Eclipse Foundation Board of Directors may amend this Code from time to time and may vary the procedures it sets out where appropriate in a particular case. - -### Attribution - -This Code was inspired by the [Contributor Covenant](https://www.contributor-covenant.org/), version 1.4, available [here](https://www.contributor-covenant.org/version/1/4/code-of-conduct/). - -[^1]: Capitalized terms used herein without definition shall have the meanings assigned to them in the Bylaws. \ No newline at end of file diff --git a/docs/score_releases/score_releases/score_v0_5_beta.rst b/docs/score_releases/score_releases/score_v0_5_beta.rst index ec431445ab3..091e4b98031 100644 --- a/docs/score_releases/score_releases/score_v0_5_beta.rst +++ b/docs/score_releases/score_releases/score_v0_5_beta.rst @@ -205,12 +205,14 @@ Reference QNX image Reference Red Hat AutoSD Linux image (Experimental) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- Use sub-module structure -- os_images does not need to be a sub-module since it does not use bazel -- Use AutoSD tools to build RPMs (toolchain + bazelrc file) -- Use built RPMs in os_images -- Uses 0.5 modules, similar setup to upstream reference_instegration -- e2e workflow defined in github actions +- Uses AutoSD's toolchain to build and generate Lola RPMs +- Deploy RPMs into an AutoSD Image + +Pull requests: + +https://github.com/eclipse-score/reference_integration/pull/56 +https://github.com/eclipse-score/inc_os_autosd/pull/16 + Reference Elektrobit corbos Linux for Safety Applications Linux image (Experimental) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ From 96c3d34436fb6b75c8b3613468f9fda86ffea72f Mon Sep 17 00:00:00 2001 From: "Frank Scholter Peres(MBTI)" <145544737+FScholPer@users.noreply.github.com> Date: Fri, 19 Dec 2025 17:28:26 +0100 Subject: [PATCH 099/214] Update docs/handbook/own_application/index.rst Co-authored-by: Oliver Pajonk <oliver.pajonk@elektrobit.com> Signed-off-by: Frank Scholter Peres(MBTI) <145544737+FScholPer@users.noreply.github.com> --- docs/handbook/own_application/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/handbook/own_application/index.rst b/docs/handbook/own_application/index.rst index 3d7c0ba787c..336e2568443 100644 --- a/docs/handbook/own_application/index.rst +++ b/docs/handbook/own_application/index.rst @@ -116,7 +116,7 @@ Be aware that the version numbers change over time. Always check the latest vers common --@score-baselibs//score/json:base_library=nlohmann common --@communication//score/mw/com/flags:tracing_library=stub - common --registry=https://raw.githubusercontent.com/eclipse-score/bazel_registry/v0.5.0-alpha/ + common --registry=https://raw.githubusercontent.com/eclipse-score/bazel_registry/v0.5.0-beta/ common --registry=https://bcr.bazel.build From 88a8f802a60fdc3ba317063ee31f62e74b91b161 Mon Sep 17 00:00:00 2001 From: "Frank Scholter Peres(MBTI)" <145544737+FScholPer@users.noreply.github.com> Date: Fri, 19 Dec 2025 17:28:42 +0100 Subject: [PATCH 100/214] Update docs/handbook/own_application/index.rst Co-authored-by: Oliver Pajonk <oliver.pajonk@elektrobit.com> Signed-off-by: Frank Scholter Peres(MBTI) <145544737+FScholPer@users.noreply.github.com> --- docs/handbook/own_application/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/handbook/own_application/index.rst b/docs/handbook/own_application/index.rst index 336e2568443..52589de88ee 100644 --- a/docs/handbook/own_application/index.rst +++ b/docs/handbook/own_application/index.rst @@ -132,7 +132,7 @@ You can now either continue with this guide to create a minimal consumer-produce ------------ -1. Use it :) +2. Use it :) ------------ Once your project is set up, you can start sending and receiving messages. From df3033709ab1047bce55e76fe9792a9e122532aa Mon Sep 17 00:00:00 2001 From: "Frank Scholter Peres(MBTI)" <145544737+FScholPer@users.noreply.github.com> Date: Fri, 19 Dec 2025 17:30:58 +0100 Subject: [PATCH 101/214] Update docs/score_releases/score_releases/score_v0_5_beta.rst Co-authored-by: Oliver Pajonk <oliver.pajonk@elektrobit.com> Signed-off-by: Frank Scholter Peres(MBTI) <145544737+FScholPer@users.noreply.github.com> --- docs/score_releases/score_releases/score_v0_5_beta.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/score_releases/score_releases/score_v0_5_beta.rst b/docs/score_releases/score_releases/score_v0_5_beta.rst index 091e4b98031..2267d8100aa 100644 --- a/docs/score_releases/score_releases/score_v0_5_beta.rst +++ b/docs/score_releases/score_releases/score_v0_5_beta.rst @@ -85,7 +85,6 @@ S-CORE Platform - **Release notes**: `S-CORE Platform release notes <https://github.com/eclipse-score/score/releases/tag/v0.5.2>`_ -https://github.com/eclipse-score/score/issues?q=is%3Aissue%20state%3Aclosed%20type%3ABug Integrated Software Modules ----------------------------- From 754ef0ddf4cbc68667c1e54c3212a58ecda7837e Mon Sep 17 00:00:00 2001 From: "Frank Scholter Peres(MBTI)" <145544737+FScholPer@users.noreply.github.com> Date: Fri, 19 Dec 2025 23:33:51 +0100 Subject: [PATCH 102/214] Bump version to 0.5.2 (#2369) --- MODULE.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MODULE.bazel b/MODULE.bazel index 5475a238f02..3691be4f4c4 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -13,7 +13,7 @@ module( name = "score_platform", - version = "0.5.1", + version = "0.5.2", compatibility_level = 0, ) From f9f5ae662c4ed0d2851e7cb23ac398ec0e62ec4f Mon Sep 17 00:00:00 2001 From: Philipp Ahmann <philipp.ahmann@de.bosch.com> Date: Mon, 22 Dec 2025 19:18:23 +0000 Subject: [PATCH 103/214] Update language for gender neutrality in project management plan Signed-off-by: Philipp Ahmann <philipp.ahmann@de.bosch.com> --- docs/platform_management_plan/project_management.rst | 4 ++-- docs/platform_management_plan/release_management.rst | 2 +- docs/platform_management_plan/security_management.rst | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/platform_management_plan/project_management.rst b/docs/platform_management_plan/project_management.rst index 91584ae01d3..b6a567aee21 100644 --- a/docs/platform_management_plan/project_management.rst +++ b/docs/platform_management_plan/project_management.rst @@ -43,7 +43,7 @@ Steering of the project is done by two committees: *project lead circle* and *te * Election of Technical Leads. * Last instance of escalation path. - *Project lead circle* proposes and elects a *Project lead circle Assistant* and his deputy with bare majority, who is responsible for scheduling and announcing meetings, preparing and announcing agenda, writing meeting minutes and protocols. *Project lead circle* can reelect *Project lead circle Assistant* at any time. The *Project lead circle Assistant* and his deputy can resign anytime on their own will. + *Project lead circle* proposes and elects a *Project lead circle Assistant* and their deputy with bare majority, who is responsible for scheduling and announcing meetings, preparing and announcing agenda, writing meeting minutes and protocols. *Project lead circle* can reelect *Project lead circle Assistant* at any time. The *Project lead circle Assistant* and their deputy can resign anytime on their own will. * **Technical lead circle** @@ -54,7 +54,7 @@ Steering of the project is done by two committees: *project lead circle* and *te * High-level project control and coordination between multiple software modules. * Escalation instance for software module project leads and committers. - *Technical lead circle* proposes and elects a *Technical lead circle Assistant* and his deputy with bare majority during *Technical Lead Circle meeting*, who is responsible for scheduling and announcing meetings, preparing and announcing agenda, writing meeting minutes and protocols. *Technical lead circle* can reelect *Technical lead circle Assistant* at any time. The *Technical lead circle Assistant* and his deputy can resign anytime on their own will. + *Technical lead circle* proposes and elects a *Technical lead circle Assistant* and their deputy with bare majority during *Technical Lead Circle meeting*, who is responsible for scheduling and announcing meetings, preparing and announcing agenda, writing meeting minutes and protocols. *Technical lead circle* can reelect *Technical lead circle Assistant* at any time. The *Technical lead circle Assistant* and their deputy can resign anytime on their own will. .. _pmp_pm_technical_committees: diff --git a/docs/platform_management_plan/release_management.rst b/docs/platform_management_plan/release_management.rst index cb7524f5e42..493952d85e5 100644 --- a/docs/platform_management_plan/release_management.rst +++ b/docs/platform_management_plan/release_management.rst @@ -50,7 +50,7 @@ One release contains all the files of one repository. So there is a platform rel It contains also all the verification reports (including their input e.g. test run logs) and documentation collaterals (e.g. the html's for the S-CORE homepage) as created during the CI build based on the release tagged repository files. It does not contain the binary produced in the CI build, as this is not a qualified work product of S-CORE and -the user will need to re-build in the context of his system. Furthermore the binary build with Bazel +the user will need to re-build in the context of their system. Furthermore the binary build with Bazel is reproducible, so this can be re-created from source any time. Release Types diff --git a/docs/platform_management_plan/security_management.rst b/docs/platform_management_plan/security_management.rst index 191dd1f06e8..81a7ebd306a 100644 --- a/docs/platform_management_plan/security_management.rst +++ b/docs/platform_management_plan/security_management.rst @@ -143,7 +143,7 @@ As defined in `Committer Training <https://www.eclipse.org/projects/training/>`_ As each project can adopt additional criteria for the committers election, we define the following: -each committer has to prove his knowledge in security SW development by +each committer has to prove their knowledge in security SW development by * an absolved training in ISO SAE 21434 (or equivalent standard, at least 16h of SW development specific training by a trusted training provider) OR * by attending the projects's ISO SAE 21434 SW development training (given by a security team member) From f1970525defdaecd87c2b2a5370822dfdb7d5628 Mon Sep 17 00:00:00 2001 From: Philipp Ahmann <philipp.ahmann@de.bosch.com> Date: Mon, 22 Dec 2025 19:20:14 +0000 Subject: [PATCH 104/214] Clarify attributes and contributor role in verification plan Signed-off-by: Philipp Ahmann <philipp.ahmann@de.bosch.com> --- docs/platform_management_plan/software_verification.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/platform_management_plan/software_verification.rst b/docs/platform_management_plan/software_verification.rst index 27cc55ac021..bff709dfd1a 100644 --- a/docs/platform_management_plan/software_verification.rst +++ b/docs/platform_management_plan/software_verification.rst @@ -330,8 +330,8 @@ following aspects define the coverage of the architectural design. - :need:`wp__sw_component_fmea` and :need:`wp__sw_component_dfa` for safety-critical parts - :need:`wp__feature_fmea` and :need:`wp__feature_dfa` for safety-critical parts -Each architectural element has at least one test case linked with attribute "fully verified" or -multiple test cases with attribute "partially verified". +Each architectural element has at least one test case linked with attribute ``FullyVerified`` or +multiple test cases with attribute ``PartiallyVerified``. Coverage of software requirements specifications ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -360,7 +360,7 @@ Test execution and result analysis ---------------------------------- The execution of the tests is based on a full automation defined by build pipelines. The analysis of the test results -needs to be performed by the contributor. +needs to be performed by the :need:`rl__contributor`. Test selection and regression testing ------------------------------------- @@ -393,7 +393,7 @@ document: #. The :need:`rl__contributor` needs to make sure that the objectives of the software integration and verification are fulfilled when contributing to the project. -#. The :need:`rl__committer` needs to verify that the contributor has fulfilled the expected objectives. +#. The :need:`rl__committer` needs to verify that the :need:`rl__contributor` has fulfilled the expected objectives. In this way roles are followed as defined in :need:`doc_concept__verification_process`. From a61a47e359ac5864f3a8d6b74e3830cf8349438f Mon Sep 17 00:00:00 2001 From: Philipp Ahmann <philipp.ahmann@de.bosch.com> Date: Mon, 22 Dec 2025 19:42:19 +0000 Subject: [PATCH 105/214] Fix grammatical inconsistencies in IPC arch docu Signed-off-by: Philipp Ahmann <philipp.ahmann@de.bosch.com> --- docs/features/communication/ipc/docs/architecture/index.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/features/communication/ipc/docs/architecture/index.rst b/docs/features/communication/ipc/docs/architecture/index.rst index 8b75ae5647e..5be0442c214 100644 --- a/docs/features/communication/ipc/docs/architecture/index.rst +++ b/docs/features/communication/ipc/docs/architecture/index.rst @@ -144,7 +144,7 @@ Synchronization Algorithm A slot shall contain all necessary meta-information in order to synchronize data access. This information most certainly needs to include a timestamp to indicate the order of produced data within the slots. Additionally, a use count is needed, indicating if a slot is currently in use by one process. The concrete data is implementation defined and must be covered by the detailed design. -The main idea of the algorithm is that a producer shall always be able to store one new data sample. If he cannot find a respective slot, this indicates a contract violation, which indicates that a QM process misbehaved. In such a case, a producer should exclude any QM consumer from the communication. +The main idea of the algorithm is that a producer shall always be able to store one new data sample. If it cannot find a respective slot, this indicates a contract violation, which indicates that a QM process misbehaved. In such a case, a producer should exclude any QM consumer from the communication. This whole idea builds up on the split of shared memory segments by ASIL levels. This way we can ensure that an QM process will not degrade the ASIL Level for a communication path. In another case, where we already have a QM producer, it is possible for an ASIL B consumer to consume the QM data. In this scenario, there is no separate control data for ASIL B, and they instead interact on the control data for ASIL QM. This is because, the data is QM and it is impossible for the middleware to apply additional checks to enhance the quality of data. This can only be done on application layer level. Hence, separating QM and ASIL consumers holds no benefit. @@ -200,7 +200,7 @@ Each consumer and the producer owns a corresponding transaction log, which resid #. Executing the activity in question. #. Writing a transaction end marker, which annotates, whether the activity in (2) was done or not. -During the restart of a communication partner, he checks for existing transaction logs in shared memory, which it +During the restart of a communication partner, it checks for existing transaction logs in shared memory, which it created in an earlier run, so that it can roll them back. Two scenarios are possible: @@ -208,7 +208,7 @@ Two scenarios are possible: - All transaction log entries are complete (transaction end marker is written). The communication partner can roll all transactions back and rejoin communication. - A transaction log entry is incomplete (transaction end marker is missing). - The communication partner is incapable of rolling back his actions fully. + The communication partner is incapable of rolling back its actions fully. Rejoining the communication would impact other communication partners. The communication partner is barred from rejoining the communication. From 848f43ba251239e6fab194fcbb684955b95a6d35 Mon Sep 17 00:00:00 2001 From: Philipp Ahmann <philipp.ahmann@de.bosch.com> Date: Mon, 22 Dec 2025 19:43:56 +0000 Subject: [PATCH 106/214] fix: update language for gender neutrality in documentation - Changed "his" to "their" in multiple instances across various documentation files to promote gender-neutral language. Signed-off-by: Philipp Ahmann <philipp.ahmann@de.bosch.com> --- docs/_assets/contribution_guide.svg | 2 +- docs/contribute/contribution_request/index.rst | 2 +- .../baselibs/docs/requirements/chklst_req_inspection.rst | 2 +- .../result/docs/requirements/chklst_req_inspection.rst | 2 +- .../executor/docs/requirements/chklst_req_inspection.rst | 2 +- .../docs/requirements/chklst_req_inspection.rst | 2 +- docs/requirements/platform_assumptions/index.rst | 8 ++++---- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/_assets/contribution_guide.svg b/docs/_assets/contribution_guide.svg index 1f1a3d52da6..9481e43f06c 100644 --- a/docs/_assets/contribution_guide.svg +++ b/docs/_assets/contribution_guide.svg @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- Do not edit this file with editors other than diagrams.net --> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="835px" height="616px" viewBox="-0.5 -0.5 835 616" content="<mxfile host="Electron" modified="2024-11-19T11:13:22.276Z" agent="5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.3.0 Chrome/104.0.5112.114 Electron/20.1.3 Safari/537.36" etag="zjXqrghVPtNNJqaulFvm" version="20.3.0" type="device"><diagram id="0w90vh-N4AjfHz9zUi27" name="Model">7Vrbdps6EP0aPzqLu+ExcZwmZzVtVtL2tH2TQQY1gDhC+NKvrwTiKnxJajv2yslDC4MkxJ6Zra2RB/o4Wn4gIAnusQfDgaZ4y4F+PdC0keoo7D9uWRUWTVfNwuIT5BU2tTY8od9QGEVHP0MeTFsNKcYhRUnb6OI4hi5t2QAheNFuNsNh+60J8KFkeHJBKFv/RR4NCqttKrX9FiI/KN+sKuJJBMrGwpAGwMOLhkmfDPQxwZgWV9FyDEOOXolL0e9mzdNqYgTGdJcOP8kX7xZ+gndYV74m98E3+E8w1IQ35iDMxBcPNCtkA15NCbvy+ZVsGeOYEjTNKMIx925GUOzLzVJIs4RPMgAp3GXc/y2nZMmjlq7KVAhoFLIrlT3zQBpAHlcKu1kEiMI0AS5vt2A8wGwzFIZjHGKSd9U9E9qewSOCEvwMG09sbapbFnsCQuTHzBbCGX/7jEXYk3h3T6gL0xwSCpcNkwj9DxBHkJIVayKeDnWjzExBRUOtJKdFndiWJWxBI6n1kTACQSZ+NXydb+xCpNwL0s+0pPSrUosh1PUAo5CEX2ZReOnyBvoVRwAxuvoIpjB8wCnKU1K/nmJKcdRocCnwpZj7p+FLnNEQxcwnJYEqlfP/EnHNVi7MNuaGJWOu90BuHQrxcuAW4lGEKIXnjrdmj4wTQ9vWJEyhx9ZXcYsJDbCPYxBOausVwVnsVexSt/mIOZQ5hr8gpSshFgBLlTbCa8FMcUZcuGG+o5GQGID4kG76MDEi/5qNziEwBBTN22pi7ziX824t413gw5CJJiiTs5L/SeQc4xgekAl0Q9spNvWDxWYfEzRlTXdBnHFGVqaZz3UkWjJVyt4vtUJRQvAcRgyuVPIBA4y2Y7Wz7HXZI0KeVyQFTNFvMM0H4r5KMOIvYKOaVwPzmo/E8iAtUkJd58ym5/fpX32kSv61Ze6pxPFxyMc+L/IpOWU7+YxOinzKea8TMYpLIKA8XZS7NGVNtJuHRzlxFoiFCc+sMGT4awpbJ9m/X2CUsI+Akitfokb3E+OW3Y7wamfXiHBNMeUINw8W4daZRbhxnstrOe9Ny2v6DKkbNNkZkskcFiSdE3K5/1e6IdvAditrs/Xa0A3DMDnjp0mhIPlqxAa7Cjui1IV8Fq9XreXiVI3Tq11LlRwtfV4EupjPvQtapu2eks8sO21KPkM9Zu7JlZNN7HaVy4YbtGTP72qJIDdcS3jrtYPk5jNTD6ZldNWD1qcejGOqB0eVPHAEbmUwktV33v/CLG9/iOHym+tl62412LJ/3M7Ju255ymrJ/jg573pJCFg1GojQrEd+4IbWZsLqFhU6hc9uD812nE092EUxizpaqs/5C4KQ92RtWUTgfxlM+beyyzmCC45CzKWPzAoeSt0sTYtyK57xJEC8Y041IOJkHU/TWuuclFBS314oOdsX8Hbu5ug8tdFpICltoW3Qs4XOn5ij/AkvaDbss/xvX5Ar9g61TfWopU1Hf1P+VFvsWZPp3vmzBPoNNO3r+FOzjXawqM42+ux0GKqOeXj+dM5sc7NzIAjwTmVzoypvonSOAbRzUkA7csFRXoQCHE2z9NwWIM1R2wqrEvTN7Vnf+uMcCmxtvfrqre4C14UJzStPA/1GcsxJ7r7yQ1LRTdvbKZLTZntdVhJOjyeNgwkJufhymfsKxCw3NGVMWKIQBGSXxpgvY2wW5+HN/SSi2TkDrBzTVIJ9By2Hc2Dfb0y61TNRQ0qzaFKdUyXMrWwK3B3X4vTqoTZtY8gpcJ/9fJn6XFStti08L+O7Nsx9W5yjnmY58m7zx+TpPQW+0a4KlCtLwyHmUR2yw5bzzKJeN1W9U6iTQT5q1FcHig2UP31+T1Fvdipb5q7Caw8u+fpNmdy6P5+HxuP3+ejxGj7e/xrKukuUxRU3xCnXV91lmtewlE+4pxYeQabwvRe4841P0SXP9fh3U3qNuuk1VK0ef/bJr33UwXv9Kauvnfz5vlyn2aNOTUXdzW2vEF3stv7RcFFsqX97rU/+AA==</diagram></mxfile>"><defs/><g><rect x="174" y="170" width="660" height="370" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 355px; margin-left: 176px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: nowrap;"><br /><br />Contribution during<br />setup phase<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></div></div></div></foreignObject><text x="176" y="359" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" font-weight="bold">Contribution during...</text></switch></g><ellipse cx="308.5" cy="7.5" rx="7.5" ry="7.5" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 308.5 15 L 308.5 40 M 308.5 20 L 293.5 20 M 308.5 20 L 323.5 20 M 308.5 40 L 293.5 60 M 308.5 40 L 323.5 60" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 67px; margin-left: 309px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Contributor</div></div></div></foreignObject><text x="309" y="79" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Contr...</text></switch></g><ellipse cx="715" cy="7.5" rx="7.5" ry="7.5" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 715 15 L 715 40 M 715 20 L 700 20 M 715 20 L 730 20 M 715 40 L 700 60 M 715 40 L 730 60" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 67px; margin-left: 715px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Committer</div></div></div></foreignObject><text x="715" y="79" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Commi...</text></switch></g><path d="M 308.5 148 L 308.5 233.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 308.5 238.88 L 305 231.88 L 308.5 233.63 L 312 231.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><ellipse cx="308.5" cy="133" rx="15" ry="15" fill="#000000" stroke="none" pointer-events="all"/><rect x="202.5" y="80" width="100" height="60" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 110px; margin-left: 205px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Contribution<br />for bug fixes/<br />improvements</div></div></div></foreignObject><text x="205" y="114" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">Contribution...</text></switch></g><path d="M 308.5 290 L 308.5 333.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 308.5 338.88 L 305 331.88 L 308.5 333.63 L 312 331.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="206" y="240" width="205" height="50" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 265px; margin-left: 309px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Contributor creates Issue/PR<br />with filled out Template</div></div></div></foreignObject><text x="309" y="269" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Contributor creates Issue/PR...</text></switch></g><path d="M 94 265 L 199.63 265" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 204.88 265 L 197.88 268.5 L 199.63 265 L 197.88 261.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="53" y="240" width="41" height="50" fill="none" stroke="none" pointer-events="all"/><path d="M 58.35 240 L 58.35 245.95 L 53 245.95 L 53 290 L 53.92 290 L 87.01 290 L 87.01 283.97 L 94 283.99 L 94 240 Z M 60.18 241.84 L 92.17 241.84 L 92.17 282.15 L 87.01 282.13 L 87.01 253.99 L 78.88 245.95 L 60.18 245.95 Z M 54.83 247.79 L 77.59 247.79 L 77.59 255.29 L 85.18 255.29 L 85.18 288.16 L 54.83 288.16 Z M 79.42 249.06 L 83.86 253.46 L 79.42 253.46 Z M 58.52 250.62 L 58.52 252.13 L 56.86 252.13 L 56.86 253.51 L 58.52 253.51 L 58.52 263.09 L 56.89 263.09 L 56.89 264.47 L 58.52 264.47 L 58.52 275.96 L 56.89 275.96 L 56.89 277.34 L 58.52 277.34 L 58.52 279.11 L 59.89 279.11 L 59.89 277.34 L 80.58 277.34 L 80.58 279.12 L 81.96 279.12 L 81.96 277.34 L 83.96 277.34 L 83.96 275.96 L 81.96 275.96 L 81.96 264.47 L 83.94 264.47 L 83.94 263.09 L 81.96 263.09 L 81.96 256.95 L 80.58 256.95 L 80.58 263.09 L 59.89 263.09 L 59.89 253.51 L 75.51 253.51 L 75.51 252.13 L 59.89 252.13 L 59.89 250.62 Z M 63.44 255.63 C 61.97 255.63 60.76 256.84 60.76 258.32 C 60.76 259.8 61.97 261.02 63.44 261.02 C 64.92 261.02 66.13 259.8 66.13 258.32 C 66.13 256.84 64.92 255.63 63.44 255.63 Z M 70.08 255.63 C 68.61 255.63 67.4 256.84 67.4 258.32 C 67.4 259.8 68.61 261.02 70.08 261.02 C 71.55 261.02 72.76 259.8 72.76 258.32 C 72.76 256.84 71.55 255.63 70.08 255.63 Z M 76.72 255.63 C 75.24 255.63 74.03 256.84 74.03 258.32 C 74.03 259.8 75.24 261.02 76.72 261.02 C 78.19 261.02 79.4 259.8 79.4 258.32 C 79.4 256.84 78.19 255.63 76.72 255.63 Z M 63.44 257 C 64.17 257 64.75 257.59 64.75 258.32 C 64.75 259.06 64.17 259.64 63.44 259.64 C 62.71 259.64 62.13 259.06 62.13 258.32 C 62.13 257.59 62.71 257 63.44 257 Z M 70.08 257 C 70.81 257 71.39 257.59 71.39 258.32 C 71.39 259.06 70.81 259.64 70.08 259.64 C 69.35 259.64 68.77 259.06 68.77 258.32 C 68.77 257.59 69.35 257 70.08 257 Z M 76.72 257 C 77.45 257 78.03 257.59 78.03 258.32 C 78.03 259.06 77.45 259.64 76.72 259.64 C 75.99 259.64 75.41 259.06 75.41 258.32 C 75.41 257.59 75.99 257 76.72 257 Z M 59.89 264.47 L 73 264.47 L 73 269.51 L 59.89 269.51 Z M 74.37 264.47 L 80.58 264.47 L 80.58 275.96 L 74.37 275.96 Z M 59.89 270.89 L 73 270.89 L 73 275.96 L 59.89 275.96 Z M 69.47 281.65 L 68.13 281.74 L 68.13 285.63 L 68.91 285.63 L 68.91 284.21 C 69.12 284.23 69.33 284.27 69.64 284.27 C 69.85 284.27 70.2 284.15 70.46 283.93 C 70.72 283.7 70.98 283.41 70.98 282.92 C 70.99 282.17 70.18 281.63 69.47 281.65 Z M 76.7 281.74 L 75.61 281.76 L 74.32 285.64 L 75.27 285.63 L 75.56 284.58 L 76.75 284.59 L 77.05 285.63 L 77.96 285.63 Z M 77.71 281.75 L 77.71 282.42 L 78.89 282.42 L 78.89 285.65 L 79.65 285.65 L 79.65 282.42 L 80.79 282.42 L 80.79 281.75 Z M 63.28 281.76 L 62.97 285.64 L 63.79 285.64 L 63.95 282.48 L 64.77 285.55 L 65.43 285.54 L 66.41 282.48 L 66.52 285.64 L 67.32 285.64 L 67.18 281.76 L 66.01 281.76 L 65.17 284.45 L 64.43 281.76 Z M 59.89 281.76 L 59.89 285.63 L 62.41 285.63 L 62.41 284.99 L 60.68 284.99 L 60.68 283.94 L 62.23 283.94 L 62.23 283.31 L 60.68 283.31 L 60.68 282.4 L 62.33 282.4 L 62.33 281.76 Z M 56.35 281.76 L 56.35 282.39 L 57.39 282.39 L 57.39 285.64 L 58.28 285.64 L 58.28 282.39 L 59.34 282.39 L 59.34 281.76 Z M 71.59 281.76 L 71.59 285.63 L 74.02 285.63 L 74.02 285 L 72.4 285 L 72.4 281.76 Z M 81.37 281.77 L 81.37 285.66 L 83.8 285.66 L 83.8 285 L 82.13 285 L 82.13 283.94 L 83.61 283.94 L 83.61 283.29 L 82.13 283.29 L 82.13 282.41 L 83.7 282.41 L 83.7 281.77 Z M 76.11 282.27 L 76.61 284.04 L 75.65 284.02 Z M 68.91 282.33 L 69.54 282.33 C 69.79 282.34 70.14 282.53 70.14 282.91 C 70.14 283.18 70.08 283.28 69.95 283.39 C 69.82 283.5 69.62 283.61 69.45 283.61 L 68.91 283.61 Z" fill="#434445" stroke="none" pointer-events="all"/><rect x="9.5" y="180" width="140" height="60" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 210px; margin-left: 80px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Issue/PR<br />Bug Fix/Improvement<br />Template</div></div></div></foreignObject><text x="80" y="214" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Issue/PR...</text></switch></g><path d="M 308.5 390 L 308.5 420 L 675 420 L 675 458.13" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 675 463.38 L 671.5 456.38 L 675 458.13 L 678.5 456.38 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="206" y="340" width="205" height="50" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 365px; margin-left: 309px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Contributor requests review and <br />discussion of his PR </div></div></div></foreignObject><text x="309" y="369" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Contributor requests review and...</text></switch></g><rect x="494" y="170" width="10" height="370" fill="#008a00" stroke="#005700" pointer-events="all"/><path d="M 689.87 479 L 734 479 L 734 265 L 417.37 265" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 412.12 265 L 419.12 261.5 L 417.37 265 L 419.12 268.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 675 503.5 L 675 573.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 675 578.88 L 671.5 571.88 L 675 573.63 L 678.5 571.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 655 484 L 96.87 484" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 91.62 484 L 98.62 480.5 L 96.87 484 L 98.62 487.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 675 464.5 L 695 484 L 675 503.5 L 655 484 Z" fill="#008a00" stroke="#005700" stroke-miterlimit="10" pointer-events="all"/><rect x="684" y="490" width="90" height="40" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 510px; margin-left: 729px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Contribution<br />accepted ?</div></div></div></foreignObject><text x="729" y="514" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Contribution...</text></switch></g><rect x="620" y="220" width="130" height="40" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 240px; margin-left: 685px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Acceptance Criteria<br />not met</div></div></div></foreignObject><text x="685" y="244" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Acceptance Criteria...</text></switch></g><ellipse cx="675" cy="595" rx="15" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 664.35 584.35 L 685.65 605.65" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 685.65 584.35 L 664.35 605.65" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="629" y="499" width="50" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 514px; margin-left: 654px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">YES</div></div></div></foreignObject><text x="654" y="518" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">YES</text></switch></g><ellipse cx="75.5" cy="484" rx="15" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 64.85 473.35 L 86.15 494.65" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 86.15 473.35 L 64.85 494.65" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="615" y="454.5" width="40" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 470px; margin-left: 635px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">NO</div></div></div></foreignObject><text x="635" y="473" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">NO</text></switch></g><rect x="0.5" y="443.5" width="90" height="60" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 474px; margin-left: 3px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Issue closed<br />PR Not<br />merged</div></div></div></foreignObject><text x="3" y="477" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">Issue closed...</text></switch></g><rect x="704" y="575" width="90" height="40" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 595px; margin-left: 706px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Issue closed<br />PR merged</div></div></div></foreignObject><text x="706" y="599" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">Issue closed...</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="835px" height="616px" viewBox="-0.5 -0.5 835 616" content="<mxfile host="Electron" modified="2024-11-19T11:13:22.276Z" agent="5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.3.0 Chrome/104.0.5112.114 Electron/20.1.3 Safari/537.36" etag="zjXqrghVPtNNJqaulFvm" version="20.3.0" type="device"><diagram id="0w90vh-N4AjfHz9zUi27" name="Model">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</diagram></mxfile>"><defs/><g><rect x="174" y="170" width="660" height="370" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 355px; margin-left: 176px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: nowrap;"><br /><br />Contribution during<br />setup phase<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></div></div></div></foreignObject><text x="176" y="359" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" font-weight="bold">Contribution during...</text></switch></g><ellipse cx="308.5" cy="7.5" rx="7.5" ry="7.5" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 308.5 15 L 308.5 40 M 308.5 20 L 293.5 20 M 308.5 20 L 323.5 20 M 308.5 40 L 293.5 60 M 308.5 40 L 323.5 60" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 67px; margin-left: 309px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Contributor</div></div></div></foreignObject><text x="309" y="79" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Contr...</text></switch></g><ellipse cx="715" cy="7.5" rx="7.5" ry="7.5" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 715 15 L 715 40 M 715 20 L 700 20 M 715 20 L 730 20 M 715 40 L 700 60 M 715 40 L 730 60" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 67px; margin-left: 715px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Committer</div></div></div></foreignObject><text x="715" y="79" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Commi...</text></switch></g><path d="M 308.5 148 L 308.5 233.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 308.5 238.88 L 305 231.88 L 308.5 233.63 L 312 231.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><ellipse cx="308.5" cy="133" rx="15" ry="15" fill="#000000" stroke="none" pointer-events="all"/><rect x="202.5" y="80" width="100" height="60" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 110px; margin-left: 205px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Contribution<br />for bug fixes/<br />improvements</div></div></div></foreignObject><text x="205" y="114" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">Contribution...</text></switch></g><path d="M 308.5 290 L 308.5 333.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 308.5 338.88 L 305 331.88 L 308.5 333.63 L 312 331.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="206" y="240" width="205" height="50" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 265px; margin-left: 309px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Contributor creates Issue/PR<br />with filled out Template</div></div></div></foreignObject><text x="309" y="269" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Contributor creates Issue/PR...</text></switch></g><path d="M 94 265 L 199.63 265" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 204.88 265 L 197.88 268.5 L 199.63 265 L 197.88 261.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="53" y="240" width="41" height="50" fill="none" stroke="none" pointer-events="all"/><path d="M 58.35 240 L 58.35 245.95 L 53 245.95 L 53 290 L 53.92 290 L 87.01 290 L 87.01 283.97 L 94 283.99 L 94 240 Z M 60.18 241.84 L 92.17 241.84 L 92.17 282.15 L 87.01 282.13 L 87.01 253.99 L 78.88 245.95 L 60.18 245.95 Z M 54.83 247.79 L 77.59 247.79 L 77.59 255.29 L 85.18 255.29 L 85.18 288.16 L 54.83 288.16 Z M 79.42 249.06 L 83.86 253.46 L 79.42 253.46 Z M 58.52 250.62 L 58.52 252.13 L 56.86 252.13 L 56.86 253.51 L 58.52 253.51 L 58.52 263.09 L 56.89 263.09 L 56.89 264.47 L 58.52 264.47 L 58.52 275.96 L 56.89 275.96 L 56.89 277.34 L 58.52 277.34 L 58.52 279.11 L 59.89 279.11 L 59.89 277.34 L 80.58 277.34 L 80.58 279.12 L 81.96 279.12 L 81.96 277.34 L 83.96 277.34 L 83.96 275.96 L 81.96 275.96 L 81.96 264.47 L 83.94 264.47 L 83.94 263.09 L 81.96 263.09 L 81.96 256.95 L 80.58 256.95 L 80.58 263.09 L 59.89 263.09 L 59.89 253.51 L 75.51 253.51 L 75.51 252.13 L 59.89 252.13 L 59.89 250.62 Z M 63.44 255.63 C 61.97 255.63 60.76 256.84 60.76 258.32 C 60.76 259.8 61.97 261.02 63.44 261.02 C 64.92 261.02 66.13 259.8 66.13 258.32 C 66.13 256.84 64.92 255.63 63.44 255.63 Z M 70.08 255.63 C 68.61 255.63 67.4 256.84 67.4 258.32 C 67.4 259.8 68.61 261.02 70.08 261.02 C 71.55 261.02 72.76 259.8 72.76 258.32 C 72.76 256.84 71.55 255.63 70.08 255.63 Z M 76.72 255.63 C 75.24 255.63 74.03 256.84 74.03 258.32 C 74.03 259.8 75.24 261.02 76.72 261.02 C 78.19 261.02 79.4 259.8 79.4 258.32 C 79.4 256.84 78.19 255.63 76.72 255.63 Z M 63.44 257 C 64.17 257 64.75 257.59 64.75 258.32 C 64.75 259.06 64.17 259.64 63.44 259.64 C 62.71 259.64 62.13 259.06 62.13 258.32 C 62.13 257.59 62.71 257 63.44 257 Z M 70.08 257 C 70.81 257 71.39 257.59 71.39 258.32 C 71.39 259.06 70.81 259.64 70.08 259.64 C 69.35 259.64 68.77 259.06 68.77 258.32 C 68.77 257.59 69.35 257 70.08 257 Z M 76.72 257 C 77.45 257 78.03 257.59 78.03 258.32 C 78.03 259.06 77.45 259.64 76.72 259.64 C 75.99 259.64 75.41 259.06 75.41 258.32 C 75.41 257.59 75.99 257 76.72 257 Z M 59.89 264.47 L 73 264.47 L 73 269.51 L 59.89 269.51 Z M 74.37 264.47 L 80.58 264.47 L 80.58 275.96 L 74.37 275.96 Z M 59.89 270.89 L 73 270.89 L 73 275.96 L 59.89 275.96 Z M 69.47 281.65 L 68.13 281.74 L 68.13 285.63 L 68.91 285.63 L 68.91 284.21 C 69.12 284.23 69.33 284.27 69.64 284.27 C 69.85 284.27 70.2 284.15 70.46 283.93 C 70.72 283.7 70.98 283.41 70.98 282.92 C 70.99 282.17 70.18 281.63 69.47 281.65 Z M 76.7 281.74 L 75.61 281.76 L 74.32 285.64 L 75.27 285.63 L 75.56 284.58 L 76.75 284.59 L 77.05 285.63 L 77.96 285.63 Z M 77.71 281.75 L 77.71 282.42 L 78.89 282.42 L 78.89 285.65 L 79.65 285.65 L 79.65 282.42 L 80.79 282.42 L 80.79 281.75 Z M 63.28 281.76 L 62.97 285.64 L 63.79 285.64 L 63.95 282.48 L 64.77 285.55 L 65.43 285.54 L 66.41 282.48 L 66.52 285.64 L 67.32 285.64 L 67.18 281.76 L 66.01 281.76 L 65.17 284.45 L 64.43 281.76 Z M 59.89 281.76 L 59.89 285.63 L 62.41 285.63 L 62.41 284.99 L 60.68 284.99 L 60.68 283.94 L 62.23 283.94 L 62.23 283.31 L 60.68 283.31 L 60.68 282.4 L 62.33 282.4 L 62.33 281.76 Z M 56.35 281.76 L 56.35 282.39 L 57.39 282.39 L 57.39 285.64 L 58.28 285.64 L 58.28 282.39 L 59.34 282.39 L 59.34 281.76 Z M 71.59 281.76 L 71.59 285.63 L 74.02 285.63 L 74.02 285 L 72.4 285 L 72.4 281.76 Z M 81.37 281.77 L 81.37 285.66 L 83.8 285.66 L 83.8 285 L 82.13 285 L 82.13 283.94 L 83.61 283.94 L 83.61 283.29 L 82.13 283.29 L 82.13 282.41 L 83.7 282.41 L 83.7 281.77 Z M 76.11 282.27 L 76.61 284.04 L 75.65 284.02 Z M 68.91 282.33 L 69.54 282.33 C 69.79 282.34 70.14 282.53 70.14 282.91 C 70.14 283.18 70.08 283.28 69.95 283.39 C 69.82 283.5 69.62 283.61 69.45 283.61 L 68.91 283.61 Z" fill="#434445" stroke="none" pointer-events="all"/><rect x="9.5" y="180" width="140" height="60" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 210px; margin-left: 80px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Issue/PR<br />Bug Fix/Improvement<br />Template</div></div></div></foreignObject><text x="80" y="214" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Issue/PR...</text></switch></g><path d="M 308.5 390 L 308.5 420 L 675 420 L 675 458.13" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 675 463.38 L 671.5 456.38 L 675 458.13 L 678.5 456.38 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="206" y="340" width="205" height="50" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 365px; margin-left: 309px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Contributor requests review and <br />discussion of the PR </div></div></div></foreignObject><text x="309" y="369" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Contributor requests review and...</text></switch></g><rect x="494" y="170" width="10" height="370" fill="#008a00" stroke="#005700" pointer-events="all"/><path d="M 689.87 479 L 734 479 L 734 265 L 417.37 265" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 412.12 265 L 419.12 261.5 L 417.37 265 L 419.12 268.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 675 503.5 L 675 573.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 675 578.88 L 671.5 571.88 L 675 573.63 L 678.5 571.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 655 484 L 96.87 484" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 91.62 484 L 98.62 480.5 L 96.87 484 L 98.62 487.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 675 464.5 L 695 484 L 675 503.5 L 655 484 Z" fill="#008a00" stroke="#005700" stroke-miterlimit="10" pointer-events="all"/><rect x="684" y="490" width="90" height="40" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 510px; margin-left: 729px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Contribution<br />accepted ?</div></div></div></foreignObject><text x="729" y="514" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Contribution...</text></switch></g><rect x="620" y="220" width="130" height="40" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 240px; margin-left: 685px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Acceptance Criteria<br />not met</div></div></div></foreignObject><text x="685" y="244" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Acceptance Criteria...</text></switch></g><ellipse cx="675" cy="595" rx="15" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 664.35 584.35 L 685.65 605.65" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 685.65 584.35 L 664.35 605.65" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="629" y="499" width="50" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 514px; margin-left: 654px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">YES</div></div></div></foreignObject><text x="654" y="518" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">YES</text></switch></g><ellipse cx="75.5" cy="484" rx="15" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 64.85 473.35 L 86.15 494.65" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 86.15 473.35 L 64.85 494.65" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="615" y="454.5" width="40" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 470px; margin-left: 635px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">NO</div></div></div></foreignObject><text x="635" y="473" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">NO</text></switch></g><rect x="0.5" y="443.5" width="90" height="60" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 474px; margin-left: 3px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Issue closed<br />PR Not<br />merged</div></div></div></foreignObject><text x="3" y="477" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">Issue closed...</text></switch></g><rect x="704" y="575" width="90" height="40" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 595px; margin-left: 706px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Issue closed<br />PR merged</div></div></div></foreignObject><text x="706" y="599" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">Issue closed...</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> diff --git a/docs/contribute/contribution_request/index.rst b/docs/contribute/contribution_request/index.rst index 74d5af97646..3a4a8f68152 100644 --- a/docs/contribute/contribution_request/index.rst +++ b/docs/contribute/contribution_request/index.rst @@ -112,7 +112,7 @@ The figure below shows a simplified workflow for a PR. Content in general may contain features, requirements, architectural designs, modules, components, detailed designs, implementations and source code, tests, process descriptions, any documentations, guidelines, tutorials, tools, or infrastructure topics and more of the *S-CORE* project. In case of doubt or for any other input we strongly encourage to open a *GitHub Issue* (:need:`doc__issue_guideline`) first. -The *PR* should provide all required information of the new or changed content. Therefore the *S-CORE* project provides content specific templates, which the contributor (:need:`Contributor <rl__contributor>`) must use for his *PR* (ToDo link here to the templates overview). Templates may be *PR* templates, *GitHub Issue* templates and also additional document or work product templates. +The *PR* should provide all required information of the new or changed content. Therefore the *S-CORE* project provides content specific templates, which the contributor (:need:`Contributor <rl__contributor>`) must use for rheir *PR* (ToDo link here to the templates overview). Templates may be *PR* templates, *GitHub Issue* templates and also additional document or work product templates. The content of any *PR* is the commit content and the description as well as the comments given in GitHub and is kept in a versioned repository, their revision history is the historical record of the PR. diff --git a/docs/features/baselibs/docs/requirements/chklst_req_inspection.rst b/docs/features/baselibs/docs/requirements/chklst_req_inspection.rst index 20a05105c63..31e26909857 100644 --- a/docs/features/baselibs/docs/requirements/chklst_req_inspection.rst +++ b/docs/features/baselibs/docs/requirements/chklst_req_inspection.rst @@ -129,7 +129,7 @@ Requirement Inspection Checklist - * - REQ_08_01 - Is the requirement *verifiable*? - - If at the time of the inspection already tests are created for the requirement, the answer is yes. This can be checked via traces, but also :need:`gd_req__req_attr_test_covered` shows this. In case the requirement is not sufficiently traced to test cases already, a test expert is invited to the inspection to give his opinion whether the requirement is formulated in a way that supports test development and the available test infrastructure is sufficient to perform the test. + - If at the time of the inspection already tests are created for the requirement, the answer is yes. This can be checked via traces, but also :need:`gd_req__req_attr_test_covered` shows this. In case the requirement is not sufficiently traced to test cases already, a test expert is invited to the inspection to give their opinion whether the requirement is formulated in a way that supports test development and the available test infrastructure is sufficient to perform the test. - - - diff --git a/docs/modules/baselibs/result/docs/requirements/chklst_req_inspection.rst b/docs/modules/baselibs/result/docs/requirements/chklst_req_inspection.rst index 533e473c082..b0d0b224e50 100644 --- a/docs/modules/baselibs/result/docs/requirements/chklst_req_inspection.rst +++ b/docs/modules/baselibs/result/docs/requirements/chklst_req_inspection.rst @@ -128,7 +128,7 @@ Requirement Inspection Checklist - none * - REQ_08_01 - Is the requirement *verifiable*? - - If at the time of the inspection already tests are created for the requirement, the answer is yes. This can be checked via traces, but also :need:`gd_req__req_attr_test_covered` shows this. In case the requirement is not sufficiently traced to test cases already, a test expert is invited to the inspection to give his opinion whether the requirement is formulated in a way that supports test development and the available test infrastructure is sufficient to perform the test. + - If at the time of the inspection already tests are created for the requirement, the answer is yes. This can be checked via traces, but also :need:`gd_req__req_attr_test_covered` shows this. In case the requirement is not sufficiently traced to test cases already, a test expert is invited to the inspection to give their opinion whether the requirement is formulated in a way that supports test development and the available test infrastructure is sufficient to perform the test. - YES - all requirements have test cases implemented - none diff --git a/docs/modules/orchestrator/executor/docs/requirements/chklst_req_inspection.rst b/docs/modules/orchestrator/executor/docs/requirements/chklst_req_inspection.rst index 6431194ff78..51c23f6a8ef 100644 --- a/docs/modules/orchestrator/executor/docs/requirements/chklst_req_inspection.rst +++ b/docs/modules/orchestrator/executor/docs/requirements/chklst_req_inspection.rst @@ -130,7 +130,7 @@ Requirement Inspection Checklist - * - REQ_08_01 - Is the requirement *verifiable*? - - If at the time of the inspection already tests are created for the requirement, the answer is yes. This can be checked via traces, but also :need:`gd_req__req_attr_test_covered` shows this. In case the requirement is not sufficiently traced to test cases already, a test expert is invited to the inspection to give his opinion whether the requirement is formulated in a way that supports test development and the available test infrastructure is sufficient to perform the test. + - If at the time of the inspection already tests are created for the requirement, the answer is yes. This can be checked via traces, but also :need:`gd_req__req_attr_test_covered` shows this. In case the requirement is not sufficiently traced to test cases already, a test expert is invited to the inspection to give their opinion whether the requirement is formulated in a way that supports test development and the available test infrastructure is sufficient to perform the test. - - - diff --git a/docs/modules/orchestrator/orchestrator/docs/requirements/chklst_req_inspection.rst b/docs/modules/orchestrator/orchestrator/docs/requirements/chklst_req_inspection.rst index d6f8cbd3818..ae92b376b13 100644 --- a/docs/modules/orchestrator/orchestrator/docs/requirements/chklst_req_inspection.rst +++ b/docs/modules/orchestrator/orchestrator/docs/requirements/chklst_req_inspection.rst @@ -130,7 +130,7 @@ Requirement Inspection Checklist - * - REQ_08_01 - Is the requirement *verifiable*? - - If at the time of the inspection already tests are created for the requirement, the answer is yes. This can be checked via traces, but also :need:`gd_req__req_attr_test_covered` shows this. In case the requirement is not sufficiently traced to test cases already, a test expert is invited to the inspection to give his opinion whether the requirement is formulated in a way that supports test development and the available test infrastructure is sufficient to perform the test. + - If at the time of the inspection already tests are created for the requirement, the answer is yes. This can be checked via traces, but also :need:`gd_req__req_attr_test_covered` shows this. In case the requirement is not sufficiently traced to test cases already, a test expert is invited to the inspection to give their opinion whether the requirement is formulated in a way that supports test development and the available test infrastructure is sufficient to perform the test. - - - diff --git a/docs/requirements/platform_assumptions/index.rst b/docs/requirements/platform_assumptions/index.rst index c526629d441..67606d19323 100644 --- a/docs/requirements/platform_assumptions/index.rst +++ b/docs/requirements/platform_assumptions/index.rst @@ -33,7 +33,7 @@ the operating system, programming language libraries, hypervisor or processing h For "organizations" two roles are used in the AoU text: - Supplier: is the provider of an element the S-CORE SW-platform is using but which is developed and maintained externally. -- System Integrator: uses the S-CORE SW-platform as a part of a system he provides to a customer. The system integrator can be for example a Tier1 providing an electronic control unit to a OEM or an OEM providing a car to his end-customer. S-CORE does not know which. +- System Integrator: uses the S-CORE SW-platform as a part of a system they provide to a customer. The system integrator can be for example a Tier1 providing an electronic control unit to a OEM or an OEM providing a car to their end-customer. S-CORE does not know which. To fulfill these assumptions is the responsibility of the mentioned roles. @@ -113,7 +113,7 @@ It is the level where the S-CORE SW-platform will functionally "work" with the e :safety: QM :status: valid - The system integrator shall run the tests provided by S-CORE (platform, feature, component and Unit level for his selected S-CORE modules) on his selected OS/Hypervisor/HW combination, + The system integrator shall run the tests provided by S-CORE (platform, feature, component and Unit level for their selected S-CORE modules) on their selected OS/Hypervisor/HW combination, or provide equivalent argumentation. Note1: S-CORE will run these tests for one or more reference OS/Hypervisor/HW combination, if not all passing, remaining issues are documented in release notes. In case the selected combination is equal to a S-CORE reference and the complete S-CORE SW-platform is used, this AoU may be skipped. @@ -127,7 +127,7 @@ It is the level where the S-CORE SW-platform will functionally "work" with the e :safety: QM :status: valid - The system integrator shall report the bugs found during integration of the S-CORE SW-platform on his selected OS/Hypervisor/HW combination to the external SW element supplier and S-CORE for analysis. + The system integrator shall report the bugs found during integration of the S-CORE SW-platform on their selected OS/Hypervisor/HW combination to the external SW element supplier and S-CORE for analysis. Assumptions on the external SW element integration - Certifiable Level ---------------------------------------------------------------------- @@ -214,7 +214,7 @@ This is the highest level of integraton. This is the level where the S-CORE SW-p :safety: ASIL_B :status: valid - If the system using the SW-platform has safety goals, the system integrator shall perform safety anomaly reporting taking into account also the reporting of all the components he integrates. + If the system using the SW-platform has safety goals, the system integrator shall perform safety anomaly reporting taking into account also the reporting of all the components they integrate. Note: This includes all the modules of the S-CORE SW platform used by the system integrator. The relevant safety critical bugs or safety anomalies are published by S-CORE as defined in the :need:`doc__platform_problem_resolution_plan`. From 4199d14d4baab40f461210434184b3e3bb060bd3 Mon Sep 17 00:00:00 2001 From: Philipp Ahmann <2428012+pahmann@users.noreply.github.com> Date: Tue, 23 Dec 2025 07:56:35 +0100 Subject: [PATCH 107/214] Fix typo in PR template sentence Corrected a typo in the contribution request documentation regarding the use of templates for PRs. Signed-off-by: Philipp Ahmann <2428012+pahmann@users.noreply.github.com> --- docs/contribute/contribution_request/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/contribute/contribution_request/index.rst b/docs/contribute/contribution_request/index.rst index 3a4a8f68152..1a7e73145d5 100644 --- a/docs/contribute/contribution_request/index.rst +++ b/docs/contribute/contribution_request/index.rst @@ -112,7 +112,7 @@ The figure below shows a simplified workflow for a PR. Content in general may contain features, requirements, architectural designs, modules, components, detailed designs, implementations and source code, tests, process descriptions, any documentations, guidelines, tutorials, tools, or infrastructure topics and more of the *S-CORE* project. In case of doubt or for any other input we strongly encourage to open a *GitHub Issue* (:need:`doc__issue_guideline`) first. -The *PR* should provide all required information of the new or changed content. Therefore the *S-CORE* project provides content specific templates, which the contributor (:need:`Contributor <rl__contributor>`) must use for rheir *PR* (ToDo link here to the templates overview). Templates may be *PR* templates, *GitHub Issue* templates and also additional document or work product templates. +The *PR* should provide all required information of the new or changed content. Therefore the *S-CORE* project provides content specific templates, which the contributor (:need:`Contributor <rl__contributor>`) must use for their *PR* (ToDo link here to the templates overview). Templates may be *PR* templates, *GitHub Issue* templates and also additional document or work product templates. The content of any *PR* is the commit content and the description as well as the comments given in GitHub and is kept in a versioned repository, their revision history is the historical record of the PR. From 29ba7d9f1180fd10415df6997c75bd5efeac053e Mon Sep 17 00:00:00 2001 From: Priyanka Patil <Priyanka.Patil@bti.bmwgroup.com> Date: Mon, 22 Dec 2025 14:36:26 +0530 Subject: [PATCH 108/214] lib/containers - Define AoUs --- .../containers/docs/requirements/index.rst | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/docs/modules/baselibs/containers/docs/requirements/index.rst b/docs/modules/baselibs/containers/docs/requirements/index.rst index 697f7e02d79..39c3f1ff92c 100644 --- a/docs/modules/baselibs/containers/docs/requirements/index.rst +++ b/docs/modules/baselibs/containers/docs/requirements/index.rst @@ -80,5 +80,90 @@ Non-Functional Requirements The Containers library shall provide deterministic behavior with no dynamic memory allocation. +Assumptions of Use (AoU) +======================== + +.. aou_req:: Check Capacity + :id: aou_req__containers__capacity_management + :reqtype: Functional + :security: NO + :safety: ASIL_B + :status: valid + :tags: inspected + + The user shall verify sufficient capacity or handle allocation failures before insertion operations to prevent exceeding container limits and undefined behavior. + +.. aou_req:: Iterator Validity + :id: aou_req__containers__iterator_validity + :reqtype: Functional + :security: NO + :safety: ASIL_B + :status: valid + :tags: inspected + + The user shall ensure that iterators are not used after operations that invalidate them and refresh iterators after modifying operations. + +.. aou_req:: Element Lifetime and Ownership + :id: aou_req__containers__element_lifetime + :reqtype: Functional + :security: NO + :safety: ASIL_B + :status: valid + :tags: inspected + + The user shall ensure that elements stored in containers remain valid throughout their lifetime in the container, and for intrusive containers, that element objects are not destroyed or moved while contained within the container. + +.. aou_req:: Thread Safety + :id: aou_req__containers__thread_safety + :reqtype: Non-Functional + :security: NO + :safety: ASIL_B + :status: valid + :tags: inspected + + The user shall implement external synchronization mechanisms when accessing or modifying container objects from multiple threads concurrently, as the library provides no internal thread safety guarantees. + +.. aou_req:: Index Bounds Checking + :id: aou_req__containers__bounds_checking + :reqtype: Functional + :security: NO + :safety: ASIL_B + :status: valid + :tags: inspected + + The user shall ensure that all index-based access operations use valid indices within the container's current size range to prevent out-of-bounds access and undefined behavior. + +.. aou_req:: Container State Verification + :id: aou_req__containers__state_verification + :reqtype: Functional + :security: NO + :safety: ASIL_B + :status: valid + :tags: inspected + + The user shall verify container state before performing operations that depend on specific states, such as checking if a container is non-empty before accessing elements. + +.. aou_req:: Memory Resource Management + :id: aou_req__containers__memory_management + :reqtype: Non-Functional + :security: NO + :safety: ASIL_B + :status: valid + :tags: inspected + + The user shall provide sufficient memory resources for all container operations. + +.. aou_req:: Element Type Requirements + :id: aou_req__containers__ele_type_requirements + :reqtype: Functional + :security: NO + :safety: ASIL_B + :status: valid + :tags: inspected + + The user shall ensure that element types are copy constructible, move constructible and destructible, and additionally for intrusive containers that they provide the required intrusive node members. + .. needextend:: "__containers__" in id :+tags: baselibs +.. needextend:: "containers" in id + :+tags: containers From 0c0f0977363ca61de61e7a64946aa1d27a8ca354 Mon Sep 17 00:00:00 2001 From: Mihajlo Katancevic <mihajlo.katancevic@bmw.de> Date: Thu, 18 Dec 2025 12:28:16 +0100 Subject: [PATCH 109/214] Define AoU requirements for filesystem lib --- .../filesystem/docs/requirements/index.rst | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/docs/modules/baselibs/filesystem/docs/requirements/index.rst b/docs/modules/baselibs/filesystem/docs/requirements/index.rst index 3f10cf4d890..4124606a403 100644 --- a/docs/modules/baselibs/filesystem/docs/requirements/index.rst +++ b/docs/modules/baselibs/filesystem/docs/requirements/index.rst @@ -98,5 +98,55 @@ Functional Requirements The Filesystem library shall provide mock and fake implementations for unit testing and validation. +Assumptions of Use (AoU) +======================== + +.. aou_req:: Low-Level Use Only + :id: aou_req__filesystem__low_level_use_only + :reqtype: Functional + :security: NO + :safety: ASIL_B + :status: valid + + Users shall use this library only when they need to manipulate files, directories, and paths at the operating system level beyond what higher-level storage abstractions provide, accepting reduced portability to other platforms. + +.. aou_req:: Supported Path Formats + :id: aou_req__filesystem__supported_path_formats + :reqtype: Functional + :security: NO + :safety: ASIL_B + :status: valid + + Users shall not use Windows paths with this library. + +.. aou_req:: Error Handling + :id: aou_req__filesystem__error_handling + :reqtype: Functional + :security: NO + :safety: ASIL_B + :status: valid + + Users shall handle all function return values and take appropriate action on errors. + +.. aou_req:: Thread Safety + :id: aou_req__filesystem__thread_safety + :reqtype: Non-Functional + :security: NO + :safety: ASIL_B + :status: valid + + Users shall implement appropriate synchronization mechanisms when accessing shared filesystem resources concurrently. + +.. aou_req:: Performance + :id: aou_req__filesystem__performance + :reqtype: Non-Functional + :security: NO + :safety: ASIL_B + :status: valid + + Users shall not assume any performance characteristics. + + Note: Filesystem operations are subject to underlying OS and storage performance. + .. needextend:: "__filesystem__" in id :+tags: baselibs From 11e53812022ef08766c2d8119edd99dcf59120a0 Mon Sep 17 00:00:00 2001 From: ZoranCutura <zoran.cutura@etas.com> Date: Thu, 11 Dec 2025 11:00:20 +0000 Subject: [PATCH 110/214] some_ip_gateway: removed references to AUTOSAR removed references to AUTOSAR, now using vsomeip and some-ip.com . one more ref to AUTOSAR removed --- .../some_ip_gateway/architecture/index.rst | 9 +- .../e2e_state_machine_in_gateway.drawio.svg | 696 ++++++++++++++++- ...2e_state_machine_on_client_side.drawio.svg | 710 +++++++++++++++++- .../assets/some_ip_gateway_details.drawio.svg | 12 +- .../communication/some_ip_gateway/index.rst | 22 +- .../some_ip_gateway/requirements/index.rst | 19 +- 6 files changed, 1424 insertions(+), 44 deletions(-) diff --git a/docs/features/communication/some_ip_gateway/architecture/index.rst b/docs/features/communication/some_ip_gateway/architecture/index.rst index 4b3e79164bb..f31d862ed98 100644 --- a/docs/features/communication/some_ip_gateway/architecture/index.rst +++ b/docs/features/communication/some_ip_gateway/architecture/index.rst @@ -27,7 +27,8 @@ data or to subscribe to data. As such it will need to know and understand the da the IPC network. It also is a participant in the SOME/IP network and provides services for the service oriented communication. -This shall be possible by including SOME/IP stacks that are AUTOSAR compliant. +This shall be possible by including SOME/IP stacks from `vsomeip <https://github.com/COVESA/vsomeip>`_ for reference, which can be replaced by other +implementations, i.e. proprietary commercial stacks. There need to be some components between the two communication networks as data types and their according representations and transmission cadence can be different. Translation of data types could be handled in some translation module @@ -43,7 +44,7 @@ should be mostly freely programmable by integrators using the SOME/IP gateway. Structural View =============== -SOME/IP stacks as supplied by AUTOSAR vendors mostly are available as QM only. +SOME/IP stacks as supplied by different vendors mostly are available as QM only. In the case that SOME/IP implementations are not developed under ASIL-B constraints, adequate measures need to be taken to separate this QM component from the otherwise ASIL-B compliant components. This may be achieved through separate processes, which again will require dedicated inter-process-communication between the SOME/IP-stack and the rest of the gateway. @@ -122,7 +123,7 @@ to the IPC clients to enable the client to individually judge on particular E2E .. note:: The proposed error enumeration is an abstraction. Deriving detailed errors based on the E2E metadata is task of the client. - For reference, this is the error enumeration of the AUTOSAR specification (R24-11): + For reference, this is the typical error enumeration: * OK * ERROR @@ -135,7 +136,7 @@ to the IPC clients to enable the client to individually judge on particular E2E E2E State Machine Considerations -------------------------------- -The E2E (End-to-End) state machine as defined within AUTOSAR E2E protocol provides a summarized result +The E2E (End-to-End) state machine provides a summarized result about the overall health and state of a communication channel. Unlike individual E2E Profile Check() functions, which assess data validity for a single communication cycle, the state machine aggregates results from multiple Check() function invocations over a period. This allows it to determine a more holistic and debounced status of the communication. diff --git a/docs/features/communication/some_ip_gateway/assets/e2e_state_machine_in_gateway.drawio.svg b/docs/features/communication/some_ip_gateway/assets/e2e_state_machine_in_gateway.drawio.svg index cf9ffa295ce..ce4644d3fad 100644 --- a/docs/features/communication/some_ip_gateway/assets/e2e_state_machine_in_gateway.drawio.svg +++ b/docs/features/communication/some_ip_gateway/assets/e2e_state_machine_in_gateway.drawio.svg @@ -1,4 +1,692 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Do not edit this file with editors other than draw.io --> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent; color-scheme: light dark;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="924px" height="681px" viewBox="-0.5 -0.5 924 681" content="<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36" version="28.0.6"> <diagram id="zdjfr85naKGtyoqBhnxg" name="Page-1"> <mxGraphModel dx="1426" dy="743" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1100" pageHeight="850" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> <mxCell id="3" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=3;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;dashed=1;" parent="1" vertex="1"> <mxGeometry x="367" y="180" width="650" height="510" as="geometry" /> </mxCell> <mxCell id="4" value="SOME/IP Gateway" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontStyle=1" parent="1" vertex="1"> <mxGeometry x="787" y="180" width="150" height="30" as="geometry" /> </mxCell> <mxCell id="11" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#1A1A1A;" parent="1" vertex="1"> <mxGeometry x="387" y="210" width="570" height="300" as="geometry" /> </mxCell> <mxCell id="5" value="" style="ellipse;whiteSpace=wrap;html=1;fillColor=none;" parent="1" vertex="1"> <mxGeometry x="177" y="70" width="460" height="190" as="geometry" /> </mxCell> <mxCell id="6" value="IPC&amp;nbsp;&lt;div&gt;participant&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="427" y="220" width="150" height="70" as="geometry" /> </mxCell> <mxCell id="7" value="Gateway Logic &amp;amp; Configuration" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="427" y="300" width="230" height="60" as="geometry" /> </mxCell> <mxCell id="21" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#1A1A1A;" parent="1" vertex="1"> <mxGeometry x="387" y="550" width="570" height="130" as="geometry" /> </mxCell> <mxCell id="8" value="SOME/IP &lt;br&gt;&lt;font style=&quot;color: rgb(0, 0, 0);&quot;&gt;communication&lt;/font&gt;&lt;div&gt;&lt;font style=&quot;color: rgb(0, 0, 0);&quot;&gt;stack&lt;/font&gt;&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1"> <mxGeometry x="482" y="580" width="120" height="82" as="geometry" /> </mxCell> <mxCell id="9" value="End-to-End &lt;br&gt;protection PlugIn&lt;div&gt;&lt;b&gt;&lt;font style=&quot;color: light-dark(rgb(255, 0, 0), rgb(237, 237, 237));&quot;&gt;with&lt;/font&gt;&lt;/b&gt;&amp;nbsp;state machine&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1"> <mxGeometry x="787" y="440" width="153" height="60" as="geometry" /> </mxCell> <mxCell id="12" value="Payload&lt;div&gt;Transformation &lt;br&gt;PlugIn&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;gradientColor=#FFFFFF;gradientDirection=north;" parent="1" vertex="1"> <mxGeometry x="787" y="360" width="153" height="60" as="geometry" /> </mxCell> <mxCell id="16" value="" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=halfCircle;endFill=0;endSize=6;strokeWidth=1;sketch=0;exitX=1;exitY=0.25;exitDx=0;exitDy=0;" parent="1" edge="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="657" y="390" as="sourcePoint" /> <Array as="points"> <mxPoint x="697" y="390" /> </Array> <mxPoint x="727" y="390" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="17" value="" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=oval;endFill=0;sketch=0;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;endSize=10;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="12" edge="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="957" y="395" as="sourcePoint" /> <mxPoint x="727" y="390" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="20" value="" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=oval;endFill=0;sketch=0;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;endSize=10;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" parent="1" edge="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="787" y="469.65999999999997" as="sourcePoint" /> <mxPoint x="727" y="470" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="23" value="IFC" style="rounded=0;whiteSpace=wrap;html=1;rotation=-90;" parent="1" vertex="1"> <mxGeometry x="764.5" y="382.5" width="60" height="15" as="geometry" /> </mxCell> <mxCell id="24" value="IFC" style="rounded=0;whiteSpace=wrap;html=1;rotation=-90;" parent="1" vertex="1"> <mxGeometry x="764.5" y="462.5" width="60" height="15" as="geometry" /> </mxCell> <mxCell id="26" value="IFC" style="rounded=0;whiteSpace=wrap;html=1;rotation=0;" parent="1" vertex="1"> <mxGeometry x="482" y="580" width="120" height="15" as="geometry" /> </mxCell> <mxCell id="30" value="IPC&amp;nbsp;&lt;div&gt;participant&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="377" y="37.5" width="70" height="70" as="geometry" /> </mxCell> <mxCell id="31" value="IPC&amp;nbsp;&lt;div&gt;participant&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="207" y="200" width="90" height="70" as="geometry" /> </mxCell> <mxCell id="33" value="IPC&amp;nbsp;&lt;div&gt;participant&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="247" y="50" width="70" height="70" as="geometry" /> </mxCell> <mxCell id="35" value="&amp;lt;&amp;lt; QM Process &amp;gt;&amp;gt; &lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;1..n" style="text;html=1;align=right;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="713" y="550" width="240" height="40" as="geometry" /> </mxCell> <mxCell id="36" value="&amp;lt;&amp;lt; ASIL Process &amp;gt;&amp;gt;&amp;nbsp; 1..n" style="text;html=1;align=right;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="657" y="210" width="260" height="40" as="geometry" /> </mxCell> <mxCell id="37" value="" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=halfCircle;endFill=0;endSize=6;strokeWidth=1;sketch=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="10" edge="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="472" y="530" as="sourcePoint" /> <Array as="points" /> <mxPoint x="542" y="530" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="38" value="" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=oval;endFill=0;sketch=0;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;endSize=10;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="26" edge="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="602" y="530" as="sourcePoint" /> <mxPoint x="542" y="530" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-53" value="" style="ellipse;whiteSpace=wrap;html=1;align=center;aspect=fixed;fillColor=none;strokeColor=none;resizable=0;perimeter=centerPerimeter;rotatable=0;allowArrows=0;points=[];outlineConnect=1;" parent="1" vertex="1"> <mxGeometry x="637" y="460" width="10" height="10" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-54" value="" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=halfCircle;endFill=0;endSize=6;strokeWidth=1;sketch=0;fontSize=12;exitX=0.25;exitY=0;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="23" target="J6P_MD0nq87JPxEnTwVL-59" edge="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="787" y="400" as="sourcePoint" /> <mxPoint x="727.0042857142857" y="460" as="targetPoint" /> <Array as="points"> <mxPoint x="727" y="405" /> <mxPoint x="727" y="461" /> </Array> </mxGeometry> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-55" value="" style="ellipse;whiteSpace=wrap;html=1;align=center;aspect=fixed;fillColor=none;strokeColor=none;resizable=0;perimeter=centerPerimeter;rotatable=0;allowArrows=0;points=[];outlineConnect=1;" parent="1" vertex="1"> <mxGeometry x="637" y="460" width="10" height="10" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-57" value="" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=halfCircle;endFill=0;endSize=6;strokeWidth=1;sketch=0;fontSize=12;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;edgeStyle=orthogonalEdgeStyle;" parent="1" source="10" target="J6P_MD0nq87JPxEnTwVL-59" edge="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="662" y="465" as="sourcePoint" /> </mxGeometry> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-58" value="" style="ellipse;whiteSpace=wrap;html=1;align=center;aspect=fixed;fillColor=none;strokeColor=none;resizable=0;perimeter=centerPerimeter;rotatable=0;allowArrows=0;points=[];outlineConnect=1;" parent="1" vertex="1"> <mxGeometry x="637" y="460" width="10" height="10" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-59" value="" style="whiteSpace=wrap;html=1;aspect=fixed;fillColor=none;strokeColor=none;" parent="1" vertex="1"> <mxGeometry x="718" y="461" width="17" height="17" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-65" value="" style="ellipse;whiteSpace=wrap;html=1;align=center;aspect=fixed;fillColor=none;strokeColor=none;resizable=0;perimeter=centerPerimeter;rotatable=0;allowArrows=0;points=[];outlineConnect=1;" parent="1" vertex="1"> <mxGeometry x="482" y="350" width="10" height="10" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-70" value="" style="curved=1;endArrow=classic;html=1;rounded=0;exitX=0.75;exitY=0;exitDx=0;exitDy=0;fillColor=#f5f5f5;strokeColor=#666666;strokeWidth=12;opacity=40;" parent="1" source="10" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="557" y="410" as="sourcePoint" /> <mxPoint x="297" y="220" as="targetPoint" /> <Array as="points"> <mxPoint x="577" y="100" /> </Array> </mxGeometry> </mxCell> <mxCell id="10" value="Payload Transformation" style="rounded=0;whiteSpace=wrap;html=1;shadow=0;" parent="1" vertex="1"> <mxGeometry x="427" y="370" width="230" height="60" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-75" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;dashed=1;entryX=-0.002;entryY=0.28;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" target="J6P_MD0nq87JPxEnTwVL-78" edge="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="247" y="330" as="targetPoint" /> <mxPoint x="460" y="170" as="sourcePoint" /> </mxGeometry> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-76" value="&lt;font style=&quot;font-size: 18px;&quot;&gt;&lt;b&gt;IPC&lt;/b&gt;&lt;/font&gt;&lt;div&gt;Mw::com/LoLa&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="352" y="120" width="110" height="40" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-78" value="&lt;div style=&quot;text-align: left;&quot;&gt;Additional metadata to be passed to the client:&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1"> <mxGeometry x="647" y="10" width="260" height="160" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-71" value="&lt;div&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;E2E results&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;of each single&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;communication cycle&lt;/span&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.document;fillColor=#f5f5f5;strokeColor=#666666;align=left;fontColor=#333333;" parent="1" vertex="1"> <mxGeometry x="667" y="50" width="90" height="100" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-79" value="IFC = Interface" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="953" y="36" width="140" height="30" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-80" value="IFC" style="rounded=0;whiteSpace=wrap;html=1;rotation=0;" parent="1" vertex="1"> <mxGeometry x="963" y="43.5" width="40" height="15" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-81" value="AUTOSAR code" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1"> <mxGeometry x="963" y="10" width="120" height="20" as="geometry" /> </mxCell> <mxCell id="IyIQq0pLubg0BM2-jFzm-38" value="&lt;div&gt;Aggregated state machine results&lt;font style=&quot;color: light-dark(rgb(255, 0, 0), rgb(237, 237, 237));&quot;&gt; per communication channel&lt;/font&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.document;fillColor=#f5f5f5;strokeColor=#666666;align=left;fontColor=#333333;" vertex="1" parent="1"> <mxGeometry x="800" y="50" width="90" height="100" as="geometry" /> </mxCell> <mxCell id="IyIQq0pLubg0BM2-jFzm-39" value="+" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=20;fontStyle=1" vertex="1" parent="1"> <mxGeometry x="747" y="85" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="IyIQq0pLubg0BM2-jFzm-40" value="&lt;div&gt;State machine configuration per communication channel&lt;/div&gt;" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.document;align=left;" vertex="1" parent="1"> <mxGeometry x="980" y="325" width="90" height="100" as="geometry" /> </mxCell> <mxCell id="IyIQq0pLubg0BM2-jFzm-41" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;dashed=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=1;exitY=0.25;exitDx=0;exitDy=0;" edge="1" parent="1" source="9" target="IyIQq0pLubg0BM2-jFzm-40"> <mxGeometry relative="1" as="geometry"> <mxPoint x="980" y="363" as="targetPoint" /> <mxPoint x="821" y="488" as="sourcePoint" /> </mxGeometry> </mxCell> <mxCell id="IyIQq0pLubg0BM2-jFzm-42" value="&lt;div&gt;Due to pub/sub nature of mw::com, clients listening on the same topic can not be separately addressed. Therefore, the state machine results can not be selectively distributed according to the particular communication channel they belong to.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.document;fillColor=#f8cecc;strokeColor=#b85450;align=left;fontSize=11;" vertex="1" parent="1"> <mxGeometry x="930" y="80" width="170" height="160" as="geometry" /> </mxCell> <mxCell id="IyIQq0pLubg0BM2-jFzm-43" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.flash;fillColor=light-dark(#ff0000, #ededed);" vertex="1" parent="1"> <mxGeometry x="1045" y="201" width="50" height="100" as="geometry" /> </mxCell> </root> </mxGraphModel> </diagram> </mxfile> "><defs><linearGradient x1="0%" y1="100%" x2="0%" y2="0%" id="drawio-svg-xGQ-8VPEyKeLuhRB7YMy-gradient-light-dark_ffffff_121212_-1-light-dark_d5e8d4_1f2f1e_-1-s-0"><stop offset="0%" stop-color="#d5e8d4" stop-opacity="1" style="stop-color: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stop-opacity: 1;"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1" style="stop-color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stop-opacity: 1;"/></linearGradient></defs><g><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="3"><g><rect x="190" y="170" width="650" height="510" rx="15.3" ry="15.3" fill="#f5f5f5" stroke="#666666" stroke-dasharray="3 3" pointer-events="all" style="fill: light-dark(rgb(245, 245, 245), rgb(26, 26, 26)); stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/></g></g><g data-cell-id="4"><g><rect x="610" y="170" width="150" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 185px; margin-left: 611px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">SOME/IP Gateway</div></div></div></foreignObject><text x="685" y="189" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle" font-weight="bold">SOME/IP Gateway</text></switch></g></g></g><g data-cell-id="11"><g><rect x="210" y="200" width="570" height="300" fill="#f5f5f5" stroke="#1a1a1a" pointer-events="all" style="fill: light-dark(rgb(245, 245, 245), rgb(26, 26, 26)); stroke: light-dark(rgb(26, 26, 26), rgb(215, 215, 215));"/></g></g><g data-cell-id="5"><g><ellipse cx="230" cy="155" rx="230" ry="95" fill="none" stroke="#000000" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="6"><g><rect x="250" y="210" width="150" height="70" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 245px; margin-left: 251px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">IPC <div>participant</div></div></div></div></foreignObject><text x="325" y="249" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">IPC...</text></switch></g></g></g><g data-cell-id="7"><g><rect x="250" y="290" width="230" height="60" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 228px; height: 1px; padding-top: 320px; margin-left: 251px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Gateway Logic & Configuration</div></div></div></foreignObject><text x="365" y="324" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">Gateway Logic & Configuration</text></switch></g></g></g><g data-cell-id="21"><g><rect x="210" y="540" width="570" height="130" fill="#f5f5f5" stroke="#1a1a1a" pointer-events="all" style="fill: light-dark(rgb(245, 245, 245), rgb(26, 26, 26)); stroke: light-dark(rgb(26, 26, 26), rgb(215, 215, 215));"/></g></g><g data-cell-id="8"><g><rect x="305" y="570" width="120" height="82" fill="#d5e8d4" stroke="#82b366" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 611px; margin-left: 306px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">SOME/IP <br /><font style="color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));">communication</font><div><font style="color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));">stack</font></div></div></div></div></foreignObject><text x="365" y="615" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">SOME/IP...</text></switch></g></g></g><g data-cell-id="9"><g><rect x="610" y="430" width="153" height="60" fill="#d5e8d4" stroke="#82b366" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 151px; height: 1px; padding-top: 460px; margin-left: 611px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">End-to-End <br />protection PlugIn<div><b><font style="color: light-dark(rgb(255, 0, 0), rgb(237, 237, 237));">with</font></b> state machine</div></div></div></div></foreignObject><text x="687" y="464" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">End-to-End...</text></switch></g></g></g><g data-cell-id="12"><g><rect x="610" y="350" width="153" height="60" fill="url(#drawio-svg-xGQ-8VPEyKeLuhRB7YMy-gradient-light-dark_ffffff_121212_-1-light-dark_d5e8d4_1f2f1e_-1-s-0)" stroke="#82b366" pointer-events="all" style="fill: url("#drawio-svg-xGQ-8VPEyKeLuhRB7YMy-gradient-light-dark_ffffff_121212_-1-light-dark_d5e8d4_1f2f1e_-1-s-0"); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 151px; height: 1px; padding-top: 380px; margin-left: 611px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Payload<div>Transformation <br />PlugIn</div></div></div></div></foreignObject><text x="687" y="384" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">Payload...</text></switch></g></g></g><g data-cell-id="16"><g><path d="M 480 380 L 520 380 L 542 380" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 550 388 Q 542 388 542 380 Q 542 372 550 372" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="17"><g><path d="M 610 380 L 555 380" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><ellipse cx="550" cy="380" rx="5" ry="5" fill="none" stroke="#000000" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="20"><g><path d="M 610 459.66 L 555 459.97" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><ellipse cx="550" cy="460" rx="5" ry="5" fill="none" stroke="#000000" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="23"><g><rect x="587.5" y="372.5" width="60" height="15" fill="#ffffff" stroke="#000000" transform="rotate(-90,617.5,380)" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="rotate(-90 617.5 380)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 380px; margin-left: 589px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">IFC</div></div></div></foreignObject><text x="618" y="384" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">IFC</text></switch></g></g></g><g data-cell-id="24"><g><rect x="587.5" y="452.5" width="60" height="15" fill="#ffffff" stroke="#000000" transform="rotate(-90,617.5,460)" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="rotate(-90 617.5 460)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 460px; margin-left: 589px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">IFC</div></div></div></foreignObject><text x="618" y="464" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">IFC</text></switch></g></g></g><g data-cell-id="26"><g><rect x="305" y="570" width="120" height="15" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 578px; margin-left: 306px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">IFC</div></div></div></foreignObject><text x="365" y="581" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">IFC</text></switch></g></g></g><g data-cell-id="30"><g><rect x="200" y="27.5" width="70" height="70" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 63px; margin-left: 201px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">IPC <div>participant</div></div></div></div></foreignObject><text x="235" y="66" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">IPC...</text></switch></g></g></g><g data-cell-id="31"><g><rect x="30" y="190" width="90" height="70" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 225px; margin-left: 31px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">IPC <div>participant</div></div></div></div></foreignObject><text x="75" y="229" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">IPC...</text></switch></g></g></g><g data-cell-id="33"><g><rect x="70" y="40" width="70" height="70" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 75px; margin-left: 71px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">IPC <div>participant</div></div></div></div></foreignObject><text x="105" y="79" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">IPC...</text></switch></g></g></g><g data-cell-id="35"><g><rect x="536" y="540" width="240" height="40" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 238px; height: 1px; padding-top: 560px; margin-left: 536px;"><div style="box-sizing: border-box; font-size: 0; text-align: right; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><< QM Process >> <span style="white-space: pre;"> </span>1..n</div></div></div></foreignObject><text x="774" y="564" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="end"><< QM Process >> 1..n</text></switch></g></g></g><g data-cell-id="36"><g><rect x="480" y="200" width="260" height="40" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 258px; height: 1px; padding-top: 220px; margin-left: 480px;"><div style="box-sizing: border-box; font-size: 0; text-align: right; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><< ASIL Process >>  1..n</div></div></div></foreignObject><text x="738" y="224" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="end"><< ASIL Process >>  1..n</text></switch></g></g></g><g data-cell-id="37"><g><path d="M 365 420 L 365 512" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 357 520 Q 357 512 365 512 Q 373 512 373 520" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="38"><g><path d="M 365 570 L 365 525" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><ellipse cx="365" cy="520" rx="5" ry="5" fill="none" stroke="#000000" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-53"><g><ellipse cx="465" cy="455" rx="5" ry="5" fill="none" stroke="none" pointer-events="all"/></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-54"><g><path d="M 610 395 L 549.5 395 L 549.5 443" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 541.5 451 Q 541.5 443 549.5 443 Q 557.5 443 557.5 451" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-55"><g><ellipse cx="465" cy="455" rx="5" ry="5" fill="none" stroke="none" pointer-events="all"/></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-57"><g><path d="M 422.5 420 L 422.5 459.5 L 533 459.5" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 541 467.5 Q 533 467.5 533 459.5 Q 533 451.5 541 451.5" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-58"><g><ellipse cx="465" cy="455" rx="5" ry="5" fill="none" stroke="none" pointer-events="all"/></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-59"><g><rect x="541" y="451" width="17" height="17" fill="none" stroke="none" pointer-events="all"/></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-65"><g><ellipse cx="310" cy="345" rx="5" ry="5" fill="none" stroke="none" pointer-events="all"/></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-70"><g><path d="M 422.5 360 Q 400 90 144.74 199.4" fill="none" stroke="#666666" stroke-opacity="0.4" stroke-width="12" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/><path d="M 132.33 204.72 L 145.33 189.35 L 144.74 199.4 L 152.42 205.9 Z" fill-opacity="0.4" fill="#666666" stroke="#666666" stroke-opacity="0.4" stroke-width="12" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(102, 102, 102), rgb(149, 149, 149)); stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/></g></g><g data-cell-id="10"><g><rect x="250" y="360" width="230" height="60" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 228px; height: 1px; padding-top: 390px; margin-left: 251px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Payload Transformation</div></div></div></foreignObject><text x="365" y="394" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">Payload Transformation</text></switch></g></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-75"><g><path d="M 283 160 L 469.48 44.8" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-76"><g><rect x="175" y="110" width="110" height="40" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 130px; margin-left: 176px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><font style="font-size: 18px;"><b>IPC</b></font><div>Mw::com/LoLa</div></div></div></div></foreignObject><text x="230" y="134" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">IPC...</text></switch></g></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-78"><g><rect x="470" y="0" width="260" height="160" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 258px; height: 1px; padding-top: 7px; margin-left: 471px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div style="text-align: left;">Additional metadata to be passed to the client:</div><div style="text-align: left;"><ul></ul></div></div></div></div></foreignObject><text x="600" y="19" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">Additional metadata to be passed to the cli...</text></switch></g></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-71"><g><path d="M 579.09 54.29 L 579.09 140 L 490 140 L 490 40 L 566.36 40 Z" fill="#f5f5f5" stroke="#666666" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(245, 245, 245), rgb(26, 26, 26)); stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/><path d="M 566.36 40 C 567.4 43.34 565.7 46.79 561.82 49.18 L 579.09 54.59" fill="none" stroke="#666666" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 88px; height: 1px; padding-top: 90px; margin-left: 492px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #333333; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#333333, #c1c1c1); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div><span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">E2E results</span></div><div><span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">of each single</span></div><div><span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">communication cycle</span></div></div></div></div></foreignObject><text x="492" y="94" fill="#333333" font-family="Helvetica" font-size="12px">E2E results...</text></switch></g></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-79"><g><rect x="776" y="26" width="140" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 41px; margin-left: 777px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">IFC = Interface</div></div></div></foreignObject><text x="846" y="45" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">IFC = Interface</text></switch></g></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-80"><g><rect x="786" y="33.5" width="40" height="15" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 41px; margin-left: 787px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">IFC</div></div></div></foreignObject><text x="806" y="45" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">IFC</text></switch></g></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-81"><g><rect x="786" y="0" width="120" height="20" fill="#d5e8d4" stroke="#82b366" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 10px; margin-left: 787px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">AUTOSAR code</div></div></div></foreignObject><text x="846" y="14" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">AUTOSAR code</text></switch></g></g></g><g data-cell-id="IyIQq0pLubg0BM2-jFzm-38"><g><path d="M 712.09 54.29 L 712.09 140 L 623 140 L 623 40 L 699.36 40 Z" fill="#f5f5f5" stroke="#666666" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(245, 245, 245), rgb(26, 26, 26)); stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/><path d="M 699.36 40 C 700.4 43.34 698.7 46.79 694.82 49.18 L 712.09 54.59" fill="none" stroke="#666666" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 88px; height: 1px; padding-top: 90px; margin-left: 625px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #333333; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#333333, #c1c1c1); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>Aggregated state machine results<font style="color: light-dark(rgb(255, 0, 0), rgb(237, 237, 237));"> per communication channel</font></div></div></div></div></foreignObject><text x="625" y="94" fill="#333333" font-family="Helvetica" font-size="12px">Aggregated stat...</text></switch></g></g></g><g data-cell-id="IyIQq0pLubg0BM2-jFzm-39"><g><rect x="570" y="75" width="60" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 90px; margin-left: 571px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 20px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">+</div></div></div></foreignObject><text x="600" y="96" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle" font-weight="bold">+</text></switch></g></g></g><g data-cell-id="IyIQq0pLubg0BM2-jFzm-40"><g><path d="M 892.09 329.29 L 892.09 415 L 803 415 L 803 315 L 879.36 315 Z" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 879.36 315 C 880.4 318.34 878.7 321.79 874.82 324.18 L 892.09 329.59" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 88px; height: 1px; padding-top: 365px; margin-left: 805px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>State machine configuration per communication channel</div></div></div></div></foreignObject><text x="805" y="369" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px">State machine c...</text></switch></g></g></g><g data-cell-id="IyIQq0pLubg0BM2-jFzm-41"><g><path d="M 763 445 L 803 365" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="IyIQq0pLubg0BM2-jFzm-42"><g><path d="M 921.28 92.86 L 921.28 230 L 753 230 L 753 70 L 897.24 70 Z" fill="#f8cecc" stroke="#b85450" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(248, 206, 204), rgb(81, 45, 43)); stroke: light-dark(rgb(184, 84, 80), rgb(215, 129, 126));"/><path d="M 897.24 70 C 899.2 75.35 895.98 80.86 888.66 84.69 L 921.28 93.35" fill="none" stroke="#b85450" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(184, 84, 80), rgb(215, 129, 126));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 168px; height: 1px; padding-top: 150px; margin-left: 755px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #000000; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>Due to pub/sub nature of mw::com, clients listening on the same topic can not be separately addressed. Therefore, the state machine results can not be selectively distributed according to the particular communication channel they belong to.</div><div><br /></div></div></div></div></foreignObject><text x="755" y="153" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="11px">Due to pub/sub nature of mw::co...</text></switch></g></g></g><g data-cell-id="IyIQq0pLubg0BM2-jFzm-43"><g><path d="M 868 291 L 884.67 270.06 L 870.5 255.4 L 884.67 242.83 L 870.5 223.98 L 896.33 191 L 918 217.7 L 898 232.36 L 909.67 247.02 L 892.17 259.59 L 903 271.1 Z" fill="#ff0000" stroke="#000000" stroke-miterlimit="6" pointer-events="all" style="fill: light-dark(rgb(255, 0, 0), rgb(237, 237, 237)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g></g></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file +<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="924px" height="681px" viewBox="-0.5 -0.5 924 681" content="<mxfile><diagram id="zdjfr85naKGtyoqBhnxg" name="Page-1">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</diagram></mxfile>"> + <defs> + <linearGradient x1="0%" y1="100%" x2="0%" y2="0%" id="drawio-svg-Pg1-P31CccAnbGd4pzwQ-gradient-light-dark_ffffff_121212_-1-light-dark_d5e8d4_1f2f1e_-1-s-0"> + <stop offset="0%" stop-color="#d5e8d4" stop-opacity="1" style="stop-color: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stop-opacity: 1;"/> + <stop offset="100%" stop-color="#FFFFFF" stop-opacity="1" style="stop-color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stop-opacity: 1;"/> + </linearGradient> + </defs> + <g> + <g> + <rect x="190" y="170" width="650" height="510" rx="15.3" ry="15.3" fill="#f5f5f5" stroke="#666666" stroke-dasharray="3 3" pointer-events="all" style="fill: light-dark(rgb(245, 245, 245), rgb(26, 26, 26)); stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/> + </g> + <g> + <rect x="610" y="170" width="150" height="30" fill="none" stroke="none" pointer-events="all"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 185px; margin-left: 611px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; "> + SOME/IP Gateway + </div> + </div> + </div> + </foreignObject> + <text x="685" y="189" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle" font-weight="bold"> + SOME/IP Gateway + </text> + </switch> + </g> + </g> + <g> + <rect x="210" y="200" width="570" height="300" fill="#f5f5f5" stroke="#1a1a1a" pointer-events="all" style="fill: light-dark(rgb(245, 245, 245), rgb(26, 26, 26)); stroke: light-dark(rgb(26, 26, 26), rgb(215, 215, 215));"/> + </g> + <g> + <ellipse cx="230" cy="155" rx="230" ry="95" fill="none" stroke="#000000" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <rect x="250" y="210" width="150" height="70" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 245px; margin-left: 251px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + IPC + <div> + participant + </div> + </div> + </div> + </div> + </foreignObject> + <text x="325" y="249" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IPC... + </text> + </switch> + </g> + </g> + <g> + <rect x="250" y="290" width="230" height="60" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 228px; height: 1px; padding-top: 320px; margin-left: 251px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + Gateway Logic & Configuration + </div> + </div> + </div> + </foreignObject> + <text x="365" y="324" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Gateway Logic & Configuration + </text> + </switch> + </g> + </g> + <g> + <rect x="210" y="540" width="570" height="130" fill="#f5f5f5" stroke="#1a1a1a" pointer-events="all" style="fill: light-dark(rgb(245, 245, 245), rgb(26, 26, 26)); stroke: light-dark(rgb(26, 26, 26), rgb(215, 215, 215));"/> + </g> + <g> + <rect x="305" y="570" width="120" height="82" fill="#d5e8d4" stroke="#82b366" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 611px; margin-left: 306px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + SOME/IP + <br/> + <font style="color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"> + communication + </font> + <div> + <font style="color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"> + stack + </font> + </div> + </div> + </div> + </div> + </foreignObject> + <text x="365" y="615" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + SOME/IP... + </text> + </switch> + </g> + </g> + <g> + <rect x="610" y="430" width="153" height="60" fill="#d5e8d4" stroke="#82b366" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 151px; height: 1px; padding-top: 460px; margin-left: 611px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + End-to-End + <br/> + protection PlugIn + <div> + <b> + <font style="color: light-dark(rgb(255, 0, 0), rgb(237, 237, 237));"> + with + </font> + </b> + state machine + </div> + </div> + </div> + </div> + </foreignObject> + <text x="687" y="464" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + End-to-End... + </text> + </switch> + </g> + </g> + <g> + <rect x="610" y="350" width="153" height="60" fill="url(#drawio-svg-Pg1-P31CccAnbGd4pzwQ-gradient-light-dark_ffffff_121212_-1-light-dark_d5e8d4_1f2f1e_-1-s-0)" stroke="#82b366" pointer-events="all" style="fill: url("#drawio-svg-Pg1-P31CccAnbGd4pzwQ-gradient-light-dark_ffffff_121212_-1-light-dark_d5e8d4_1f2f1e_-1-s-0"); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 151px; height: 1px; padding-top: 380px; margin-left: 611px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + Payload + <div> + Transformation + <br/> + PlugIn + </div> + </div> + </div> + </div> + </foreignObject> + <text x="687" y="384" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Payload... + </text> + </switch> + </g> + </g> + <g> + <path d="M 480 380 L 520 380 L 542 380" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 550 388 Q 542 388 542 380 Q 542 372 550 372" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <path d="M 610 380 L 555 380" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <ellipse cx="550" cy="380" rx="5" ry="5" fill="none" stroke="#000000" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <path d="M 610 459.66 L 555 459.97" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <ellipse cx="550" cy="460" rx="5" ry="5" fill="none" stroke="#000000" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <rect x="587.5" y="372.5" width="60" height="15" fill="#ffffff" stroke="#000000" transform="rotate(-90,617.5,380)" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)rotate(-90 617.5 380)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 380px; margin-left: 589px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + IFC + </div> + </div> + </div> + </foreignObject> + <text x="618" y="384" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IFC + </text> + </switch> + </g> + </g> + <g> + <rect x="587.5" y="452.5" width="60" height="15" fill="#ffffff" stroke="#000000" transform="rotate(-90,617.5,460)" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)rotate(-90 617.5 460)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 460px; margin-left: 589px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + IFC + </div> + </div> + </div> + </foreignObject> + <text x="618" y="464" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IFC + </text> + </switch> + </g> + </g> + <g> + <rect x="305" y="570" width="120" height="15" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 578px; margin-left: 306px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + IFC + </div> + </div> + </div> + </foreignObject> + <text x="365" y="581" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IFC + </text> + </switch> + </g> + </g> + <g> + <rect x="200" y="27.5" width="70" height="70" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 63px; margin-left: 201px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + IPC + <div> + participant + </div> + </div> + </div> + </div> + </foreignObject> + <text x="235" y="66" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IPC... + </text> + </switch> + </g> + </g> + <g> + <rect x="30" y="190" width="90" height="70" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 225px; margin-left: 31px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + IPC + <div> + participant + </div> + </div> + </div> + </div> + </foreignObject> + <text x="75" y="229" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IPC... + </text> + </switch> + </g> + </g> + <g> + <rect x="70" y="40" width="70" height="70" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 75px; margin-left: 71px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + IPC + <div> + participant + </div> + </div> + </div> + </div> + </foreignObject> + <text x="105" y="79" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IPC... + </text> + </switch> + </g> + </g> + <g> + <rect x="536" y="540" width="240" height="40" fill="none" stroke="none" pointer-events="all"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 238px; height: 1px; padding-top: 560px; margin-left: 536px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: right; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + << QM Process >> + <span style="white-space: pre;"> + </span> + 1..n + </div> + </div> + </div> + </foreignObject> + <text x="774" y="564" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="end"> + << QM Process >> 1..n + </text> + </switch> + </g> + </g> + <g> + <rect x="480" y="200" width="260" height="40" fill="none" stroke="none" pointer-events="all"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 258px; height: 1px; padding-top: 220px; margin-left: 480px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: right; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + << ASIL Process >>  1..n + </div> + </div> + </div> + </foreignObject> + <text x="738" y="224" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="end"> + << ASIL Process >>  1..n + </text> + </switch> + </g> + </g> + <g> + <path d="M 365 420 L 365 512" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 357 520 Q 357 512 365 512 Q 373 512 373 520" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <path d="M 365 570 L 365 525" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <ellipse cx="365" cy="520" rx="5" ry="5" fill="none" stroke="#000000" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <ellipse cx="465" cy="455" rx="5" ry="5" fill="none" stroke="none" pointer-events="all"/> + </g> + <g> + <path d="M 610 395 L 549.5 395 L 549.5 443" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 541.5 451 Q 541.5 443 549.5 443 Q 557.5 443 557.5 451" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <ellipse cx="465" cy="455" rx="5" ry="5" fill="none" stroke="none" pointer-events="all"/> + </g> + <g> + <path d="M 422.5 420 L 422.5 459.5 L 533 459.5" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 541 467.5 Q 533 467.5 533 459.5 Q 533 451.5 541 451.5" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <ellipse cx="465" cy="455" rx="5" ry="5" fill="none" stroke="none" pointer-events="all"/> + </g> + <g> + <rect x="541" y="451" width="17" height="17" fill="none" stroke="none" pointer-events="all"/> + </g> + <g> + <ellipse cx="310" cy="345" rx="5" ry="5" fill="none" stroke="none" pointer-events="all"/> + </g> + <g> + <path d="M 422.5 360 Q 400 90 144.74 199.4" fill="none" stroke="#666666" stroke-opacity="0.4" stroke-width="12" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/> + <path d="M 132.33 204.72 L 145.33 189.35 L 144.74 199.4 L 152.42 205.9 Z" fill-opacity="0.4" fill="#666666" stroke="#666666" stroke-opacity="0.4" stroke-width="12" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(102, 102, 102), rgb(149, 149, 149)); stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/> + </g> + <g> + <rect x="250" y="360" width="230" height="60" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 228px; height: 1px; padding-top: 390px; margin-left: 251px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + Payload Transformation + </div> + </div> + </div> + </foreignObject> + <text x="365" y="394" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Payload Transformation + </text> + </switch> + </g> + </g> + <g> + <path d="M 283 160 L 469.48 44.8" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <rect x="175" y="110" width="110" height="40" fill="none" stroke="none" pointer-events="all"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 130px; margin-left: 176px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <font style="font-size: 18px;"> + <b> + IPC + </b> + </font> + <div> + Mw::com/LoLa + </div> + </div> + </div> + </div> + </foreignObject> + <text x="230" y="134" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IPC... + </text> + </switch> + </g> + </g> + <g> + <rect x="470" y="0" width="260" height="160" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 258px; height: 1px; padding-top: 7px; margin-left: 471px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <div style="text-align: left;"> + Additional metadata to be passed to the client: + </div> + <div style="text-align: left;"> + <ul></ul> + </div> + </div> + </div> + </div> + </foreignObject> + <text x="600" y="19" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Additional metadata to be passed to the cli... + </text> + </switch> + </g> + </g> + <g> + <path d="M 579.09 54.29 L 579.09 140 L 490 140 L 490 40 L 566.36 40 Z" fill="#f5f5f5" stroke="#666666" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(245, 245, 245), rgb(26, 26, 26)); stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/> + <path d="M 566.36 40 C 567.4 43.34 565.7 46.79 561.82 49.18 L 579.09 54.59" fill="none" stroke="#666666" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 88px; height: 1px; padding-top: 90px; margin-left: 492px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: left; color: #333333; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#333333, #c1c1c1); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <div> + <span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"> + E2E results + </span> + </div> + <div> + <span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"> + of each single + </span> + </div> + <div> + <span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"> + communication cycle + </span> + </div> + </div> + </div> + </div> + </foreignObject> + <text x="492" y="94" fill="#333333" font-family=""Helvetica"" font-size="12px"> + E2E results... + </text> + </switch> + </g> + </g> + <g> + <rect x="776" y="26" width="140" height="30" fill="none" stroke="none" pointer-events="all"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 41px; margin-left: 777px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + IFC = Interface + </div> + </div> + </div> + </foreignObject> + <text x="846" y="45" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IFC = Interface + </text> + </switch> + </g> + </g> + <g> + <rect x="786" y="33.5" width="40" height="15" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 41px; margin-left: 787px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + IFC + </div> + </div> + </div> + </foreignObject> + <text x="806" y="45" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IFC + </text> + </switch> + </g> + </g> + <g> + <rect x="786" y="0" width="120" height="20" fill="#d5e8d4" stroke="#82b366" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 10px; margin-left: 787px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + vsomeip code + </div> + </div> + </div> + </foreignObject> + <text x="846" y="14" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + vsomeip code + </text> + </switch> + </g> + </g> + <g> + <path d="M 712.09 54.29 L 712.09 140 L 623 140 L 623 40 L 699.36 40 Z" fill="#f5f5f5" stroke="#666666" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(245, 245, 245), rgb(26, 26, 26)); stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/> + <path d="M 699.36 40 C 700.4 43.34 698.7 46.79 694.82 49.18 L 712.09 54.59" fill="none" stroke="#666666" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 88px; height: 1px; padding-top: 90px; margin-left: 625px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: left; color: #333333; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#333333, #c1c1c1); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <div> + Aggregated state machine results + <font style="color: light-dark(rgb(255, 0, 0), rgb(237, 237, 237));"> + per communication channel + </font> + </div> + </div> + </div> + </div> + </foreignObject> + <text x="625" y="94" fill="#333333" font-family=""Helvetica"" font-size="12px"> + Aggregated stat... + </text> + </switch> + </g> + </g> + <g> + <rect x="570" y="75" width="60" height="30" fill="none" stroke="none" pointer-events="all"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 90px; margin-left: 571px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 20px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; "> + + + </div> + </div> + </div> + </foreignObject> + <text x="600" y="96" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle" font-weight="bold"> + + + </text> + </switch> + </g> + </g> + <g> + <path d="M 892.09 329.29 L 892.09 415 L 803 415 L 803 315 L 879.36 315 Z" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 879.36 315 C 880.4 318.34 878.7 321.79 874.82 324.18 L 892.09 329.59" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 88px; height: 1px; padding-top: 365px; margin-left: 805px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: left; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <div> + State machine configuration per communication channel + </div> + </div> + </div> + </div> + </foreignObject> + <text x="805" y="369" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px"> + State machine c... + </text> + </switch> + </g> + </g> + <g> + <path d="M 763 445 L 803 365" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <path d="M 921.28 92.86 L 921.28 230 L 753 230 L 753 70 L 897.24 70 Z" fill="#f8cecc" stroke="#b85450" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(248, 206, 204), rgb(81, 45, 43)); stroke: light-dark(rgb(184, 84, 80), rgb(215, 129, 126));"/> + <path d="M 897.24 70 C 899.2 75.35 895.98 80.86 888.66 84.69 L 921.28 93.35" fill="none" stroke="#b85450" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(184, 84, 80), rgb(215, 129, 126));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 168px; height: 1px; padding-top: 150px; margin-left: 755px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: left; color: #000000; "> + <div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <div> + Due to pub/sub nature of mw::com, clients listening on the same topic can not be separately addressed. Therefore, the state machine results can not be selectively distributed according to the particular communication channel they belong to. + </div> + <div> + <br/> + </div> + </div> + </div> + </div> + </foreignObject> + <text x="755" y="153" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px"> + Due to pub/sub nature of mw::co... + </text> + </switch> + </g> + </g> + <g> + <path d="M 868 291 L 884.67 270.06 L 870.5 255.4 L 884.67 242.83 L 870.5 223.98 L 896.33 191 L 918 217.7 L 898 232.36 L 909.67 247.02 L 892.17 259.59 L 903 271.1 Z" fill="#ff0000" stroke="#000000" stroke-miterlimit="6" pointer-events="all" style="fill: light-dark(rgb(255, 0, 0), rgb(237, 237, 237)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + </g> + <switch> + <g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/> + <a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"> + <text text-anchor="middle" font-size="10px" x="50%" y="100%"> + Text is not SVG - cannot display + </text> + </a> + </switch> +</svg> diff --git a/docs/features/communication/some_ip_gateway/assets/e2e_state_machine_on_client_side.drawio.svg b/docs/features/communication/some_ip_gateway/assets/e2e_state_machine_on_client_side.drawio.svg index a3aa7e7592b..3ca9265c5cd 100644 --- a/docs/features/communication/some_ip_gateway/assets/e2e_state_machine_on_client_side.drawio.svg +++ b/docs/features/communication/some_ip_gateway/assets/e2e_state_machine_on_client_side.drawio.svg @@ -1,4 +1,706 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Do not edit this file with editors other than draw.io --> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent; color-scheme: light dark;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1087px" height="681px" viewBox="-0.5 -0.5 1087 681" content="<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36" version="28.0.6"> <diagram id="zdjfr85naKGtyoqBhnxg" name="Page-1"> <mxGraphModel dx="1426" dy="743" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1100" pageHeight="850" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> <mxCell id="3" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=3;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;dashed=1;" parent="1" vertex="1"> <mxGeometry x="367" y="180" width="650" height="510" as="geometry" /> </mxCell> <mxCell id="4" value="SOME/IP Gateway" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontStyle=1" parent="1" vertex="1"> <mxGeometry x="867" y="180" width="150" height="30" as="geometry" /> </mxCell> <mxCell id="11" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#1A1A1A;" parent="1" vertex="1"> <mxGeometry x="387" y="210" width="570" height="300" as="geometry" /> </mxCell> <mxCell id="5" value="" style="ellipse;whiteSpace=wrap;html=1;fillColor=none;" parent="1" vertex="1"> <mxGeometry x="177" y="70" width="460" height="190" as="geometry" /> </mxCell> <mxCell id="6" value="IPC&amp;nbsp;&lt;div&gt;participant&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="427" y="220" width="150" height="70" as="geometry" /> </mxCell> <mxCell id="7" value="Gateway Logic &amp;amp; Configuration" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="427" y="300" width="230" height="60" as="geometry" /> </mxCell> <mxCell id="21" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#1A1A1A;" parent="1" vertex="1"> <mxGeometry x="387" y="550" width="570" height="130" as="geometry" /> </mxCell> <mxCell id="8" value="SOME/IP &lt;br&gt;&lt;font style=&quot;color: rgb(0, 0, 0);&quot;&gt;communication&lt;/font&gt;&lt;div&gt;&lt;font style=&quot;color: rgb(0, 0, 0);&quot;&gt;stack&lt;/font&gt;&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1"> <mxGeometry x="482" y="580" width="120" height="82" as="geometry" /> </mxCell> <mxCell id="9" value="End-to-End &lt;br&gt;protection PlugIn&lt;div&gt;&lt;b&gt;&lt;font style=&quot;color: light-dark(rgb(255, 0, 0), rgb(237, 237, 237));&quot;&gt;w/o&lt;/font&gt;&lt;/b&gt; state machine&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1"> <mxGeometry x="787" y="440" width="153" height="60" as="geometry" /> </mxCell> <mxCell id="12" value="Payload&lt;div&gt;Transformation &lt;br&gt;PlugIn&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;gradientColor=#FFFFFF;gradientDirection=north;" parent="1" vertex="1"> <mxGeometry x="787" y="360" width="153" height="60" as="geometry" /> </mxCell> <mxCell id="16" value="" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=halfCircle;endFill=0;endSize=6;strokeWidth=1;sketch=0;exitX=1;exitY=0.25;exitDx=0;exitDy=0;" parent="1" edge="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="657" y="390" as="sourcePoint" /> <Array as="points"> <mxPoint x="697" y="390" /> </Array> <mxPoint x="727" y="390" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="17" value="" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=oval;endFill=0;sketch=0;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;endSize=10;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="12" edge="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="957" y="395" as="sourcePoint" /> <mxPoint x="727" y="390" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="20" value="" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=oval;endFill=0;sketch=0;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;endSize=10;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" parent="1" edge="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="787" y="469.65999999999997" as="sourcePoint" /> <mxPoint x="727" y="470" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="23" value="IFC" style="rounded=0;whiteSpace=wrap;html=1;rotation=-90;" parent="1" vertex="1"> <mxGeometry x="764.5" y="382.5" width="60" height="15" as="geometry" /> </mxCell> <mxCell id="24" value="IFC" style="rounded=0;whiteSpace=wrap;html=1;rotation=-90;" parent="1" vertex="1"> <mxGeometry x="764.5" y="462.5" width="60" height="15" as="geometry" /> </mxCell> <mxCell id="26" value="IFC" style="rounded=0;whiteSpace=wrap;html=1;rotation=0;" parent="1" vertex="1"> <mxGeometry x="482" y="580" width="120" height="15" as="geometry" /> </mxCell> <mxCell id="30" value="IPC&amp;nbsp;&lt;div&gt;participant&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="377" y="37.5" width="70" height="70" as="geometry" /> </mxCell> <mxCell id="31" value="IPC&amp;nbsp;&lt;div&gt;participant&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="207" y="200" width="90" height="70" as="geometry" /> </mxCell> <mxCell id="33" value="IPC&amp;nbsp;&lt;div&gt;participant&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="247" y="50" width="70" height="70" as="geometry" /> </mxCell> <mxCell id="35" value="&amp;lt;&amp;lt; QM Process &amp;gt;&amp;gt; &lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;1..n" style="text;html=1;align=right;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="713" y="550" width="240" height="40" as="geometry" /> </mxCell> <mxCell id="36" value="&amp;lt;&amp;lt; ASIL Process &amp;gt;&amp;gt;&amp;nbsp; 1..n" style="text;html=1;align=right;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="693" y="210" width="260" height="40" as="geometry" /> </mxCell> <mxCell id="37" value="" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=halfCircle;endFill=0;endSize=6;strokeWidth=1;sketch=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="10" edge="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="472" y="530" as="sourcePoint" /> <Array as="points" /> <mxPoint x="542" y="530" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="38" value="" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=oval;endFill=0;sketch=0;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;endSize=10;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="26" edge="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="602" y="530" as="sourcePoint" /> <mxPoint x="542" y="530" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-53" value="" style="ellipse;whiteSpace=wrap;html=1;align=center;aspect=fixed;fillColor=none;strokeColor=none;resizable=0;perimeter=centerPerimeter;rotatable=0;allowArrows=0;points=[];outlineConnect=1;" vertex="1" parent="1"> <mxGeometry x="637" y="460" width="10" height="10" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-54" value="" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=halfCircle;endFill=0;endSize=6;strokeWidth=1;sketch=0;fontSize=12;exitX=0.25;exitY=0;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" target="J6P_MD0nq87JPxEnTwVL-59" parent="1" source="23"> <mxGeometry relative="1" as="geometry"> <mxPoint x="787" y="400" as="sourcePoint" /> <mxPoint x="727.0042857142857" y="460" as="targetPoint" /> <Array as="points"> <mxPoint x="727" y="405" /> <mxPoint x="727" y="461" /> </Array> </mxGeometry> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-55" value="" style="ellipse;whiteSpace=wrap;html=1;align=center;aspect=fixed;fillColor=none;strokeColor=none;resizable=0;perimeter=centerPerimeter;rotatable=0;allowArrows=0;points=[];outlineConnect=1;" vertex="1" parent="1"> <mxGeometry x="637" y="460" width="10" height="10" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-57" value="" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=halfCircle;endFill=0;endSize=6;strokeWidth=1;sketch=0;fontSize=12;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;edgeStyle=orthogonalEdgeStyle;" edge="1" target="J6P_MD0nq87JPxEnTwVL-59" parent="1" source="10"> <mxGeometry relative="1" as="geometry"> <mxPoint x="662" y="465" as="sourcePoint" /> </mxGeometry> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-58" value="" style="ellipse;whiteSpace=wrap;html=1;align=center;aspect=fixed;fillColor=none;strokeColor=none;resizable=0;perimeter=centerPerimeter;rotatable=0;allowArrows=0;points=[];outlineConnect=1;" vertex="1" parent="1"> <mxGeometry x="637" y="460" width="10" height="10" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-59" value="" style="whiteSpace=wrap;html=1;aspect=fixed;fillColor=none;strokeColor=none;" vertex="1" parent="1"> <mxGeometry x="718" y="461" width="17" height="17" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-67" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;endArrow=none;endFill=0;dashed=1;" edge="1" parent="1" source="J6P_MD0nq87JPxEnTwVL-60"> <mxGeometry relative="1" as="geometry"> <mxPoint x="247" y="280" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-60" value="&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;All E2E results received via IPC metadata need to be fed into the state machine for each single&amp;nbsp; communication cacle.&lt;/span&gt;&lt;div&gt;&lt;br&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;&lt;font style=&quot;color: light-dark(rgb(255, 0, 0), rgb(255, 255, 255));&quot;&gt;E2E state machine configuration details need to be known by the client.&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.document;fillColor=#fff2cc;strokeColor=#d6b656;align=left;" vertex="1" parent="1"> <mxGeometry x="7" y="230" width="150" height="190" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-61" value="End-to-End &lt;br&gt;protection&lt;div&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;state machine&lt;/span&gt;&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1"> <mxGeometry x="207" y="315" width="90" height="50" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-62" value="IFC" style="rounded=0;whiteSpace=wrap;html=1;rotation=0;" vertex="1" parent="1"> <mxGeometry x="207" y="300" width="90" height="15" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-63" value="" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=halfCircle;endFill=0;endSize=6;strokeWidth=1;sketch=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="31"> <mxGeometry relative="1" as="geometry"> <mxPoint x="507" y="355" as="sourcePoint" /> <mxPoint x="252" y="290" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-64" value="" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=oval;endFill=0;sketch=0;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;endSize=10;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="J6P_MD0nq87JPxEnTwVL-62"> <mxGeometry relative="1" as="geometry"> <mxPoint x="467" y="355" as="sourcePoint" /> <mxPoint x="252" y="290" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-65" value="" style="ellipse;whiteSpace=wrap;html=1;align=center;aspect=fixed;fillColor=none;strokeColor=none;resizable=0;perimeter=centerPerimeter;rotatable=0;allowArrows=0;points=[];outlineConnect=1;" vertex="1" parent="1"> <mxGeometry x="482" y="350" width="10" height="10" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-69" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.25;entryY=0;entryDx=0;entryDy=0;dashed=1;endArrow=none;endFill=0;exitX=1.015;exitY=0.27;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="J6P_MD0nq87JPxEnTwVL-68" target="31"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-68" value="E2E sate machine configuration" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.document;align=left;" vertex="1" parent="1"> <mxGeometry x="77" y="107.5" width="80" height="90" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-70" value="" style="curved=1;endArrow=classic;html=1;rounded=0;exitX=0.75;exitY=0;exitDx=0;exitDy=0;fillColor=#f5f5f5;strokeColor=#666666;strokeWidth=12;opacity=40;" edge="1" parent="1" source="10"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="557" y="410" as="sourcePoint" /> <mxPoint x="297" y="220" as="targetPoint" /> <Array as="points"> <mxPoint x="577" y="100" /> </Array> </mxGeometry> </mxCell> <mxCell id="10" value="Payload Transformation" style="rounded=0;whiteSpace=wrap;html=1;shadow=0;" parent="1" vertex="1"> <mxGeometry x="427" y="370" width="230" height="60" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-75" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;dashed=1;entryX=-0.002;entryY=0.28;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" target="J6P_MD0nq87JPxEnTwVL-78"> <mxGeometry relative="1" as="geometry"> <mxPoint x="247" y="330" as="targetPoint" /> <mxPoint x="460" y="170" as="sourcePoint" /> </mxGeometry> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-76" value="&lt;font style=&quot;font-size: 18px;&quot;&gt;&lt;b&gt;IPC&lt;/b&gt;&lt;/font&gt;&lt;div&gt;Mw::com/LoLa&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> <mxGeometry x="352" y="120" width="110" height="40" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-78" value="&lt;div style=&quot;text-align: left;&quot;&gt;Additional metadata to be passed to the client:&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;verticalAlign=top;" vertex="1" parent="1"> <mxGeometry x="647" y="10" width="260" height="160" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-71" value="&lt;div&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;E2E results&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;of each single&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;communication cycle&lt;/span&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;shape=mxgraph.basic.document;fillColor=#f5f5f5;strokeColor=#666666;align=left;fontColor=#333333;" vertex="1" parent="1"> <mxGeometry x="667" y="50" width="90" height="100" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-79" value="IFC = Interface" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> <mxGeometry x="953" y="40" width="140" height="30" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-80" value="IFC" style="rounded=0;whiteSpace=wrap;html=1;rotation=0;" vertex="1" parent="1"> <mxGeometry x="963" y="47.5" width="40" height="15" as="geometry" /> </mxCell> <mxCell id="J6P_MD0nq87JPxEnTwVL-81" value="AUTOSAR code" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1"> <mxGeometry x="963" y="10" width="120" height="20" as="geometry" /> </mxCell> </root> </mxGraphModel> </diagram> </mxfile> "><defs><linearGradient x1="0%" y1="100%" x2="0%" y2="0%" id="drawio-svg-8MIzQagZCFH3dvCEszK3-gradient-light-dark_ffffff_121212_-1-light-dark_d5e8d4_1f2f1e_-1-s-0"><stop offset="0%" stop-color="#d5e8d4" stop-opacity="1" style="stop-color: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stop-opacity: 1;"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1" style="stop-color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stop-opacity: 1;"/></linearGradient></defs><g><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="3"><g><rect x="360" y="170" width="650" height="510" rx="15.3" ry="15.3" fill="#f5f5f5" stroke="#666666" stroke-dasharray="3 3" pointer-events="all" style="fill: light-dark(rgb(245, 245, 245), rgb(26, 26, 26)); stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/></g></g><g data-cell-id="4"><g><rect x="860" y="170" width="150" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 185px; margin-left: 861px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">SOME/IP Gateway</div></div></div></foreignObject><text x="935" y="189" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle" font-weight="bold">SOME/IP Gateway</text></switch></g></g></g><g data-cell-id="11"><g><rect x="380" y="200" width="570" height="300" fill="#f5f5f5" stroke="#1a1a1a" pointer-events="all" style="fill: light-dark(rgb(245, 245, 245), rgb(26, 26, 26)); stroke: light-dark(rgb(26, 26, 26), rgb(215, 215, 215));"/></g></g><g data-cell-id="5"><g><ellipse cx="400" cy="155" rx="230" ry="95" fill="none" stroke="#000000" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="6"><g><rect x="420" y="210" width="150" height="70" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 245px; margin-left: 421px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">IPC <div>participant</div></div></div></div></foreignObject><text x="495" y="249" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">IPC...</text></switch></g></g></g><g data-cell-id="7"><g><rect x="420" y="290" width="230" height="60" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 228px; height: 1px; padding-top: 320px; margin-left: 421px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Gateway Logic & Configuration</div></div></div></foreignObject><text x="535" y="324" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">Gateway Logic & Configuration</text></switch></g></g></g><g data-cell-id="21"><g><rect x="380" y="540" width="570" height="130" fill="#f5f5f5" stroke="#1a1a1a" pointer-events="all" style="fill: light-dark(rgb(245, 245, 245), rgb(26, 26, 26)); stroke: light-dark(rgb(26, 26, 26), rgb(215, 215, 215));"/></g></g><g data-cell-id="8"><g><rect x="475" y="570" width="120" height="82" fill="#d5e8d4" stroke="#82b366" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 611px; margin-left: 476px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">SOME/IP <br /><font style="color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));">communication</font><div><font style="color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));">stack</font></div></div></div></div></foreignObject><text x="535" y="615" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">SOME/IP...</text></switch></g></g></g><g data-cell-id="9"><g><rect x="780" y="430" width="153" height="60" fill="#d5e8d4" stroke="#82b366" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 151px; height: 1px; padding-top: 460px; margin-left: 781px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">End-to-End <br />protection PlugIn<div><b><font style="color: light-dark(rgb(255, 0, 0), rgb(237, 237, 237));">w/o</font></b> state machine</div></div></div></div></foreignObject><text x="857" y="464" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">End-to-End...</text></switch></g></g></g><g data-cell-id="12"><g><rect x="780" y="350" width="153" height="60" fill="url(#drawio-svg-8MIzQagZCFH3dvCEszK3-gradient-light-dark_ffffff_121212_-1-light-dark_d5e8d4_1f2f1e_-1-s-0)" stroke="#82b366" pointer-events="all" style="fill: url("#drawio-svg-8MIzQagZCFH3dvCEszK3-gradient-light-dark_ffffff_121212_-1-light-dark_d5e8d4_1f2f1e_-1-s-0"); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 151px; height: 1px; padding-top: 380px; margin-left: 781px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Payload<div>Transformation <br />PlugIn</div></div></div></div></foreignObject><text x="857" y="384" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">Payload...</text></switch></g></g></g><g data-cell-id="16"><g><path d="M 650 380 L 690 380 L 712 380" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 720 388 Q 712 388 712 380 Q 712 372 720 372" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="17"><g><path d="M 780 380 L 725 380" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><ellipse cx="720" cy="380" rx="5" ry="5" fill="none" stroke="#000000" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="20"><g><path d="M 780 459.66 L 725 459.97" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><ellipse cx="720" cy="460" rx="5" ry="5" fill="none" stroke="#000000" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="23"><g><rect x="757.5" y="372.5" width="60" height="15" fill="#ffffff" stroke="#000000" transform="rotate(-90,787.5,380)" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="rotate(-90 787.5 380)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 380px; margin-left: 759px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">IFC</div></div></div></foreignObject><text x="788" y="384" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">IFC</text></switch></g></g></g><g data-cell-id="24"><g><rect x="757.5" y="452.5" width="60" height="15" fill="#ffffff" stroke="#000000" transform="rotate(-90,787.5,460)" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="rotate(-90 787.5 460)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 460px; margin-left: 759px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">IFC</div></div></div></foreignObject><text x="788" y="464" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">IFC</text></switch></g></g></g><g data-cell-id="26"><g><rect x="475" y="570" width="120" height="15" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 578px; margin-left: 476px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">IFC</div></div></div></foreignObject><text x="535" y="581" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">IFC</text></switch></g></g></g><g data-cell-id="30"><g><rect x="370" y="27.5" width="70" height="70" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 63px; margin-left: 371px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">IPC <div>participant</div></div></div></div></foreignObject><text x="405" y="66" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">IPC...</text></switch></g></g></g><g data-cell-id="31"><g><rect x="200" y="190" width="90" height="70" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 225px; margin-left: 201px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">IPC <div>participant</div></div></div></div></foreignObject><text x="245" y="229" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">IPC...</text></switch></g></g></g><g data-cell-id="33"><g><rect x="240" y="40" width="70" height="70" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 75px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">IPC <div>participant</div></div></div></div></foreignObject><text x="275" y="79" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">IPC...</text></switch></g></g></g><g data-cell-id="35"><g><rect x="706" y="540" width="240" height="40" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 238px; height: 1px; padding-top: 560px; margin-left: 706px;"><div style="box-sizing: border-box; font-size: 0; text-align: right; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><< QM Process >> <span style="white-space: pre;"> </span>1..n</div></div></div></foreignObject><text x="944" y="564" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="end"><< QM Process >> 1..n</text></switch></g></g></g><g data-cell-id="36"><g><rect x="686" y="200" width="260" height="40" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 258px; height: 1px; padding-top: 220px; margin-left: 686px;"><div style="box-sizing: border-box; font-size: 0; text-align: right; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><< ASIL Process >>  1..n</div></div></div></foreignObject><text x="944" y="224" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="end"><< ASIL Process >>  1..n</text></switch></g></g></g><g data-cell-id="37"><g><path d="M 535 420 L 535 512" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 527 520 Q 527 512 535 512 Q 543 512 543 520" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="38"><g><path d="M 535 570 L 535 525" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><ellipse cx="535" cy="520" rx="5" ry="5" fill="none" stroke="#000000" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-53"><g><ellipse cx="635" cy="455" rx="5" ry="5" fill="none" stroke="none" pointer-events="all"/></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-54"><g><path d="M 780 395 L 719.5 395 L 719.5 443" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 711.5 451 Q 711.5 443 719.5 443 Q 727.5 443 727.5 451" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-55"><g><ellipse cx="635" cy="455" rx="5" ry="5" fill="none" stroke="none" pointer-events="all"/></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-57"><g><path d="M 592.5 420 L 592.5 459.5 L 703 459.5" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 711 467.5 Q 703 467.5 703 459.5 Q 703 451.5 711 451.5" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-58"><g><ellipse cx="635" cy="455" rx="5" ry="5" fill="none" stroke="none" pointer-events="all"/></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-59"><g><rect x="711" y="451" width="17" height="17" fill="none" stroke="none" pointer-events="all"/></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-67"><g><path d="M 150 315 L 240 270" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-60"><g><path d="M 148.48 247.14 L 148.48 410 L 0 410 L 0 220 L 127.27 220 Z" fill="#fff2cc" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(255, 242, 204), rgb(40, 29, 0)); stroke: light-dark(rgb(214, 182, 86), rgb(109, 81, 0));"/><path d="M 127.27 220 C 129 226.35 126.16 232.9 119.7 237.45 L 148.48 247.72" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(214, 182, 86), rgb(109, 81, 0));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 148px; height: 1px; padding-top: 315px; margin-left: 2px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">All E2E results received via IPC metadata need to be fed into the state machine for each single  communication cacle.</span><div><br /><span style="background-color: transparent;"><font style="color: light-dark(rgb(255, 0, 0), rgb(255, 255, 255));">E2E state machine configuration details need to be known by the client.</font></span></div></div></div></div></foreignObject><text x="2" y="319" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px">All E2E results received...</text></switch></g></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-61"><g><rect x="200" y="305" width="90" height="50" fill="#d5e8d4" stroke="#82b366" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 330px; margin-left: 201px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">End-to-End <br />protection<div><span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">state machine</span></div></div></div></div></foreignObject><text x="245" y="334" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">End-to-End...</text></switch></g></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-62"><g><rect x="200" y="290" width="90" height="15" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 298px; margin-left: 201px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">IFC</div></div></div></foreignObject><text x="245" y="301" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">IFC</text></switch></g></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-63"><g><path d="M 245 260 L 245 272" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 237 280 Q 237 272 245 272 Q 253 272 253 280" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-64"><g><path d="M 245 290 L 245 285" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><ellipse cx="245" cy="280" rx="5" ry="5" fill="none" stroke="#000000" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-65"><g><ellipse cx="480" cy="345" rx="5" ry="5" fill="none" stroke="none" pointer-events="all"/></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-69"><g><path d="M 151.2 121.8 L 222.5 190" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-68"><g><path d="M 149.19 110.36 L 149.19 187.5 L 70 187.5 L 70 97.5 L 137.88 97.5 Z" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 137.88 97.5 C 138.8 100.51 137.28 103.61 133.84 105.77 L 149.19 110.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 78px; height: 1px; padding-top: 143px; margin-left: 72px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">E2E sate machine configuration</div></div></div></foreignObject><text x="72" y="146" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px">E2E sate mach...</text></switch></g></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-70"><g><path d="M 592.5 360 Q 570 90 314.74 199.4" fill="none" stroke="#666666" stroke-opacity="0.4" stroke-width="12" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/><path d="M 302.33 204.72 L 315.33 189.35 L 314.74 199.4 L 322.42 205.9 Z" fill-opacity="0.4" fill="#666666" stroke="#666666" stroke-opacity="0.4" stroke-width="12" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(102, 102, 102), rgb(149, 149, 149)); stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/></g></g><g data-cell-id="10"><g><rect x="420" y="360" width="230" height="60" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 228px; height: 1px; padding-top: 390px; margin-left: 421px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Payload Transformation</div></div></div></foreignObject><text x="535" y="394" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">Payload Transformation</text></switch></g></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-75"><g><path d="M 453 160 L 639.48 44.8" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-76"><g><rect x="345" y="110" width="110" height="40" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 130px; margin-left: 346px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><font style="font-size: 18px;"><b>IPC</b></font><div>Mw::com/LoLa</div></div></div></div></foreignObject><text x="400" y="134" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">IPC...</text></switch></g></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-78"><g><rect x="640" y="0" width="260" height="160" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 258px; height: 1px; padding-top: 7px; margin-left: 641px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div style="text-align: left;">Additional metadata to be passed to the client:</div><div style="text-align: left;"><ul></ul></div></div></div></div></foreignObject><text x="770" y="19" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">Additional metadata to be passed to the cli...</text></switch></g></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-71"><g><path d="M 749.09 54.29 L 749.09 140 L 660 140 L 660 40 L 736.36 40 Z" fill="#f5f5f5" stroke="#666666" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(245, 245, 245), rgb(26, 26, 26)); stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/><path d="M 736.36 40 C 737.4 43.34 735.7 46.79 731.82 49.18 L 749.09 54.59" fill="none" stroke="#666666" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 88px; height: 1px; padding-top: 90px; margin-left: 662px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #333333; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#333333, #c1c1c1); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div><span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">E2E results</span></div><div><span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">of each single</span></div><div><span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">communication cycle</span></div></div></div></div></foreignObject><text x="662" y="94" fill="#333333" font-family="Helvetica" font-size="12px">E2E results...</text></switch></g></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-79"><g><rect x="946" y="30" width="140" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 45px; margin-left: 947px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">IFC = Interface</div></div></div></foreignObject><text x="1016" y="49" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">IFC = Interface</text></switch></g></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-80"><g><rect x="956" y="37.5" width="40" height="15" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 45px; margin-left: 957px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">IFC</div></div></div></foreignObject><text x="976" y="49" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">IFC</text></switch></g></g></g><g data-cell-id="J6P_MD0nq87JPxEnTwVL-81"><g><rect x="956" y="0" width="120" height="20" fill="#d5e8d4" stroke="#82b366" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 10px; margin-left: 957px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">AUTOSAR code</div></div></div></foreignObject><text x="1016" y="14" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="12px" text-anchor="middle">AUTOSAR code</text></switch></g></g></g></g></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file +<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1087px" height="681px" viewBox="-0.5 -0.5 1087 681" content="<mxfile><diagram id="zdjfr85naKGtyoqBhnxg" name="Page-1">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</diagram></mxfile>"> + <defs> + <linearGradient x1="0%" y1="100%" x2="0%" y2="0%" id="drawio-svg-bAvHyK9ossQ6yVAgRW9R-gradient-light-dark_ffffff_121212_-1-light-dark_d5e8d4_1f2f1e_-1-s-0"> + <stop offset="0%" stop-color="#d5e8d4" stop-opacity="1" style="stop-color: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stop-opacity: 1;"/> + <stop offset="100%" stop-color="#FFFFFF" stop-opacity="1" style="stop-color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stop-opacity: 1;"/> + </linearGradient> + </defs> + <g> + <g> + <rect x="360" y="170" width="650" height="510" rx="15.3" ry="15.3" fill="#f5f5f5" stroke="#666666" stroke-dasharray="3 3" pointer-events="all" style="fill: light-dark(rgb(245, 245, 245), rgb(26, 26, 26)); stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/> + </g> + <g> + <rect x="860" y="170" width="150" height="30" fill="none" stroke="none" pointer-events="all"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 185px; margin-left: 861px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; "> + SOME/IP Gateway + </div> + </div> + </div> + </foreignObject> + <text x="935" y="189" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle" font-weight="bold"> + SOME/IP Gateway + </text> + </switch> + </g> + </g> + <g> + <rect x="380" y="200" width="570" height="300" fill="#f5f5f5" stroke="#1a1a1a" pointer-events="all" style="fill: light-dark(rgb(245, 245, 245), rgb(26, 26, 26)); stroke: light-dark(rgb(26, 26, 26), rgb(215, 215, 215));"/> + </g> + <g> + <ellipse cx="400" cy="155" rx="230" ry="95" fill="none" stroke="#000000" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <rect x="420" y="210" width="150" height="70" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 245px; margin-left: 421px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + IPC + <div> + participant + </div> + </div> + </div> + </div> + </foreignObject> + <text x="495" y="249" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IPC... + </text> + </switch> + </g> + </g> + <g> + <rect x="420" y="290" width="230" height="60" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 228px; height: 1px; padding-top: 320px; margin-left: 421px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + Gateway Logic & Configuration + </div> + </div> + </div> + </foreignObject> + <text x="535" y="324" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Gateway Logic & Configuration + </text> + </switch> + </g> + </g> + <g> + <rect x="380" y="540" width="570" height="130" fill="#f5f5f5" stroke="#1a1a1a" pointer-events="all" style="fill: light-dark(rgb(245, 245, 245), rgb(26, 26, 26)); stroke: light-dark(rgb(26, 26, 26), rgb(215, 215, 215));"/> + </g> + <g> + <rect x="475" y="570" width="120" height="82" fill="#d5e8d4" stroke="#82b366" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 611px; margin-left: 476px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + SOME/IP + <br/> + <font style="color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"> + communication + </font> + <div> + <font style="color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"> + stack + </font> + </div> + </div> + </div> + </div> + </foreignObject> + <text x="535" y="615" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + SOME/IP... + </text> + </switch> + </g> + </g> + <g> + <rect x="780" y="430" width="153" height="60" fill="#d5e8d4" stroke="#82b366" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 151px; height: 1px; padding-top: 460px; margin-left: 781px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + End-to-End + <br/> + protection PlugIn + <div> + <b> + <font style="color: light-dark(rgb(255, 0, 0), rgb(237, 237, 237));"> + w/o + </font> + </b> + state machine + </div> + </div> + </div> + </div> + </foreignObject> + <text x="857" y="464" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + End-to-End... + </text> + </switch> + </g> + </g> + <g> + <rect x="780" y="350" width="153" height="60" fill="url(#drawio-svg-bAvHyK9ossQ6yVAgRW9R-gradient-light-dark_ffffff_121212_-1-light-dark_d5e8d4_1f2f1e_-1-s-0)" stroke="#82b366" pointer-events="all" style="fill: url("#drawio-svg-bAvHyK9ossQ6yVAgRW9R-gradient-light-dark_ffffff_121212_-1-light-dark_d5e8d4_1f2f1e_-1-s-0"); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 151px; height: 1px; padding-top: 380px; margin-left: 781px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + Payload + <div> + Transformation + <br/> + PlugIn + </div> + </div> + </div> + </div> + </foreignObject> + <text x="857" y="384" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Payload... + </text> + </switch> + </g> + </g> + <g> + <path d="M 650 380 L 690 380 L 712 380" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 720 388 Q 712 388 712 380 Q 712 372 720 372" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <path d="M 780 380 L 725 380" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <ellipse cx="720" cy="380" rx="5" ry="5" fill="none" stroke="#000000" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <path d="M 780 459.66 L 725 459.97" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <ellipse cx="720" cy="460" rx="5" ry="5" fill="none" stroke="#000000" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <rect x="757.5" y="372.5" width="60" height="15" fill="#ffffff" stroke="#000000" transform="rotate(-90,787.5,380)" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)rotate(-90 787.5 380)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 380px; margin-left: 759px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + IFC + </div> + </div> + </div> + </foreignObject> + <text x="788" y="384" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IFC + </text> + </switch> + </g> + </g> + <g> + <rect x="757.5" y="452.5" width="60" height="15" fill="#ffffff" stroke="#000000" transform="rotate(-90,787.5,460)" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)rotate(-90 787.5 460)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 460px; margin-left: 759px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + IFC + </div> + </div> + </div> + </foreignObject> + <text x="788" y="464" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IFC + </text> + </switch> + </g> + </g> + <g> + <rect x="475" y="570" width="120" height="15" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 578px; margin-left: 476px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + IFC + </div> + </div> + </div> + </foreignObject> + <text x="535" y="581" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IFC + </text> + </switch> + </g> + </g> + <g> + <rect x="370" y="27.5" width="70" height="70" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 63px; margin-left: 371px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + IPC + <div> + participant + </div> + </div> + </div> + </div> + </foreignObject> + <text x="405" y="66" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IPC... + </text> + </switch> + </g> + </g> + <g> + <rect x="200" y="190" width="90" height="70" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 225px; margin-left: 201px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + IPC + <div> + participant + </div> + </div> + </div> + </div> + </foreignObject> + <text x="245" y="229" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IPC... + </text> + </switch> + </g> + </g> + <g> + <rect x="240" y="40" width="70" height="70" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 75px; margin-left: 241px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + IPC + <div> + participant + </div> + </div> + </div> + </div> + </foreignObject> + <text x="275" y="79" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IPC... + </text> + </switch> + </g> + </g> + <g> + <rect x="706" y="540" width="240" height="40" fill="none" stroke="none" pointer-events="all"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 238px; height: 1px; padding-top: 560px; margin-left: 706px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: right; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + << QM Process >> + <span style="white-space: pre;"> + </span> + 1..n + </div> + </div> + </div> + </foreignObject> + <text x="944" y="564" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="end"> + << QM Process >> 1..n + </text> + </switch> + </g> + </g> + <g> + <rect x="686" y="200" width="260" height="40" fill="none" stroke="none" pointer-events="all"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 258px; height: 1px; padding-top: 220px; margin-left: 686px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: right; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + << ASIL Process >>  1..n + </div> + </div> + </div> + </foreignObject> + <text x="944" y="224" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="end"> + << ASIL Process >>  1..n + </text> + </switch> + </g> + </g> + <g> + <path d="M 535 420 L 535 512" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 527 520 Q 527 512 535 512 Q 543 512 543 520" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <path d="M 535 570 L 535 525" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <ellipse cx="535" cy="520" rx="5" ry="5" fill="none" stroke="#000000" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <ellipse cx="635" cy="455" rx="5" ry="5" fill="none" stroke="none" pointer-events="all"/> + </g> + <g> + <path d="M 780 395 L 719.5 395 L 719.5 443" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 711.5 451 Q 711.5 443 719.5 443 Q 727.5 443 727.5 451" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <ellipse cx="635" cy="455" rx="5" ry="5" fill="none" stroke="none" pointer-events="all"/> + </g> + <g> + <path d="M 592.5 420 L 592.5 459.5 L 703 459.5" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 711 467.5 Q 703 467.5 703 459.5 Q 703 451.5 711 451.5" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <ellipse cx="635" cy="455" rx="5" ry="5" fill="none" stroke="none" pointer-events="all"/> + </g> + <g> + <rect x="711" y="451" width="17" height="17" fill="none" stroke="none" pointer-events="all"/> + </g> + <g> + <path d="M 150 315 L 240 270" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <path d="M 148.48 247.14 L 148.48 410 L 0 410 L 0 220 L 127.27 220 Z" fill="#fff2cc" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(255, 242, 204), rgb(40, 29, 0)); stroke: light-dark(rgb(214, 182, 86), rgb(109, 81, 0));"/> + <path d="M 127.27 220 C 129 226.35 126.16 232.9 119.7 237.45 L 148.48 247.72" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(214, 182, 86), rgb(109, 81, 0));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 148px; height: 1px; padding-top: 315px; margin-left: 2px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: left; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"> + All E2E results received via IPC metadata need to be fed into the state machine for each single  communication cacle. + </span> + <div> + <br/> + <span style="background-color: transparent;"> + <font style="color: light-dark(rgb(255, 0, 0), rgb(255, 255, 255));"> + E2E state machine configuration details need to be known by the client. + </font> + </span> + </div> + </div> + </div> + </div> + </foreignObject> + <text x="2" y="319" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px"> + All E2E results received... + </text> + </switch> + </g> + </g> + <g> + <rect x="200" y="305" width="90" height="50" fill="#d5e8d4" stroke="#82b366" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 330px; margin-left: 201px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + End-to-End + <br/> + protection + <div> + <span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"> + state machine + </span> + </div> + </div> + </div> + </div> + </foreignObject> + <text x="245" y="334" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + End-to-End... + </text> + </switch> + </g> + </g> + <g> + <rect x="200" y="290" width="90" height="15" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 298px; margin-left: 201px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + IFC + </div> + </div> + </div> + </foreignObject> + <text x="245" y="301" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IFC + </text> + </switch> + </g> + </g> + <g> + <path d="M 245 260 L 245 272" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 237 280 Q 237 272 245 272 Q 253 272 253 280" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <path d="M 245 290 L 245 285" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <ellipse cx="245" cy="280" rx="5" ry="5" fill="none" stroke="#000000" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <ellipse cx="480" cy="345" rx="5" ry="5" fill="none" stroke="none" pointer-events="all"/> + </g> + <g> + <path d="M 151.2 121.8 L 222.5 190" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <path d="M 149.19 110.36 L 149.19 187.5 L 70 187.5 L 70 97.5 L 137.88 97.5 Z" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 137.88 97.5 C 138.8 100.51 137.28 103.61 133.84 105.77 L 149.19 110.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 78px; height: 1px; padding-top: 143px; margin-left: 72px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: left; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + E2E sate machine configuration + </div> + </div> + </div> + </foreignObject> + <text x="72" y="146" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px"> + E2E sate mach... + </text> + </switch> + </g> + </g> + <g> + <path d="M 592.5 360 Q 570 90 314.74 199.4" fill="none" stroke="#666666" stroke-opacity="0.4" stroke-width="12" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/> + <path d="M 302.33 204.72 L 315.33 189.35 L 314.74 199.4 L 322.42 205.9 Z" fill-opacity="0.4" fill="#666666" stroke="#666666" stroke-opacity="0.4" stroke-width="12" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(102, 102, 102), rgb(149, 149, 149)); stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/> + </g> + <g> + <rect x="420" y="360" width="230" height="60" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 228px; height: 1px; padding-top: 390px; margin-left: 421px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + Payload Transformation + </div> + </div> + </div> + </foreignObject> + <text x="535" y="394" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Payload Transformation + </text> + </switch> + </g> + </g> + <g> + <path d="M 453 160 L 639.48 44.8" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <rect x="345" y="110" width="110" height="40" fill="none" stroke="none" pointer-events="all"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 130px; margin-left: 346px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <font style="font-size: 18px;"> + <b> + IPC + </b> + </font> + <div> + Mw::com/LoLa + </div> + </div> + </div> + </div> + </foreignObject> + <text x="400" y="134" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IPC... + </text> + </switch> + </g> + </g> + <g> + <rect x="640" y="0" width="260" height="160" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 258px; height: 1px; padding-top: 7px; margin-left: 641px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <div style="text-align: left;"> + Additional metadata to be passed to the client: + </div> + <div style="text-align: left;"> + <ul></ul> + </div> + </div> + </div> + </div> + </foreignObject> + <text x="770" y="19" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Additional metadata to be passed to the cli... + </text> + </switch> + </g> + </g> + <g> + <path d="M 749.09 54.29 L 749.09 140 L 660 140 L 660 40 L 736.36 40 Z" fill="#f5f5f5" stroke="#666666" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(245, 245, 245), rgb(26, 26, 26)); stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/> + <path d="M 736.36 40 C 737.4 43.34 735.7 46.79 731.82 49.18 L 749.09 54.59" fill="none" stroke="#666666" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 88px; height: 1px; padding-top: 90px; margin-left: 662px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: left; color: #333333; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#333333, #c1c1c1); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <div> + <span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"> + E2E results + </span> + </div> + <div> + <span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"> + of each single + </span> + </div> + <div> + <span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"> + communication cycle + </span> + </div> + </div> + </div> + </div> + </foreignObject> + <text x="662" y="94" fill="#333333" font-family=""Helvetica"" font-size="12px"> + E2E results... + </text> + </switch> + </g> + </g> + <g> + <rect x="946" y="30" width="140" height="30" fill="none" stroke="none" pointer-events="all"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 45px; margin-left: 947px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + IFC = Interface + </div> + </div> + </div> + </foreignObject> + <text x="1016" y="49" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IFC = Interface + </text> + </switch> + </g> + </g> + <g> + <rect x="956" y="37.5" width="40" height="15" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 45px; margin-left: 957px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + IFC + </div> + </div> + </div> + </foreignObject> + <text x="976" y="49" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IFC + </text> + </switch> + </g> + </g> + <g> + <rect x="956" y="0" width="120" height="20" fill="#d5e8d4" stroke="#82b366" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)"> + <switch> + <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"> + <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 10px; margin-left: 957px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <span style="color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"> + vsomeip code + </span> + </div> + </div> + </div> + </foreignObject> + <text x="1016" y="14" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + vsomeip code + </text> + </switch> + </g> + </g> + </g> + <switch> + <g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/> + <a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"> + <text text-anchor="middle" font-size="10px" x="50%" y="100%"> + Text is not SVG - cannot display + </text> + </a> + </switch> +</svg> diff --git a/docs/features/communication/some_ip_gateway/assets/some_ip_gateway_details.drawio.svg b/docs/features/communication/some_ip_gateway/assets/some_ip_gateway_details.drawio.svg index 699817d6a9b..2b1cb5cd000 100644 --- a/docs/features/communication/some_ip_gateway/assets/some_ip_gateway_details.drawio.svg +++ b/docs/features/communication/some_ip_gateway/assets/some_ip_gateway_details.drawio.svg @@ -1,6 +1,6 @@ -<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1081px" height="661px" viewBox="-0.5 -0.5 1081 661" content="<mxfile><diagram id="zdjfr85naKGtyoqBhnxg" name="Page-1">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</diagram></mxfile>"> +<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1081px" height="661px" viewBox="-0.5 -0.5 1081 661" content="<mxfile><diagram id="zdjfr85naKGtyoqBhnxg" name="Page-1">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</diagram></mxfile>"> <defs> - <linearGradient x1="0%" y1="100%" x2="0%" y2="0%" id="drawio-svg-_iZUFXP4BSp-YLTmm4xS-gradient-light-dark_ffffff_121212_-1-light-dark_d5e8d4_1f2f1e_-1-s-0"> + <linearGradient x1="0%" y1="100%" x2="0%" y2="0%" id="drawio-svg-a61a4OI70g0RqUKUMnG6-gradient-light-dark_ffffff_121212_-1-light-dark_d5e8d4_1f2f1e_-1-s-0"> <stop offset="0%" stop-color="#d5e8d4" stop-opacity="1" style="stop-color: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stop-opacity: 1;"/> <stop offset="100%" stop-color="#FFFFFF" stop-opacity="1" style="stop-color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stop-opacity: 1;"/> </linearGradient> @@ -164,7 +164,7 @@ </g> </g> <g> - <rect x="630" y="300" width="120" height="60" fill="url(#drawio-svg-_iZUFXP4BSp-YLTmm4xS-gradient-light-dark_ffffff_121212_-1-light-dark_d5e8d4_1f2f1e_-1-s-0)" stroke="#82b366" pointer-events="all" style="fill: url("#drawio-svg-_iZUFXP4BSp-YLTmm4xS-gradient-light-dark_ffffff_121212_-1-light-dark_d5e8d4_1f2f1e_-1-s-0"); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/> + <rect x="630" y="300" width="120" height="60" fill="url(#drawio-svg-a61a4OI70g0RqUKUMnG6-gradient-light-dark_ffffff_121212_-1-light-dark_d5e8d4_1f2f1e_-1-s-0)" stroke="#82b366" pointer-events="all" style="fill: url("#drawio-svg-a61a4OI70g0RqUKUMnG6-gradient-light-dark_ffffff_121212_-1-light-dark_d5e8d4_1f2f1e_-1-s-0"); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/> </g> <g> <g transform="translate(-0.5 -0.5)"> @@ -368,13 +368,13 @@ <div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 20px; margin-left: 691px;"> <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> <div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> - AUTOSAR code + vsomeip code </div> </div> </div> </foreignObject> <text x="750" y="24" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> - AUTOSAR code + vsomeip code </text> </switch> </g> @@ -461,7 +461,7 @@ <path d="M 751.12 330 L 758.12 326.5 L 756.37 330 L 758.12 333.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> </g> <g> - <rect x="920" y="240" width="120" height="60" fill="url(#drawio-svg-_iZUFXP4BSp-YLTmm4xS-gradient-light-dark_ffffff_121212_-1-light-dark_d5e8d4_1f2f1e_-1-s-0)" stroke="#82b366" pointer-events="all" style="fill: url("#drawio-svg-_iZUFXP4BSp-YLTmm4xS-gradient-light-dark_ffffff_121212_-1-light-dark_d5e8d4_1f2f1e_-1-s-0"); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/> + <rect x="920" y="240" width="120" height="60" fill="url(#drawio-svg-a61a4OI70g0RqUKUMnG6-gradient-light-dark_ffffff_121212_-1-light-dark_d5e8d4_1f2f1e_-1-s-0)" stroke="#82b366" pointer-events="all" style="fill: url("#drawio-svg-a61a4OI70g0RqUKUMnG6-gradient-light-dark_ffffff_121212_-1-light-dark_d5e8d4_1f2f1e_-1-s-0"); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/> </g> <g> <g transform="translate(-0.5 -0.5)"> diff --git a/docs/features/communication/some_ip_gateway/index.rst b/docs/features/communication/some_ip_gateway/index.rst index c096008d16d..0a7d28743de 100644 --- a/docs/features/communication/some_ip_gateway/index.rst +++ b/docs/features/communication/some_ip_gateway/index.rst @@ -102,9 +102,8 @@ The requirements from Communication generally apply to the SOME/IP Gateway. SOME/IP protocol implementation ------------------------------- -The protocol implementation shall be fully compatible and complying with the SOME/IP specification from AUTOSAR Adaptive. (:need:`feat_req__some_ip_gateway__someip_protocol`) -Specifically the SOME/IP specification from AUTOSAR release R24-11 shall be supported by the SOME/IP Gateway. This shall guarantee that systems integrated with the SOME/IP gateway can be used in according -automotive E/E-architectures. +For reference purpose, the gateway shall use the `vsomeip <https://github.com/COVESA/vsomeip>`_ protocol +implementation that is compatible and complying with the SOME/IP specification from `some-ip.com <https://some-ip.com/>`_. (:need:`feat_req__some_ip_gateway__someip_protocol`) Protocol implementations shall be wrapped in an abstraction API, that stays stable and allows implementations may be exchanged, potentially even by binary only libraries. The SOME/IP Gateway shall support SOME/IP Events, Fields and Methods and shall map these accordingly into IPC. @@ -176,7 +175,7 @@ Access Control acts on OSI Layer 5-7. It shall fulfill the following: .. note:: - Checking SOME/IP-SD messages with the ACL is optional because no functional data is transported. - - SOME/IP-SD messages are not protected as per AUTOSAR Adaptive specification. + - SOME/IP-SD messages are not protected as per specification. .. uml:: @@ -219,7 +218,7 @@ End-to-End (E2E) protection with CRC and counters Applications communicating over the network may have to protect data with end-to-end protection (E2E), which may involve CRC-protection and checks, and message counters. -There are several E2E (= End-to-End) profiles, which utilize various CRC routines as part of AUTOSAR E2E Protocol Specification, that shall be supported with the SOME/IP Gateway. +There are several E2E (= End-to-End) profiles, which utilize various CRC routines as part of E2E Protocol Specification, that shall be supported with the SOME/IP Gateway. Though the implementation of the SOME/IP protocol itself is likely not going to be ASIL-B compliant and have a safety consideration of QM rather, E2E-checks and protection need to happen in an ASIL-B context. The gateway may perform the CRC routines as a central service. @@ -229,21 +228,18 @@ SOME/IP Events, Methods, and Fields need to be supported with E2E protection. Please refer to the SOME/IP Gateway architecture for further details. -References - -- `AUTOSAR_FO_PRS_E2EProtocol <https://www.autosar.org/fileadmin/standards/R24-11/FO/AUTOSAR_FO_PRS_E2EProtocol.pdf>`_ -- `AUTOSAR_FO_RS_E2E <https://www.autosar.org/fileadmin/standards/R24-11/FO/AUTOSAR_FO_RS_E2E.pdf>`_ License Impact ============== [How could the copyright impacted by the license of the new contribution?] -Since SOME/IP is a protocol, including applied E2E protection and the according profile (polynom, etc.), -defined by AUTOSAR and published under the license of AUTOSAR, the gateway implementation shall carefully distinguish between the SOME/IP communication stack, -the E2E protection of data, and the integration into S-CORE mw::com. Breach of foreign licenses must be avoided. +SOME/IP is a protocol, including applied E2E protection and the according profile (polynom, etc.), +is defined by multiple organizations, here we refer to the us of `vsomeip <https://github.com/COVESA/vsomeip>`_ implementation that refers to `some-ip.com <https://some-ip.com/>`_. +The gateway implementation shall carefully distinguish between the SOME/IP communication stack, +the E2E protection of data, and the integration into S-CORE mw::com. -Anybody using SOME/IP Gateway needs to make sure to follow the license conditions and rules of AUTOSAR. +Anybody requiring specific SOME/IP versions needs to make sure to follow the license conditions and rules of the underlying standards or specifications. How to Teach This ================= diff --git a/docs/features/communication/some_ip_gateway/requirements/index.rst b/docs/features/communication/some_ip_gateway/requirements/index.rst index bc26141f5f7..b182582bc02 100644 --- a/docs/features/communication/some_ip_gateway/requirements/index.rst +++ b/docs/features/communication/some_ip_gateway/requirements/index.rst @@ -39,7 +39,7 @@ Functional Requirements The SOME/IP Gateway shall support an interface to plug-in a E2E protection service implementation. -.. feat_req:: Compatibility with AUTOSAR SOME/IP Protocol Specification +.. feat_req:: Compatibility with `some-ip.com <https://some-ip.com/>`_ Protocol Specification :id: feat_req__some_ip_gateway__someip_protocol :reqtype: Functional :security: NO @@ -47,11 +47,9 @@ Functional Requirements :satisfies: stkh_req__communication__supported_net :status: valid - The SOME/IP protocol implementation shall be fully compatible and complying with the SOME/IP protocol specification from AUTOSAR Adaptive Version 24-11. - - `AUTOSAR_FO_PRS_SOMEIPProtocol <https://www.autosar.org/fileadmin/standards/R24-11/FO/AUTOSAR_FO_PRS_SOMEIPProtocol.pdf>`_ - - `AUTOSAR_FO_RS_SOMEIPProtocol <https://www.autosar.org/fileadmin/standards/R24-11/FO/AUTOSAR_FO_RS_SOMEIPProtocol.pdf>`_ + The SOME/IP protocol implementation shall be fully compatible and complying with the SOME/IP protocol specification from `some-ip.com <https://some-ip.com/>`_. -.. feat_req:: Compatibility with AUTOSAR E2E Protocol Specification +.. feat_req:: Compatibility with `some-ip.com <https://some-ip.com/>`_ E2E Protocol Specification :id: feat_req__some_ip_gateway__e2e_specs :reqtype: Functional :security: NO @@ -59,12 +57,9 @@ Functional Requirements :satisfies: stkh_req__communication__supported_net :status: valid - The E2E protection implementation shall be fully compatible and complying with the E2E protocol specification from AUTOSAR Adaptive Version 24-11. - - `AUTOSAR_FO_PRS_E2EProtocol <https://www.autosar.org/fileadmin/standards/R24-11/FO/AUTOSAR_FO_PRS_E2EProtocol.pdf>`_ - - `AUTOSAR_FO_RS_E2E <https://www.autosar.org/fileadmin/standards/R24-11/FO/AUTOSAR_FO_RS_E2E.pdf>`_ + The E2E protection implementation shall be fully compatible and complying with the E2E protocol specification from `some-ip.com <https://some-ip.com/>`_. - -.. feat_req:: Compatibility with AUTOSAR SOME/IP Service Discovery Protocol Specification +.. feat_req:: Compatibility with `some-ip.com <https://some-ip.com/>`_ SOME/IP Service Discovery Protocol Specification :id: feat_req__some_ip_gateway__someip_sd_protocol :reqtype: Functional :security: NO @@ -72,6 +67,4 @@ Functional Requirements :satisfies: stkh_req__communication__supported_net :status: valid - The Service Discovery implementation shall be fully compatible and complying with the SOME/IP service discovery specification from AUTOSAR Adaptive Version 24-11. - - `AUTOSAR_FO_PRS_SOMEIPServiceDiscoveryProtocol <https://www.autosar.org/fileadmin/standards/R24-11/FO/AUTOSAR_FO_PRS_SOMEIPServiceDiscoveryProtocol.pdf>`_ - - `AUTOSAR_FO_RS_SOMEIPServiceDiscoveryProtocol <https://www.autosar.org/fileadmin/standards/R24-11/FO/AUTOSAR_FO_RS_SOMEIPServiceDiscoveryProtocol.pdf>`_ + The Service Discovery implementation shall be fully compatible and complying with the SOME/IP service discovery specification from `some-ip.com <https://some-ip.com/>`_. From 326635979260ab196e29f0514ee36c58cbca8fb8 Mon Sep 17 00:00:00 2001 From: Philipp Ahmann <2428012+pahmann@users.noreply.github.com> Date: Fri, 2 Jan 2026 10:51:46 +0100 Subject: [PATCH 111/214] Correct reference to vsomeip including repo link Minor correction from review finding. Signed-off-by: Philipp Ahmann <2428012+pahmann@users.noreply.github.com> --- .../communication/some_ip_gateway/architecture/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/features/communication/some_ip_gateway/architecture/index.rst b/docs/features/communication/some_ip_gateway/architecture/index.rst index f31d862ed98..65dce26e750 100644 --- a/docs/features/communication/some_ip_gateway/architecture/index.rst +++ b/docs/features/communication/some_ip_gateway/architecture/index.rst @@ -27,8 +27,8 @@ data or to subscribe to data. As such it will need to know and understand the da the IPC network. It also is a participant in the SOME/IP network and provides services for the service oriented communication. -This shall be possible by including SOME/IP stacks from `vsomeip <https://github.com/COVESA/vsomeip>`_ for reference, which can be replaced by other -implementations, i.e. proprietary commercial stacks. +This shall be possible by including the `vsomeip <https://github.com/COVESA/vsomeip>`_ SOME/IP stack for reference, +which can be replaced by other implementations, i.e. proprietary commercial stacks. There need to be some components between the two communication networks as data types and their according representations and transmission cadence can be different. Translation of data types could be handled in some translation module From 7756f1d01e3e17c69debc748c4392c6d1fff6f50 Mon Sep 17 00:00:00 2001 From: Andreas Zwinkau <Andreas.Zwinkau@etas.com> Date: Mon, 15 Dec 2025 09:22:44 +0100 Subject: [PATCH 112/214] Remove persistency module docs They are now in the persistency module: https://github.com/eclipse-score/persistency/pull/188 Note that persistency feature docs are still here. --- docs/features/persistency/index.rst | 5 +- docs/modules/persistency/docs/index.rst | 27 -- .../modules/persistency/docs/manual/index.rst | 21 - .../persistency/docs/manual/safety_manual.rst | 104 ----- .../persistency/docs/release/release_note.rst | 79 ---- .../persistency/docs/safety_mgt/index.rst | 23 - .../safety_mgt/module_safety_package_fdr.rst | 63 --- .../docs/safety_mgt/module_safety_plan.rst | 297 ------------- .../safety_mgt/module_safety_plan_fdr.rst | 93 ----- .../module_verification_report.rst | 81 ---- docs/modules/persistency/index.rst | 32 -- .../json/docs/component_classification.rst | 182 -------- docs/modules/persistency/json/docs/index.rst | 41 -- .../kvs/docs/architecture/index.rst | 125 ------ docs/modules/persistency/kvs/docs/index.rst | 155 ------- .../kvs/docs/requirements/index.rst | 394 ------------------ .../kvs/docs/safety_analysis/dfa.rst | 27 -- .../kvs/docs/safety_analysis/fmea.rst | 27 -- 18 files changed, 1 insertion(+), 1775 deletions(-) delete mode 100644 docs/modules/persistency/docs/index.rst delete mode 100644 docs/modules/persistency/docs/manual/index.rst delete mode 100644 docs/modules/persistency/docs/manual/safety_manual.rst delete mode 100644 docs/modules/persistency/docs/release/release_note.rst delete mode 100644 docs/modules/persistency/docs/safety_mgt/index.rst delete mode 100644 docs/modules/persistency/docs/safety_mgt/module_safety_package_fdr.rst delete mode 100644 docs/modules/persistency/docs/safety_mgt/module_safety_plan.rst delete mode 100644 docs/modules/persistency/docs/safety_mgt/module_safety_plan_fdr.rst delete mode 100644 docs/modules/persistency/docs/verification/module_verification_report.rst delete mode 100644 docs/modules/persistency/index.rst delete mode 100644 docs/modules/persistency/json/docs/component_classification.rst delete mode 100644 docs/modules/persistency/json/docs/index.rst delete mode 100644 docs/modules/persistency/kvs/docs/architecture/index.rst delete mode 100644 docs/modules/persistency/kvs/docs/index.rst delete mode 100644 docs/modules/persistency/kvs/docs/requirements/index.rst delete mode 100644 docs/modules/persistency/kvs/docs/safety_analysis/dfa.rst delete mode 100644 docs/modules/persistency/kvs/docs/safety_analysis/fmea.rst diff --git a/docs/features/persistency/index.rst b/docs/features/persistency/index.rst index ded30f1e54b..86fdf7b5a1d 100644 --- a/docs/features/persistency/index.rst +++ b/docs/features/persistency/index.rst @@ -135,10 +135,7 @@ analyze the impact of the feature. :need:`doc__persistency_fmea` We use an iterative development process and apply results from the next steps -back to the feature request. For TinyJSON we will perform a software component -classification. - -:need:`doc__persistency_component_classification` +back to the feature request. To ensure the freedom of interference the feature key-value storage should not be used within different processes. diff --git a/docs/modules/persistency/docs/index.rst b/docs/modules/persistency/docs/index.rst deleted file mode 100644 index 62a2a1fd061..00000000000 --- a/docs/modules/persistency/docs/index.rst +++ /dev/null @@ -1,27 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2025 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -.. _module_documentation: - -Module Documents Persistency -############################ - -.. toctree:: - :maxdepth: 1 - :glob: - - manual/index.rst - safety_mgt/index.rst - verification/module_verification_report.rst - release/release_note.rst diff --git a/docs/modules/persistency/docs/manual/index.rst b/docs/modules/persistency/docs/manual/index.rst deleted file mode 100644 index 08ba1a6e1a0..00000000000 --- a/docs/modules/persistency/docs/manual/index.rst +++ /dev/null @@ -1,21 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2024 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -Manuals -####### - -.. toctree:: - :titlesonly: - - safety_manual diff --git a/docs/modules/persistency/docs/manual/safety_manual.rst b/docs/modules/persistency/docs/manual/safety_manual.rst deleted file mode 100644 index b2515225fd5..00000000000 --- a/docs/modules/persistency/docs/manual/safety_manual.rst +++ /dev/null @@ -1,104 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2025 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -Safety Manual -============= - -.. document:: Persistency Safety Manual - :id: doc__persistency_safety_manual - :status: valid - :safety: ASIL_B - :security: NO - :tags: persistency - :realizes: wp__module_safety_manual - -Introduction/Scope ------------------- -| This manual will cover the Feature Persistency. It's based on the components KVS and Tiny JSON. - -Assumed Platform Safety Requirements ------------------------------------- -| For the module persistency the following safety related stakeholder requirements are assumed to define the top level functionality (purpose) of the module persistency. I.e. from these all the feature and component requirements implemented are derived. -| List of stakeholder requirements, with ASIL B, the module's components requirements are derived from. - -.. needtable:: - :style: table - :columns: title;id;status - :colwidths: 25,25,15 - :sort: title - - results = [] - - for need in needs.filter_types(["stkh_req"]): - if need and "persistency" in need["tags"]: - if need["safety"] == "ASIL_B": - results.append(need) - - -Assumptions of Use ------------------- - -Assumptions on the Environment -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -| Generally the assumption of the S-CORE platform SEooC is that it is integrated in a safe system, i.e. the POSIX OS it runs on is qualified and also the HW related failures are taken into account by the system integrator, if not otherwise stated in the module's safety concept. - -List of AoUs expected from the environment the module runs on: - -.. needtable:: - :style: table - :columns: title;id;status - :colwidths: 25,25,25 - :sort: title - - results = [] - - for need in needs.filter_types(["aou_req"]): - if need and "persistency" in need["tags"]: - if need and "environment" in need["tags"]: - results.append(need) - -Assumptions on the User -^^^^^^^^^^^^^^^^^^^^^^^ -| As there is no assumption on which specific OS and HW is used, the integration testing of the stakeholder and feature requirements is expected to be performed by the user of the platform SEooC. Tests covering all stakeholder and feature requirements performed on a reference platform (tbd link to reference platform specification), reviewed and passed are included in the platform SEooC safety case. -| Additionally the components of the platform may have additional specific assumptions how they are used. These are part of every module documentation: :ref:`module_documentation`. Assumptions from components to their users can be fulfilled in two ways: -| 1. There are assumption which need to be fulfilled by all SW components, e.g. "every user of an IPC mechanism needs to make sure that he provides correct data (including appropriate ASIL level)" - in this case the AoU is marked as "platform". -| 2. There are assumption which can be fulfilled by a safety mechanism realized by some other S-CORE platform component and are therefore not relevant for an user who uses the whole platform. But those are relevant if you chose to use the module SEooC stand-alone - in this case the AoU is marked as "module". An example would be the "JSON read" which requires "The user shall provide a string as input which is not corrupted due to HW or QM SW errors." - which is covered when using together with safe S-CORE platform persistency feature. - -List of AoUs on the user of the platform features or the module of this safety manual: - -.. needtable:: - :style: table - :columns: title;id;status - :colwidths: 25,25,25 - :sort: title - - results = [] - - for need in needs.filter_types(["aou_req"]): - if need and "environment" not in need["tags"]: - if need and "persistency" in need["tags"]: - results.append(need) - -Safety concept of the SEooC ---------------------------- -| <Describe here the safety concept incl. which faults are taken care of, reactions of the implemented functions under anomalous operating conditions ... if this is not already documented sufficiently in the feature documentation "safety impact" section of all the features the module is used in.> - -Safety Anomalies ----------------- -| Anomalies (bugs in ASIL SW, detected by testing or by users, which could not be fixed) known before release are documented in the platform/module release notes <add link to release note>. - -References ----------- -| <link to the user manual> -| <other links> diff --git a/docs/modules/persistency/docs/release/release_note.rst b/docs/modules/persistency/docs/release/release_note.rst deleted file mode 100644 index e966523ce98..00000000000 --- a/docs/modules/persistency/docs/release/release_note.rst +++ /dev/null @@ -1,79 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2025 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -Release Note -============ - -.. document:: Persistency Release Note - :id: doc__persistency_release_note - :status: valid - :safety: ASIL_B - :security: NO - :realizes: wp__module_sw_release_note - :tags: persistency - -| Module Name: Persistency -| Release Tag: vX.Y.Z -| Release Commit Hash: a1b2c3d4e5f6g7h8i9j0 -| Release Date: YYYY-MM-DD -| -| Overview -| -------- -| -| This document provides an overview of the changes, improvements, and bug fixes included in the software module release version vX.Y.Z. -| -| New Features -| ------------ -| -| - **Feature 1**: Brief description of the new feature. -| - **Feature 2**: Brief description of the new feature. -| - **Feature 3**: Brief description of the new feature. -| -| Improvements -| ------------ -| -| - **Improvement 1**: Brief description of the improvement. -| - **Improvement 2**: Brief description of the improvement. -| - **Improvement 3**: Brief description of the improvement. -| -| Bug Fixes -| --------- -| -| - **Bug 1**: Brief description of the bug fix. -| - **Bug 2**: Brief description of the bug fix. -| - **Bug 3**: Brief description of the bug fix. -| -| Compatibility -| ------------- -| -| - **Dependencies**: List any dependencies and their versions. -| -| Known Issues -| ------------ -| -| - **Issue 1**: Brief description of the known issue. Justification regarding safety impact. -| - **Issue 2**: Brief description of the known issue. Justification regarding safety impact. -| - **Issue 3**: Brief description of the known issue. Justification regarding safety impact. -| -| Upgrade Instructions -| -------------------- -| -| 1. **Step 1**: Description of the first step. -| 2. **Step 2**: Description of the second step. -| 3. **Step 3**: Description of the third step. -| -| Contact Information -| ------------------- -| -| For any questions or support, please contact the *Project lead* or raise an issue/discussion. diff --git a/docs/modules/persistency/docs/safety_mgt/index.rst b/docs/modules/persistency/docs/safety_mgt/index.rst deleted file mode 100644 index 04718ba3557..00000000000 --- a/docs/modules/persistency/docs/safety_mgt/index.rst +++ /dev/null @@ -1,23 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2024 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -Safety Management -################# - -.. toctree:: - :titlesonly: - - module_safety_plan - module_safety_plan_fdr - module_safety_package_fdr diff --git a/docs/modules/persistency/docs/safety_mgt/module_safety_package_fdr.rst b/docs/modules/persistency/docs/safety_mgt/module_safety_package_fdr.rst deleted file mode 100644 index 678f4e756ae..00000000000 --- a/docs/modules/persistency/docs/safety_mgt/module_safety_package_fdr.rst +++ /dev/null @@ -1,63 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2025 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -Safety Package Formal Review Report -=================================== - -.. document:: Persistency Safety Package Formal Review - :id: doc__persistency_safety_package_fdr - :status: valid - :safety: ASIL_B - :security: NO - :realizes: wp__fdr_reports - :tags: persistency - -**1. Purpose** - -The purpose of this review checklist is to report status of the formal review for the safety package. - -**2. Checklist** - -.. list-table:: Safety Package Checklist - :header-rows: 1 - - * - Id - - Safety package activity - - Compliant to ISO 26262? - - Comment - - * - 1 - - Is a safety package provided which matches the safety plan (i.e. all planned workproducts referenced)? - - [YES | NO ] - - <Rationale for result> - - * - 2 - - Is the argument how functional safety is achieved, provided in the safety package, plausible and sufficient? - - NO - - The argument is intentionally not provided by S-CORE. - - * - 3 - - Are the referenced work products available? - - [YES | NO ] - - <Rationale for result> - - * - 4 - - Are the referenced work products in released state, including the process safety audit? - - [YES | NO ] - - <Rationale for result> - - * - 5 - - If safety related deviations from the process or safety concept are documented, are these argued understandably? - - [YES | NO ] - - <Rationale for result> diff --git a/docs/modules/persistency/docs/safety_mgt/module_safety_plan.rst b/docs/modules/persistency/docs/safety_mgt/module_safety_plan.rst deleted file mode 100644 index 93e633670ec..00000000000 --- a/docs/modules/persistency/docs/safety_mgt/module_safety_plan.rst +++ /dev/null @@ -1,297 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2025 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -Module Safety Plan -****************** - -.. document:: Persistency Safety Plan - :id: doc__persistency_safety_plan - :status: valid - :safety: ASIL_B - :security: NO - :realizes: wp__module_safety_plan - :tags: persistency - -Functional Safety Management Context -==================================== - -This Safety Plan adds to the :need:`gd_guidl__saf_plan_definitions` all the module development relevant workproducts needed for ISO 26262 conformity. - -Functional Safety Management Scope -================================== - -This Safety Plan's scope is a SW module of the SW platform :ref:`module_documentation`. -The module consists of one or more SW components and will be qualified as a SEooC. - -Functional Safety Management Roles -================================== - -.. list-table:: Module roles - :header-rows: 1 - - * - Role - - Assignee - - * - Safety Manager - - Volker Häussler - - * - Module Project Manager (= Feature team lead) - - Lars Bauhofer - -Tailoring -========= - -Additional to the tailoring in the SW platform project as defined in the :need:`gd_guidl__saf_plan_definitions` we define here the additional tailoring on module level. - -| - Excluded for this module are additionally the following workproducts (and their related requirements): -| - No work products excluded - -Functional Safety Module Workproducts -===================================== - -One set of workproducts for the module and one set for each component of the module: - -Module Workproducts List ------------------------- - -.. list-table:: Module Workproducts - :header-rows: 1 - - * - Workproduct Id - - Link to process - - Process status - - Link to WP - - * - :need:`wp__module_safety_plan` - - :need:`gd_guidl__saf_plan_definitions` - - :ndf:`copy('status', need_id='gd_guidl__saf_plan_definitions')` - - this document - - * - :need:`wp__module_safety_package` - - :need:`gd_guidl__saf_package` - - :ndf:`copy('status', need_id='gd_guidl__saf_package')` - - this document (including the linked documentation) - - * - :need:`wp__fdr_reports` (module Safety Plan) - - :need:`gd_chklst__safety_plan` - - :ndf:`copy('status', need_id='gd_chklst__safety_plan')` - - :need:`doc__persistency_safety_plan_fdr` - - * - :need:`wp__fdr_reports` (module Safety Package) - - :need:`gd_chklst__safety_package` - - :ndf:`copy('status', need_id='gd_chklst__safety_package')` - - :need:`doc__persistency_safety_package_fdr` - - * - :need:`wp__fdr_reports` (module's Safety Analyses & DFA) - - :need:`gd_guidl__safety_analysis` - - :ndf:`copy('status', need_id='gd_guidl__safety_analysis')` - - <Link to WP> - - * - :need:`wp__audit_report` - - performed by external experts - - n/a - - <Link to WP> - - * - :need:`wp__module_safety_manual` - - :need:`gd_temp__safety_manual` - - :ndf:`copy('status', need_id='gd_temp__safety_manual')` - - :need:`doc__persistency_safety_manual` - - * - :need:`wp__verification_module_ver_report` - - :need:`gd_temp__mod_ver_report` - - :ndf:`copy('status', need_id='gd_temp__mod_ver_report')` - - :need:`doc__persistency_verification_report` - - * - :need:`wp__module_sw_release_note` - - :need:`gd_temp__rel_mod_rel_note` - - :ndf:`copy('status', need_id='gd_temp__rel_mod_rel_note')` - - :need:`doc__persistency_release_note` - -Component KVS Workproducts List -------------------------------- - -.. list-table:: Component KVS Workproducts - :header-rows: 1 - - * - Workproduct Id - - Link to process - - Process status - - Link to WP - - * - :need:`wp__requirements_comp` - - :need:`gd_temp__req_comp_req` - - :ndf:`copy('status', need_id='gd_temp__req_comp_req')` - - :need:`doc__persistency_kvs_requirements` - - * - :need:`wp__requirements_comp_aou` - - :need:`gd_temp__req_aou_req` - - :ndf:`copy('status', need_id='gd_temp__req_aou_req')` - - :need:`doc__persistency_kvs_requirements` - - * - :need:`wp__requirements_inspect` - - :need:`gd_chklst__req_inspection` - - :ndf:`copy('status', need_id='gd_chklst__req_inspection')` - - Checklist used in Pull Request Review - - * - :need:`wp__component_arch` - - :need:`gd_temp__arch_comp` - - :ndf:`copy('status', need_id='gd_temp__arch_comp')` - - :need:`doc__persistency_kvs_architecture` - - * - :need:`wp__sw_arch_verification` - - :need:`gd_chklst__arch_inspection_checklist` - - :ndf:`copy('status', need_id='gd_chklst__arch_inspection_checklist')` - - Checklist used in Pull Request Review - - * - :need:`wp__sw_component_fmea` - - :need:`wp__sw_component_fmea` - - :ndf:`copy('status', need_id='gd_guidl__safety_analysis')` - - :need:`doc__persistency_kvs_fmea` - - * - :need:`wp__sw_component_dfa` - - :need:`wp__sw_component_dfa` - - :ndf:`copy('status', need_id='gd_guidl__safety_analysis')` - - :need:`doc__persistency_kvs_dfa` - - * - :need:`wp__sw_implementation` - - :need:`gd_guidl__implementation` - - :ndf:`copy('status', need_id='gd_guidl__implementation')` - - <Link to WP> - - * - :need:`wp__verification_sw_unit_test` - - :need:`gd_guidl__verification_guide` - - :ndf:`copy('status', need_id='gd_guidl__verification_guide')` - - <Link to WP> - - * - :need:`wp__sw_implementation_inspection` - - :need:`gd_chklst__impl_inspection_checklist` - - :ndf:`copy('status', need_id='gd_chklst__impl_inspection_checklist')` - - Checklist used in Pull Request Review - - * - :need:`wp__verification_comp_int_test` - - :need:`gd_guidl__verification_guide` - - :ndf:`copy('status', need_id='gd_guidl__verification_guide')` - - <Link to WP> - - * - :need:`wp__sw_component_class` - - :need:`gd_guidl__component_classification` - - :ndf:`copy('status', need_id='gd_guidl__component_classification')` - - :need:`doc__persistency_component_classification` - - -OSS (sub-)component qualification plan -====================================== - -For the selected OSS component the following workproducts will be implemented (and why): - -If the OSS element is classified as - - component, then the below table shall match the above, adding the reasoning for tailoring of work products according to the OSS component classification. - - lower level component, then no workproducts additional to the component’s will be planned and activities below are part of the component’s issues. - -.. list-table:: OSS (sub-)component Tiny JSON Workproducts - :header-rows: 1 - - * - Workproduct Id - - Reasoning for tailoring - - * - :need:`wp__requirements_comp` - - Always needed (for Q and QR classification) and also improves process Id 2 - - * - :need:`wp__requirements_comp_aou` - - Always needed (for Q and QR classification) and also improves process Id 5 - - * - :need:`wp__requirements_inspect` - - <Reasoning for tailoring> - - * - :need:`wf__cr_mt_comparch` - - <Reasoning for tailoring, needed for example in case of deficits in process Id 3&4 and complexity Ids 1&4> - - * - :need:`wp__sw_component_fmea` - - <Reasoning for tailoring, could help arguing too high cyclomatic complexity covered by safety mechanisms> - - * - :need:`wp__sw_arch_verification` - - <Reasoning for tailoring, needed if also wf__cr_mt_comparch is required> - - * - :need:`wp__sw_implementation` - - Tailored - If source code is modified, this is not a OSS qualification any more. - - * - :need:`wp__verification_sw_unit_test` - - <Reasoning for tailoring, can improve deficits in process Id 6 and complexity Id 3> - - * - :need:`wp__sw_implementation_inspection` - - <Reasoning for tailoring, can improve deficits in process Id 6 and complexity Id 2> - - * - :need:`wp__verification_comp_int_test` - - Always needed (for Q and QR classification) - - * - :need:`wp__sw_component_class` - - Always needed as basis for tailoring. - -Module Safety Package -===================== - -To create the safety package (according to :need:`gd_guidl__saf_package`) the following -documents and work products status have to go to "valid" (after the relevant verification were performed). - -Module Documents Status ------------------------ - -For all the work product documents the status can be seen by following the "Link to WP". -A summary of the status is also documented in the project's documentation management plan. - -See :ref:`documents_docs_modules_persistency_docs` - -Component Documents Status --------------------------- - -For all the work product documents the status can be seen by following the "Link to WP". -A summary of the status is also documented in the project's documentation management plan. - -See :ref:`documents_docs_modules_persistency_components` - -Component Requirements Status ------------------------------ - -.. needtable:: - :filter: docname is not None and "persistency" in docname and "requirements" in docname - :style: table - :types: comp_req - :tags: kvs - :columns: id;status;tags - :colwidths: 25,25,25 - :sort: title - -Component AoU Status --------------------- - -.. needtable:: - :filter: docname is not None and "persistency" in docname and "requirements" in docname - :style: table - :types: aou_req - :tags: kvs - :columns: id;status;tags - :colwidths: 25,25,25 - :sort: title - -Component Architecture Status ------------------------------ - -.. needtable:: - :filter: docname is not None and "persistency" in docname and "architecture" in docname - :style: table - :types: comp_arc_sta; comp_arc_dyn - :tags: kvs - :columns: id;status;tags - :colwidths: 25,25,25 - :sort: title diff --git a/docs/modules/persistency/docs/safety_mgt/module_safety_plan_fdr.rst b/docs/modules/persistency/docs/safety_mgt/module_safety_plan_fdr.rst deleted file mode 100644 index 23f90f2c367..00000000000 --- a/docs/modules/persistency/docs/safety_mgt/module_safety_plan_fdr.rst +++ /dev/null @@ -1,93 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2025 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -Safety Plan Formal Review Report -================================ - -.. document:: Persistency Safety Plan Formal Review - :id: doc__persistency_safety_plan_fdr - :status: valid - :safety: ASIL_B - :security: NO - :realizes: wp__fdr_reports - :tags: persistency - -**1. Purpose** - -The purpose of this safety plan formal review checklist is to report status of the review for the safety plan. - -**2. Checklist** - -.. list-table:: Safety Plan Checklist - :header-rows: 1 - - * - Id - - Safety plan activity - - Compliant to ISO 26262? - - Comment - - * - 1 - - Is the rationale for the safety work products tailoring included? - - [YES | NO ] - - <Rationale for result> - - * - 2 - - Is impact analysis planned in case of re-use of SW (needed for every release following the first formal release)? - - [YES | NO ] - - <Rationale for result> - - * - 3 - - Does the safety plan define all needed activities for safety management (incl. Confirmation review and Safety Audit)? - - [YES | NO ] - - <Rationale for result> - - * - 4 - - Does the safety plan define all needed activities for System and SW development, integration and verification? - - [YES | NO ] - - <Rationale for result> - - * - 5 - - Does the safety plan define all needed activities for safety analysis and DFA? - - [YES | NO ] - - <Rationale for result> - - * - 6 - - Does the safety plan define all needed activities for supporting processes (incl. tool mgt)? - - [YES | NO ] - - <Rationale for result> - - * - 7 - - Does the safety plan document a responsible for all activities? - - [YES | NO ] - - <Rationale for result> - - * - 8 - - If OSS software components is used, is it planned to be qualified? - - [YES | NO ] - - <Rationale for result> - - * - 9 - - Is a safety manager and a project manager appointed for the project? - - [YES | NO ] - - <Rationale for result> - - * - 10 - - Is safety plan sufficiently linked to the project plan? - - [YES | NO ] - - <Rationale for result> - - * - 11 - - Is safety plan updated iteratively to show the progress? - - [YES | NO ] - - <Rationale for result> diff --git a/docs/modules/persistency/docs/verification/module_verification_report.rst b/docs/modules/persistency/docs/verification/module_verification_report.rst deleted file mode 100644 index a00ca26e618..00000000000 --- a/docs/modules/persistency/docs/verification/module_verification_report.rst +++ /dev/null @@ -1,81 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2025 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -Verification Report -=================== - -.. document:: Persistency Verification Report - :id: doc__persistency_verification_report - :status: valid - :safety: ASIL_B - :security: NO - :realizes: wp__verification_module_ver_report - :tags: persistency - - -This verification report is based on the verification plan. -It covers all the components of the above stated module. - -Verification Report contains: - -**1. Verification Coverage** - -**1.1. on Requirements** - - Lists of component requirements (incl. AoU satisfied by the component) tested by which test case, passed/failed and completeness verdict - (this shall be generated by tools and accompanied by progress charts to be usable also for project steering) - - For external component Assumptions of Use: coverage by platform safety manual or feature/components incl. test case, passed/failed and completeness verdict - - This is split in a list of QM requirements tested and a separate list of tests for ASIL rated requirements. - - List of component requirements (ASIL rated) linked to inspection checklist and verdict (derived from PR export) - -**1.2. on Architecture** - - List of component architecture tags tested by which test case, passed/failed and completeness verdict - (this shall be generated by tools and accompanied by progress charts to be usable also for project steering) - - This is split in a list of QM components tested and a separate list of tests for ASIL rated components. - - List of component architecture tags (ASIL rated) linked to inspection checklist and verdict (derived from PR export) - -**1.3. on Detailed Design** - - List of detailed design tags tested by which test case, passed/failed and completeness verdict - (this shall be generated by tools and accompanied by progress charts to be usable also for project steering) - - This is split in a list of QM components tested and a separate list of tests for ASIL rated components. - - List of detailed design tags (ASIL rated) linked to inspection checklist and verdict (derived from PR export) - - - The lists may also contain other verification methods like "Analysis" - process tbd - -**2. DFA Report** - - List of the performed component DFA, pass/fail with open mitigations - -**3. Safety Analysis Report** - - List of the performed component Safety Analysis, pass/fail with open mitigations - -**4. Unit Verification Coverage** - -**4.1. Structural Coverage** - - List of the units with C0(line) and C1(branch) coverage absolute and percentage - (this shall be generated by tools and accompanied by progress charts to be usable also for project steering) - - List includes a column for the safety rating of each unit. - -**4.2. Static Code Analysis** - - List of the units with compiler warning numbers and coding rule violation numbers - (this shall be generated by tools and accompanied by progress charts to be usable also for project steering) - - List includes a column for the safety rating of each unit. - -**4.3. Manual Code Inspection** - - List of components (ASIL rated) linked to inspection checklist and verdict (derived from PR export) - -**5. Software component qualification verification report** - - Contains the needed verification results if for some components a qualification of pre-developed SW is performed. - -**Note1:** The verification report is valid for the module version tagged together with the report - -**Note2:** All the above lists are generated automatically diff --git a/docs/modules/persistency/index.rst b/docs/modules/persistency/index.rst deleted file mode 100644 index b7e498ec7c6..00000000000 --- a/docs/modules/persistency/index.rst +++ /dev/null @@ -1,32 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2025 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -Persistency KVS Module -###################### - -.. toctree:: - :titlesonly: - :maxdepth: 2 - - ./docs/index - -Components -========== - -.. toctree:: - :titlesonly: - :maxdepth: 1 - :glob: - - ./*/docs/index diff --git a/docs/modules/persistency/json/docs/component_classification.rst b/docs/modules/persistency/json/docs/component_classification.rst deleted file mode 100644 index 4350716ae26..00000000000 --- a/docs/modules/persistency/json/docs/component_classification.rst +++ /dev/null @@ -1,182 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2025 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -Component Classification -======================== - -.. document:: Persistency Component Classification - :id: doc__persistency_component_classification - :status: valid - :safety: ASIL_B - :security: NO - :realizes: wp__sw_component_class - :tags: feature_persistency - -| Classification of Tiny JSON -| -| `Tiny JSON <https://github.com/rhysd/tinyjson>`_ V.2.5.1 -| -| Additional documentation considered: -| `Documentation for Tiny JSON <https://docs.rs/tinyjson/latest/tinyjson/>`_ - - -Step 1: Determine (P): the uncertainty of the Processes applied ---------------------------------------------------------------- - -| Apply the process measures to determine (P). -| The result of a process measure shall have as outcome [HE, PE, NE] -| - HE: High Evidence -| - PE: Partly Evidence but Manageable -| - NE: No Evidence - -.. list-table:: Determine (P) - :header-rows: 1 - - * - Id - - Indicator for applying process - - Result - - Rationale for result - - * - 1 - - Are rules, state-of-the art processes applied for the design, implementation and verification? - - PE - - Rules for Safe Rust applied. - - * - 2 - - Are requirements available? - - PE - - n/a. Tiny JSON is a library to parse/generate JSON format document. So this is the main requirement. - - * - 3 - - Are specifications for functionalities and properties available (architecture)? - - PE - - Yes in the documentation of Tiny JSON. - - * - 4 - - Are design specifications available? - - PE - - n/a - - * - 5 - - Are configuration specification and data available, if applicable? - - PE - - Yes in the documentation of Tiny JSON. - - * - 6 - - Are verification measures including tests and reports available? - - HE - - Stored in github repo within folder tests. - - -| (P=1) shall be selected when none of the determined process measures indicate PE or NE. -| (P=2) shall be selected when at least one of the determined process measures indicate PE or NE, but the gaps evaluated are acceptable, means -| the risk of systematic faults due to these gaps is sufficiently low or manageable by mitigating the gaps. -| (P=3) in all other cases. - -Tiny JSON determined as P=2. - - -Step 2: Determine (C): the uncertainty of finding systematic faults based on the Complexity -------------------------------------------------------------------------------------------- - -| Apply the complexity measures to determine (C). -| The result of a complexity measure shall have as outcome [NH, HM, NM] -| - NH: Not High -| - HM: High but Manageable -| - NM: high and Not Manageable -| -| **Complexity measure for programming language: <C++ or RUST>** - -.. list-table:: Determine (C) for RUST - :header-rows: 1 - - * - Id - - Indicator for high Complexity - - Complexity measure Tool - - Result - - Number - - * - 1 - - High amount of Lines of Code - - Lines of Code (without comments) (generated code is excluded, e.g. ProtoCmpl) - - NH - - 2367 loc - - * - 2 - - Unsafe code used / total unsafe code - - Count: - * LoUC+N: lines of unsafe code with safety note - * LoUC : lines of unsafe code, no safety note - - NH. Tiny JSON is written in Safe Rust. - - 0 - - * - 3 - - | Test exists / Coverage (Function, Line) - | (maybe better: testability, but how to measure?) - - Existing Tests Coverage - - NH - - <Number> - - * - 4 - - High amount of public function interfaces - - Number of public function interfaces - - NH - - <Number> - - * - 5 - - High amount of function parameters - - Number of parameters - - NH - - <Number> - - -| (C=1) shall be selected when none of the determined complexity measures indicate HM or NM. -| (C=2) shall be selected when at least one of the determined complexity measures indicate HM or NM, but the gaps evaluated are acceptable, means -| the risk of systematic faults due to these gaps is sufficiently low in the context of S-CORE or manageable by mitigating the gaps. -| (C=3) in all other cases. -| - -Tiny JSON is determined as C=1 - - -Step 3: Determine (CLAS_OUT): the classification outcome --------------------------------------------------------- - -| Select CLAS_OUT depending on the determined values of (C) and (P) - -+-------+-----------------------+ -| ( C ) | ( P ) | -+-------+-------+-------+-------+ -| | 1 | 2 | 3 | -+=======+=======+=======+=======+ -| 1 | Q | Q | QR | -+-------+-------+-------+-------+ -| 2 | QR | QR | QR | -+-------+-------+-------+-------+ -| 3 | QR | QR | NQ | -+-------+-------+-------+-------+ - -Tiny JSON is classified as CLAS_OUT=Q - - -Step 4: Document all results and rationale for choosing (P) and (C) and (CLAS_OUT) ----------------------------------------------------------------------------------- -This document - - -Step 5: Based on (CLAS_OUT) select the activities -------------------------------------------------- - -| As soon as the contribution request containing this is in status "Accepted", the module safety plan for the component development is adapted based on the following: -| - Q: Follow the processes for qualification of software components in a safety context. diff --git a/docs/modules/persistency/json/docs/index.rst b/docs/modules/persistency/json/docs/index.rst deleted file mode 100644 index e974fadc78b..00000000000 --- a/docs/modules/persistency/json/docs/index.rst +++ /dev/null @@ -1,41 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2025 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -.. toctree:: - :titlesonly: - - component_classification - -.. _component_PersistencyJson: - -Tiny JSON -######### - -.. document:: Persistency JSON - :id: doc__persistencyjson - :status: valid - :safety: ASIL_B - :security: NO - :realizes: wp__cmpt_request - :tags: template - - -Abstract -======== - -| The component is implemented in the module: -| `Tiny JSON <https://github.com/rhysd/tinyjson>`_ V.2.5.1 -| -| Additional documentation considered: -| `Documentation for Tiny JSON <https://docs.rs/tinyjson/latest/tinyjson/>`_ diff --git a/docs/modules/persistency/kvs/docs/architecture/index.rst b/docs/modules/persistency/kvs/docs/architecture/index.rst deleted file mode 100644 index e03efc14b08..00000000000 --- a/docs/modules/persistency/kvs/docs/architecture/index.rst +++ /dev/null @@ -1,125 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2025 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -.. _component_architecture_PersistencyKvs: - -Architecture -============ - -.. document:: Persistency KVS Module Architecture - :id: doc__persistency_kvs_architecture - :status: valid - :safety: ASIL_B - :security: NO - :realizes: wp__component_arch - -Overview --------- -Brief summary - -Requirements Linked to Component Architecture ---------------------------------------------- - -.. code-block:: none - - .. needtable:: Overview of Component Requirements - :style: table - :columns: title;id - :filter: search("comp_arch_sta__archdes$", "fulfils_back") - :colwidths: 70,30 - -Description ------------ - -General Description - -Design Decisions - -Design Constraints - -Rationale Behind Architecture Decomposition -******************************************* -mandatory: a motivation for the decomposition or reason for not further splitting it into sub components. - -.. note:: Common decisions across components / cross cutting concepts is at the higher level. - -Static Architecture -------------------- - -The components are designed to cover the expectations from the feature architecture -(i.e. if already exists a definition it should be taken over and enriched). - -.. comp_arc_sta:: Component Name (Static View) - :id: comp_arc_sta__persistency__static_view - :security: YES - :safety: ASIL_B - :status: invalid - :implements: - :fulfils: - :includes: comp_arc_sta__persistency__2 - - .. needarch:: - :scale: 50 - :align: center - - {{ draw_component(need(), needs) }} - -Dynamic Architecture --------------------- - -.. comp_arc_dyn:: Dynamic View - :id: comp_arc_dyn__persistency__dynamic_view - :security: YES - :safety: ASIL_B - :status: invalid - :fulfils: - - put here a sequence diagram - - -Interfaces ----------- - -.. code-block:: rst - - .. real_arc_int:: <Title> - :id: real_arc_int__<component>__<Title> - :security: <YES|NO> - :safety: <QM|ASIL_B|ASIL_B> - :fulfils: <link to component requirement id> - :language: cpp - -Lower Level Components ----------------------- - -.. comp_arc_sta:: Component Name 2 - :id: comp_arc_sta__persistency__2 - :status: invalid - :safety: ASIL_B - :security: YES - :implements: - - no architecture but detailed design - -.. note:: - Architecture can be split into multiple files. At component level the public interfaces to be used by the user and tester to be shown. - -.. attention:: - The above directives must be updated according to your component architecture. - - - Replace the example content by the real content (according to :need:`gd_guidl__arch_design`) - - Set the status to valid and start the review/merge process - -.. needextend:: docname is not None and "persistency/kvs/docs/architecture" in docname - :+tags: kvs diff --git a/docs/modules/persistency/kvs/docs/index.rst b/docs/modules/persistency/kvs/docs/index.rst deleted file mode 100644 index 6886a3e43c6..00000000000 --- a/docs/modules/persistency/kvs/docs/index.rst +++ /dev/null @@ -1,155 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2025 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -.. _component_PersistencyKvs: - -KVS (Key Value Store) -##################### - -.. document:: Persistency KVS - :id: doc__persistencykvs - :status: valid - :safety: ASIL_B - :security: NO - :realizes: wp__cmpt_request - :tags: Persistency KVS - -Abstract -======== - -This feature request describes the key-value storage (KVS) that is needed by -applications to store either temporary or permanent data in an easy way that -conforms to most programming languages that provide a hash, hashmap, dictionary -or similar data structure. Access to the KVS is possible from any support -language through language specific interfaces. - - -Motivation -========== - -The current solutions available mostly don't meet the specific needs of the -S-CORE project like storing specific datatypes without a BASE64 conversation or -having no rollback/replay feature. Also the integration into analysis tools is -simpler when the solution grows with the needs instead having to adapt existing -data structures through wrapppers. Especially in the focus of security it will -be possible to build a system that integrates the layers from scratch and -provide them as API to any language whilst still using Rust as the backend. - -A main USP of the solution will be the integration of a tracing framework that -allows to understand how events also in the context of other events interact. - -A key-value storage is used within many applications to store e.g. -configuration data and is therefore seen crucial for the Eclipse S-CORE -platform. - - -Rationale -========= - -1. | Requirement 1: Multiple key-value storages per application - | Solution: Allow each application to have multiple key-value storages (KVS) to enable data separation and different levels of security. -2. | Requirement 2: Update mechanism for KVS versions - | Solution: Implement an update mechanism to ensure compatibility through updates and rollbacks of different KVS versions. -3. | Requirement 3: Language-agnostic KVS interface - | Solution: Design a flexible interface that allows the KVS to be read and written from multiple programming languages, including C++, Rust, and others. -4. | Requirement 4: Default values for KVS - | Solution: Configure the KVS to store default values for all keys, returning either the default value or an error if the key needs to be written first. -5. | Requirement 5: Simple data representation for KVS - | Solution: Utilize a simple data representation, such as JSON or Cap'n Proto, that supports versioned up- and downgrading and is easily debuggable by developers. -6. | Requirement 6: KVS integrity checking - | Solution: Ensure the KVS maintains a consistent state, providing either the currently stored data or the previous snapshot if data retrieval is not possible. - - -Specification -============= - -[Describe the requirements, architecture of any new component.] or -[Describe the change to requirements, architecture, implementation, documentation of any change request.] - - .. note:: - A CR shall specify the component requirements as part of our platform/project. - Thereby the :need:`Module Lead <rl__committer>` will approve these requirements as part of accepting the CR (e.g. merging the PR with the CR). - - -Backwards Compatibility -======================= - -The API for the specific language tries to represent the language specific -implementation like hashmaps or dictionaries to be mostly backwards compatible -to already existing key-value-storage usage cases. Access without a safe error -handling path, like the array-operator in Rust which can panic, must be -avoided. - - -Security Impact -=============== - -Access to the key-value-storage would allow a malicious user to control the -behaviour of the device, so it must be secured to prevent unauthorized access. -To achieve this, debug access should only be provided when a debug firmware -image is installed. - - -Safety Impact -============= - -The expected ASIL level is ASIL-B. To reach this goal we will apply the S-CORE -development process. Key elements of it are listed in the process descriptions -of safety management and safety analysis. In the safety analysis we will -analyze the impact of the feature. - -:need:`doc__persistency_fmea` - -We use an iterative development process and apply results from the next steps -back to the feature request. For TinyJSON we will perform a software component -classification. - -:need:`doc__persistency_component_classification` - -To ensure the freedom of interference the feature key-value storage should not -be used within different processes. - - -License Impact -============== - - .. note:: - The key-value storage itself uses the Apache-2.0 license. Licenses of - used libraries are need to be checked. - - -Open Issues -=========== - -[Any points that are still being decided/discussed.] - - .. note:: - While a CR is in draft, ideas can come up which warrant further discussion. - Those ideas should be recorded so people know that they are being thought about but do not have a concrete resolution. - This helps make sure all issues required for the CR to be ready for consideration are complete and reduces people duplicating prior discussion. - - - -Footnotes -========= - -[A collection of footnotes cited in the CR, and a place to list non-inline hyperlink targets.] - -.. toctree:: - :hidden: - - requirements/index.rst - architecture/index.rst - safety_analysis/fmea.rst - safety_analysis/dfa.rst diff --git a/docs/modules/persistency/kvs/docs/requirements/index.rst b/docs/modules/persistency/kvs/docs/requirements/index.rst deleted file mode 100644 index 407c6c42545..00000000000 --- a/docs/modules/persistency/kvs/docs/requirements/index.rst +++ /dev/null @@ -1,394 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2025 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -Requirements -############ - -.. document:: Persistency KVS Requirements - :id: doc__persistency_kvs_requirements - :status: valid - :safety: ASIL_B - :security: NO - :realizes: wp__requirements_comp - -.. comp_req:: Key Naming - :id: comp_req__persistency__key_naming - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__support_datatype_keys - :status: valid - - The component shall accept keys that consist solely of alphanumeric characters, underscores, or dashes. - -.. comp_req:: Key Encoding - :id: comp_req__persistency__key_encoding - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__support_datatype_keys - :status: valid - - The component shall encode each key as valid UTF-8. - -.. comp_req:: Key Uniqueness - :id: comp_req__persistency__key_uniqueness - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__support_datatype_keys - :status: valid - - The component shall guarantee that each key is unique. - -.. comp_req:: Key Length - :id: comp_req__persistency__key_length - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__support_datatype_keys - :status: valid - - The component shall limit the maximum length of a key to 32 bytes. - -.. comp_req:: Value Data Types - :id: comp_req__persistency__value_data_types - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__support_datatype_value - :status: valid - - The component shall accept only values of the following data types: Number, - String, Null, Array[Value], or Dictionary{Key:Value}. - -.. comp_req:: Value Serialization - :id: comp_req__persistency__value_serialize - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__support_datatype_value - :status: valid - - The component shall serialize and deserialize all values to and from JSON. - -.. comp_req:: Value Length - :id: comp_req__persistency__value_length - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__support_datatype_value - :status: valid - - The component shall limit the maximum length of a value to 1024 bytes. - -.. comp_req:: Value Default - :id: comp_req__persistency__value_default - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__support_datatype_value,feat_req__persistency__default_values - :status: valid - - The component shall support unset values and shall provide a default value - when a value is unset. - -.. comp_req:: Value Reset - :id: comp_req__persistency__value_reset - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__support_datatype_value,feat_req__persistency__default_values - :status: valid - - The component shall allow resetting a value to its default if a default is - defined. - -.. comp_req:: Default Value Datatypes - :id: comp_req__persistency__default_value_types - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__default_values,feat_req__persistency__default_value_get,feat_req__persistency__reset_to_default,feat_req__persistency__default_value_file - :status: valid - - The component shall accept default values of only permitted value data - types. - -.. comp_req:: Default Value Query - :id: comp_req__persistency__default_value_query - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__default_values,feat_req__persistency__default_value_get,feat_req__persistency__reset_to_default,feat_req__persistency__default_value_file - :status: valid - - The component shall provide an API to retrieve default values. - -.. comp_req:: Default Value Config - :id: comp_req__persistency__default_value_config - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__default_values,feat_req__persistency__default_value_get,feat_req__persistency__reset_to_default,feat_req__persistency__default_value_file - :status: valid - - The component shall allow configuration of default values in code or in a - separate configuration file. - -.. comp_req:: Default Value Checksum - :id: comp_req__persistency__default_value_checksum - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__default_values,feat_req__persistency__default_value_get,feat_req__persistency__reset_to_default,feat_req__persistency__default_value_file - :status: valid - - The component shall secure the configuration file for default values with an - associated checksum file when default values are stored in a file. - -.. comp_req:: Constraint Configuration - :id: comp_req__persistency__constraints - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__cfg - :status: valid - - The component shall allow configuration of KVS constraints at compile-time - using source code constants or at runtime using a configuration file. - -.. comp_req:: Concurrency - :id: comp_req__persistency__concurrency - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__concurrency - :status: valid - - The component shall implement thread-safe mechanisms to enable concurrent - access to data without data races. - -.. comp_req:: Multi-Instance - :id: comp_req__persistency__multi_instance - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__multiple_kvs - :status: valid - - The component shall manage all runtime variables within an instance to - enable creation and use of multiple KVS instances concurrently within a - single software architecture element. - -.. comp_req:: Persistent Data Storage Components - :id: comp_req__persistency__persist_data_store_com - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__integrity_check,feat_req__persistency__store_data - :status: valid - - The component shall use the file API and the JSON data format to persist data. - -.. comp_req:: Persistent Data Storage Checksum Write - :id: comp_req__persistency__pers_data_csum_write - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__integrity_check,feat_req__persistency__store_data - :status: valid - - The component shall generate a checksum for each data file and shall store - it alongside the data. - -.. comp_req:: Persistent Data Storage Checksum Verify - :id: comp_req__persistency__pers_data_csum_verify - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__integrity_check,feat_req__persistency__load_data - :status: valid - - The component shall verify the checksum when loading data. - -.. comp_req:: Persistent Data Storage Backend - :id: comp_req__persistency__pers_data_store_bend - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__integrity_check,feat_req__persistency__store_data - :status: valid - - The component shall use the file API to persist data. - -.. comp_req:: Persistent Data Storage Format - :id: comp_req__persistency__pers_data_store_fmt - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__integrity_check,feat_req__persistency__store_data - :status: valid - - The component shall use the JSON data format to persist data. - -.. comp_req:: Persistent Data Versioning - :id: comp_req__persistency__pers_data_version - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__versioning,feat_req__persistency__update_mechanism - :status: valid - - The component shall not provide built-in versioning. - -.. comp_req:: Persistent Data Schema - :id: comp_req__persistency__pers_data_schema - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__versioning,feat_req__persistency__update_mechanism - :status: valid - - The component shall use a JSON file storage format that enables the - application to implement versioning, including upgrade and downgrade paths, - as needed. - -.. comp_req:: Snapshot Creation - :id: comp_req__persistency__snapshot_creation - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__snapshot_create - :status: valid - - The component shall create a snapshot each time data is stored. - -.. comp_req:: Snapshot Maximum Number - :id: comp_req__persistency__snapshot_max_num - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__cfg - :status: valid - - The component shall maintain a configurable maximum number of snapshots. - -.. comp_req:: Snapshot IDs - :id: comp_req__persistency__snapshot_id - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__snapshot_create - :status: valid - - The component shall assign the ID 1 to the newest snapshot and shall increment the IDs of older snapshots accordingly. - -.. comp_req:: Snapshot Rotation - :id: comp_req__persistency__snapshot_rotate - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__snapshot_remove, feat_req__persistency__snapshot_restore - :status: valid - - The component shall rotate and delete the oldest snapshot when the maximum number is reached. - -.. comp_req:: Snapshot Restore - :id: comp_req__persistency__snapshot_restore - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__snapshot_restore - :status: valid - - The component shall allow restoration of a snapshot by its ID. - -.. comp_req:: Snapshot Deletion - :id: comp_req__persistency__snapshot_delete - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__snapshot_remove - :status: valid - - The component shall allow deletion of individual snapshots. - -.. comp_req:: Engineering Mode - :id: comp_req__persistency__eng_mode - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__dev_mode - :status: valid - - The component shall provide an engineering mode that can be enabled during - build time to display debugging and internal information. - -.. comp_req:: Field Mode - :id: comp_req__persistency__field_mode - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__prod_mode - :status: valid - - The component shall provide a field mode that can be enabled during build - time to restrict access as much as possible. - -.. comp_req:: Async API - :id: comp_req__persistency__async_api - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__async_api - :status: valid - - The component shall provide an asynchronous API in addition to the standard API. - -.. comp_req:: Permission Control - :id: comp_req__persistency__permission_control - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__access_control - :status: valid - - The component shall rely on the underlying filesystem for access and - permission management and shall not implement its own access or permission - controls. - -.. comp_req:: Permission Error Handling - :id: comp_req__persistency__permission_err_handle - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__access_control - :status: valid - - The component shall report any access or permission errors encountered at - the filesystem level to the application. - -.. comp_req:: Callback Support - :id: comp_req__persistency__callback_support - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__persistency__async_api, feat_req__persistency__async_completion - :status: valid - - The component shall provide an API for registering callbacks that are triggered by data change events. - -.. needextend:: docname is not None and "persistency/kvs/docs/requirements" in docname - :+tags: kvs diff --git a/docs/modules/persistency/kvs/docs/safety_analysis/dfa.rst b/docs/modules/persistency/kvs/docs/safety_analysis/dfa.rst deleted file mode 100644 index 491a48c43d3..00000000000 --- a/docs/modules/persistency/kvs/docs/safety_analysis/dfa.rst +++ /dev/null @@ -1,27 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2025 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - - -Dependent Failure Analysis -========================== - -.. document:: KVS DFA - :id: doc__persistency_kvs_dfa - :status: valid - :safety: ASIL_B - :security: NO - :realizes: wp__sw_component_dfa - :tags: Persistency KVS - -Because there is no sub-components in KVS, the results of the FMEA are the same as on feature level :need:`doc__persistency_dfa`. diff --git a/docs/modules/persistency/kvs/docs/safety_analysis/fmea.rst b/docs/modules/persistency/kvs/docs/safety_analysis/fmea.rst deleted file mode 100644 index 7cf42304cd2..00000000000 --- a/docs/modules/persistency/kvs/docs/safety_analysis/fmea.rst +++ /dev/null @@ -1,27 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2025 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - - -Safety Analysis: FMEA -====================== - -.. document:: KVS FMEA - :id: doc__persistency_kvs_fmea - :status: valid - :safety: ASIL_B - :security: NO - :realizes: wp__sw_component_fmea - :tags: Persistency KVS - -Because there is no sub-components in KVS, the results of the FMEA are the same as on feature level :need:`doc__persistency_fmea`. From b5f3a4d648b33e34e47483273029ded16d6c6f08 Mon Sep 17 00:00:00 2001 From: aschemmel-git <alexander.schemmel@bmw.de> Date: Fri, 9 Jan 2026 15:42:50 +0100 Subject: [PATCH 113/214] Bug: Remove duplicated text in platform safety plan --- docs/platform_management_plan/safety_management.rst | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/docs/platform_management_plan/safety_management.rst b/docs/platform_management_plan/safety_management.rst index bdf7d955203..d4a4fdd190f 100644 --- a/docs/platform_management_plan/safety_management.rst +++ b/docs/platform_management_plan/safety_management.rst @@ -92,18 +92,11 @@ The following ISO 26262 defined safety work products are not relevant for the S Note that stakeholder requirements (:need:`std_wp__iso26262__system_651`) are in scope of the project, to be able to address System and HW related failures which are typically mitigated by SW (e.g. end-to-end protection for ECU external communication). However, these are considered "Assumed Technical Safety Requirements" of the SW platform SEooC and do not require testing by the SEooC supplier. - Thus, system-level testing is out of scope. S-CORE will implement platform tests of stakeholder requirements for demonstration purposes, + Thus, system-level testing is out of scope. S-CORE will implement Platform Integration Tests of stakeholder requirements for demonstration purposes, but these are not intended to provide complete coverage of the stakeholder requirements. There will be SW integration tests of feature requirements as specified in ISO 26262 part 6-10. These tests may be reused by users on their HW platform to address Technical Safety Requirements for the SW platform. Whether these are sufficient to cover the TSRs must be analyzed and decided by the user. - to be able to cover System and HW related failures which are usually covered by SW (e.g. end to end protection for ECU external communication). - But those are the "Assumed Technical Safety Requirements" of the SW platform SEooC and do not need to be tested by SEooC supplier. - I.e. the system testing is out of scope. Note that S-CORE will implement Platform Integration Test of stakeholder requirements for demonstration, - but these are not intended to be completely covering the stakeholder requirements. - There will be SW integration tests of feature requirements, as required by ISO 26262 part 6-10. - These may be reused by the users on their HW platform to cover Technical Safety Requirements towards the SW platform. - But if these are sufficiently also covering the TSRs must be analyzed and decided by the user. Therefore and as S-CORE only delivers source code, :need:`std_wp__iso26262__software_1052` is tailored out. From 3ff33efbc29f7f4e739ee0fe385f9d3132781acd Mon Sep 17 00:00:00 2001 From: Philipp Ahmann <2428012+pahmann@users.noreply.github.com> Date: Mon, 12 Jan 2026 10:24:15 +0100 Subject: [PATCH 114/214] Improve argument about test selection for a feature (#2399) As part of the process audit on part 6 clause 1041 an argumentation which test levels are selected for a feature shall be explained. Additionally, the PR adds quality goals which were missing for these tests. Signed-off-by: Philipp Ahmann <Philipp.Ahmann@de.bosch.com> --- .../software_verification.rst | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/docs/platform_management_plan/software_verification.rst b/docs/platform_management_plan/software_verification.rst index 3fc97553487..cbf14b083fe 100644 --- a/docs/platform_management_plan/software_verification.rst +++ b/docs/platform_management_plan/software_verification.rst @@ -103,6 +103,17 @@ The following types of integrations are applicable: #. **Changes** get integrated based on the :need:`wf__change_create_cr` and will follow the :need:`doc__pull_request_guideline` as any other artifact. +The test methods and techniques shall be selected based on the characteristics and specified behavior +of the software element under test. This shall ensure proper testing from unit level to feature integration level. +Specific recommendations for each test level are provided in the following sections of this verification plan. + +The following examples serve as illustration and inspiration for test selection: +Resource Usage Evaluation is selected when requirements address resource management or when data +corruption may occur. Interface Testing is applied when requirements target external API behavior. +Boundary Value Analysis is used for buffers where overflow is deemed possible or when requirements specify +input ranges and boundaries covering incorrect input values. This list is not complete, and additional tests +may be selected based on the specific requirements of each software element. + Levels of integration and verification -------------------------------------- @@ -304,9 +315,17 @@ to be reached with every contribution. - 100% - 100% * - 7 - - Relative amount of failed tests - - 0% - - 0% + - Relative amount of passed tests + - 100% + - 100% + * - 8 + - Compliance with rules for static code analysis + - only minor violation based on tool rating + - 100% + * - 9 + - Freedom from compiler warnings & errors + - 100% + - 100% Further quality goals are defined in section :doc:`quality_management`. From 4d8d26e68da7f9aedf1840b15be0649c2ae4c1fe Mon Sep 17 00:00:00 2001 From: sachinkumarsingh <SachinKumar.Singh@bti.bmwgroup.com> Date: Tue, 13 Jan 2026 12:17:04 +0530 Subject: [PATCH 115/214] Add component description for FutureCPP library --- docs/modules/baselibs/index.rst | 1 + .../language/futurecpp/docs/index.rst | 50 +++++++++++++++++++ docs/modules/baselibs/language/index.rst | 21 ++++++++ 3 files changed, 72 insertions(+) create mode 100644 docs/modules/baselibs/language/futurecpp/docs/index.rst create mode 100644 docs/modules/baselibs/language/index.rst diff --git a/docs/modules/baselibs/index.rst b/docs/modules/baselibs/index.rst index 61741f356af..c9de56d580f 100644 --- a/docs/modules/baselibs/index.rst +++ b/docs/modules/baselibs/index.rst @@ -20,6 +20,7 @@ Baselibs Module :maxdepth: 2 ./docs/index + language/index Components ========== diff --git a/docs/modules/baselibs/language/futurecpp/docs/index.rst b/docs/modules/baselibs/language/futurecpp/docs/index.rst new file mode 100644 index 00000000000..881d015bafb --- /dev/null +++ b/docs/modules/baselibs/language/futurecpp/docs/index.rst @@ -0,0 +1,50 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +futurecpp +######### + +.. document:: FutureCPP Library + :id: doc__futurecpp + :status: draft + :safety: ASIL_B + :tags: baselibs_futurecpp + :realizes: wp__cmpt_request + :security: YES + +.. toctree:: + :hidden: + +Abstract +======== + +FutureCPP extends the C++ Standard Library with features from newer standards up to C++26 and selected proposals, offering an STL-like API. + +Motivation and Rationale +======================== + +Adopting the latest C++ standards is often challenging in safety-critical environments, which can delay access to modern language and library features. +FutureCPP addresses this by providing forward-compatible extensions that mirror upcoming Standard Library capabilities, allowing developers to benefit +from modern APIs without waiting for full compiler support. This approach ensures smoother transitions to future standards. + +Following components are provided by FutureCPP: + +- **Containers library**: Provides data structures such as fixed-size circular buffers, multi-dimensional array views, and containers for optional or variant types. +- **Functional library**: Provides APIs for function wrappers and error handling. +- **Numeric and Math library**: Provides mathematical utilities such as angle conversions, safe numeric casts, interpolation, and angle wrapping. +- **Memory management library**: Provides polymorphic allocators and related utilities which allow flexible memory allocation. +- **Meta Programming**: Provides compile-time utilities for generic programming, enabling type-safe abstractions and reducing code duplication. +- **Threading Support**: Provides API for thread management. +- **Utilities library**: Provides APIs for type safe conversion. +- **String Utilities**: Provides APIs for managing string related functionality. diff --git a/docs/modules/baselibs/language/index.rst b/docs/modules/baselibs/language/index.rst new file mode 100644 index 00000000000..3dd570ccb2e --- /dev/null +++ b/docs/modules/baselibs/language/index.rst @@ -0,0 +1,21 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +language +######## + +.. toctree:: + :hidden: + + futurecpp/docs/index.rst From feeb170b9d9e62472957ba1a04aacb6e70200d10 Mon Sep 17 00:00:00 2001 From: Priyanka Patil <Priyanka.Patil@bti.bmwgroup.com> Date: Tue, 13 Jan 2026 10:57:12 +0530 Subject: [PATCH 116/214] Add minimal Component Architecture for Utils library --- .../baselibs/docs/architecture/index.rst | 4 +- docs/modules/baselibs/docs/index.rst | 2 +- .../utils/docs/architecture/index.rst | 87 +++++++++++++++++++ docs/modules/baselibs/utils/docs/index.rst | 1 + 4 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 docs/modules/baselibs/utils/docs/architecture/index.rst diff --git a/docs/features/baselibs/docs/architecture/index.rst b/docs/features/baselibs/docs/architecture/index.rst index 8050c42da72..c3c941beefb 100644 --- a/docs/features/baselibs/docs/architecture/index.rst +++ b/docs/features/baselibs/docs/architecture/index.rst @@ -90,7 +90,7 @@ Static Architecture :safety: ASIL_B :status: valid :fulfils: feat_req__baselibs__core_utilities - :includes: logic_arc_int__baselibs__json, logic_arc_int__baselibs__memory_shared, logic_arc_int__baselibs__message_passing, logic_arc_int__baselibs__result, logic_arc_int__baselibs__bit_manipulation, logic_arc_int__baselibs__bit_mask_operator, logic_arc_int__baselibs__dynamic_array, logic_arc_int__baselibs__intrusive_list, logic_arc_int__baselibs__filesystem + :includes: logic_arc_int__baselibs__json, logic_arc_int__baselibs__memory_shared, logic_arc_int__baselibs__message_passing, logic_arc_int__baselibs__result, logic_arc_int__baselibs__bit_manipulation, logic_arc_int__baselibs__bit_mask_operator, logic_arc_int__baselibs__dynamic_array, logic_arc_int__baselibs__intrusive_list, logic_arc_int__baselibs__filesystem, logic_arc_int__baselibs__utils_base64, logic_arc_int__baselibs__utils_scoped_op .. needarch:: :scale: 50 @@ -107,4 +107,4 @@ The Baselibs feature exposes the following logical interfaces: :style: table :columns: title;id;status :sort: title - :filter: id in ['logic_arc_int__baselibs__json', 'logic_arc_int__baselibs__memory_shared', 'logic_arc_int__baselibs__message_passing' ,'logic_arc_int__baselibs__result', 'logic_arc_int__baselibs__bit_manipulation', 'logic_arc_int__baselibs__bit_mask_operator', 'logic_arc_int__baselibs__dynamic_array', 'logic_arc_int__baselibs__intrusive_list', 'logic_arc_int__baselibs__filesystem'] + :filter: id in ['logic_arc_int__baselibs__json', 'logic_arc_int__baselibs__memory_shared', 'logic_arc_int__baselibs__message_passing' ,'logic_arc_int__baselibs__result', 'logic_arc_int__baselibs__bit_manipulation', 'logic_arc_int__baselibs__bit_mask_operator', 'logic_arc_int__baselibs__dynamic_array', 'logic_arc_int__baselibs__intrusive_list', 'logic_arc_int__baselibs__filesystem', 'logic_arc_int__baselibs__utils_base64', 'logic_arc_int__baselibs__utils_scoped_op'] diff --git a/docs/modules/baselibs/docs/index.rst b/docs/modules/baselibs/docs/index.rst index d0c2fd1e512..84dbbd6e416 100644 --- a/docs/modules/baselibs/docs/index.rst +++ b/docs/modules/baselibs/docs/index.rst @@ -14,7 +14,7 @@ .. mod_view_sta:: Baselibs :id: mod_view_sta__baselibs__baselibs - :includes: comp_arc_sta__baselibs__json, comp_arc_sta__baselibs__message_passing, comp_arc_sta__baselibs__memory_shared, comp_arc_sta__baselibs__result, comp_arc_sta__baselibs__bit_manipulation, comp_arc_sta__baselibs__containers, comp_arc_sta__baselibs__filesystem + :includes: comp_arc_sta__baselibs__json, comp_arc_sta__baselibs__message_passing, comp_arc_sta__baselibs__memory_shared, comp_arc_sta__baselibs__result, comp_arc_sta__baselibs__bit_manipulation, comp_arc_sta__baselibs__containers, comp_arc_sta__baselibs__filesystem, comp_arc_sta__baselibs__utils .. needarch:: :scale: 50 diff --git a/docs/modules/baselibs/utils/docs/architecture/index.rst b/docs/modules/baselibs/utils/docs/architecture/index.rst new file mode 100644 index 00000000000..986544ab444 --- /dev/null +++ b/docs/modules/baselibs/utils/docs/architecture/index.rst @@ -0,0 +1,87 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +Utils Component Architecture +********************************** + +.. document:: Utils Architecture + :id: doc__utils_architecture + :status: valid + :security: YES + :safety: ASIL_B + :realizes: wp__component_arch + +Overview/Description +-------------------- +see :need:`doc__utils` + +Static Architecture +------------------- + +.. comp_arc_sta:: Utils + :id: comp_arc_sta__baselibs__utils + :security: YES + :safety: ASIL_B + :status: valid + :tags: baselibs_utils + :implements: logic_arc_int__baselibs__utils_base64,logic_arc_int__baselibs__utils_scoped_op + + .. needarch:: + :scale: 50 + :align: center + + {{ draw_component(need(), needs) }} + +Interfaces +---------- + +.. logic_arc_int:: Base64 + :id: logic_arc_int__baselibs__utils_base64 + :security: YES + :safety: ASIL_B + :status: valid + +.. logic_arc_int_op:: Encode + :id: logic_arc_int_op__utils__base64_encode + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__utils_base64 + +.. logic_arc_int_op:: Decode + :id: logic_arc_int_op__utils__base64_decode + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__utils_base64 + +.. logic_arc_int:: Scoped Operation + :id: logic_arc_int__baselibs__utils_scoped_op + :security: YES + :safety: ASIL_B + :status: valid + +.. logic_arc_int_op:: Constructor + :id: logic_arc_int_op__utils__scoped_op_construct + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__utils_scoped_op + +.. logic_arc_int_op:: Destructor + :id: logic_arc_int_op__utils__scoped_op_destruct + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__utils_scoped_op diff --git a/docs/modules/baselibs/utils/docs/index.rst b/docs/modules/baselibs/utils/docs/index.rst index 29cc4349912..95cfad09cb7 100644 --- a/docs/modules/baselibs/utils/docs/index.rst +++ b/docs/modules/baselibs/utils/docs/index.rst @@ -27,6 +27,7 @@ utils :hidden: requirements/index.rst + architecture/index.rst Abstract ======== From c32b88f520eedc02f6f0e7161ad5c9c33eea8452 Mon Sep 17 00:00:00 2001 From: rahulthakre <rahul.thakre@bti.bmwgroup.com> Date: Tue, 13 Jan 2026 12:28:41 +0530 Subject: [PATCH 117/214] lib/utils: remove pimple_Ptr from utils docs --- docs/modules/baselibs/utils/docs/index.rst | 1 - .../modules/baselibs/utils/docs/requirements/index.rst | 10 ---------- 2 files changed, 11 deletions(-) diff --git a/docs/modules/baselibs/utils/docs/index.rst b/docs/modules/baselibs/utils/docs/index.rst index 95cfad09cb7..3cc37f124d1 100644 --- a/docs/modules/baselibs/utils/docs/index.rst +++ b/docs/modules/baselibs/utils/docs/index.rst @@ -53,7 +53,6 @@ General considerations The Utils library should provide type-safe utility functions and efficient algorithms: * :need:`comp_req__utils__base64` -* :need:`comp_req__utils__pimpl_ptr` * :need:`comp_req__utils__scoped_operation` * :need:`comp_req__utils__deterministic_behavior` diff --git a/docs/modules/baselibs/utils/docs/requirements/index.rst b/docs/modules/baselibs/utils/docs/requirements/index.rst index dde7e4704e5..a1fc0e83efb 100644 --- a/docs/modules/baselibs/utils/docs/requirements/index.rst +++ b/docs/modules/baselibs/utils/docs/requirements/index.rst @@ -36,16 +36,6 @@ Functional Requirements The Utils component shall provide functions for encoding data to Base64 format and decoding Base64 data back to its original form. -.. comp_req:: PIMPL Pointer Implementation - :id: comp_req__utils__pimpl_ptr - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__baselibs__consistent_apis, feat_req__baselibs__safety - :status: valid - - The Utils component shall provide a stack-based Pointer-to-Implementation Idiom implementation that avoids dynamic memory allocation by using fixed-size, aligned storage buffers. - .. comp_req:: Scoped Operation Management :id: comp_req__utils__scoped_operation :reqtype: Functional From 9a4ebd13b6f8e9d65a1b898b6b354e00925bf8f7 Mon Sep 17 00:00:00 2001 From: sachinkumarsingh <SachinKumar.Singh@bti.bmwgroup.com> Date: Tue, 13 Jan 2026 13:46:43 +0530 Subject: [PATCH 118/214] Add component description for concurrency library --- .../baselibs/concurrency/docs/index.rst | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 docs/modules/baselibs/concurrency/docs/index.rst diff --git a/docs/modules/baselibs/concurrency/docs/index.rst b/docs/modules/baselibs/concurrency/docs/index.rst new file mode 100644 index 00000000000..4f9cfef732f --- /dev/null +++ b/docs/modules/baselibs/concurrency/docs/index.rst @@ -0,0 +1,38 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +concurrency +########### + +.. document:: Concurrency Library + :id: doc__concurrency + :status: draft + :safety: ASIL_B + :tags: baselibs_concurrency + :realizes: wp__cmpt_request + :security: YES + +.. toctree:: + :hidden: + +Abstract +======== + +This component request proposes a concurrency library that provides abstractions for managing concurrent tasks, threads, and synchronization mechanisms. + +Motivation and Rationale +======================== + +The concurrency library shall provide safe and efficient way to handle concurrent operations. It aims to simplify the development of multi-threaded applications by offering high-level abstractions for task management, synchronization, and inter-thread communication. +The library is designed to improve code readability, maintainability, and portability across different platforms. From 57b9218cd4da1e2a9c64ae60af5bfa88ef2867a7 Mon Sep 17 00:00:00 2001 From: AndreasMittag <andreas.mittag@etas.com> Date: Tue, 13 Jan 2026 11:20:55 +0100 Subject: [PATCH 119/214] Disable blank issue creation Signed-off-by: AndreasMittag <andreas.mittag@etas.com> --- .github/ISSUE_TEMPLATE/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index bb961996016..d8944ceeaff 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -11,4 +11,4 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -blank_issues_enabled: true +blank_issues_enabled: false From 1412ea2a5ec640b14312fef21017c1e1e43f99af Mon Sep 17 00:00:00 2001 From: AndreasMittag <andreas.mittag@etas.com> Date: Tue, 13 Jan 2026 11:52:10 +0100 Subject: [PATCH 120/214] Add type field to bugfix issue template Added type field to the bug report issue template. Signed-off-by: AndreasMittag <andreas.mittag@etas.com> --- .github/ISSUE_TEMPLATE/1-bugfix.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE/1-bugfix.yml b/.github/ISSUE_TEMPLATE/1-bugfix.yml index b23d6ae149e..c3784949cb3 100644 --- a/.github/ISSUE_TEMPLATE/1-bugfix.yml +++ b/.github/ISSUE_TEMPLATE/1-bugfix.yml @@ -15,6 +15,7 @@ name: Problem Report description: Issue to track a bug title: "Bug: Your bugfix title" labels: ["codeowner_review"] +type: 'Bug' body: - type: markdown attributes: From f78177ca0202cbaaf4431284f7eb3d2b2ff38b7c Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Tue, 13 Jan 2026 10:43:53 +0100 Subject: [PATCH 121/214] Update Codeowner file --- .github/CODEOWNERS | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 29d0470de72..79b47ff7b88 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -6,16 +6,16 @@ # Note: last match wins # By Default reviews go to the infrastructure community, to address missing lines in this document. -* @AlexanderLanin @dcalavrezo-qorix +* @AlexanderLanin @dcalavrezo-qorix @MaximilianSoerenPollak # All special files go to infrastructure as well -.* @AlexanderLanin @dcalavrezo-qorix +.* @AlexanderLanin @dcalavrezo-qorix @MaximilianSoerenPollak -.github/ISSUE_TEMPLATE/ @pahmann @PhilipPartsch @masc2023 @aschemmel-tech +.github/ISSUE_TEMPLATE/ @pahmann @PhilipPartsch @masc2023 @aschemmel-tech @PandaeDo .github/CODEOWNERS @antonkri @FScholPer @qor-lb @johannes-esr -/docs/ @pahmann @PhilipPartsch @masc2023 @aschemmel-tech -/docs/conf.py @AlexanderLanin @dcalavrezo-qorix +/docs/ @pahmann @PhilipPartsch @masc2023 @aschemmel-tech @PandaeDo +/docs/conf.py @AlexanderLanin @dcalavrezo-qorix @MaximilianSoerenPollak /docs/contribute/ @eclipse-score/automotive-score-committers # /docs/features/ @eclipse-score/automotive-score-technical-leads /docs/features/ @antonkri @FScholPer @qor-lb @johannes-esr @@ -23,23 +23,23 @@ architecture/ @eclipse-score/automotive-score-committers # requirements/ @eclipse-score/automotive-score-technical-leads requirements/ @antonkri @FScholPer @qor-lb @johannes-esr # safety_analysis/ @eclipse-score/safety-managers -safety_analysis/ @aschemmel-tech @PhilipPartsch @masc2023 +safety_analysis/ @aschemmel-tech @PhilipPartsch @masc2023 @PandaeDo # safety_planning/ @eclipse-score/automotive-score-technical-leads safety_planning/ @antonkri @FScholPer @qor-lb @johannes-esr verification/ @eclipse-score/automotive-score-committers -/docs/design_decisions/*infra* @AlexanderLanin @dcalavrezo-qorix +/docs/design_decisions/*infra* @AlexanderLanin @dcalavrezo-qorix @MaximilianSoerenPollak /docs/glossary/ @eclipse-score/automotive-score-committers /docs/introduction/ @eclipse-score/automotive-score-committers /docs/manuals/ @eclipse-score/automotive-score-committers /docs/modules/ @eclipse-score/automotive-score-committers # /docs/platform_management_plan/ @eclipse-score/community-process -/docs/platform_management_plan/ @pahmann @PhilipPartsch @masc2023 @aschemmel-tech +/docs/platform_management_plan/ @pahmann @PhilipPartsch @masc2023 @aschemmel-tech @PandaeDo # /docs/quality/ @eclipse-score/quality-managers /docs/quality/ @masc2023 @pahmann @PandaeDo # /docs/requirements/stakeholder/ @eclipse-score/automotive-score-technical-leads /docs/requirements/stakeholder/ @antonkri @FScholPer @qor-lb @johannes-esr # /docs/requirements/tool/ @eclipse-score/community-process -/docs/requirements/tool/ @pahmann @PhilipPartsch @masc2023 @aschemmel-tech +/docs/requirements/tool/ @pahmann @PhilipPartsch @masc2023 @aschemmel-tech @PandaeDo # /docs/safety/ @eclipse-score/safety-managers /docs/safety/ @aschemmel-tech @PhilipPartsch @masc2023 @PandaeDo # /docs/score_releases/ @eclipse-score/automotive-score-project-leads @@ -52,4 +52,4 @@ verification/ @eclipse-score/automotive-score-committers /platform_integration_tests/ @eclipse-score/automotive-score-committers # /tools/ @eclipse-score/infrastructure-maintainers -/tools/ @AlexanderLanin @dcalavrezo-qorix +/tools/ @AlexanderLanin @dcalavrezo-qorix @MaximilianSoerenPollak From 9b7472c0d6c54b0bc46ebf63e6959fa3dc6d7a7f Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Tue, 13 Jan 2026 10:54:05 +0100 Subject: [PATCH 122/214] Update elected safety manager --- .github/CODEOWNERS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 79b47ff7b88..c8e61d25a66 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -23,7 +23,7 @@ architecture/ @eclipse-score/automotive-score-committers # requirements/ @eclipse-score/automotive-score-technical-leads requirements/ @antonkri @FScholPer @qor-lb @johannes-esr # safety_analysis/ @eclipse-score/safety-managers -safety_analysis/ @aschemmel-tech @PhilipPartsch @masc2023 @PandaeDo +safety_analysis/ @aschemmel-tech @masc2023 @PandaeDo # safety_planning/ @eclipse-score/automotive-score-technical-leads safety_planning/ @antonkri @FScholPer @qor-lb @johannes-esr verification/ @eclipse-score/automotive-score-committers @@ -41,7 +41,7 @@ verification/ @eclipse-score/automotive-score-committers # /docs/requirements/tool/ @eclipse-score/community-process /docs/requirements/tool/ @pahmann @PhilipPartsch @masc2023 @aschemmel-tech @PandaeDo # /docs/safety/ @eclipse-score/safety-managers -/docs/safety/ @aschemmel-tech @PhilipPartsch @masc2023 @PandaeDo +/docs/safety/ @aschemmel-tech @masc2023 @PandaeDo # /docs/score_releases/ @eclipse-score/automotive-score-project-leads /docs/score_releases/ @thilo-schmitt @HartmannNico @skappel29 @grandyholger @antonkri @FScholPer @qor-lb @johannes-esr /docs/score_tools/ @eclipse-score/automotive-score-committers From 4a01539019cc207b8e8ca994135d76908672412b Mon Sep 17 00:00:00 2001 From: root <karthik.vanka@qorix.ai> Date: Mon, 12 Jan 2026 15:49:04 +0530 Subject: [PATCH 123/214] First version of persistency feature security plan --- docs/features/persistency/index.rst | 2 + .../persistency/security_analysis/stride.rst | 26 ++++++++++++ .../persistency/security_planning/index.rst | 42 +++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 docs/features/persistency/security_analysis/stride.rst create mode 100644 docs/features/persistency/security_planning/index.rst diff --git a/docs/features/persistency/index.rst b/docs/features/persistency/index.rst index e1dde692ccc..36074b9e8f9 100644 --- a/docs/features/persistency/index.rst +++ b/docs/features/persistency/index.rst @@ -32,6 +32,8 @@ Persistency (v0.5 beta) safety_analysis/dfa.rst safety_analysis/safety_analysis_fdr.rst safety_planning/index.rst + security_planning/index.rst + security_analysis/stride.rst Feature flag diff --git a/docs/features/persistency/security_analysis/stride.rst b/docs/features/persistency/security_analysis/stride.rst new file mode 100644 index 00000000000..bbc48a7b18c --- /dev/null +++ b/docs/features/persistency/security_analysis/stride.rst @@ -0,0 +1,26 @@ +.. + # ******************************************************************************* + # Copyright (c) 2024 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +Persistency STRIDE +################## + +.. document:: STRIDE + :id: doc__persistency_stride + :status: valid + :safety: ASIL_B + :security: YES + :realizes: wp__feature_security_analysis + :tags: persistency + +STRIDE analysis procedure is required to be defined and applied. This section is created as placeholder and will be updated in future. diff --git a/docs/features/persistency/security_planning/index.rst b/docs/features/persistency/security_planning/index.rst new file mode 100644 index 00000000000..11e2a6dce78 --- /dev/null +++ b/docs/features/persistency/security_planning/index.rst @@ -0,0 +1,42 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +Feature Security Planning +========================= + +.. document:: Persistency KVS Security WPs + :id: doc__persistency_security_wp + :status: valid + :safety: ASIL_B + :security: YES + :realizes: wp__platform_security_plan + :tags: persistency + + +.. list-table:: Feature persistency Workproducts + :header-rows: 1 + + * - Workproduct Id + - Link to process + - Process status + - Link to issue + - Link to WP + - WP status + + * - :need:`wp__feature_security_analysis` + - :need:`gd_guidl__security_analysis` + - :ndf:`copy('status', need_id='gd_guidl__security_analysis')` + - TBD + - :need:`doc__persistency_stride` + - valid From 9e54112b594f2ac0b85da90bff79abf4c3385f63 Mon Sep 17 00:00:00 2001 From: aschemmel-tech <aschemmel_job@arcor.de> Date: Tue, 13 Jan 2026 13:39:42 +0100 Subject: [PATCH 124/214] Update result req inspection checklist author Signed-off-by: aschemmel-tech <aschemmel_job@arcor.de> --- .../result/docs/requirements/chklst_req_inspection.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/modules/baselibs/result/docs/requirements/chklst_req_inspection.rst b/docs/modules/baselibs/result/docs/requirements/chklst_req_inspection.rst index b0d0b224e50..070f8562941 100644 --- a/docs/modules/baselibs/result/docs/requirements/chklst_req_inspection.rst +++ b/docs/modules/baselibs/result/docs/requirements/chklst_req_inspection.rst @@ -15,7 +15,7 @@ .. document:: Result Library Requirements Inspection Checklist :id: doc__result_library_req_inspection - :status: draft + :status: valid :safety: ASIL_B :security: YES :realizes: wp__requirements_inspect @@ -31,7 +31,7 @@ Requirement Inspection Checklist As described in the concept :need:`doc_concept__wp_inspections` the following "inspection roles" are expected to be filled: - - author: these are the persons who did the last commits on the requirements in scope (can be derived from version mgt tool) + - author: `<https://github.com/4og>`_ - reviewer: these are all persons committing into this inspection document or giving a pull request verdict on it (can be derived from version mgt tool) - moderator: only needed for conflict resolution between author and reviewers, is the safety manager, security manager or quality manager called in as a reviewer (can be derived from version mgt tool) - test expert: `<https://github.com/rahulthakre29>`_ From aa4f5fa5113973d381847c7e55b17e95dca68046 Mon Sep 17 00:00:00 2001 From: Philipp Ahmann <2428012+pahmann@users.noreply.github.com> Date: Wed, 14 Jan 2026 10:12:38 +0100 Subject: [PATCH 125/214] Fix typo in verification plan execution environment Signed-off-by: Philipp Ahmann <2428012+pahmann@users.noreply.github.com> --- docs/platform_management_plan/software_verification.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/platform_management_plan/software_verification.rst b/docs/platform_management_plan/software_verification.rst index cbf14b083fe..5d743ef99bd 100644 --- a/docs/platform_management_plan/software_verification.rst +++ b/docs/platform_management_plan/software_verification.rst @@ -524,8 +524,8 @@ Test execution environment and reference hardware ------------------------------------------------- The platform is consisting solely on features that are considered as "middleware" as the layer -above the hardware abstraction layer. The platform itself doe not require to be running on -a specific hardware. It integrates with an Posix Operating System which is the first level of +above the hardware abstraction layer. The platform itself does not require to be running on +a specific hardware. It integrates with an POSIX Operating System which is the first level of abstraction to the physical hardware. The simulation environment will be based on x86 and arm64 architecture, to be close to later From b90ceea6791cc5d5eefc4eb6c5ff7ddf815438b9 Mon Sep 17 00:00:00 2001 From: Philipp Ahmann <Philipp.Ahmann@de.bosch.com> Date: Wed, 14 Jan 2026 14:28:22 +0100 Subject: [PATCH 126/214] Update dependencies to new process release Signed-off-by: Philipp Ahmann <Philipp.Ahmann@de.bosch.com> --- MODULE.bazel | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 3691be4f4c4..04f3f5ed8f8 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -73,5 +73,5 @@ bazel_dep(name = "rules_java", version = "8.15.1") # ############################################################################### bazel_dep(name = "score_tooling", version = "1.0.4") -bazel_dep(name = "score_docs_as_code", version = "2.2.0") -bazel_dep(name = "score_process", version = "1.4.0") +bazel_dep(name = "score_docs_as_code", version = "2.3.0") +bazel_dep(name = "score_process", version = "1.4.1") From 8528fefb6e070ae805195e2089dae0a26a0a8c73 Mon Sep 17 00:00:00 2001 From: Philipp Ahmann <Philipp.Ahmann@de.bosch.com> Date: Wed, 14 Jan 2026 14:31:55 +0100 Subject: [PATCH 127/214] Correct linking to latest wp tailoring naming Signed-off-by: Philipp Ahmann <Philipp.Ahmann@de.bosch.com> --- docs/platform_management_plan/quality_management.rst | 2 +- docs/platform_management_plan/safety_management.rst | 4 ++-- docs/platform_management_plan/security_management.rst | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/platform_management_plan/quality_management.rst b/docs/platform_management_plan/quality_management.rst index b276c4a8fb1..b49096a48a1 100644 --- a/docs/platform_management_plan/quality_management.rst +++ b/docs/platform_management_plan/quality_management.rst @@ -416,7 +416,7 @@ None * - :need:`wp__sw_implementation_inspection` - :ref:`documents_docs_modules_components` - * - :need:`wp__tailoring` + * - :need:`wp__tailoring_work_products` - :ref:`project_documents_list`, :ref:`documents_docs_features`, :ref:`documents_docs_modules_components` * - :need:`wp__tlm_plan` diff --git a/docs/platform_management_plan/safety_management.rst b/docs/platform_management_plan/safety_management.rst index d4a4fdd190f..5dca2577c0d 100644 --- a/docs/platform_management_plan/safety_management.rst +++ b/docs/platform_management_plan/safety_management.rst @@ -17,7 +17,7 @@ :status: draft :safety: ASIL_B :security: NO - :realizes: wp__platform_safety_plan, wp__tailoring + :realizes: wp__platform_safety_plan, wp__safety_tailoring :tags: platform_management Safety management / Platform Safety Plan @@ -449,7 +449,7 @@ Functional Safety Specific SW Platform Work Products - <Link to WP> - <automated> - * - :need:`wp__tailoring` (generic) + * - :need:`wp__safety_tailoring` (generic) - :ndf:`copy('status', need_id='wf__def_app_process_description')` - :need:`wp__tailoring_work_products` & :need:`doc__score_platform_safety_plan` - valid diff --git a/docs/platform_management_plan/security_management.rst b/docs/platform_management_plan/security_management.rst index 81a7ebd306a..7b40cf793a5 100644 --- a/docs/platform_management_plan/security_management.rst +++ b/docs/platform_management_plan/security_management.rst @@ -17,7 +17,7 @@ :status: draft :safety: ASIL_B :security: YES - :realizes: wp__platform_security_plan, wp__tailoring + :realizes: wp__platform_security_plan, wp__tailoring_work_products :tags: platform_management Security management / Platform Security Plan @@ -91,7 +91,7 @@ Because these are in responsibility of the system integrator: :need:`std_wp__iso :need:`std_wp__isosae21434__assessment_15331`, :need:`std_wp__isosae21434__assessment_15332`, :need:`std_wp__isosae21434__assessment_15431`, :need:`std_wp__isosae21434__assessment_15531` -Summary: :need:`wp__tailoring` links to all the work products which are tailored out in the platform security plan, +Summary: :need:`wp__tailoring_work_products` links to all the work products which are tailored out in the platform security plan, to be able to demonstrate completeness in `REPLACE_external_standards` @@ -305,7 +305,7 @@ Security Specific SW Platform Work Products - <Link to WP> - <automated> - * - :need:`wp__tailoring` (generic) + * - :need:`wp__tailoring_work_products` (generic) - :ndf:`copy('status', need_id='wf__def_app_process_description')` - :need:`doc__platform_security_plan` - :ndf:`copy('status', need_id='doc__platform_security_plan')` From 3cc66624b5d78ef533a77892849d8db05b18bb19 Mon Sep 17 00:00:00 2001 From: Philipp Ahmann <Philipp.Ahmann@de.bosch.com> Date: Wed, 14 Jan 2026 11:50:42 +0100 Subject: [PATCH 128/214] Add link for embedded SW tailoring in verification plan Signed-off-by: Philipp Ahmann <Philipp.Ahmann@de.bosch.com> --- docs/platform_management_plan/software_verification.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/platform_management_plan/software_verification.rst b/docs/platform_management_plan/software_verification.rst index 5d743ef99bd..77d9dd49d22 100644 --- a/docs/platform_management_plan/software_verification.rst +++ b/docs/platform_management_plan/software_verification.rst @@ -141,7 +141,7 @@ There are the following different levels of integration and verification defined The full Platform Integration Testing will be executed by the integrator. S-CORE project only executes tests on reference hardware. These tests serve as an optional base for the integrator and will also be part of the :need:`wp__verification_platform_ver_report`, but more on an informative character. The full scope - of clause 11 is tailored out accordingly for S-CORE. Practically, this means S-CORE will implement + of clause 11 is tailored out accordingly for S-CORE (see: :need:`gd_guidl__verification_req_tailored`). Practically, this means S-CORE will implement Platform Integration Test of stakeholder requirements for demonstration, but these are not intended to completely covering all stakeholder requirements. From 03982c9fbeb9491adff1b23535c1ab8e3f76b339 Mon Sep 17 00:00:00 2001 From: Philipp Ahmann <Philipp.Ahmann@de.bosch.com> Date: Wed, 14 Jan 2026 14:06:51 +0100 Subject: [PATCH 129/214] Formatting improvement for verification plan Signed-off-by: Philipp Ahmann <Philipp.Ahmann@de.bosch.com> --- docs/platform_management_plan/software_verification.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/platform_management_plan/software_verification.rst b/docs/platform_management_plan/software_verification.rst index 77d9dd49d22..19e38d2bc88 100644 --- a/docs/platform_management_plan/software_verification.rst +++ b/docs/platform_management_plan/software_verification.rst @@ -141,9 +141,9 @@ There are the following different levels of integration and verification defined The full Platform Integration Testing will be executed by the integrator. S-CORE project only executes tests on reference hardware. These tests serve as an optional base for the integrator and will also be part of the :need:`wp__verification_platform_ver_report`, but more on an informative character. The full scope - of clause 11 is tailored out accordingly for S-CORE (see: :need:`gd_guidl__verification_req_tailored`). Practically, this means S-CORE will implement - Platform Integration Test of stakeholder requirements for demonstration, but these are not intended to completely - covering all stakeholder requirements. + of clause 11 is tailored out accordingly for S-CORE (see: :need:`gd_guidl__verification_req_tailored`). + Practically, this means S-CORE will implement Platform Integration Tests for stakeholder requirements for demonstration, + but these are not intended to completely covering all stakeholder requirements. Verification Methods -------------------- From e26f26179f9b90b63429f6c65a7411a85459daad Mon Sep 17 00:00:00 2001 From: Philipp Ahmann <2428012+pahmann@users.noreply.github.com> Date: Wed, 14 Jan 2026 17:31:40 +0100 Subject: [PATCH 130/214] Add statement on coverage goals It may not be feasible to achieve always a 100% coverage. When this is the case, there need to be a way to record this deviation and make it part of the documentation. As numbers are reported in CI this will pop up in audits and it can be checked if argumentation is provided. Signed-off-by: Philipp Ahmann <2428012+pahmann@users.noreply.github.com> --- docs/platform_management_plan/software_verification.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/platform_management_plan/software_verification.rst b/docs/platform_management_plan/software_verification.rst index 19e38d2bc88..ce71c3349cb 100644 --- a/docs/platform_management_plan/software_verification.rst +++ b/docs/platform_management_plan/software_verification.rst @@ -329,6 +329,9 @@ to be reached with every contribution. Further quality goals are defined in section :doc:`quality_management`. +The confirmation or any deviation of the coverage percentage value is documented in this section. +This shall also be part of the module documenation with a reasoning when percentage numbers deviate for an official release. + Coverage of detailed design ^^^^^^^^^^^^^^^^^^^^^^^^^^^ From 7cf9304aa9368bbe0ae59c87f4ea7b90037d3c27 Mon Sep 17 00:00:00 2001 From: aschemmel-tech <aschemmel_job@arcor.de> Date: Mon, 19 Jan 2026 10:02:19 +0100 Subject: [PATCH 131/214] Make stakeholder requirements a document plus some link corrections in platform safety plan Signed-off-by: aschemmel-tech <aschemmel_job@arcor.de> --- .../safety_management.rst | 23 +++++++++++-------- docs/requirements/stakeholder/index.rst | 9 +++++++- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/docs/platform_management_plan/safety_management.rst b/docs/platform_management_plan/safety_management.rst index 5dca2577c0d..00f32a79ff0 100644 --- a/docs/platform_management_plan/safety_management.rst +++ b/docs/platform_management_plan/safety_management.rst @@ -311,8 +311,8 @@ Functional Safety Quality Criteria ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The platform management plan defines :doc:`quality_management` -Platform Safety Plan -++++++++++++++++++++ +Platform Safety Plan / Package +++++++++++++++++++++++++++++++ .. _sw_platform_wp_list: @@ -379,8 +379,13 @@ Functional Safety/Security Management SW Platform Work Products * - :need:`wp__requirements_stkh` - :ndf:`copy('status', need_id='wf__req_stkh_req')` - - :ref:`stakeholder_requirements` - - <automated> + - :need:`doc__stakeholder_requirements` + - :ndf:`copy('status', need_id='doc__stakeholder_requirements')` + + * - :need:`wp__requirements_sw_platform_aou` + - :ndf:`copy('status', need_id='wf__req_stkh_req')` + - :need:`doc__platform_assumptions` + - :ndf:`copy('status', need_id='doc__platform_assumptions')` * - :need:`wp__sw_development_plan` - :ndf:`copy('status', need_id='wf__sw_development_plan')` @@ -416,8 +421,8 @@ Functional Safety Specific SW Platform Work Products * - :need:`wp__platform_safety_package` - :ndf:`copy('status', need_id='wf__cr_mt_safety_package')` - - <Link to WP> - - <automated> + - this document + - see above * - :need:`wp__fdr_reports` (platform Safety Plan) - :ndf:`copy('status', need_id='wf__p_formal_rv')` @@ -430,7 +435,7 @@ Functional Safety Specific SW Platform Work Products - <automated> * - :need:`wp__fdr_reports` (feature's Safety Analyses & DFA) - - <Process status> + - :ndf:`copy('status', need_id='wf__p_formal_rv')` - <Link to WP> - <automated> @@ -439,8 +444,8 @@ Functional Safety Specific SW Platform Work Products - <Link to WP> - intermediate - * - :need:`wp__feature_dfa` - - <Process status> + * - :need:`wp__platform_dfa` + - :ndf:`copy('status', need_id='wf__analyse_platform_featarch')` - <Link to WP> - <automated> diff --git a/docs/requirements/stakeholder/index.rst b/docs/requirements/stakeholder/index.rst index 65c9fd1d0c2..e916fabf3d2 100644 --- a/docs/requirements/stakeholder/index.rst +++ b/docs/requirements/stakeholder/index.rst @@ -17,6 +17,13 @@ Stakeholder Requirements ======================== +.. document:: SW-platform stakeholder requirements + :id: doc__stakeholder_requirements + :status: draft + :security: YES + :safety: ASIL_B + :realizes: wp__requirements_stkh + Overall goals ------------- @@ -1200,7 +1207,7 @@ Requirements Engineering :rationale: This is a usability constraint needed for long term maintenance support :status: valid - he SW-platform infrastructure shall support linking all requirements from lower to upper level, whereby on the top-level are the stakeholder requirements. + The SW-platform infrastructure shall support linking all requirements from lower to upper level, whereby on the top-level are the stakeholder requirements. .. stkh_req:: Document requirements as code :id: stkh_req__requirements__as_code From 1dbb0221d745758b86e24ab1c307b0528420b0ac Mon Sep 17 00:00:00 2001 From: Andreas Zwinkau <95761648+a-zw@users.noreply.github.com> Date: Mon, 19 Jan 2026 10:44:04 +0100 Subject: [PATCH 132/214] Clean up decision records (#2455) Use needs objects instead of text. --- docs/design_decisions/DR-001-infra.md | 9 +++++++-- docs/design_decisions/DR-002-infra.md | 9 +++++++-- docs/design_decisions/DR-003-infra.md | 9 +++++++-- docs/design_decisions/DR-004-infra.rst | 4 ++-- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/docs/design_decisions/DR-001-infra.md b/docs/design_decisions/DR-001-infra.md index 923fc044a76..dc820deedb5 100644 --- a/docs/design_decisions/DR-001-infra.md +++ b/docs/design_decisions/DR-001-infra.md @@ -14,10 +14,15 @@ SPDX-License-Identifier: Apache-2.0 # DR-001-Infra: Integration Strategy for External Development Tools -* **Status:** Agreed within Community -* **Owner:** Infrastructure Community * **Date:** 2025-09-01 +```{dec_rec} Integration Strategy for External Development Tools +:id: dec_rec__infra__dev_tools +:status: accepted +:context: Infrastructure +:decision: Devcontainer is the primary distribution for all tools +``` + --- ## 1. Context / Problem diff --git a/docs/design_decisions/DR-002-infra.md b/docs/design_decisions/DR-002-infra.md index 62d938237f2..00a87e7deba 100644 --- a/docs/design_decisions/DR-002-infra.md +++ b/docs/design_decisions/DR-002-infra.md @@ -13,10 +13,15 @@ SPDX-License-Identifier: Apache-2.0 # DR-002-Infra: Integration Testing in a Distributed Monolith -* **Status:** Agreed within Community -* **Owner:** Infrastructure Community * **Date:** 2025-09-01 +```{dec_rec} Integration Testing in a Distributed Monolith +:id: dec_rec__infra__int_testing +:status: accepted +:context: Infrastructure +:decision: two testing layers +``` + --- ## Executive Summary diff --git a/docs/design_decisions/DR-003-infra.md b/docs/design_decisions/DR-003-infra.md index 70d0f882986..0dcdf8aa352 100644 --- a/docs/design_decisions/DR-003-infra.md +++ b/docs/design_decisions/DR-003-infra.md @@ -13,10 +13,15 @@ SPDX-License-Identifier: Apache-2.0 # DR-003-Infra: Devcontainer Strategy for S-CORE -- **Status:** Proposed -- **Owner:** Infrastructure Community - **Date:** 2025-10-06 +```{dec_rec} Devcontainer Strategy for S-CORE +:id: dec_rec__infra__devcontainer +:status: accepted +:context: Infrastructure +:decision: Hybrid Approach with Devcontainer Features +``` + --- ## 1. Context / Problem diff --git a/docs/design_decisions/DR-004-infra.rst b/docs/design_decisions/DR-004-infra.rst index 07ca4002220..f3b717616a3 100644 --- a/docs/design_decisions/DR-004-infra.rst +++ b/docs/design_decisions/DR-004-infra.rst @@ -13,14 +13,14 @@ DR-004-Infra: Bi-directional traceability in docs ================================================= +- **Date:** 2025-10-24 + .. dec_rec:: Bi-directional traceability in docs :id: dec_rec__infra__traceable_docs :status: accepted :context: Infrastructure :decision: Single documentation build - Date: 2025-10-24 - Context / Problem ----------------- From e44dd78fd6a529195171a4cbabaea52341949d17 Mon Sep 17 00:00:00 2001 From: aschemmel-tech <aschemmel_job@arcor.de> Date: Mon, 19 Jan 2026 11:22:53 +0100 Subject: [PATCH 133/214] Add SW-platform test completion aou Signed-off-by: aschemmel-tech <aschemmel_job@arcor.de> --- docs/requirements/platform_assumptions/index.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/requirements/platform_assumptions/index.rst b/docs/requirements/platform_assumptions/index.rst index 67606d19323..3d6d16a4e82 100644 --- a/docs/requirements/platform_assumptions/index.rst +++ b/docs/requirements/platform_assumptions/index.rst @@ -207,6 +207,18 @@ This is the highest level of integraton. This is the level where the S-CORE SW-p Note3: This applies also if the system integrator would replace a S-CORE SW-platform element with another SW element which is external to S-CORE. +.. aou_req:: SW-platform test completion + :id: aou_req__platform__test_completion + :reqtype: Non-Functional + :security: YES + :safety: ASIL_B + :status: valid + + If the system using the SW-platform has safety goals, the system integrator shall check for correctness and completeness of SW-platform testing and add verification where needed. + + Note: The SW-platform integtion tests provided by S-CORE for :need:`aou_req__platform__testing` are for demonstration purpose only, + as described in the tailoring section of :need:`doc__score_platform_safety_plan` and thus do not claim correctness and completeness. + .. aou_req:: Integrator safety anomaly reporting :id: aou_req__platform__integration_safety_anomaly :reqtype: Non-Functional From 9d86cae8541ec8c33e4690d12de689df870541bf Mon Sep 17 00:00:00 2001 From: Priyanka Patil <Priyanka.Patil@bti.bmwgroup.com> Date: Tue, 20 Jan 2026 11:51:12 +0530 Subject: [PATCH 134/214] lib/concurrency - Add minimal Component Architecture --- .../baselibs/docs/architecture/index.rst | 4 +- .../concurrency/docs/architecture/index.rst | 313 ++++++++++++++++++ .../baselibs/concurrency/docs/index.rst | 4 +- docs/modules/baselibs/docs/index.rst | 4 +- 4 files changed, 320 insertions(+), 5 deletions(-) create mode 100644 docs/modules/baselibs/concurrency/docs/architecture/index.rst diff --git a/docs/features/baselibs/docs/architecture/index.rst b/docs/features/baselibs/docs/architecture/index.rst index c3c941beefb..6e2712c6776 100644 --- a/docs/features/baselibs/docs/architecture/index.rst +++ b/docs/features/baselibs/docs/architecture/index.rst @@ -90,7 +90,7 @@ Static Architecture :safety: ASIL_B :status: valid :fulfils: feat_req__baselibs__core_utilities - :includes: logic_arc_int__baselibs__json, logic_arc_int__baselibs__memory_shared, logic_arc_int__baselibs__message_passing, logic_arc_int__baselibs__result, logic_arc_int__baselibs__bit_manipulation, logic_arc_int__baselibs__bit_mask_operator, logic_arc_int__baselibs__dynamic_array, logic_arc_int__baselibs__intrusive_list, logic_arc_int__baselibs__filesystem, logic_arc_int__baselibs__utils_base64, logic_arc_int__baselibs__utils_scoped_op + :includes: logic_arc_int__baselibs__json, logic_arc_int__baselibs__memory_shared, logic_arc_int__baselibs__message_passing, logic_arc_int__baselibs__result, logic_arc_int__baselibs__bit_manipulation, logic_arc_int__baselibs__bit_mask_operator, logic_arc_int__baselibs__dynamic_array, logic_arc_int__baselibs__intrusive_list, logic_arc_int__baselibs__filesystem, logic_arc_int__baselibs__utils_base64, logic_arc_int__baselibs__utils_scoped_op, logic_arc_int__baselibs__promise, logic_arc_int__baselibs__future, logic_arc_int__baselibs__shared_future, logic_arc_int__baselibs__executor, logic_arc_int__baselibs__task, logic_arc_int__baselibs__task_result, logic_arc_int__baselibs__synchronized_queue, logic_arc_int__baselibs__condition_variable .. needarch:: :scale: 50 @@ -107,4 +107,4 @@ The Baselibs feature exposes the following logical interfaces: :style: table :columns: title;id;status :sort: title - :filter: id in ['logic_arc_int__baselibs__json', 'logic_arc_int__baselibs__memory_shared', 'logic_arc_int__baselibs__message_passing' ,'logic_arc_int__baselibs__result', 'logic_arc_int__baselibs__bit_manipulation', 'logic_arc_int__baselibs__bit_mask_operator', 'logic_arc_int__baselibs__dynamic_array', 'logic_arc_int__baselibs__intrusive_list', 'logic_arc_int__baselibs__filesystem', 'logic_arc_int__baselibs__utils_base64', 'logic_arc_int__baselibs__utils_scoped_op'] + :filter: id in ['logic_arc_int__baselibs__json', 'logic_arc_int__baselibs__memory_shared', 'logic_arc_int__baselibs__message_passing' ,'logic_arc_int__baselibs__result', 'logic_arc_int__baselibs__bit_manipulation', 'logic_arc_int__baselibs__bit_mask_operator', 'logic_arc_int__baselibs__dynamic_array', 'logic_arc_int__baselibs__intrusive_list', 'logic_arc_int__baselibs__filesystem', 'logic_arc_int__baselibs__utils_base64', 'logic_arc_int__baselibs__utils_scoped_op', 'logic_arc_int__baselibs__promise', 'logic_arc_int__baselibs__future', 'logic_arc_int__baselibs__shared_future', 'logic_arc_int__baselibs__executor', 'logic_arc_int__baselibs__task', 'logic_arc_int__baselibs__task_result', 'logic_arc_int__baselibs__synchronized_queue', 'logic_arc_int__baselibs__condition_variable'] diff --git a/docs/modules/baselibs/concurrency/docs/architecture/index.rst b/docs/modules/baselibs/concurrency/docs/architecture/index.rst new file mode 100644 index 00000000000..7985d4393bd --- /dev/null +++ b/docs/modules/baselibs/concurrency/docs/architecture/index.rst @@ -0,0 +1,313 @@ +.. + # ******************************************************************************* + # Copyright (c) 2026 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +Concurrency Component Architecture +*********************************** + +.. document:: Concurrency Architecture + :id: doc__concurrency_architecture + :status: valid + :safety: ASIL_B + :security: YES + :realizes: wp__component_arch + +Overview/Description +-------------------- + +see :need:`doc__concurrency` + +Static Architecture +------------------- + +.. comp_arc_sta:: Concurrency + :id: comp_arc_sta__baselibs__concurrency + :security: YES + :safety: ASIL_B + :status: valid + :tags: baselibs_concurrency + :implements: logic_arc_int__baselibs__promise, logic_arc_int__baselibs__future, logic_arc_int__baselibs__shared_future, logic_arc_int__baselibs__executor, logic_arc_int__baselibs__task, logic_arc_int__baselibs__task_result, logic_arc_int__baselibs__synchronized_queue, logic_arc_int__baselibs__condition_variable + + .. needarch:: + :scale: 50 + :align: center + + {{ draw_component(need(), needs) }} + +Interfaces +---------- + +.. logic_arc_int:: Promise + :id: logic_arc_int__baselibs__promise + :security: YES + :safety: ASIL_B + :status: valid + +.. logic_arc_int_op:: Set Value + :id: logic_arc_int_op__conc__promise_setval + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__promise + +.. logic_arc_int_op:: Set Error + :id: logic_arc_int_op__conc__promise_set_error + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__promise + +.. logic_arc_int_op:: Get Future + :id: logic_arc_int_op__conc__promise_get_future + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__promise + +.. logic_arc_int_op:: On Abort + :id: logic_arc_int_op__conc__promise_on_abort + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__promise + +.. logic_arc_int:: Future + :id: logic_arc_int__baselibs__future + :security: YES + :safety: ASIL_B + :status: valid + +.. logic_arc_int_op:: Get + :id: logic_arc_int_op__conc__future_get + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__future + +.. logic_arc_int_op:: Wait + :id: logic_arc_int_op__conc__future_wait + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__future + +.. logic_arc_int_op:: Wait For + :id: logic_arc_int_op__conc__future_wait_for + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__future + +.. logic_arc_int_op:: Wait Until + :id: logic_arc_int_op__conc__future_wait_until + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__future + +.. logic_arc_int_op:: Valid + :id: logic_arc_int_op__conc__future_valid + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__future + +.. logic_arc_int_op:: Share + :id: logic_arc_int_op__conc__future_share + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__future + +.. logic_arc_int_op:: Then + :id: logic_arc_int_op__conc__future_then + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__future + +.. logic_arc_int:: Shared Future + :id: logic_arc_int__baselibs__shared_future + :security: YES + :safety: ASIL_B + :status: valid + +.. logic_arc_int_op:: Get Shared + :id: logic_arc_int_op__conc__shared_future_get + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__shared_future + +.. logic_arc_int_op:: Copy + :id: logic_arc_int_op__conc__shared_future_copy + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__shared_future + +.. logic_arc_int:: Executor + :id: logic_arc_int__baselibs__executor + :security: YES + :safety: ASIL_B + :status: valid + +.. logic_arc_int_op:: Enqueue + :id: logic_arc_int_op__conc__executor_enqueue + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__executor + +.. logic_arc_int_op:: Post + :id: logic_arc_int_op__conc__executor_post + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__executor + +.. logic_arc_int_op:: Submit + :id: logic_arc_int_op__conc__executor_submit + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__executor + +.. logic_arc_int_op:: Shutdown + :id: logic_arc_int_op__conc__executor_shutdown + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__executor + +.. logic_arc_int_op:: Max Concurrency Level + :id: logic_arc_int_op__conc__executor_max_conc + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__executor + +.. logic_arc_int:: Task + :id: logic_arc_int__baselibs__task + :security: YES + :safety: ASIL_B + :status: valid + +.. logic_arc_int_op:: Execute + :id: logic_arc_int_op__conc__task_execute + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__task + +.. logic_arc_int_op:: Get Stop Source + :id: logic_arc_int_op__conc__task_get_stop_source + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__task + +.. logic_arc_int:: Task Result + :id: logic_arc_int__baselibs__task_result + :security: YES + :safety: ASIL_B + :status: valid + +.. logic_arc_int_op:: Abort + :id: logic_arc_int_op__conc__task_result_abort + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__task_result + +.. logic_arc_int_op:: Aborted + :id: logic_arc_int_op__conc__task_result_aborted + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__task_result + +.. logic_arc_int_op:: Get Result + :id: logic_arc_int_op__conc__task_result_get + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__task_result + +.. logic_arc_int:: Synchronized Queue + :id: logic_arc_int__baselibs__synchronized_queue + :security: YES + :safety: ASIL_B + :status: valid + +.. logic_arc_int_op:: Push + :id: logic_arc_int_op__conc__sync_queue_push + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__synchronized_queue + +.. logic_arc_int_op:: Pop + :id: logic_arc_int_op__conc__sync_queue_pop + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__synchronized_queue + +.. logic_arc_int_op:: Try Push + :id: logic_arc_int_op__conc__sync_queue_try_push + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__synchronized_queue + +.. logic_arc_int_op:: Try Pop + :id: logic_arc_int_op__conc__sync_queue_try_pop + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__synchronized_queue + +.. logic_arc_int:: Condition Variable + :id: logic_arc_int__baselibs__condition_variable + :security: YES + :safety: ASIL_B + :status: valid + +.. logic_arc_int_op:: Wait + :id: logic_arc_int_op__conc__cv_wait + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__condition_variable + +.. logic_arc_int_op:: Wait For + :id: logic_arc_int_op__conc__cv_wait_for + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__condition_variable + +.. logic_arc_int_op:: Notify One + :id: logic_arc_int_op__conc__cv_notify_one + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__condition_variable + +.. logic_arc_int_op:: Notify All + :id: logic_arc_int_op__conc__cv_notify_all + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__baselibs__condition_variable diff --git a/docs/modules/baselibs/concurrency/docs/index.rst b/docs/modules/baselibs/concurrency/docs/index.rst index 4f9cfef732f..a18749ff317 100644 --- a/docs/modules/baselibs/concurrency/docs/index.rst +++ b/docs/modules/baselibs/concurrency/docs/index.rst @@ -1,6 +1,6 @@ .. # ******************************************************************************* - # Copyright (c) 2025 Contributors to the Eclipse Foundation + # Copyright (c) 2026 Contributors to the Eclipse Foundation # # See the NOTICE file(s) distributed with this work for additional # information regarding copyright ownership. @@ -26,6 +26,8 @@ concurrency .. toctree:: :hidden: + architecture/index.rst + Abstract ======== diff --git a/docs/modules/baselibs/docs/index.rst b/docs/modules/baselibs/docs/index.rst index 84dbbd6e416..a769b54cbe8 100644 --- a/docs/modules/baselibs/docs/index.rst +++ b/docs/modules/baselibs/docs/index.rst @@ -1,6 +1,6 @@ .. # ******************************************************************************* - # Copyright (c) 2025 Contributors to the Eclipse Foundation + # Copyright (c) 2026 Contributors to the Eclipse Foundation # # See the NOTICE file(s) distributed with this work for additional # information regarding copyright ownership. @@ -14,7 +14,7 @@ .. mod_view_sta:: Baselibs :id: mod_view_sta__baselibs__baselibs - :includes: comp_arc_sta__baselibs__json, comp_arc_sta__baselibs__message_passing, comp_arc_sta__baselibs__memory_shared, comp_arc_sta__baselibs__result, comp_arc_sta__baselibs__bit_manipulation, comp_arc_sta__baselibs__containers, comp_arc_sta__baselibs__filesystem, comp_arc_sta__baselibs__utils + :includes: comp_arc_sta__baselibs__json, comp_arc_sta__baselibs__message_passing, comp_arc_sta__baselibs__memory_shared, comp_arc_sta__baselibs__result, comp_arc_sta__baselibs__bit_manipulation, comp_arc_sta__baselibs__containers, comp_arc_sta__baselibs__filesystem, comp_arc_sta__baselibs__utils, comp_arc_sta__baselibs__concurrency .. needarch:: :scale: 50 From a3a920c2dd5980a45d5a89e0eac1a27b19f7c9ae Mon Sep 17 00:00:00 2001 From: Priyanka Patil <Priyanka.Patil@bti.bmwgroup.com> Date: Tue, 13 Jan 2026 11:19:56 +0530 Subject: [PATCH 135/214] lib/memory - Define component requirements --- .../baselibs/docs/requirements/index.rst | 10 ++ .../baselibs/memory_shared/docs/index.rst | 1 + .../memory_shared/docs/requirements/index.rst | 161 ++++++++++++++++++ 3 files changed, 172 insertions(+) create mode 100644 docs/modules/baselibs/memory_shared/docs/requirements/index.rst diff --git a/docs/features/baselibs/docs/requirements/index.rst b/docs/features/baselibs/docs/requirements/index.rst index 82346371f94..114780411df 100644 --- a/docs/features/baselibs/docs/requirements/index.rst +++ b/docs/features/baselibs/docs/requirements/index.rst @@ -132,5 +132,15 @@ Requirements The base libraries shall provide a filesystem library with file and directory manipulation functionality. +.. feat_req:: Memory Library + :id: feat_req__baselibs__memory_library + :reqtype: Functional + :security: YES + :safety: QM + :satisfies: stkh_req__functional_req__base_libraries + :status: valid + + The baselibs shall provide a memory management library that includes utilities for shared memory operations, polymorphic memory resources, position-independent pointers, endianness conversion, and inter-process synchronization mechanisms. + .. needextend:: "__baselibs" in id :+tags: baselibs diff --git a/docs/modules/baselibs/memory_shared/docs/index.rst b/docs/modules/baselibs/memory_shared/docs/index.rst index b5b99cbc537..a366ef926d5 100644 --- a/docs/modules/baselibs/memory_shared/docs/index.rst +++ b/docs/modules/baselibs/memory_shared/docs/index.rst @@ -21,3 +21,4 @@ memory_shared :hidden: architecture/index + requirements/index.rst diff --git a/docs/modules/baselibs/memory_shared/docs/requirements/index.rst b/docs/modules/baselibs/memory_shared/docs/requirements/index.rst new file mode 100644 index 00000000000..a02a3c6a421 --- /dev/null +++ b/docs/modules/baselibs/memory_shared/docs/requirements/index.rst @@ -0,0 +1,161 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +Requirements +############ + +.. document:: Memory Library Requirements + :id: doc__memory_lib_requirements + :status: draft + :safety: ASIL_B + :security: YES + :realizes: wp__requirements_comp + :tags: requirements, memory_library + +Functional Requirements +======================= + +.. comp_req:: Shared Memory Management + :id: comp_req__memory__shared_memory + :reqtype: Functional + :security: YES + :safety: ASIL_B + :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__memory_library, feat_req__baselibs__safety + :status: valid + + The Memory library shall provide capabilities for creating, opening and managing shared memory. + +.. comp_req:: Position-Independent Pointers + :id: comp_req__memory__offset_ptr + :reqtype: Functional + :security: YES + :safety: ASIL_B + :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__memory_library, feat_req__baselibs__safety + :status: valid + + The Memory library shall provide polymorphic memory resource allocators for controlled and deterministic memory allocation. + +.. comp_req:: Shared Memory Containers + :id: comp_req__memory__shared_containers + :reqtype: Functional + :security: YES + :safety: ASIL_B + :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__memory_library, feat_req__baselibs__safety + :status: valid + + The Memory library shall provide type aliases for STL containers (vector, map, string) that use offset pointers for shared memory storage. + +.. comp_req:: Inter-Process Synchronization + :id: comp_req__memory__ipc_sync + :reqtype: Functional + :security: YES + :safety: ASIL_B + :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__memory_library, feat_req__baselibs__safety + :status: valid + + The Memory library shall provide file-based locking mechanisms for inter-process synchronization and mutual exclusion. + +.. comp_req:: Memory Region Bounds Checking + :id: comp_req__memory__bounds_check + :reqtype: Functional + :security: YES + :safety: ASIL_B + :satisfies: feat_req__baselibs__safety, feat_req__baselibs__memory_library + :status: valid + + The Memory library shall track and validate memory region boundaries to prevent out-of-bounds access in shared memory. + +.. comp_req:: Endianness Conversion + :id: comp_req__memory__endianness + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__memory_library + :status: valid + + The Memory library shall provide byte order conversion between host and network byte order (big/little endian). + +.. comp_req:: Sealed Shared Memory + :id: comp_req__memory__sealed_shm + :reqtype: Functional + :security: YES + :safety: ASIL_B + :satisfies: feat_req__baselibs__safety, feat_req__baselibs__memory_library, feat_req__baselibs__security + :status: valid + + The Memory library shall provide immutable shared memory segments that become read-only after initialization. + +.. comp_req:: Type-Safe Shared Memory + :id: comp_req__memory__typed_shm + :reqtype: Functional + :security: YES + :safety: ASIL_B + :satisfies: feat_req__baselibs__consistent_apis, feat_req__baselibs__safety, feat_req__baselibs__memory_library + :status: valid + + The Memory library shall provide type-safe wrappers for typed shared memory objects with compile-time type checking. + +.. comp_req:: Memory Resource Registry + :id: comp_req__memory__resource_registry + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__memory_library + :status: valid + + The Memory library shall provide a global registry for memory resource lookup and management. + +.. comp_req:: String Utilities + :id: comp_req__memory__string_utils + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__memory_library + :status: valid + + The Memory library shall provide zero-allocation string utilities including splitting, comparison, and compile-time literals. + +.. comp_req:: Atomic Operations in Shared Memory + :id: comp_req__memory__atomic_ops + :reqtype: Functional + :security: YES + :safety: ASIL_B + :satisfies: feat_req__baselibs__memory_library, feat_req__baselibs__safety + :status: valid + + The Memory library shall provide atomic operations on shared memory data for lock-free inter-process communication. + + +Non-Functional Requirements +=========================== + +.. comp_req:: Deterministic Memory Allocation + :id: comp_req__memory__deterministic_alloc + :reqtype: Non-Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__safety + :status: valid + + The shared memory allocation shall provide deterministic behavior with predictable execution time suitable for real-time automotive systems. + +.. comp_req:: Process Address Space Independence + :id: comp_req__memory__address_independence + :reqtype: Non-Functional + :security: YES + :safety: ASIL_B + :satisfies: feat_req__baselibs__safety, feat_req__baselibs__memory_library + :status: valid + + The Memory library shall ensure shared memory data structures remain valid regardless of process virtual address space mappings. From a438aa7c2495fae5510047ea921b91a409bcc051 Mon Sep 17 00:00:00 2001 From: Priyanka Patil <Priyanka.Patil@bti.bmwgroup.com> Date: Tue, 13 Jan 2026 11:19:56 +0530 Subject: [PATCH 136/214] lib/memory - Define component requirements --- docs/features/baselibs/docs/requirements/index.rst | 2 +- .../baselibs/memory_shared/docs/requirements/index.rst | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/features/baselibs/docs/requirements/index.rst b/docs/features/baselibs/docs/requirements/index.rst index 114780411df..efb9141ecd6 100644 --- a/docs/features/baselibs/docs/requirements/index.rst +++ b/docs/features/baselibs/docs/requirements/index.rst @@ -136,7 +136,7 @@ Requirements :id: feat_req__baselibs__memory_library :reqtype: Functional :security: YES - :safety: QM + :safety: ASIL_B :satisfies: stkh_req__functional_req__base_libraries :status: valid diff --git a/docs/modules/baselibs/memory_shared/docs/requirements/index.rst b/docs/modules/baselibs/memory_shared/docs/requirements/index.rst index a02a3c6a421..904bc1e44db 100644 --- a/docs/modules/baselibs/memory_shared/docs/requirements/index.rst +++ b/docs/modules/baselibs/memory_shared/docs/requirements/index.rst @@ -36,7 +36,7 @@ Functional Requirements The Memory library shall provide capabilities for creating, opening and managing shared memory. -.. comp_req:: Position-Independent Pointers +.. comp_req:: Polymorphic OffsetPtr Allocator :id: comp_req__memory__offset_ptr :reqtype: Functional :security: YES @@ -44,7 +44,7 @@ Functional Requirements :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__memory_library, feat_req__baselibs__safety :status: valid - The Memory library shall provide polymorphic memory resource allocators for controlled and deterministic memory allocation. + The Memory library shall provide polymorphic memory resource allocators using offset pointers instead of raw pointers to enable allocation in shared memory regions accessible across multiple processes. The standard library's std::pmr::polymorphic_allocator is not applicable as it uses raw pointers that are invalid when shared memory is mapped at different virtual addresses in different processes. .. comp_req:: Shared Memory Containers :id: comp_req__memory__shared_containers From 3b90b8b53cfd3ffb4ba139d22f18034572b08d49 Mon Sep 17 00:00:00 2001 From: aschemmel-tech <aschemmel_job@arcor.de> Date: Tue, 20 Jan 2026 16:00:36 +0100 Subject: [PATCH 137/214] Remove @PhilipPartsch as codeowner Signed-off-by: aschemmel-tech <aschemmel_job@arcor.de> --- .github/CODEOWNERS | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index c8e61d25a66..21b4997cbde 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -11,10 +11,10 @@ # All special files go to infrastructure as well .* @AlexanderLanin @dcalavrezo-qorix @MaximilianSoerenPollak -.github/ISSUE_TEMPLATE/ @pahmann @PhilipPartsch @masc2023 @aschemmel-tech @PandaeDo +.github/ISSUE_TEMPLATE/ @pahmann @masc2023 @aschemmel-tech @PandaeDo .github/CODEOWNERS @antonkri @FScholPer @qor-lb @johannes-esr -/docs/ @pahmann @PhilipPartsch @masc2023 @aschemmel-tech @PandaeDo +/docs/ @pahmann @masc2023 @aschemmel-tech @PandaeDo /docs/conf.py @AlexanderLanin @dcalavrezo-qorix @MaximilianSoerenPollak /docs/contribute/ @eclipse-score/automotive-score-committers # /docs/features/ @eclipse-score/automotive-score-technical-leads @@ -33,13 +33,13 @@ verification/ @eclipse-score/automotive-score-committers /docs/manuals/ @eclipse-score/automotive-score-committers /docs/modules/ @eclipse-score/automotive-score-committers # /docs/platform_management_plan/ @eclipse-score/community-process -/docs/platform_management_plan/ @pahmann @PhilipPartsch @masc2023 @aschemmel-tech @PandaeDo +/docs/platform_management_plan/ @pahmann @masc2023 @aschemmel-tech @PandaeDo # /docs/quality/ @eclipse-score/quality-managers /docs/quality/ @masc2023 @pahmann @PandaeDo # /docs/requirements/stakeholder/ @eclipse-score/automotive-score-technical-leads /docs/requirements/stakeholder/ @antonkri @FScholPer @qor-lb @johannes-esr # /docs/requirements/tool/ @eclipse-score/community-process -/docs/requirements/tool/ @pahmann @PhilipPartsch @masc2023 @aschemmel-tech @PandaeDo +/docs/requirements/tool/ @pahmann @masc2023 @aschemmel-tech @PandaeDo # /docs/safety/ @eclipse-score/safety-managers /docs/safety/ @aschemmel-tech @masc2023 @PandaeDo # /docs/score_releases/ @eclipse-score/automotive-score-project-leads From 8155aa357830752bf1acfcc922378bab306898e9 Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Tue, 13 Jan 2026 10:36:22 +0100 Subject: [PATCH 138/214] Initial version Codeowner Orchestrator --- .../orchestrator/docs/safety_mgt/index.rst | 1 + .../docs/safety_mgt/module_codeowners.rst | 47 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 docs/modules/orchestrator/docs/safety_mgt/module_codeowners.rst diff --git a/docs/modules/orchestrator/docs/safety_mgt/index.rst b/docs/modules/orchestrator/docs/safety_mgt/index.rst index 04718ba3557..f186244aff1 100644 --- a/docs/modules/orchestrator/docs/safety_mgt/index.rst +++ b/docs/modules/orchestrator/docs/safety_mgt/index.rst @@ -18,6 +18,7 @@ Safety Management .. toctree:: :titlesonly: + module_codewoners module_safety_plan module_safety_plan_fdr module_safety_package_fdr diff --git a/docs/modules/orchestrator/docs/safety_mgt/module_codeowners.rst b/docs/modules/orchestrator/docs/safety_mgt/module_codeowners.rst new file mode 100644 index 00000000000..725bc70b187 --- /dev/null +++ b/docs/modules/orchestrator/docs/safety_mgt/module_codeowners.rst @@ -0,0 +1,47 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +Module Codeowners Skill Check +***************************** + +.. document:: Orchestrator Codeowners + :id: doc__orchestrator_codeowners + :status: valid + :safety: ASIL_B + :security: YES + :realizes: wp__module_safety_plan + +Assigned Committer(s) +===================== + +According to `Orchestrator Module Codeowners <https://github.com/eclipse-score/orchestrator/blob/main/.github/CODEOWNERS>`_ +the following committers are assigned to guard the Orchestrator repository: + +- `<https://github.com/vinodreddy-g>`_ +- `<https://github.com/qor-lb>`_ +- `<https://github.com/MaximilianSoerenPollak>`_ + + +Skill Check +=========== + +For the CODEOWNERS the required skills, knowledge and experience is defined in `<https://eclipse-score.github.io/score/main/platform_management_plan/safety_management.html#functional-safety-management-organization>`_. + +The evidences are not published openly due to personal data confidentiality, but will be checked by the module safety manager. + +- `<https://github.com/vinodreddy-g>`_: SW developer and architect at Tier 1 > 10 years for safety related SW. Member of process community +- `<https://github.com/qor-lb>`_: SW developer at Tier 1 > y . Member of S-CORE process community and project lead + + +The S-CORE processes are trained on the job by the Orchestrator module safety manager to the CODEOWNERS. From e865b9165776e041978e4070312dedf3293649a1 Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Wed, 21 Jan 2026 11:31:53 +0100 Subject: [PATCH 139/214] fix failures --- docs/modules/orchestrator/docs/safety_mgt/index.rst | 2 +- .../orchestrator/docs/safety_mgt/module_codeowners.rst | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/modules/orchestrator/docs/safety_mgt/index.rst b/docs/modules/orchestrator/docs/safety_mgt/index.rst index f186244aff1..f67104c9b63 100644 --- a/docs/modules/orchestrator/docs/safety_mgt/index.rst +++ b/docs/modules/orchestrator/docs/safety_mgt/index.rst @@ -18,7 +18,7 @@ Safety Management .. toctree:: :titlesonly: - module_codewoners + module_codeowners module_safety_plan module_safety_plan_fdr module_safety_package_fdr diff --git a/docs/modules/orchestrator/docs/safety_mgt/module_codeowners.rst b/docs/modules/orchestrator/docs/safety_mgt/module_codeowners.rst index 725bc70b187..997499fa493 100644 --- a/docs/modules/orchestrator/docs/safety_mgt/module_codeowners.rst +++ b/docs/modules/orchestrator/docs/safety_mgt/module_codeowners.rst @@ -30,8 +30,6 @@ the following committers are assigned to guard the Orchestrator repository: - `<https://github.com/vinodreddy-g>`_ - `<https://github.com/qor-lb>`_ -- `<https://github.com/MaximilianSoerenPollak>`_ - Skill Check =========== @@ -40,8 +38,8 @@ For the CODEOWNERS the required skills, knowledge and experience is defined in ` The evidences are not published openly due to personal data confidentiality, but will be checked by the module safety manager. -- `<https://github.com/vinodreddy-g>`_: SW developer and architect at Tier 1 > 10 years for safety related SW. Member of process community -- `<https://github.com/qor-lb>`_: SW developer at Tier 1 > y . Member of S-CORE process community and project lead +- `<https://github.com/vinodreddy-g>`_: SW developer and architect at Tier 1 > 10 years for safety related SW. Contribution to process community. +- `<https://github.com/qor-lb>`_: SW developer and architect at Tier 1 > 2 years for safety related SW. Project lead for safety related SW > 3 years. Lead of architecture community and member of S-CORE project lead circle. The S-CORE processes are trained on the job by the Orchestrator module safety manager to the CODEOWNERS. From 9bb436b36e2fa572266285bc47a064414391fca1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Willenb=C3=BCcher?= <adrian.willenbuecher.ext@qorix.ai> Date: Tue, 11 Nov 2025 17:06:46 +0100 Subject: [PATCH 140/214] ABI CD: support for strings and characters --- .../abi_compatible_data_types/index.rst | 42 ++++++++++- .../requirements.rst | 70 +++++++++++++++++++ 2 files changed, 109 insertions(+), 3 deletions(-) diff --git a/docs/features/communication/abi_compatible_data_types/index.rst b/docs/features/communication/abi_compatible_data_types/index.rst index 9fb5cf0be86..db46f3c1324 100644 --- a/docs/features/communication/abi_compatible_data_types/index.rst +++ b/docs/features/communication/abi_compatible_data_types/index.rst @@ -76,7 +76,7 @@ The following data types shall be supported: * **Primitive Types**: * Boolean - * Numeric (fixed-size integers 8-128 bits, signed and unsigned; IEEE 754 floating-point numbers) + * Character (Unicode scalar value) * **Sequence Types**: @@ -92,6 +92,7 @@ The following data types shall be supported: * **Fixed-Size, Variable-Length Containers**: * Vector + * String (UTF-8 encoded) * Queue * Hash map (*optional*) * Hash set (*optional*) @@ -169,8 +170,11 @@ These types are ABI-compatible when declared using fixed-size standard types: * - Floating point - ``f32``, ``f64`` - ``float``, ``double`` (compliant with IEEE 754) + * - Character + - ``char`` + - ``AbiChar`` (32-bit unsigned integer, valid bit patterns ``0x0`` to ``0xD7FF`` and ``0xE000`` to ``0x10FFFF``) -All types must avoid trap representations and undefined padding. +* Characters can't be represented as native ``uint32_t`` type in C++ without a wrapper, because it must be guaranteed that *surrogate code points* (``0xD800`` to ``0xDFFF``) and non-code points (values above ``0x10FFFF``) won't be stored in memory. Structs and Tuples """""""""""""""""" @@ -236,6 +240,34 @@ To provide bounded sequence types with familiar APIs, a custom vector implementa * Internally, these are ABI-compatible with ``len``, ``capacity`` and ``elements`` accessible from both languages. * The public API must match standard vector types in usability (e.g. ``push()``, ``pop()``). +Strings +""""""" + +Strings have the same memory layout as ``AbiVec<u8>``, but additionally guarantee that their content is valid UTF-8. + +.. code-block:: rust + + #[repr(C)] + pub struct AbiString<const N: usize> { + len: u32, + bytes: [u8; N], + } + +.. code-block:: cpp + + template<std::uint32_t N> + struct AbiString { + private: + std::uint32_t len; + std::uint8_t bytes[N]; + }; + +* Capacity is fixed and equal to ``N`` bytes at compile time. +* Overflow beyond capacity must be a checked error. +* No heap allocation is permitted. +* The public API must provide for a way to extend the string by a single character (Unicode scalar value) and by a string slice encoded as UTF-8. +* Zero-capacity strings (``N=0``) are forbidden, because zero-sized array have different representations in C++ and Rust. + Option Types """""""""""" @@ -309,7 +341,7 @@ Language Conformance Summary - Specification Status * - Primitives - ✅ Native types - - ✅ Native types + - ⚠ Native and custom types - Conforming * - Structs - ✅ ``#[repr(C)]`` @@ -327,6 +359,10 @@ Language Conformance Summary - ❌ ``Vec<T>`` - ❌ ``std::vector<T>`` - ✅ ``AbiVec<T, N>`` required + * - String + - ❌ ``String`` + - ❌ ``std::string`` + - ✅ ``AbiString<N>`` required * - Option - ❌ ``Option<T>`` - ❌ ``std::optional<T>`` diff --git a/docs/features/communication/abi_compatible_data_types/requirements.rst b/docs/features/communication/abi_compatible_data_types/requirements.rst index 52fe94cf66f..4badb4365c6 100644 --- a/docs/features/communication/abi_compatible_data_types/requirements.rst +++ b/docs/features/communication/abi_compatible_data_types/requirements.rst @@ -52,6 +52,16 @@ Restrictions on Native Types For ABI compatibility, floating-point types shall be limited to 32-bit (``f32`` in Rust / ``float`` in C++) and 64-bit (``f64`` in Rust / ``double`` in C++); all floating-point representations shall be compliant with IEEE 754. +.. feat_req:: Characters + :id: feat_req__abi_compatible_data_types__char + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__abi_compatible + :status: valid + + For ABI compatibility, the Unicode character type shall use fixed-width definitions (``char`` in Rust; wrapper around ``std::uint32_t`` in C++), and shall restrict values to the ranges ``0x0`` to ``0xD7FF`` and ``0xE000`` to ``0x10FFFF``. + .. feat_req:: Fixed-size arrays :id: feat_req__abi_compatible_data_types__arr_fix :reqtype: Functional @@ -167,6 +177,66 @@ Vector Any attempt to exceed ``AbiVec.capacity`` shall result in a checked runtime error. +String +^^^^^^ + +.. feat_req:: Provide AbiString<N> + :id: feat_req__abi_compatible_data_types__prv_abs + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__abi_compatible + :status: valid + + An ABI-compatible ``AbiString<N>`` type shall be provided in both C++ and Rust with the specified layout. + + .. code-block:: rust + + #[repr(C)] + pub struct AbiString<const N: usize> { + len: u32, + bytes: [u8; N], + } + + .. code-block:: cpp + + template<std::uint32_t N> + struct AbiString { + private: + std::uint32_t len; + std::uint8_t bytes[N]; + }; + +.. feat_req:: AbiString field semantics + :id: feat_req__abi_compatible_data_types__abs_fld + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__abi_compatible + :status: valid + + ``AbiString.len`` shall report the current byte count; ``AbiString.capacity`` shall equal the compile-time size ``N``. + +.. feat_req:: AbiString API + :id: feat_req__abi_compatible_data_types__abs_noa + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__abi_compatible + :status: valid + + The ``AbiString`` API shall mirror the applicable parts of ``std::basic_string`` / ``String``, but shall not allocate or reallocate memory. + +.. feat_req:: AbiString overflow check + :id: feat_req__abi_compatible_data_types__abs_ovf + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__abi_compatible + :status: valid + + Any attempt to exceed ``AbiString.capacity`` shall result in a checked runtime error. + Option ^^^^^^ .. TODO: Uncomment when issue with "some" in description is resolved From 6eceb4d8bd27508dfb8f7e1b0195dc3a47ddec4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Willenb=C3=BCcher?= <adrian.willenbuecher.ext@qorix.ai> Date: Tue, 11 Nov 2025 17:08:30 +0100 Subject: [PATCH 141/214] ABI CD: clarify requirements for primitive types --- .../communication/abi_compatible_data_types/index.rst | 9 ++++++++- .../abi_compatible_data_types/requirements.rst | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/features/communication/abi_compatible_data_types/index.rst b/docs/features/communication/abi_compatible_data_types/index.rst index db46f3c1324..c144aeead56 100644 --- a/docs/features/communication/abi_compatible_data_types/index.rst +++ b/docs/features/communication/abi_compatible_data_types/index.rst @@ -76,6 +76,12 @@ The following data types shall be supported: * **Primitive Types**: * Boolean + * Integer (signed and unsigned, 8/16/32/64-bit) + * Floating-point: + + * IEEE 754 binary 32/64-bit + * FP16/bfloat16 (*optional*) + * Character (Unicode scalar value) * **Sequence Types**: @@ -163,7 +169,7 @@ These types are ABI-compatible when declared using fixed-size standard types: - C++17 * - Boolean - ``bool`` - - ``bool`` (1 byte, with ``0x00`` and ``0x01`` as the only valid bit patterns) + - ``AbiBool`` (1 byte, with ``0x00`` representing ``false`` and ``0x01`` representing ``true`` as the only valid bit patterns) * - Integers (N = 8, 16, 32, 64) - ``uN``, ``iN`` - ``std::uintN_t``, ``std::intN_t`` @@ -174,6 +180,7 @@ These types are ABI-compatible when declared using fixed-size standard types: - ``char`` - ``AbiChar`` (32-bit unsigned integer, valid bit patterns ``0x0`` to ``0xD7FF`` and ``0xE000`` to ``0x10FFFF``) +* Booleans can't be represented as native ``bool`` type in C++, because the language doesn't guarantee a size of 1 byte, and it doesn't guarantee that only the values ``0x00`` and ``0x01`` will be stored in memory. * Characters can't be represented as native ``uint32_t`` type in C++ without a wrapper, because it must be guaranteed that *surrogate code points* (``0xD800`` to ``0xDFFF``) and non-code points (values above ``0x10FFFF``) won't be stored in memory. Structs and Tuples diff --git a/docs/features/communication/abi_compatible_data_types/requirements.rst b/docs/features/communication/abi_compatible_data_types/requirements.rst index 4badb4365c6..4d8e8cde433 100644 --- a/docs/features/communication/abi_compatible_data_types/requirements.rst +++ b/docs/features/communication/abi_compatible_data_types/requirements.rst @@ -30,7 +30,7 @@ Restrictions on Native Types :satisfies: stkh_req__communication__abi_compatible :status: valid - For ABI compatibility, the implementation shall restrict boolean types to one byte (``bool`` in Rust and C++). + For ABI compatibility, the implementation shall restrict boolean types to one byte (``bool`` in Rust) and to the bit patterns ``0x00`` and ``0x01``. .. feat_req:: Fixed-width integers :id: feat_req__abi_compatible_data_types__int_fix From 8a15c99b1b7c7d2c3875809f94e2822dcacc9fe1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Willenb=C3=BCcher?= <adrian.willenbuecher.ext@qorix.ai> Date: Tue, 11 Nov 2025 17:11:26 +0100 Subject: [PATCH 142/214] ABI CD: exclude zero-sized types C++ forbids zero-sized types, so any type is at least 1 byte in size. This is incompatible with Rust, where empty structs etc. really have a size of 0. --- .../communication/abi_compatible_data_types/index.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/features/communication/abi_compatible_data_types/index.rst b/docs/features/communication/abi_compatible_data_types/index.rst index c144aeead56..4975a45c601 100644 --- a/docs/features/communication/abi_compatible_data_types/index.rst +++ b/docs/features/communication/abi_compatible_data_types/index.rst @@ -196,6 +196,7 @@ Structs and tuples are supported using standard layout rules: `full specification <https://en.cppreference.com/w/cpp/language/classes.html#Standard-layout_class>`__) Field ordering must be preserved and padding must be identical across compilers. Any alignment greater than the default must be explicitly declared. +Empty structs and tuples are forbidden, because zero-sized types have different representations in C++ and Rust. Enums """"" @@ -215,7 +216,7 @@ Fixed-size arrays are naturally ABI-compatible and supported in both languages. * Rust: ``[T; N]`` * C++: wrapper around ``T[N]`` to enforce bounds-checking for element access -Element types must also conform to this specification. No dynamic length information is allowed. +Empty arrays (``N=0``) are forbidden, because zero-sized types have different representations in C++ and Rust. Vectors """""""" @@ -246,6 +247,7 @@ To provide bounded sequence types with familiar APIs, a custom vector implementa * No heap allocation is permitted. * Internally, these are ABI-compatible with ``len``, ``capacity`` and ``elements`` accessible from both languages. * The public API must match standard vector types in usability (e.g. ``push()``, ``pop()``). +* Zero-capacity vectors (``N=0``) are forbidden, because zero-sized arrays have different representations in C++ and Rust. Strings """"""" From 4c779389b7b81e7ea3fc1488b2c4fde3a090cdd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Willenb=C3=BCcher?= <adrian.willenbuecher.ext@qorix.ai> Date: Tue, 11 Nov 2025 17:14:18 +0100 Subject: [PATCH 143/214] ABI CD: fix problems in structs, enums, and AbiVec spec --- .../abi_compatible_data_types/index.rst | 22 +++++++++---------- .../requirements.rst | 8 +++---- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/docs/features/communication/abi_compatible_data_types/index.rst b/docs/features/communication/abi_compatible_data_types/index.rst index 4975a45c601..baa238d0ee1 100644 --- a/docs/features/communication/abi_compatible_data_types/index.rst +++ b/docs/features/communication/abi_compatible_data_types/index.rst @@ -160,7 +160,6 @@ Primitive Types These types are ABI-compatible when declared using fixed-size standard types: - .. list-table:: Native Type Mapping :header-rows: 1 @@ -195,18 +194,20 @@ Structs and tuples are supported using standard layout rules: (no virtual functions, no virtual inheritance, and only one class in the hierarchy has non-static data members; `full specification <https://en.cppreference.com/w/cpp/language/classes.html#Standard-layout_class>`__) +Field types must themselves be ABI compatible. Field ordering must be preserved and padding must be identical across compilers. Any alignment greater than the default must be explicitly declared. Empty structs and tuples are forbidden, because zero-sized types have different representations in C++ and Rust. Enums """"" -Only fieldless enums with a defined underlying integer type are supported. These must use: +Fieldless enums with a defined underlying integer type are supported. These must use: * ``#[repr(u8)]``, ``#[repr(u16)]``, etc. in Rust * ``enum class MyEnum : std::uint8_t`` in C++ -*Note:* Enums with payloads ("variants" or "tagged unions") are optionally supported. +Each entry in an enum must have well-defined representation. +Enums with payloads ("variants" or "tagged unions") are optionally supported. Arrays """""" @@ -216,36 +217,35 @@ Fixed-size arrays are naturally ABI-compatible and supported in both languages. * Rust: ``[T; N]`` * C++: wrapper around ``T[N]`` to enforce bounds-checking for element access +Element types must themselves be ABI compatible. No dynamic length information is allowed. Empty arrays (``N=0``) are forbidden, because zero-sized types have different representations in C++ and Rust. Vectors -"""""""" +""""""" To provide bounded sequence types with familiar APIs, a custom vector implementation must be provided in both languages that matches the memory layout defined below. .. code-block:: rust #[repr(C)] - pub struct AbiVec<T> { + pub struct AbiVec<T, const N: usize> { len: u32, - capacity: u32, elements: [T; N], } .. code-block:: cpp - template<typename T, std::size_t N> + template<typename T, std::uint32_t N> struct AbiVec { private: std::uint32_t len; - std::uint32_t capacity; T elements[N]; }; -* Capacity is fixed and equal to ``N`` at compile time. +* Capacity is fixed and equal to ``N`` elements at compile time. * Overflow beyond capacity must be a checked error. * No heap allocation is permitted. -* Internally, these are ABI-compatible with ``len``, ``capacity`` and ``elements`` accessible from both languages. +* Internally, these are ABI-compatible with ``len`` and ``elements`` accessible from both languages. * The public API must match standard vector types in usability (e.g. ``push()``, ``pop()``). * Zero-capacity vectors (``N=0``) are forbidden, because zero-sized arrays have different representations in C++ and Rust. @@ -362,7 +362,7 @@ Language Conformance Summary - Conforming * - Arrays - ✅ ``[T; N]`` - - ✅ ``T[N]`` + - ✅ ``std::array<T, N>`` - Conforming * - Vector - ❌ ``Vec<T>`` diff --git a/docs/features/communication/abi_compatible_data_types/requirements.rst b/docs/features/communication/abi_compatible_data_types/requirements.rst index 4d8e8cde433..d286f6feeed 100644 --- a/docs/features/communication/abi_compatible_data_types/requirements.rst +++ b/docs/features/communication/abi_compatible_data_types/requirements.rst @@ -131,19 +131,17 @@ Vector .. code-block:: rust #[repr(C)] - pub struct AbiVec<T> { + pub struct AbiVec<T, const N: usize> { len: u32, - capacity: u32, elements: [T; N], } .. code-block:: cpp - template<typename T, std::size_t N> + template<typename T, std::uint32_t N> struct AbiVec { private: std::uint32_t len; - std::uint32_t capacity; T elements[N]; }; @@ -165,7 +163,7 @@ Vector :satisfies: stkh_req__communication__abi_compatible :status: valid - The ``AbiVec`` API shall mirror ``std::vector`` / ``Vec<T>`` but shall not allocate or reallocate memory. + The ``AbiVec`` API shall mirror ``std::vector`` / ``Vec<T>``, but shall not allocate or reallocate memory. .. feat_req:: AbiVec overflow check :id: feat_req__abi_compatible_data_types__abv_ovf From 9e4897a6a88cf5882d253dfcb4d9fc34662b0e79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Willenb=C3=BCcher?= <adrian.willenbuecher.ext@qorix.ai> Date: Tue, 11 Nov 2025 17:17:27 +0100 Subject: [PATCH 144/214] ABI CD: improve AbiOption and AbiResult spec --- .../abi_compatible_data_types/index.rst | 20 ++--- .../requirements.rst | 75 +++++++++---------- 2 files changed, 47 insertions(+), 48 deletions(-) diff --git a/docs/features/communication/abi_compatible_data_types/index.rst b/docs/features/communication/abi_compatible_data_types/index.rst index baa238d0ee1..3f658d3aa2c 100644 --- a/docs/features/communication/abi_compatible_data_types/index.rst +++ b/docs/features/communication/abi_compatible_data_types/index.rst @@ -286,7 +286,7 @@ ABI-compatible optional types must be implemented manually using a one-byte tag #[repr(C)] pub struct AbiOption<T> { - is_some: u8, + is_some: bool, value: T, } @@ -295,13 +295,13 @@ ABI-compatible optional types must be implemented manually using a one-byte tag template<typename T> struct AbiOption { private: - std::uint8_t is_some; + AbiBool is_some; T value; }; -* ``is_some == 0`` indicates absence; ``1`` indicates presence. +* ``is_some == false`` indicates absence; ``true`` indicates presence. * The value field is always initialized and occupies memory regardless of state. -* The public API must match standard optional types in usability. +* The public API should match standard optional types in usability, as far as possible. Result Types """""""""""" @@ -312,14 +312,14 @@ Result types represent tagged unions with two possible states. #[repr(C)] pub struct AbiResult<T, E> { - is_ok: u8, + is_err: bool, value: AbiResultUnion<T, E>, } #[repr(C)] union AbiResultUnion<T, E> { - ok: T, - err: E, + ok: ManuallyDrop<T>, + err: ManuallyDrop<E>, } .. code-block:: cpp @@ -327,15 +327,15 @@ Result types represent tagged unions with two possible states. template<typename T, typename E> struct AbiResult { private: - std::uint8_t is_ok; + AbiBool is_err; union { T ok; E err; } value; }; -* ``is_ok == 1`` indicates ``ok`` field is valid -* ``is_ok == 0`` indicates ``err`` field is valid +* ``is_err == false`` indicates ``ok`` field is valid +* ``is_err == true`` indicates ``err`` field is valid * The layout must guarantee correct union member interpretation based on the discriminant Language Conformance Summary diff --git a/docs/features/communication/abi_compatible_data_types/requirements.rst b/docs/features/communication/abi_compatible_data_types/requirements.rst index d286f6feeed..f416f1eba32 100644 --- a/docs/features/communication/abi_compatible_data_types/requirements.rst +++ b/docs/features/communication/abi_compatible_data_types/requirements.rst @@ -237,44 +237,43 @@ String Option ^^^^^^ -.. TODO: Uncomment when issue with "some" in description is resolved -.. .. feat_req:: Provide AbiOption<T> -.. :id: feat_req__abi_compatible_data_types__prv_abo -.. :reqtype: Functional -.. :security: NO -.. :safety: QM -.. :satisfies: stkh_req__communication__abi_compatible -.. :status: valid +.. feat_req:: Provide AbiOption<T> + :id: feat_req__abi_compatible_data_types__prv_abo + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__abi_compatible + :status: valid -.. An ABI-compatible ``AbiOption<T>`` type shall be provided in both C++ and Rust with the specified layout. + An ABI-compatible ``AbiOption<T>`` type shall be provided in both C++ and Rust with the specified layout. -.. .. code-block:: rust + .. code-block:: rust -.. #[repr(C)] -.. pub struct AbiOption<T> { -.. is_some: u8, -.. value: T, -.. } + #[repr(C)] + pub struct AbiOption<T> { + is_some: bool, + value: T, + } -.. .. code-block:: cpp + .. code-block:: cpp -.. template<typename T> -.. struct AbiOption { -.. private: -.. std::uint8_t is_some; -.. T value; -.. }; + template<typename T> + struct AbiOption { + private: + AbiBool is_some; + T value; + }; -.. .. feat_req:: AbiOption is_some flag -.. :id: feat_req__abi_compatible_data_types__abo_flg -.. :reqtype: Functional -.. :security: NO -.. :safety: QM -.. :satisfies: stkh_req__communication__abi_compatible -.. :status: valid +.. feat_req:: AbiOption is_some flag + :id: feat_req__abi_compatible_data_types__abo_flg + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__abi_compatible + :status: valid -.. ``AbiOption.is_some`` shall be ``0`` when empty and ``1`` when containing a value. + ``AbiOption.is_some`` shall be ``false`` when empty and ``true`` when containing a value. .. feat_req:: AbiOption API :id: feat_req__abi_compatible_data_types__abo_api @@ -284,7 +283,7 @@ Option :satisfies: stkh_req__communication__abi_compatible :status: valid - The ``AbiOption`` API shall mirror ``std::optional``/``Option<T>`` without introducing extra fields or indirections. + The ``AbiOption`` API shall mirror ``std::optional`` / ``Option<T>`` without introducing extra fields or indirections. Result ^^^^^^ @@ -303,14 +302,14 @@ Result #[repr(C)] pub struct AbiResult<T, E> { - is_ok: u8, + is_err: bool, value: AbiResultUnion<T, E>, } #[repr(C)] union AbiResultUnion<T, E> { - ok: T, - err: E, + ok: ManuallyDrop<T>, + err: ManuallyDrop<E>, } .. code-block:: cpp @@ -318,14 +317,14 @@ Result template<typename T, typename E> struct AbiResult { private: - std::uint8_t is_ok; + AbiBool is_err; union { T ok; E err; } value; }; -.. feat_req:: AbiResult is_ok flag +.. feat_req:: AbiResult is_err flag :id: feat_req__abi_compatible_data_types__ari_flg :reqtype: Functional :security: NO @@ -333,7 +332,7 @@ Result :satisfies: stkh_req__communication__abi_compatible :status: valid - ``AbiResult.is_ok`` shall be ``1`` if ``value.ok`` is valid, and ``0`` if ``value.err`` is valid. + ``AbiResult.is_err`` shall be ``false`` if ``value.ok`` is valid, and ``true`` if ``value.err`` is valid. .. feat_req:: AbiResult API :id: feat_req__abi_compatible_data_types__ari_api @@ -343,4 +342,4 @@ Result :satisfies: stkh_req__communication__abi_compatible :status: valid - The ``AbiResult`` API shall mirror ``std::expected``/``Result<T, E>`` without hidden storage or pointers. + The ``AbiResult`` API shall mirror ``std::expected`` / ``Result<T, E>`` without hidden storage or pointers. From b1586b335d108277f27d1301caff380c05d30e33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Willenb=C3=BCcher?= <adrian.willenbuecher.ext@qorix.ai> Date: Wed, 12 Nov 2025 15:47:28 +0100 Subject: [PATCH 145/214] ABI CD: minor clarifications --- .../abi_compatible_data_types/index.rst | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/docs/features/communication/abi_compatible_data_types/index.rst b/docs/features/communication/abi_compatible_data_types/index.rst index 3f658d3aa2c..63512ee510f 100644 --- a/docs/features/communication/abi_compatible_data_types/index.rst +++ b/docs/features/communication/abi_compatible_data_types/index.rst @@ -43,9 +43,9 @@ To activate this feature, use the following feature flag: Abstract ======== -This feature request defines a set of ABI-compatible data types and a runtime type description format to support zero-copy inter-process communication between C++17 and Rust 1.8x processes using the same endianness. It ensures consistent type layouts across languages by requiring fixed-size, statically allocated types without absolute pointers or language-specific metadata. +This feature request defines a set of ABI-compatible data types and a runtime type description format to support zero-copy inter-process communication between C++17 and Rust 1.88 processes using the same endianness. It ensures consistent type layouts across languages by requiring fixed-size, statically allocated types without absolute pointers or language-specific metadata. -The specification covers primitive types, structs, enums, arrays, and introduces ABI-stable representations for vectors, options, and results. A runtime-readable type description enables processes to interpret shared memory without compile-time access to type definitions. +The specification covers primitive types, structs, enums, arrays, and introduces ABI-stable representations for vectors, strings, options, and results. An optional runtime-readable type description enables processes to interpret shared memory without compile-time access to type definitions. Motivation @@ -53,7 +53,7 @@ Motivation This feature request addresses specific challenges in achieving type compatibility within our inter-process communication (IPC) framework that leverages zero-copy shared memory mechanisms. Two essential scenarios are under evaluation: -1. **ABI Compatibility**: Processes implemented in different programming languages (C++17 and Rust 1.8x) must interpret a shared memory location consistently as the same native type, provided both have compile-time access to the type definition. This scenario eliminates serialization overhead and allows direct memory access. +1. **ABI Compatibility**: Processes implemented in different programming languages (C++17 and Rust 1.88) must interpret a shared memory location consistently as the same native type, provided both have compile-time access to the type definition. This scenario eliminates serialization overhead and allows direct memory access. 2. **Type Description**: It should be possible to record arbitrary data streams, and convert or analyze them at a later time and/or on a different system, without having to recompile the conversion or analysis tools for that particular data format. A machine-readable description of the format, including any user-defined data types, should be available on request during runtime. In addition, this description could potentially be used by gateway processes to perform relatively simple but generic transformations between different data representations. @@ -61,7 +61,7 @@ This feature request addresses specific challenges in achieving type compatibili ABI Compatibility ----------------- -Our communication feature relies on shared memory to transfer data between processes. For effective zero-copy data exchange, processes written in C++17 and Rust 1.8x must inherently understand the data at shared memory locations identically. Achieving this requires ensuring that data types have consistent, fixed-size memory layouts. +Our communication feature relies on shared memory to transfer data between processes. For effective zero-copy data exchange, processes written in C++17 and Rust 1.88 must inherently understand the data at shared memory locations identically. Achieving this requires ensuring that data types have consistent, fixed-size memory layouts. This evaluation initially targets the following process configurations: @@ -69,6 +69,7 @@ This evaluation initially targets the following process configurations: * Processes running on different operating systems but under the same hypervisor. Supporting different endianness between processes is explicitly out of scope, as it inherently demands bit manipulation, effectively requiring serialization. +A mechanism to ensure that sender and receiver use the same endianness is out of scope as well. Different bit widths, however, are implicitly supported by specifying the width of all types and excluding word-size integers. The following data types shall be supported: @@ -116,6 +117,9 @@ Type Description A critical scalability feature involves gateway processes, which subscribe to IPC endpoints and translate ABI-compatible data types into external serialization formats. These gateways require the ability to interpret data without compile-time access to type definitions. To address this, an explicit runtime-readable type description format is necessary. This description allows dynamic, runtime interpretation of data structures, enabling the addition of new IPC topics without recompiling gateway processes. +Summary +------- + In summary, the motivation behind this feature request is to define and standardize ABI-compatible data types and a runtime-accessible type description mechanism to ensure interoperability and scalability in zero-copy IPC scenarios involving multiple languages and dynamic environments. @@ -129,7 +133,7 @@ Specification ABI Compatibility ----------------- -This specification defines the set of rules and constraints for representing data types in shared memory such that they can be interpreted consistently across processes implemented in C++17 and Rust 1.8x. These types enable zero-copy inter-process communication by enforcing ABI compatibility at the memory layout level. The focus is on data exchange between processes using the same endianness. +This specification defines the set of rules and constraints for representing data types in shared memory such that they can be interpreted consistently across processes implemented in C++17 and Rust 1.88. These types enable zero-copy inter-process communication by enforcing ABI compatibility at the memory layout level. The focus is on data exchange between processes using the same endianness. Assumptions ^^^^^^^^^^^ From 78bc939e99a04d3cee4080b6d19d3dfb1c444f56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Willenb=C3=BCcher?= <adrian.willenbuecher.ext@qorix.ai> Date: Thu, 13 Nov 2025 09:01:34 +0100 Subject: [PATCH 146/214] ABI CD: distinguish between type descriptions and structure metadata --- .../abi_compatible_data_types/index.rst | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/docs/features/communication/abi_compatible_data_types/index.rst b/docs/features/communication/abi_compatible_data_types/index.rst index 63512ee510f..c5992d11822 100644 --- a/docs/features/communication/abi_compatible_data_types/index.rst +++ b/docs/features/communication/abi_compatible_data_types/index.rst @@ -43,9 +43,9 @@ To activate this feature, use the following feature flag: Abstract ======== -This feature request defines a set of ABI-compatible data types and a runtime type description format to support zero-copy inter-process communication between C++17 and Rust 1.88 processes using the same endianness. It ensures consistent type layouts across languages by requiring fixed-size, statically allocated types without absolute pointers or language-specific metadata. +This feature request defines a set of ABI-compatible data types and a runtime type metadata format to support zero-copy inter-process communication between C++17 and Rust 1.88 processes using the same endianness. It ensures consistent type layouts across languages by requiring fixed-size, statically allocated types without absolute pointers or language-specific metadata. -The specification covers primitive types, structs, enums, arrays, and introduces ABI-stable representations for vectors, strings, options, and results. An optional runtime-readable type description enables processes to interpret shared memory without compile-time access to type definitions. +The specification covers primitive types, structs, enums, arrays, and introduces ABI-stable representations for vectors, strings, options, and results. An optional runtime-readable type structure metadata enables processes to interpret shared memory without compile-time access to type definitions. Motivation @@ -55,7 +55,7 @@ This feature request addresses specific challenges in achieving type compatibili 1. **ABI Compatibility**: Processes implemented in different programming languages (C++17 and Rust 1.88) must interpret a shared memory location consistently as the same native type, provided both have compile-time access to the type definition. This scenario eliminates serialization overhead and allows direct memory access. -2. **Type Description**: It should be possible to record arbitrary data streams, and convert or analyze them at a later time and/or on a different system, without having to recompile the conversion or analysis tools for that particular data format. A machine-readable description of the format, including any user-defined data types, should be available on request during runtime. In addition, this description could potentially be used by gateway processes to perform relatively simple but generic transformations between different data representations. +2. **Type Structure Metadata**: It should be possible to record arbitrary data streams, and convert or analyze them at a later time and/or on a different system, without having to recompile the conversion or analysis tools for that particular data format. A machine-readable description of the format, including any user-defined data types, should be available on request during runtime. In addition, this structure description could potentially be used by gateway processes to perform relatively simple but generic transformations between different data representations. ABI Compatibility @@ -390,14 +390,7 @@ Language Conformance Summary Type Description ---------------- -To address the scenarios outlined in the motivation, a clearly defined type description mechanism is required. The type description provides sufficient information during runtime, enabling a process without compile-time access to type definitions to correctly interpret a given memory location according to the previously established ABI rules. - -The goals are: - -* Enable interpretation of shared memory content without compile-time access to type definitions. -* Support all ABI-compatible data types previously defined. -* Include versioning to manage schema evolution and compatibility. -* Allow easy generation and parsing by tooling in both C++ and Rust. +To address the scenarios outlined in the motivation, a clearly defined type description mechanism is required. Workflows ^^^^^^^^^ @@ -410,10 +403,11 @@ Two potential workflows are considered for creating type descriptions: Both workflows are valid, and the final decision is deferred pending further feasibility analysis. -Type Description Format +Type Structure Metadata ^^^^^^^^^^^^^^^^^^^^^^^ -The format of the type description shall explicitly support versioning to allow schema evolution and backward compatibility. It must accommodate all data types described earlier in the ABI compatibility section. It should be simple, human-readable, and easily machine-parsable. +Precise information about the structure of the types is preserved for use during runtime, enabling a process without compile-time access to type definitions to correctly interpret a given memory location according to the previously established ABI rules. +The format of the type metadata shall explicitly support versioning to allow schema evolution and backward compatibility. It must accommodate all data types described earlier in the ABI compatibility section. It should be simple, human-readable, and easily machine-parsable. The choice of serialization format is left open but may include RON, JSON5, or a custom DSL, based on readability, tooling support, and maintainability. @@ -459,7 +453,7 @@ Reflection Reflection, in this context, is the ability to inspect data at runtime even if its structure is not or not fully known at compile time. Benefits of reflection include being able to translate recorded data into a human-readable format (e.g., JSON or CSV) without having to know the type definitions at compile time; this enables general-purpose data recording and transformation tools. -This ability requires some form of *type description* being available at runtime, so that a sequence of bytes can be interpreted as a data structure. +This ability requires some form of *type structure metadata* being available at runtime, so that a sequence of bytes can be interpreted as a data structure. There are two primary approaches to achieve this goal: * *inline type descriptions*, which precede each instance of every type, and @@ -480,10 +474,10 @@ This approach, however, comes with significant downsides: Alternative Approach ^^^^^^^^^^^^^^^^^^^^ -Instead of inserting inline type descriptions into each instance of an ABI compatible type, the full type description can be made available to a consumer only once, either proactively or on request. +Instead of inserting inline type descriptions into each instance of an ABI compatible type, the full type structure metadata can be made available to a consumer only once, either proactively or on request. The consumer decides if it uses or ignores this metadata. -This type description can be used to dynamically translate between the compact, non-reflective ABI compatible data structures on one side, and a reflective, inline-describing format on the other side. +This description of the type structure can be used to dynamically translate between the compact, non-reflective ABI compatible data structures on one side, and a reflective, inline-describing format on the other side. Although this incurs a copy and some minor processing, the overhead should be negligible compared to other computational tasks involving the payload. One method to efficiently translate a payload consisting of ABI compatible types to an inline-described reflective format is to convert the hierarchical type description to a flat list of *instructions* which can be executed by an interpreter. @@ -525,7 +519,7 @@ Reflection will not be part of version 1.0 of this feature request. 3. The specification for SOME/IP types is incompatible with the requirement of ABI vectors that can grow dynamically during construction, i.e., vectors which contain fewer valid elements than they take up space in memory. 4. Inserting inline type descriptions on demand is expected to be a relatively cheap operation, which negates the main motivation for including them directly in ABI types in the first place. -* External type descriptions will probably be included in a later version of this feature request. +* External type structure descriptions will probably be included in a later version of this feature request. For now, they're postponed until we have a better understanding of the relevant use cases. From 88e6fe77d42ecf7c09da05985c487f004d834983 Mon Sep 17 00:00:00 2001 From: "jhr2hi@bosch.com" <roland.jentsch@etas.com> Date: Mon, 19 Jan 2026 07:37:10 +0000 Subject: [PATCH 147/214] improvement switch to new docs as code --- MODULE.bazel | 4 +-- .../lifecycle/architecture/launch_manager.rst | 2 +- docs/features/lifecycle/index.rst | 4 +-- docs/modules/lifecycle/index.rst | 28 +++++++++++++++---- 4 files changed, 28 insertions(+), 10 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 04f3f5ed8f8..10469c3817d 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -73,5 +73,5 @@ bazel_dep(name = "rules_java", version = "8.15.1") # ############################################################################### bazel_dep(name = "score_tooling", version = "1.0.4") -bazel_dep(name = "score_docs_as_code", version = "2.3.0") -bazel_dep(name = "score_process", version = "1.4.1") +bazel_dep(name = "score_docs_as_code", version = "2.3.2") +bazel_dep(name = "score_process", version = "1.4.2") diff --git a/docs/features/lifecycle/architecture/launch_manager.rst b/docs/features/lifecycle/architecture/launch_manager.rst index 4c29c258d78..2976846c4db 100644 --- a/docs/features/lifecycle/architecture/launch_manager.rst +++ b/docs/features/lifecycle/architecture/launch_manager.rst @@ -42,7 +42,7 @@ E.g. the configuration below consists of three :term:`Run Targets <Run Target>` :scale: 50 :align: center -The :need:`comp_arc_sta__lifecycle__launch_manager` implements the following interfaces,for the selection of :term:`Run Target` s, starting and stopping of components and monitoring of the processes. +The :need:`comp__lifecycle_launch_manager` implements the following interfaces,for the selection of :term:`Run Target` s, starting and stopping of components and monitoring of the processes. Switching between Run Targets ----------------------------- diff --git a/docs/features/lifecycle/index.rst b/docs/features/lifecycle/index.rst index 0c24127603a..2bc7ee8f7d9 100644 --- a/docs/features/lifecycle/index.rst +++ b/docs/features/lifecycle/index.rst @@ -108,7 +108,7 @@ Specification .. mod_view_sta:: Feature architecture :id: mod_view_sta__lifecycle__overview - :includes: comp_arc_sta__lifecycle__launch_manager, comp_arc_sta__lifecycle__healthmonitor + :includes: comp__lifecycle_launch_manager, comp__lifecycle_healthmonitor .. needarch:: :scale: 50 @@ -122,7 +122,7 @@ Specification LifecycleApplication --> logic_arc_int__lifecycle__deadline_monitor_if :use LifecycleApplication --> posix_signals : implements NativeApplication --> posix_signals : implements - comp_arc_sta__lifecycle__launch_manager --> posix_signals : use + comp__lifecycle_launch_manager --> posix_signals : use The overall functionality of the feature can be split into 2 subfeatures, which are diff --git a/docs/modules/lifecycle/index.rst b/docs/modules/lifecycle/index.rst index 7f6078aafd8..0729cd8f267 100644 --- a/docs/modules/lifecycle/index.rst +++ b/docs/modules/lifecycle/index.rst @@ -18,7 +18,7 @@ Lifecycle .. mod_view_sta:: Lifecycle :id: mod_view_sta__lifecycle__modules - :includes: comp_arc_sta__lifecycle__launch_manager, comp_arc_sta__lifecycle__healthmonitor + :includes: comp__lifecycle_launch_manager, comp__lifecycle_healthmonitor .. needarch:: :scale: 50 @@ -26,8 +26,8 @@ Lifecycle {{ draw_module(need(), needs) }} -.. comp_arc_sta:: Launch Manager - :id: comp_arc_sta__lifecycle__launch_manager +.. comp:: Launch Manager + :id: comp__lifecycle_launch_manager :status: valid :safety: ASIL_B :implements: logic_arc_int__lifecycle__controlif, logic_arc_int__lifecycle__alive_if @@ -36,14 +36,23 @@ Lifecycle :includes: :fulfils: + +.. comp_arc_sta:: Launch Manager Static View + :id: comp_arc_sta__lifecycle__launch_manager + :status: valid + :safety: ASIL_B + :security: NO + :includes: logic_arc_int__lifecycle__controlif, logic_arc_int__lifecycle__alive_if + :fulfils: + .. needarch:: :scale: 50 :align: center {{ draw_component(need(), needs) }} -.. comp_arc_sta:: Health Monitor - :id: comp_arc_sta__lifecycle__healthmonitor +.. comp:: Health Monitor + :id: comp__lifecycle_healthmonitor :status: valid :safety: ASIL_B :implements: logic_arc_int__lifecycle__deadline_monitor_if,logic_arc_int__lifecycle__logical_monitor_if @@ -52,6 +61,15 @@ Lifecycle :includes: :fulfils: +.. comp_arc_sta:: Health Monitor Static View + :id: comp_arc_sta__lifecycle__healthmonitor + :status: valid + :safety: ASIL_B + :uses: logic_arc_int__lifecycle__alive_if + :security: NO + :includes: logic_arc_int__lifecycle__deadline_monitor_if,logic_arc_int__lifecycle__logical_monitor_if + :fulfils: + .. needarch:: :scale: 50 :align: center From 70bbb137e3d236b5a967433f9a94459e38221512 Mon Sep 17 00:00:00 2001 From: "jhr2hi@bosch.com" <roland.jentsch@etas.com> Date: Mon, 19 Jan 2026 11:09:58 +0000 Subject: [PATCH 148/214] increase version --- MODULE.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MODULE.bazel b/MODULE.bazel index 10469c3817d..42443a3a221 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -73,5 +73,5 @@ bazel_dep(name = "rules_java", version = "8.15.1") # ############################################################################### bazel_dep(name = "score_tooling", version = "1.0.4") -bazel_dep(name = "score_docs_as_code", version = "2.3.2") +bazel_dep(name = "score_docs_as_code", version = "2.3.3") bazel_dep(name = "score_process", version = "1.4.2") From 9e89eb60f32f3cc8b3778b1cddcd5019d57e4942 Mon Sep 17 00:00:00 2001 From: "jhr2hi@bosch.com" <roland.jentsch@etas.com> Date: Mon, 19 Jan 2026 11:11:54 +0000 Subject: [PATCH 149/214] fix review findings --- docs/modules/lifecycle/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/modules/lifecycle/index.rst b/docs/modules/lifecycle/index.rst index 0729cd8f267..187b8e62dd9 100644 --- a/docs/modules/lifecycle/index.rst +++ b/docs/modules/lifecycle/index.rst @@ -55,20 +55,20 @@ Lifecycle :id: comp__lifecycle_healthmonitor :status: valid :safety: ASIL_B + :security: YES :implements: logic_arc_int__lifecycle__deadline_monitor_if,logic_arc_int__lifecycle__logical_monitor_if :uses: logic_arc_int__lifecycle__alive_if :security: NO :includes: - :fulfils: .. comp_arc_sta:: Health Monitor Static View :id: comp_arc_sta__lifecycle__healthmonitor :status: valid :safety: ASIL_B + :security: YES :uses: logic_arc_int__lifecycle__alive_if :security: NO :includes: logic_arc_int__lifecycle__deadline_monitor_if,logic_arc_int__lifecycle__logical_monitor_if - :fulfils: .. needarch:: :scale: 50 From 070f65e79ffbf9c567db9c78ac2bcef303af9eec Mon Sep 17 00:00:00 2001 From: "jhr2hi@bosch.com" <roland.jentsch@etas.com> Date: Mon, 19 Jan 2026 11:13:34 +0000 Subject: [PATCH 150/214] fix review findings --- docs/modules/lifecycle/index.rst | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/modules/lifecycle/index.rst b/docs/modules/lifecycle/index.rst index 187b8e62dd9..239914a14a1 100644 --- a/docs/modules/lifecycle/index.rst +++ b/docs/modules/lifecycle/index.rst @@ -33,8 +33,6 @@ Lifecycle :implements: logic_arc_int__lifecycle__controlif, logic_arc_int__lifecycle__alive_if :uses: logic_arc_int__logging__logging, logic_arc_int__baselibs__json, logic_arc_int__os__fork, logic_arc_int__lifecycle__lifecycle_if :security: NO - :includes: - :fulfils: .. comp_arc_sta:: Launch Manager Static View @@ -43,7 +41,6 @@ Lifecycle :safety: ASIL_B :security: NO :includes: logic_arc_int__lifecycle__controlif, logic_arc_int__lifecycle__alive_if - :fulfils: .. needarch:: :scale: 50 @@ -59,7 +56,6 @@ Lifecycle :implements: logic_arc_int__lifecycle__deadline_monitor_if,logic_arc_int__lifecycle__logical_monitor_if :uses: logic_arc_int__lifecycle__alive_if :security: NO - :includes: .. comp_arc_sta:: Health Monitor Static View :id: comp_arc_sta__lifecycle__healthmonitor From 49a0e69089298db3c2d01dd1fb540f895e6e1d65 Mon Sep 17 00:00:00 2001 From: "jhr2hi@bosch.com" <roland.jentsch@etas.com> Date: Mon, 19 Jan 2026 11:22:43 +0000 Subject: [PATCH 151/214] fix build error --- docs/features/lifecycle/architecture/launch_manager.rst | 4 +--- docs/modules/lifecycle/index.rst | 2 -- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/docs/features/lifecycle/architecture/launch_manager.rst b/docs/features/lifecycle/architecture/launch_manager.rst index 2976846c4db..1db2ea0dac7 100644 --- a/docs/features/lifecycle/architecture/launch_manager.rst +++ b/docs/features/lifecycle/architecture/launch_manager.rst @@ -117,11 +117,10 @@ This unified approach allows external state managers to request any run target a .. feat_arc_dyn:: Control interface dynamic architecture activate run target :id: feat_arc_dyn__lifecycle__control_if_activate - :security: YES :status: valid :safety: ASIL_B + :security: YES :fulfils: feat_req__lifecycle__control_commands, feat_req__lifecycle__request_run_target_start, feat_req__lifecycle__switch_run_targets - :includes: .. uml:: _assets/control_interface_start_sequence.puml :scale: 50 @@ -250,7 +249,6 @@ Dynamic Architecture :status: valid :safety: ASIL_B :fulfils: feat_req__lifecycle__control_commands, feat_req__lifecycle__request_run_target_start, feat_req__lifecycle__switch_run_targets - :includes: .. uml:: _assets/lifecycle_state_machine.puml :scale: 50 diff --git a/docs/modules/lifecycle/index.rst b/docs/modules/lifecycle/index.rst index 239914a14a1..57e0834f817 100644 --- a/docs/modules/lifecycle/index.rst +++ b/docs/modules/lifecycle/index.rst @@ -55,7 +55,6 @@ Lifecycle :security: YES :implements: logic_arc_int__lifecycle__deadline_monitor_if,logic_arc_int__lifecycle__logical_monitor_if :uses: logic_arc_int__lifecycle__alive_if - :security: NO .. comp_arc_sta:: Health Monitor Static View :id: comp_arc_sta__lifecycle__healthmonitor @@ -63,7 +62,6 @@ Lifecycle :safety: ASIL_B :security: YES :uses: logic_arc_int__lifecycle__alive_if - :security: NO :includes: logic_arc_int__lifecycle__deadline_monitor_if,logic_arc_int__lifecycle__logical_monitor_if .. needarch:: From 6af3c50ead9afa982d12eb54c2782935d16fc063 Mon Sep 17 00:00:00 2001 From: "jhr2hi@bosch.com" <roland.jentsch@etas.com> Date: Mon, 19 Jan 2026 11:25:05 +0000 Subject: [PATCH 152/214] hold old value --- docs/modules/lifecycle/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/modules/lifecycle/index.rst b/docs/modules/lifecycle/index.rst index 57e0834f817..81690be4c74 100644 --- a/docs/modules/lifecycle/index.rst +++ b/docs/modules/lifecycle/index.rst @@ -52,7 +52,7 @@ Lifecycle :id: comp__lifecycle_healthmonitor :status: valid :safety: ASIL_B - :security: YES + :security: NO :implements: logic_arc_int__lifecycle__deadline_monitor_if,logic_arc_int__lifecycle__logical_monitor_if :uses: logic_arc_int__lifecycle__alive_if @@ -60,7 +60,7 @@ Lifecycle :id: comp_arc_sta__lifecycle__healthmonitor :status: valid :safety: ASIL_B - :security: YES + :security: NO :uses: logic_arc_int__lifecycle__alive_if :includes: logic_arc_int__lifecycle__deadline_monitor_if,logic_arc_int__lifecycle__logical_monitor_if From 0a6877bbbe238c4fbe44a69ac981434df832ea76 Mon Sep 17 00:00:00 2001 From: "jhr2hi@bosch.com" <roland.jentsch@etas.com> Date: Tue, 20 Jan 2026 15:44:57 +0000 Subject: [PATCH 153/214] remove includes --- docs/modules/lifecycle/index.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/modules/lifecycle/index.rst b/docs/modules/lifecycle/index.rst index 81690be4c74..dbc68671139 100644 --- a/docs/modules/lifecycle/index.rst +++ b/docs/modules/lifecycle/index.rst @@ -40,7 +40,6 @@ Lifecycle :status: valid :safety: ASIL_B :security: NO - :includes: logic_arc_int__lifecycle__controlif, logic_arc_int__lifecycle__alive_if .. needarch:: :scale: 50 @@ -62,7 +61,6 @@ Lifecycle :safety: ASIL_B :security: NO :uses: logic_arc_int__lifecycle__alive_if - :includes: logic_arc_int__lifecycle__deadline_monitor_if,logic_arc_int__lifecycle__logical_monitor_if .. needarch:: :scale: 50 From 6087595a6a4c0f5ddbfe958e81ddafdf1adecaf9 Mon Sep 17 00:00:00 2001 From: "markus.schu" <markus.schu@accenture.com> Date: Thu, 22 Jan 2026 11:57:16 +0100 Subject: [PATCH 154/214] start election of platform quality managers --- docs/platform_management_plan/index.rst | 1 + .../platform_quality_manager.rst | 78 +++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 docs/platform_management_plan/role_assignment/platform_quality_manager.rst diff --git a/docs/platform_management_plan/index.rst b/docs/platform_management_plan/index.rst index fcd68149ebe..dda6b426434 100644 --- a/docs/platform_management_plan/index.rst +++ b/docs/platform_management_plan/index.rst @@ -48,3 +48,4 @@ Platform Management Plan role_assignment/platform_safety_engineer role_assignment/platform_safety_manager + role_assignment/platform_quality_manager diff --git a/docs/platform_management_plan/role_assignment/platform_quality_manager.rst b/docs/platform_management_plan/role_assignment/platform_quality_manager.rst new file mode 100644 index 00000000000..10254ac3110 --- /dev/null +++ b/docs/platform_management_plan/role_assignment/platform_quality_manager.rst @@ -0,0 +1,78 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +Platform Quality Manager Election +********************************* + +.. document:: Platform Quality Manager + :id: doc__platform_quality_manager + :status: valid + :safety: ASIL_B + :security: YES + :realizes: wp__qms_plan + +Elected Committer(s) +==================== + +For the platform quality management a pool of quality managers is elected due to complexity of the task: + +`Markus Schu <https://github.com/masc2023>`_ + + +Election Reasoning +================== + +For the role :need:`rl__quality_manager` the required skills, knowledge and experience is defined in :need:`rl__quality_manager`. + +The evidences are not published openly due to personal data confidentiality, but will be checked in a dedicated review meeting +and confirmed by the first reviewer of this document's pull requests. + + +Evidences Markus Schu +--------------------- + +Experiences as Quality Manager and Project Manager: + +- Process Manager/Architect for Standard Processes and integrated QMS from 2022 to today +- Participating as Provisional ASPICE Assessor in project assessments from 2022 to today + + +Experiences for Safety and Security Management can be found here: +:need:`doc__platform_safety_manager` and :need:`doc__platform_safety_engineer`. + + +Education and Skills: + +- `Universities degrees <https://www.linkedin.com/in/markus-schu-7a689b5/details/education/>`_ +- `Certifications (ASPICE, Product Safety, Cybersecurity) <https://www.linkedin.com/in/markus-schu-7a689b5/details/certifications/>`_ +- ASPICE Provisional Assessor Training, Further trainings within Gate4Spice community `Gate4SPICE <https://intacs.info/gate4spice>`_ + +S-CORE Commits: + +- major committer in `process_description repository <https://github.com/eclipse-score/process_description>`_ +- major committer in `score repository <https://github.com/eclipse-score/score>`_ + + +Election +======== + +For the election further Committers with similar skills are asked for approval: + +- `<https://github.com/PandaeDo>`_ +- `<https://github.com/pahmann>`_ + + +The election is performed by approving the pull request of this document. +The nominee is elected if more than half of the above committers in the list approved and nobody "request changes". +Nominees are not allowed to vote for themselves. From c848af2e9eb18109496b65c8309a2e43cb7c77d0 Mon Sep 17 00:00:00 2001 From: aschemmel-git <alexander.schemmel@bmw.de> Date: Thu, 22 Jan 2026 13:13:37 +0100 Subject: [PATCH 155/214] Comp Req inspection - template update Resolves: #2479 --- .../requirements/chklst_req_inspection.rst | 30 ++++++++----------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/docs/modules/baselibs/result/docs/requirements/chklst_req_inspection.rst b/docs/modules/baselibs/result/docs/requirements/chklst_req_inspection.rst index 070f8562941..45b690fbb3d 100644 --- a/docs/modules/baselibs/result/docs/requirements/chklst_req_inspection.rst +++ b/docs/modules/baselibs/result/docs/requirements/chklst_req_inspection.rst @@ -32,7 +32,7 @@ Requirement Inspection Checklist As described in the concept :need:`doc_concept__wp_inspections` the following "inspection roles" are expected to be filled: - author: `<https://github.com/4og>`_ - - reviewer: these are all persons committing into this inspection document or giving a pull request verdict on it (can be derived from version mgt tool) + - reviewer: `<https://github.com/aschemmel-tech>`_ - moderator: only needed for conflict resolution between author and reviewers, is the safety manager, security manager or quality manager called in as a reviewer (can be derived from version mgt tool) - test expert: `<https://github.com/rahulthakre29>`_ @@ -85,13 +85,7 @@ Requirement Inspection Checklist - This is appropriate for the component level. No use of exceptions and standard library relation is a S-CORE platform condition. - none * - REQ_03_01 - - For stakeholder requirements: Is the *rationale* correct? - - Rationales explain why the top level requirements were created. Do those cover the requirement? - - n/a - - no stakeholder requirements in scope - - n/a - * - REQ_03_02 - - For other requirements: Is the *linkage to the parent requirement* correct? + - Is the *linkage to the parent requirement* correct? - Linkage to correct levels and ASIL attributes is checked automatically, but it needs checking if the child requirement implements (at least) a part of the parent requirement. - YES - linking is appropriate, that it exists is checked automatically @@ -109,7 +103,7 @@ Requirement Inspection Checklist - No timing requirements found and also no timing problems expected - none * - REQ_06_01 - - Does the requirement set consider *external interfaces*? + - Does the requirement consider *external interfaces*? - The SW platform's external interfaces (to the user) are defined in the Feature Architecture, so the Feature and Component Requirements should determine the input data use and setting of output data for these interfaces. Are all output values defined? - YES - Fixed: This could be improved by using the interfaces defined in :need:`comp_arc_sta__baselibs__result` @@ -122,7 +116,7 @@ Requirement Inspection Checklist - none * - REQ_07_02 - Is the attribute *security* set correctly? - - Stakeholder requirements security attribute should be set based on Threat Analysis and Risk Assessment (TARA) (process is TBD). For feature/component requirements this checklist item is supported by automated check: "Every requirement which satisfies a requirement with security attribute set to YES inherits this". But the feature/component requirements/architecture may additionally also be subject to a Software Security Criticality Analysis (process is TBD). + - For component requirements this checklist item is supported by automated check: "Every requirement which satisfies a feature requirement with security attribute set to YES inherits this". But the component requirements/architecture may additionally also be subject to a :need:`wp__sw_component_security_analysis`. - YES - all requirements have no security implication as expected (no security impact analysis done) - none @@ -132,20 +126,20 @@ Requirement Inspection Checklist - YES - all requirements have test cases implemented - none - * - REQ_09_01 - - For stakeholder requirements: Do those cover assumed safety mechanisms needed by the hardware and system? - - Note that stakeholder requirements covering safety mechanisms come from rationales, whereas feature/component requirements are covering safety mechanisms coming from :need:`gd_chklst__safety_analysis` + * - REQ_08_02 + - Is the requirement verifiable by design or code review in case it is not feasibly testable? + - In very rare cases a requirement may not be verifiable by test cases, for example a specific non-functional requirement. In this case a requirement analysis verifies the requirement by design/code review. If such a requirement is in scope of this inspection, please check this here and link to the respective review record. A test expert is invited to the inspection to confirm their opinion that the requirement is not testable. - n/a - - no stakeholder requirements in scope - - n/a - * - REQ_09_02 - - For feature/component requirements: Do the requirements defining a safety mechanism contain the error reaction leading to a safe state? + - Requirement is testable (see REQ_08_01) + - none + * - REQ_09_01 + - Do the requirements defining a safety mechanism contain the error reaction leading to a safe state? - Alternatively to the safe state there could also be "repair" mechanisms. Also do not forget to consider REQ_05_01 for these. - YES - Fixed: There should be an AoU covering this, :need:`aou_req__result__value_handling` is not. - `#2229 <https://github.com/eclipse-score/score/issues/2229>`_ -Note: If a Review ID is not applicable for your requirement, then state "n/a" in status and comment accordingly in remarks. For example "no stakeholder requirement (no rationale needed)" +Note: If a Review ID is not applicable for your requirement, then state "n/a" in status and comment accordingly in remarks. The following requirements in "valid" state and with "inspected" tag set are in the scope of this inspection: From 9042ed21e53e7ff23755ad91d4c7484803a55376 Mon Sep 17 00:00:00 2001 From: RolandJentschETAS <135332348+RolandJentschETAS@users.noreply.github.com> Date: Fri, 23 Jan 2026 07:54:14 +0100 Subject: [PATCH 156/214] update communication to new docs as code meta modell (#2486) --- .../communication/docs/architecture/index.rst | 8 ++++++++ .../configuration/docs/architecture/index.rst | 4 ++-- docs/modules/communication/docs/index.rst | 12 ++++++------ .../frontent/docs/architecture/index.rst | 11 ++++++++++- .../ipc_binding/docs/architecture/index.rst | 4 ++-- .../lola/docs/component_classification.rst | 2 +- .../mock_binding/docs/architecture/index.rst | 4 ++-- 7 files changed, 31 insertions(+), 14 deletions(-) diff --git a/docs/features/communication/docs/architecture/index.rst b/docs/features/communication/docs/architecture/index.rst index 334788a26ff..1e72d8ceb66 100644 --- a/docs/features/communication/docs/architecture/index.rst +++ b/docs/features/communication/docs/architecture/index.rst @@ -36,6 +36,14 @@ As discussed in :ref:`com_rationale`, the overall architecture of the communicat This ensures a stable public API, independent of the underlying binding(s). At the same time, the communication framework can support many different communication protocols in a flexible manner. +.. feat:: Communication Feature + :id: feat__com_communication + :security: YES + :safety: ASIL_B + :status: valid + :includes: logic_arc_int__communication__user + :consists_of: comp__com_configuration, comp__com_ipc_binding, comp__com_mock_binding, comp__com_frontend + .. feat_arc_sta:: Feature Architecture Communication :id: feat_arc_sta__com__communication :security: YES diff --git a/docs/modules/communication/configuration/docs/architecture/index.rst b/docs/modules/communication/configuration/docs/architecture/index.rst index a16c31e423d..85c7414caa3 100644 --- a/docs/modules/communication/configuration/docs/architecture/index.rst +++ b/docs/modules/communication/configuration/docs/architecture/index.rst @@ -15,8 +15,8 @@ Configuration Component Architecture ************************************ -.. comp_arc_sta:: Lola Configuration - :id: comp_arc_sta__com__configuration +.. comp:: Lola Configuration + :id: comp__com_configuration :security: YES :safety: ASIL_B :status: valid diff --git a/docs/modules/communication/docs/index.rst b/docs/modules/communication/docs/index.rst index d8d596038ca..7a5322656a0 100644 --- a/docs/modules/communication/docs/index.rst +++ b/docs/modules/communication/docs/index.rst @@ -12,18 +12,18 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -.. mod_view_sta:: Communication - :id: mod_view_sta__com__communication - :includes: comp_arc_sta__com__configuration, comp_arc_sta__com__ipc_binding, comp_arc_sta__com__mock_binding, comp_arc_sta__com__frontend +.. mod:: Communication + :id: mod__com_communication + :includes: comp__com_configuration, comp__com_ipc_binding, comp__com_mock_binding, comp__com_frontend .. needarch:: :scale: 50 :align: center {{ draw_module(need(), needs) }} - comp_arc_sta__com__ipc_binding -r[hidden]-> comp_arc_sta__com__frontend - comp_arc_sta__com__frontend -r[hidden]-> comp_arc_sta__com__mock_binding - comp_arc_sta__com__mock_binding -r[hidden]-> comp_arc_sta__com__configuration + comp__com_ipc_binding -r[hidden]-> comp__com_frontend + comp__com_frontend -r[hidden]-> comp__com_mock_binding + comp__com_mock_binding -r[hidden]-> comp__com_configuration logic_arc_int__tracing__tracing -r[hidden]-> logic_arc_int__logging__logging diff --git a/docs/modules/communication/frontent/docs/architecture/index.rst b/docs/modules/communication/frontent/docs/architecture/index.rst index 09d0222d24f..dc58e7d6d10 100644 --- a/docs/modules/communication/frontent/docs/architecture/index.rst +++ b/docs/modules/communication/frontent/docs/architecture/index.rst @@ -15,7 +15,16 @@ Frontend Component Architecture ******************************* -.. comp_arc_sta:: mw::com Frontend +.. comp:: mw::com Frontend + :id: comp__com_frontend + :security: YES + :safety: ASIL_B + :status: valid + :implements: logic_arc_int__communication__user + :uses: logic_arc_int__logging__logging, logic_arc_int__tracing__tracing + + +.. comp_arc_sta:: mw::com Frontend Architecture :id: comp_arc_sta__com__frontend :security: YES :safety: ASIL_B diff --git a/docs/modules/communication/ipc_binding/docs/architecture/index.rst b/docs/modules/communication/ipc_binding/docs/architecture/index.rst index 0bbc7a6f8b3..34da4de8f66 100644 --- a/docs/modules/communication/ipc_binding/docs/architecture/index.rst +++ b/docs/modules/communication/ipc_binding/docs/architecture/index.rst @@ -15,8 +15,8 @@ IPC Binding Component Architecture ********************************** -.. comp_arc_sta:: IPC Binding - :id: comp_arc_sta__com__ipc_binding +.. comp:: IPC Binding + :id: comp__com_ipc_binding :security: YES :safety: ASIL_B :status: valid diff --git a/docs/modules/communication/lola/docs/component_classification.rst b/docs/modules/communication/lola/docs/component_classification.rst index 0c52fe8130c..d554333d0e4 100644 --- a/docs/modules/communication/lola/docs/component_classification.rst +++ b/docs/modules/communication/lola/docs/component_classification.rst @@ -62,7 +62,7 @@ Step 1: Determine (P): the uncertainty of the Processes applied * - 3 - Are specifications for functionalities and properties available (architecture)? - HE - - Created using S-CORE process: :need:`mod_view_sta__com__communication` + - Created using S-CORE process: :need:`mod__com_communication` * - 4 - Are design specifications available? diff --git a/docs/modules/communication/mock_binding/docs/architecture/index.rst b/docs/modules/communication/mock_binding/docs/architecture/index.rst index 5fa3ccc7832..9156e62e944 100644 --- a/docs/modules/communication/mock_binding/docs/architecture/index.rst +++ b/docs/modules/communication/mock_binding/docs/architecture/index.rst @@ -15,8 +15,8 @@ Mock Binding Component Architecture *********************************** -.. comp_arc_sta:: Mock binding - :id: comp_arc_sta__com__mock_binding +.. comp:: Mock binding + :id: comp__com_mock_binding :security: YES :safety: ASIL_B :status: valid From a42c6cc9ae878735b1348faa1cf0759aba2738a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20S=C3=B6ren=20Pollak?= <maximilian.pollak@qorix.com> Date: Mon, 26 Jan 2026 10:29:47 +0100 Subject: [PATCH 157/214] Add Documentation for Source Code Linker (#2461) * Add Documentation for Docs-as-Code tools --- .../assets/example_rust_source_code_link.png | Bin 0 -> 119162 bytes docs/contribute/development/index.rst | 1 + .../development/python/coding_guidelines.rst | 1 + .../development/traceability_tooling.rst | 140 ++++++++++++++++++ 4 files changed, 142 insertions(+) create mode 100644 docs/contribute/development/assets/example_rust_source_code_link.png create mode 100644 docs/contribute/development/traceability_tooling.rst diff --git a/docs/contribute/development/assets/example_rust_source_code_link.png b/docs/contribute/development/assets/example_rust_source_code_link.png new file mode 100644 index 0000000000000000000000000000000000000000..7815d552f6d5bef14128c2e3560a0ad94d934e65 GIT binary patch literal 119162 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%0DG{r+&zY=?d{5g@3@-Q67)Z5ZNiM5Ea} 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 literal 0 HcmV?d00001 diff --git a/docs/contribute/development/index.rst b/docs/contribute/development/index.rst index b8428b2ae8c..2cb371a6ce9 100644 --- a/docs/contribute/development/index.rst +++ b/docs/contribute/development/index.rst @@ -19,6 +19,7 @@ Development :maxdepth: 1 development_environment + traceability_tooling api_guideline cpp/index rust/index diff --git a/docs/contribute/development/python/coding_guidelines.rst b/docs/contribute/development/python/coding_guidelines.rst index 65e9ac80b15..e2f9d719f0e 100644 --- a/docs/contribute/development/python/coding_guidelines.rst +++ b/docs/contribute/development/python/coding_guidelines.rst @@ -67,6 +67,7 @@ Testing implementation details. Overly fine-grained tests lead to brittle code and high maintenance. - **Boundary conditions:** - Edge cases often break things. Think about invalid input, large data sets, empty cases, and concurrency issues. +- **Enesure Traceability** - Make sure to use the pytest decorator where applicable to enable traceabillity throughout. More infos on how to use it `example here <https://eclipse-score.github.io/docs-as-code/main/how-to/test_to_doc_links.html>`_ and `more through documentation here <https://eclipse-score.github.io/docs-as-code/main/internals/extensions/source_code_linker.html>`_ Documentation -------------------- diff --git a/docs/contribute/development/traceability_tooling.rst b/docs/contribute/development/traceability_tooling.rst new file mode 100644 index 00000000000..b5346de32e0 --- /dev/null +++ b/docs/contribute/development/traceability_tooling.rst @@ -0,0 +1,140 @@ +.. + # ******************************************************************************* + # Copyright (c) 2026 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + + +.. document:: Traceability Tooling + :id: doc__traceability_tooling + :status: valid + :safety: QM + :security: NO + :realizes: wp__requirements_proc_tool + +Traceability Tooling +#################### + +This document describes tools or some functionality of them, that can be used regardless of source code language.These tools are also provided by S-CORE projects, like Docs-As-Code. + + + +Link Requirements to Source Code +******************************** + +This functionality provides the ability to link any requirement to any part of the source code. +It is possible to link as many places of source code as are needed. All of them will show up in the requirement. + +All that is needed is to write the 'template string' that the program is looking for. +It is either `# req-Id: <your requirement>` or `# req-traceability: <your requirement>` +If there is multiple requirements that need to be linked to this place in the source code, repeat the line for each one. + +As an example for one requirement: + +.. code-block:: python + + # req-Id: tool_req__docs_common_attr_title + def your_function(args): + """Your function that implements the requirement partiall or fully""" + ... + +`A Rendered Example <https://eclipse-score.github.io/docs-as-code/main/internals/requirements/requirements.html#tool_req__docs_common_attr_id>`_ + +An Example of multiple requirements: + +.. code-block:: python + + # req-Id: tool_req__docs_common_attr_title + # req-Id: tool_req__docs_common_attr_status + # req-Id: tool_req__docs_common_attr_safety + def your_function(args): + """Your function that implements the requirement partiall or fully""" + ... + +The tool will look through any files except: + +Directories or files that start with '.' or '_' +It skips all files that end with one of the following: +- .pyc +- .so +- .exe +- .bin +- .rst +- .md + + +The template string works regardless of the language. +This means both following examples are valid and will work. + +.. code-block:: cpp + + // # req-Id: comp_req__containers_rust__fixed_vector + int your_function() { + ... + } + + +.. code-block:: rust + + /// # req-Id: comp_req__containers_rust__fixed_vector + impl<T> FixedCapacityVec<T> { + ... + } + + +Here is how this would look rendered: + +.. image:: assets/example_rust_source_code_link.png + + + +Link Requirements to Tests +************************** + +There is a tool that has the ability to link requirements to your tests as well as provide virtual tests sphinx-needs in order to make statistics etc. possible to be rendered. + +The implementation here differs based on your source code language though. +So it is best if you read up in the language you want to develop in how to do this. + +In rough terms the data flow looks as follows. + +Your testing framework produces XML files with pre-defined properties. +These XML files are loaded and parsed. The test needs to get build details from the parsed data and link it to the requirements mentioned. + +You can now also do statistics on your tests. + + +.. code-block:: rst + + .. needtable:: SUCCESSFUL TESTS + :filter: result == "passed" + :tags: TEST + :columns: name as "testcase";result;fully_verifies;partially_verifies;test_type;derivation_technique;id as "link" + + + .. needpie:: Test Results + :labels: passed, failed, skipped + :colors: green, red, orange + :legend: + + type == 'testcase' and result == 'passed' + type == 'testcase' and result == 'failed' + type == 'testcase' and result == 'skipped' + + +Find the rendered examples here: `Docs as Code Test Statistics examples <https://eclipse-score.github.io/docs-as-code/main/internals/requirements/implementation_state.html>`_ + + +Find More Information +===================== + +If you need more information, you can read it all in the `Docs as Code Documentation <https://eclipse-score.github.io/docs-as-code/main/internals/extensions/source_code_linker.html>`_ + From 14d14da44d1860d20137dd8919a2d9f70ed5676d Mon Sep 17 00:00:00 2001 From: "jhr2hi@bosch.com" <roland.jentsch@etas.com> Date: Fri, 23 Jan 2026 16:44:20 +0100 Subject: [PATCH 158/214] correct orchestrator_picture --- docs/features/index.rst | 9 ++++++ .../orchestration/architecture/index.rst | 8 ++++++ docs/modules/index.rst | 9 ++++++ docs/modules/orchestrator/docs/index.rst | 6 ++-- .../executor/docs/architecture/index.rst | 8 ++++++ .../orchestrator/docs/architecture/index.rst | 28 ++++++++++++++----- 6 files changed, 59 insertions(+), 9 deletions(-) diff --git a/docs/features/index.rst b/docs/features/index.rst index 08fe4d199f0..d8f647937c5 100644 --- a/docs/features/index.rst +++ b/docs/features/index.rst @@ -26,3 +26,12 @@ The following features are defined: :glob: */index + +Feature List +------------ + +.. needtable:: + :style: table + :types: feat + :columns: id;Security;Safety;status + :filter: id not in ["feat__example_feature", "feat__feature_name", "feat__feature_name_example"] diff --git a/docs/features/orchestration/architecture/index.rst b/docs/features/orchestration/architecture/index.rst index 9c1f2011e07..e3d2ab8fbfc 100644 --- a/docs/features/orchestration/architecture/index.rst +++ b/docs/features/orchestration/architecture/index.rst @@ -23,6 +23,14 @@ Feature Architecture :realizes: wp__feature_arch :tags: orchestration +.. feat:: Orchestration + :id: feat__orchestration + :security: YES + :safety: ASIL_B + :status: invalid + :includes: logic_arc_int__orchestration__user, logic_arc_int__orchestration__design, logic_arc_int__orchestration__deployment + :consists_of: comp__orchestrator + Overview -------- diff --git a/docs/modules/index.rst b/docs/modules/index.rst index 9949b019c7d..a8208c369d0 100644 --- a/docs/modules/index.rst +++ b/docs/modules/index.rst @@ -33,3 +33,12 @@ It is the physically compiled and packaged unit that results from the build proc :glob: ./*/index + +Modules List +------------ + +.. needtable:: + :style: table + :types: mod + :columns: id;comp;status + :filter: id != "mod__example_feature_archex_module_1" diff --git a/docs/modules/orchestrator/docs/index.rst b/docs/modules/orchestrator/docs/index.rst index 4a5cfbac999..744855b96b8 100644 --- a/docs/modules/orchestrator/docs/index.rst +++ b/docs/modules/orchestrator/docs/index.rst @@ -25,11 +25,13 @@ Module Documents Orchestrator verification/module_verification_report.rst release/release_note.rst - +.. mod:: Orchestrator + :id: mod__orchestrator + :includes: comp__orchestrator, comp__orch_executor .. mod_view_sta:: Orchestrator :id: mod_view_sta__orch__orchestrator - :includes: comp_arc_sta__orch__orchestrator, comp_arc_sta__orch__executor + :includes: comp__orchestrator, comp__orch_executor .. needarch:: :scale: 50 diff --git a/docs/modules/orchestrator/executor/docs/architecture/index.rst b/docs/modules/orchestrator/executor/docs/architecture/index.rst index 3a0c9c9db0e..7f5d47ebe1a 100644 --- a/docs/modules/orchestrator/executor/docs/architecture/index.rst +++ b/docs/modules/orchestrator/executor/docs/architecture/index.rst @@ -61,6 +61,14 @@ Static Architecture The components are designed to cover the expectations from the feature architecture (i.e. if already exists a definition it should be taken over and enriched). +.. comp:: Executor + :id: comp__orch_executor + :security: YES + :safety: ASIL_B + :status: valid + :uses: logic_arc_int__logging__logging, logic_arc_int__tracing__tracing + + .. comp_arc_sta:: Executor :id: comp_arc_sta__orch__executor :security: YES diff --git a/docs/modules/orchestrator/orchestrator/docs/architecture/index.rst b/docs/modules/orchestrator/orchestrator/docs/architecture/index.rst index f9809b13778..2437a477273 100644 --- a/docs/modules/orchestrator/orchestrator/docs/architecture/index.rst +++ b/docs/modules/orchestrator/orchestrator/docs/architecture/index.rst @@ -79,13 +79,28 @@ Static Architecture The components are designed to cover the expectations from the feature architecture (i.e. if already exists a definition it should be taken over and enriched). +.. comp:: Orchestrator + :id: comp__orchestrator + :security: YES + :safety: ASIL_B + :status: valid + :implements: logic_arc_int__orchestration__user, logic_arc_int__orchestration__deployment, logic_arc_int__orchestration__design + :uses: logic_arc_int__logging__logging, logic_arc_int__tracing__tracing, logic_arc_int__communication__user + :consists_of: comp__orch_design_impl, comp__orch_deployment_impl + + .. needarch:: + :scale: 50 + :align: center + + {{ draw_component(need(), needs) }} + + .. comp_arc_sta:: Orchestrator :id: comp_arc_sta__orch__orchestrator :security: YES :safety: ASIL_B :status: valid - :includes: comp_arc_sta__orch__design_impl, comp_arc_sta__orch__deployment_impl - :implements: logic_arc_int__orchestration__user, logic_arc_int__orchestration__deployment, logic_arc_int__orchestration__design + :includes: comp__orch_design_impl, comp__orch_deployment_impl :uses: logic_arc_int__logging__logging, logic_arc_int__tracing__tracing, logic_arc_int__communication__user .. needarch:: @@ -165,15 +180,15 @@ Interfaces .. Subcomponents -.. comp_arc_sta:: Design - :id: comp_arc_sta__orch__design_impl +.. comp:: Design + :id: comp__orch_design_impl :status: valid :safety: ASIL_B :security: NO :implements: logic_arc_int__orchestration__design -.. comp_arc_sta:: Deployment - :id: comp_arc_sta__orch__deployment_impl +.. comp:: Deployment + :id: comp__orch_deployment_impl :status: valid :safety: ASIL_B :security: NO @@ -181,7 +196,6 @@ Interfaces .. Operations - .. logic_arc_int_op:: register_invoke_fn :id: logic_arc_int_op__orch__register_invoke_fn :security: YES From 615c23debd81a8c3b05cf88692ee4dfcd33a656e Mon Sep 17 00:00:00 2001 From: "jhr2hi@bosch.com" <roland.jentsch@etas.com> Date: Mon, 26 Jan 2026 07:35:00 +0100 Subject: [PATCH 159/214] nulledit for trigger workflow again --- .../orchestrator/orchestrator/docs/architecture/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/modules/orchestrator/orchestrator/docs/architecture/index.rst b/docs/modules/orchestrator/orchestrator/docs/architecture/index.rst index 2437a477273..2ce1f7cc1aa 100644 --- a/docs/modules/orchestrator/orchestrator/docs/architecture/index.rst +++ b/docs/modules/orchestrator/orchestrator/docs/architecture/index.rst @@ -109,6 +109,7 @@ The components are designed to cover the expectations from the feature architect {{ draw_component(need(), needs) }} + Dynamic Architecture -------------------- From fb88ea843b73329628024183933f652e3fd37773 Mon Sep 17 00:00:00 2001 From: "jhr2hi@bosch.com" <roland.jentsch@etas.com> Date: Mon, 26 Jan 2026 08:31:34 +0100 Subject: [PATCH 160/214] set status of feature to valid --- docs/features/orchestration/architecture/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/orchestration/architecture/index.rst b/docs/features/orchestration/architecture/index.rst index e3d2ab8fbfc..09ed6ace919 100644 --- a/docs/features/orchestration/architecture/index.rst +++ b/docs/features/orchestration/architecture/index.rst @@ -27,7 +27,7 @@ Feature Architecture :id: feat__orchestration :security: YES :safety: ASIL_B - :status: invalid + :status: valid :includes: logic_arc_int__orchestration__user, logic_arc_int__orchestration__design, logic_arc_int__orchestration__deployment :consists_of: comp__orchestrator From f4769c4b86bfe46b29b56b6c3e262c5b82db334b Mon Sep 17 00:00:00 2001 From: "jhr2hi@bosch.com" <roland.jentsch@etas.com> Date: Mon, 26 Jan 2026 08:38:48 +0100 Subject: [PATCH 161/214] add module parameters --- docs/modules/index.rst | 2 +- docs/modules/orchestrator/docs/index.rst | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/modules/index.rst b/docs/modules/index.rst index a8208c369d0..f7ef453165c 100644 --- a/docs/modules/index.rst +++ b/docs/modules/index.rst @@ -40,5 +40,5 @@ Modules List .. needtable:: :style: table :types: mod - :columns: id;comp;status + :columns: id;status :filter: id != "mod__example_feature_archex_module_1" diff --git a/docs/modules/orchestrator/docs/index.rst b/docs/modules/orchestrator/docs/index.rst index 744855b96b8..3717c601990 100644 --- a/docs/modules/orchestrator/docs/index.rst +++ b/docs/modules/orchestrator/docs/index.rst @@ -28,6 +28,9 @@ Module Documents Orchestrator .. mod:: Orchestrator :id: mod__orchestrator :includes: comp__orchestrator, comp__orch_executor + :status: valid + :safety: ASIL_B + :security: YES .. mod_view_sta:: Orchestrator :id: mod_view_sta__orch__orchestrator From a853a294f3fda8d40fde3ac76f60bd03fcdc6a4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Volker=20H=C3=A4ussler?= <volker.haeussler@qorix.ai> Date: Mon, 26 Jan 2026 16:23:47 +0100 Subject: [PATCH 162/214] typo fix / small bugs (#2503) --- .vscode/settings.json | 4 ++++ docs/platform_management_plan/change_management.rst | 2 +- .../documentation_management.rst | 8 ++++---- docs/platform_management_plan/problem_resolution.rst | 4 ++-- docs/platform_management_plan/project_management.rst | 12 ++++++------ docs/platform_management_plan/quality_management.rst | 4 ++-- docs/platform_management_plan/release_management.rst | 4 ++-- .../role_assignment/platform_safety_manager.rst | 2 +- docs/platform_management_plan/safety_management.rst | 4 ++-- .../software_verification.rst | 2 +- 10 files changed, 25 insertions(+), 21 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 47e46435ca0..c7f8436a638 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -88,8 +88,12 @@ }, "cSpell.words": [ "__getitem__", + "baselibs", "bazel", "buildifier", + "Codeowner", + "codeowners", + "docname", "getstrt", "metatags", "reqs" diff --git a/docs/platform_management_plan/change_management.rst b/docs/platform_management_plan/change_management.rst index bd9b68b3ac5..1b7e55fe323 100644 --- a/docs/platform_management_plan/change_management.rst +++ b/docs/platform_management_plan/change_management.rst @@ -274,7 +274,7 @@ If the information is sufficient and it is decided to implement the change reque ISSUE status is kept ``Open`` and the Projects status is set to ``In Progress``. The decision, if the change request is accepted or rejected must be documented. Safety/Security -experts must confirm or disconfirm, if safety/security relevance is set correctly. +experts must confirm or deny, if safety/security relevance is set correctly. :need:`gd_chklst__change_cr_review` can help to verify whether the information is complete. diff --git a/docs/platform_management_plan/documentation_management.rst b/docs/platform_management_plan/documentation_management.rst index 75d6bbc083b..d99fa0ff2d9 100644 --- a/docs/platform_management_plan/documentation_management.rst +++ b/docs/platform_management_plan/documentation_management.rst @@ -46,12 +46,12 @@ Others are modelled as general documents (e.g. the plans which are part of the p This plan deals with these documents, which have the following manually set attributes: -* Title: the name of the document (mandatory) +* Title: The name of the document (mandatory) * Unique Id: Id following the naming pattern of the document Title (mandatory) -* Safety: which ASIL the document supports (mandatory) +* Safety: Which ASIL the document supports (mandatory) * Author: Who is the main committer to the document (mandatory) -* Status: describing where in the lifecycle of the document it currently is (mandatory) -* Tags: can be used to group documents for subsequent filtering (optional) +* Status: Describing where in the lifecycle of the document it currently is (mandatory) +* Tags: Can be used to group documents for subsequent filtering (optional) Also the "Documentation Management" is a document, so an example for a correct document definition can be seen in the header section above, see :need:`doc__documentation_mgt_plan`. diff --git a/docs/platform_management_plan/problem_resolution.rst b/docs/platform_management_plan/problem_resolution.rst index d7dd33c4419..1fc777afc10 100644 --- a/docs/platform_management_plan/problem_resolution.rst +++ b/docs/platform_management_plan/problem_resolution.rst @@ -137,7 +137,7 @@ To provide solutions, use the Solution part of the ISSUE. :need:`[[title]] <gd_req__problem_attr_anaylsis_results>` is provided in the analysis results part of the ISSUE. State here, if the problem is accepted or rejected. Safety/Security -experts must confirm or disconfirm, if safety/security is affected is set correctly +experts must confirm or deny, if safety/security is affected is set correctly :need:`[[title]] <gd_req__problem_attr_stakeholder>` are provided in the Assignees part of the ISSUE. In addition you can use pre-defined labels for Communities or Feature Teams @@ -230,7 +230,7 @@ If the information is sufficient and it is decided to initiate the problem resol ISSUE status is kept ``Open`` and the Projects status is set to ``In Progress``. The decision, if the problem is accepted or rejected must be documented. Safety/Security -experts must confirm or disconfirm, if safety/security is affected is set correctly. +experts must confirm or deny, if safety/security is affected is set correctly. :need:`gd_chklst__problem_cr_review` can help to verify whether the information is complete. diff --git a/docs/platform_management_plan/project_management.rst b/docs/platform_management_plan/project_management.rst index b6a567aee21..1f0cb7b1eaa 100644 --- a/docs/platform_management_plan/project_management.rst +++ b/docs/platform_management_plan/project_management.rst @@ -98,7 +98,7 @@ Technical committees Every *Feature Team* should also have a *Feature Team Lead*. The person with this role is responsible for organizing the meetings, writing meeting protocols and representing the current status of the *Feature Team* - work in various management reporting or plannig calls. *Feature Team Lead* is nominated by *Technical Leads* by election. + work in various management reporting or planning calls. *Feature Team Lead* is nominated by *Technical Leads* by election. Normally, this is the owner of the original *Feature Request*. @@ -107,8 +107,8 @@ Creation of a new Feature Team Decision to create a new *Feature Team* is normally done in *Technical Lead Circle* in case a particular, already *accepted* *Feature Request* can not be assigned to any of already existing *Feature Teams*. -As a first step, the decision to create a new Feature Team is protocolled in the `Tech Lead Circle meeeting minutes <https://github.com/orgs/eclipse-score/discussions/categories/technical-lead-circle>`_. -Afterwards a GitHub Issue is created in the `Technical Lead Cirle LOP project <https://github.com/orgs/eclipse-score/projects/3>`_ +As a first step, the decision to create a new Feature Team is recorded in the `Tech Lead Circle meeting minutes <https://github.com/orgs/eclipse-score/discussions/categories/technical-lead-circle>`_. +Afterwards a GitHub Issue is created in the `Technical Lead Circle LOP project <https://github.com/orgs/eclipse-score/projects/3>`_ using the special *Feature Team Creation* GitHub Issue template and is assigned to one of the Technical Leads. **ToDo**: create such a template. @@ -182,10 +182,10 @@ technical competence of the software developers, e.g. in case during the :ref:`F it was decided to take over already existing source code, then persons who were actively participating in the development of that code are always good candidates to be part of *Codeowner GitHub team*. The decision who should be initially part of the *Codeowner GitHub team* and the reasoning for this -should be protocolled in the GitHub Issue, that is used for creation of the *Feature Team*. +should be recorded in the GitHub Issue, that is used for creation of the *Feature Team*. -In case further software developers should be added to the *Codeowener GitHub team* in the future, -that decision and its reasoning should be protocolled in one of the *Feature Team* GitHub discussions. +In case further software developers should be added to the *Codeowner GitHub team* in the future, +that decision and its reasoning should be recorded in one of the *Feature Team* GitHub discussions. Members of the *Codeowner GitHub team* should also be authorized to merge pull requests (PRs) into the corresponding repository. Therefore, once the *Codeowner GitHub team* has been created, the Technical Lead assigned to the ticket for the *Feature diff --git a/docs/platform_management_plan/quality_management.rst b/docs/platform_management_plan/quality_management.rst index b49096a48a1..4b6166c8ca9 100644 --- a/docs/platform_management_plan/quality_management.rst +++ b/docs/platform_management_plan/quality_management.rst @@ -182,11 +182,11 @@ The metric for the work products is ensured by the process that contains the wor 3.5 Quality Management Scope ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -There is no deviation from the scope defined in the :need:`doc__project_mgt_plan`. The platform and its +There is no deviation from the scope defined in the :need:`doc__project_mgt_plan`. The platform and it's components are developed, and integrated for an assumed technical system, for functional safety purposes as Safety Element out of Context (SEooC). -The development of the platform and its components follows the defined processes. Responsibilities for management, +The development of the platform and it's components follows the defined processes. Responsibilities for management, development, implementation, integration, and verification are also defined in the processes. The SW platform consists of features, which are based on a set of requirements and are developed in parallel. diff --git a/docs/platform_management_plan/release_management.rst b/docs/platform_management_plan/release_management.rst index 493952d85e5..173512d7791 100644 --- a/docs/platform_management_plan/release_management.rst +++ b/docs/platform_management_plan/release_management.rst @@ -20,7 +20,7 @@ :tags: platform_management :realizes: wp__platform_sw_release_plan -Release management Plan +Release Management Plan ----------------------- This document implements parts of the :need:`wp__platform_mgmt`. @@ -73,7 +73,7 @@ Release Planning and Execution ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Generally release planning and execution is described in :need:`wf__rel_mod_rel_note` process. -It is part of project planning and therefore also documented with the same means. Generally a Release +It is part of project planning and therefore also documented with the same means. Generally a release is planned as an issue linked to a milestone in the `GitHub Milestone Planning <https://github.com/orgs/eclipse-score/projects/13>`_. And this issue is closed by merging a pull request which creates/updates a release note. diff --git a/docs/platform_management_plan/role_assignment/platform_safety_manager.rst b/docs/platform_management_plan/role_assignment/platform_safety_manager.rst index 555895c498f..7e02fa362b0 100644 --- a/docs/platform_management_plan/role_assignment/platform_safety_manager.rst +++ b/docs/platform_management_plan/role_assignment/platform_safety_manager.rst @@ -55,7 +55,7 @@ Education and Skills: - Safety related SW development and project management (in aerospace) > 10 years - letters of recommendation from employers - Trainer for DO-178B SW safety standard - election certificate - Process development CMMI - letters of recommendation from employers -- Safety trainings by Exida (Iso 26262) - part of Safety Case Safe Posix SW platform +- Safety trainings by Exida (ISO 26262) - part of Safety Case Safe Posix SW platform S-CORE Committs: diff --git a/docs/platform_management_plan/safety_management.rst b/docs/platform_management_plan/safety_management.rst index 00f32a79ff0..8b0e334067a 100644 --- a/docs/platform_management_plan/safety_management.rst +++ b/docs/platform_management_plan/safety_management.rst @@ -60,7 +60,7 @@ Functional Safety Management Scope There is no deviation from the scope presented in the `S-CORE project page <https://eclipse-score.github.io/>`_ . The platform and its components are developed, and integrated for an assumed technical system as Safety Element out of Context (SEooC). The development of the platform and its components follows the defined processes. -Responsibilities for development, implementation, integration and verification are also defined int the processes. +Responsibilities for development, implementation, integration and verification are also defined in the processes. Regarding the platform specifics: @@ -202,7 +202,7 @@ For the :need:`rl__project_lead`, the :need:`rl__safety_manager` and the :need:` in these project role definitions. They are also elected in a meritocratic way and this election is documented including the evidences checked to prove the experience. Committers in the S-CORE project can work on the development of safety related or non-safety related SW modules. -If they work on safety related modules they have to prove (additionaly to their committer election, which already shows they are skilled developers): +If they work on safety related modules they have to prove (additionally to their committer election, which already shows they are skilled developers): * two years practice of safety related SW development (or management) relevant for the section content (includes trainings in safety standards like ISO 26262) * training on the S-CORE processes diff --git a/docs/platform_management_plan/software_verification.rst b/docs/platform_management_plan/software_verification.rst index ce71c3349cb..bc0f0f338bf 100644 --- a/docs/platform_management_plan/software_verification.rst +++ b/docs/platform_management_plan/software_verification.rst @@ -330,7 +330,7 @@ to be reached with every contribution. Further quality goals are defined in section :doc:`quality_management`. The confirmation or any deviation of the coverage percentage value is documented in this section. -This shall also be part of the module documenation with a reasoning when percentage numbers deviate for an official release. +This shall also be part of the module documentation with a reasoning when percentage numbers deviate for an official release. Coverage of detailed design ^^^^^^^^^^^^^^^^^^^^^^^^^^^ From 3884fce09c3ec88397d0aaf790ff506d41ab7eb6 Mon Sep 17 00:00:00 2001 From: Andreas Thums <Andreas.Thums@etas.com> Date: Tue, 27 Jan 2026 10:12:51 +0100 Subject: [PATCH 163/214] Feature request/configuration model (#2353) --- .../configuration/config_model/index.rst | 154 ++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 docs/features/configuration/config_model/index.rst diff --git a/docs/features/configuration/config_model/index.rst b/docs/features/configuration/config_model/index.rst new file mode 100644 index 00000000000..8eaf11fcfaa --- /dev/null +++ b/docs/features/configuration/config_model/index.rst @@ -0,0 +1,154 @@ +Configuration Model +################### + +.. document:: Configuration Model + :id: doc__configuration_model + :status: draft + :safety: QM + :security: NO + :tags: feature_request + +Feature flag +============ + +To activate this feature, use the following feature flag: + +``experimental_configuration_model`` + + +Abstract +======== + +This proposal introduces a unified approach to static component configuration in S-CORE by combining a Configuration Guideline and a Configuration Model. It covers both platform and application components. While the guideline defines how configurations should be structured—covering naming conventions, identifier usage, storage formats, and parameter organization—the model specifies what needs to be configured, focusing on common elements that must remain consistent across all components. The dual approach ensures clarity, predictability, and maintainability, reducing integration complexity and improving user experience. By standardizing both the structure and the content of configurations, the solution enables faster onboarding of new components, supports future extensions (e.g., JSON or FlatBuffers), and lays the foundation for automated compliance checks. + +Motivation +========== + +The current configuration landscape in S-CORE suffers from fragmentation: contributors define static configurations independently, leading to inconsistencies in identifiers, variable naming, and file storage. Beyond structural differences, there is no common understanding of what must be configured for each component (e.g., support for "multiple instances"). This results in missing or redundant parameters, unclear dependencies, and unpredictable integration behavior. Without a shared model, cross-component consistency can hardly be guaranteed, making maintenance and scaling difficult. Introducing both a guideline and a model addresses these gaps by ensuring uniformity in configuration structure and content, reducing errors, and improving overall system reliability. + +Focus of this proposal is on static post compile time configurations of application and middleware components. Pre-compile time configurations like 'feature_selection' are out of scope. + +Rationale +========= + +Will be added during implementation. + +Specification +============= + +Guideline and model definition is part of the pitch. They should cover at least the following aspects: + +Requirements +------------ + +* **Common Format**: Define a formal description language for the configuration model (e.g., JSON schema) to ensure machine-readable and validated configurations. +* **Self-Contained Component Configuration**: To provide a self-contained component, each component must be able to carry its own configuration. This introduces a potential conflict with centralized consistency. Potential compromise: Implement consistency checks across components rather than enforcing a single shared configuration file. +* **Extensibility**: The model should be designed to accommodate future features and extensions without breaking existing configurations. +* **Simplicity**: The guideline and model should be easy to understand and each configuration parameter should have a clear purpose. +* **Supported Features**: + + * Configuration scope of current component configurations need to be considered + * Configuration of required and provided capabilities of components. + * Multiple instantiations of the same component with distinct configurations. + * Versioning of configuration schema for backward compatibility. + * further features to be defined. + +Architecture +------------ + +* **Configuration Schema Layer**: Defines the model, e.g. in JSON schema. +* **Validation Engine**: Performs consistency checks across components and validates schema compliance. +* **Integration Layer**: Ensures that component configurations can be loaded independently while maintaining global consistency rules. + +Changes Introduced +------------------ + +* **Requirements**: Add mandatory adherence to the guideline and model for all new components. +* **Architecture**: Introduce schema-based configuration and validation components. +* **Implementation**: Provide reference templates and examples for contributors. +* **Process**: Update component development workflow to include configuration compliance checks. +* **Documentation**: Publish guideline and model specifications with examples. +* **Infrastructure**: Add tooling for automated validation and integration testing. + + + +Backwards Compatibility +======================= + +**Impact Assessment**: Low to Medium + +The configuration model is designed with extensibility and versioning to maintain backward compatibility. However, some existing components may require minor configuration adjustments to align with the new standardized model. + + +Security Impact +=============== + +none + +Safety Impact +============= + +none + +License Impact +============== + +none + + +How to Teach This +================= + +**Implementation Roadmap**: + +1. **Documentation Package**: + * Configuration guideline with naming conventions and structure rules + * Model specification with required and optional elements + * Migration guide for existing components + * Best practices and common patterns + +2. **Developer Resources**: + * Updated component templates with configuration sections + * Validation tools and IDE integration + * Example configurations for common use cases + * Training workshops for development teams + +3. **Integration Support**: + * Automated compliance checking in CI/CD pipelines + * Configuration validation utilities + * Migration assistance for legacy components + + +Rejected Ideas +============== + +**Centralized Configuration File**: Would compromise component portability and independence + +**Purely Structural Approach**: Fails to address content fragmentation issues + +**Hard-coded Standards**: Too inflexible for future extensions and diverse component needs + +**Runtime Configuration Only**: Will not meet runtime requirements like fast startup time + +Open Issues +=========== + +1. **Schema Implementation Language**: Final decision between JSON Schema and FlatBuffers pending performance analysis + +2. **Migration Timeline**: Coordination with existing component development cycles +3. **Validation Granularity**: Define scope of consistency checks between local (component specific) and global (cross component) configuration aspects, considering self-containment of component configuration vs. cross component consistency. +4. **Tooling Integration**: Specify IDE and build system integration requirements + + + +References +========== + +* **JSON Schema**: https://json-schema.org/ - Specification for configuration validation +* **FlatBuffers**: https://google.github.io/flatbuffers/ - Alternative serialization format +* **Module Development Guide**: Internal project documentation +* **Configuration Examples**: Available in project repository under `/examples/config/` + + +.. toctree:: + :hidden: From 10a944aceb5d2790e67a965fc4c2d063c95b3347 Mon Sep 17 00:00:00 2001 From: Alexander Lanin <Alexander.Lanin@etas.com> Date: Tue, 27 Jan 2026 11:20:09 +0100 Subject: [PATCH 164/214] fix(docs): add mandatory link --- docs/features/configuration/config_model/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/features/configuration/config_model/index.rst b/docs/features/configuration/config_model/index.rst index 8eaf11fcfaa..7045060bf7b 100644 --- a/docs/features/configuration/config_model/index.rst +++ b/docs/features/configuration/config_model/index.rst @@ -7,6 +7,7 @@ Configuration Model :safety: QM :security: NO :tags: feature_request + :realizes: wp__feat_request Feature flag ============ From fd26823d043cd4c84831ced4b0e716f871d04634 Mon Sep 17 00:00:00 2001 From: "jhr2hi@bosch.com" <roland.jentsch@etas.com> Date: Wed, 28 Jan 2026 17:48:31 +0100 Subject: [PATCH 165/214] fix baselibs drawings --- .../baselibs/docs/architecture/index.rst | 10 +++++++- .../docs/architecture/index.rst | 4 +-- .../concurrency/docs/architecture/index.rst | 4 +-- .../containers/docs/architecture/index.rst | 4 +-- docs/modules/baselibs/docs/index.rst | 11 ++++++-- .../filesystem/docs/architecture/index.rst | 4 +-- .../baselibs/json/docs/architecture/index.rst | 25 ++++++++++++------- .../docs/json_wrapper/requirements/index.rst | 2 +- .../docs/architecture/index.rst | 4 +-- .../result/docs/architecture/index.rst | 4 +-- .../requirements/chklst_req_inspection.rst | 2 +- .../utils/docs/architecture/index.rst | 4 +-- 12 files changed, 50 insertions(+), 28 deletions(-) diff --git a/docs/features/baselibs/docs/architecture/index.rst b/docs/features/baselibs/docs/architecture/index.rst index 6e2712c6776..e1b89367607 100644 --- a/docs/features/baselibs/docs/architecture/index.rst +++ b/docs/features/baselibs/docs/architecture/index.rst @@ -84,7 +84,15 @@ The decomposition of Baselibs into modular libraries is motivated by the need fo Static Architecture ------------------- -.. feat_arc_sta:: Static View +.. feat:: Baselibs + :id: feat__baselibs + :security: YES + :safety: ASIL_B + :status: valid + :includes: logic_arc_int__baselibs__json, logic_arc_int__baselibs__memory_shared, logic_arc_int__baselibs__message_passing, logic_arc_int__baselibs__result, logic_arc_int__baselibs__bit_manipulation, logic_arc_int__baselibs__bit_mask_operator, logic_arc_int__baselibs__dynamic_array, logic_arc_int__baselibs__intrusive_list, logic_arc_int__baselibs__filesystem, logic_arc_int__baselibs__utils_base64, logic_arc_int__baselibs__utils_scoped_op, logic_arc_int__baselibs__promise, logic_arc_int__baselibs__future, logic_arc_int__baselibs__shared_future, logic_arc_int__baselibs__executor, logic_arc_int__baselibs__task, logic_arc_int__baselibs__task_result, logic_arc_int__baselibs__synchronized_queue, logic_arc_int__baselibs__condition_variable + :consists_of: comp__com_configuration, comp__com_ipc_binding, comp__com_mock_binding, comp__com_frontend + +.. feat_arc_sta:: Baselibs Static View :id: feat_arc_sta__baselibs__static_view_arch :security: YES :safety: ASIL_B diff --git a/docs/modules/baselibs/bitmanipulation/docs/architecture/index.rst b/docs/modules/baselibs/bitmanipulation/docs/architecture/index.rst index 31df4e9dbc6..2bc31d307c6 100644 --- a/docs/modules/baselibs/bitmanipulation/docs/architecture/index.rst +++ b/docs/modules/baselibs/bitmanipulation/docs/architecture/index.rst @@ -30,8 +30,8 @@ see :need:`doc__bitmanipulation` Static Architecture ------------------- -.. comp_arc_sta:: Bit Manipulation - :id: comp_arc_sta__baselibs__bit_manipulation +.. comp:: Bit Manipulation + :id: comp__baselibs_bit_manipulation :security: NO :safety: ASIL_B :status: valid diff --git a/docs/modules/baselibs/concurrency/docs/architecture/index.rst b/docs/modules/baselibs/concurrency/docs/architecture/index.rst index 7985d4393bd..e75498fe5ed 100644 --- a/docs/modules/baselibs/concurrency/docs/architecture/index.rst +++ b/docs/modules/baselibs/concurrency/docs/architecture/index.rst @@ -30,8 +30,8 @@ see :need:`doc__concurrency` Static Architecture ------------------- -.. comp_arc_sta:: Concurrency - :id: comp_arc_sta__baselibs__concurrency +.. comp:: Concurrency + :id: comp__baselibs_concurrency :security: YES :safety: ASIL_B :status: valid diff --git a/docs/modules/baselibs/containers/docs/architecture/index.rst b/docs/modules/baselibs/containers/docs/architecture/index.rst index 49c30994ea8..aee917240af 100644 --- a/docs/modules/baselibs/containers/docs/architecture/index.rst +++ b/docs/modules/baselibs/containers/docs/architecture/index.rst @@ -30,8 +30,8 @@ see :need:`doc__containers_architecture` Static Architecture ------------------- -.. comp_arc_sta:: Containers - :id: comp_arc_sta__baselibs__containers +.. comp:: Containers + :id: comp__baselibs_containers :security: YES :safety: ASIL_B :status: valid diff --git a/docs/modules/baselibs/docs/index.rst b/docs/modules/baselibs/docs/index.rst index a769b54cbe8..3d2d3802dd8 100644 --- a/docs/modules/baselibs/docs/index.rst +++ b/docs/modules/baselibs/docs/index.rst @@ -12,9 +12,16 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -.. mod_view_sta:: Baselibs +.. mod:: Baselibs + :id: mod__baselibs + :includes: comp__baselibs_json, comp__baselibs_message_passing, comp__baselibs_memory_shared, comp__baselibs_result, comp__baselibs_bit_manipulation, comp__baselibs_containers, comp__baselibs_filesystem, comp__baselibs_utils, comp__baselibs_concurrency + :status: valid + :safety: ASIL_B + :security: YES + +.. mod_view_sta:: Baselibs Static View :id: mod_view_sta__baselibs__baselibs - :includes: comp_arc_sta__baselibs__json, comp_arc_sta__baselibs__message_passing, comp_arc_sta__baselibs__memory_shared, comp_arc_sta__baselibs__result, comp_arc_sta__baselibs__bit_manipulation, comp_arc_sta__baselibs__containers, comp_arc_sta__baselibs__filesystem, comp_arc_sta__baselibs__utils, comp_arc_sta__baselibs__concurrency + :includes: comp__baselibs_json, comp__baselibs_message_passing, comp__baselibs_memory_shared, comp__baselibs_result, comp__baselibs_bit_manipulation, comp__baselibs_containers, comp__baselibs_filesystem, comp__baselibs_utils, comp__baselibs_concurrency .. needarch:: :scale: 50 diff --git a/docs/modules/baselibs/filesystem/docs/architecture/index.rst b/docs/modules/baselibs/filesystem/docs/architecture/index.rst index a6c3ba211e3..a2f52544a0b 100644 --- a/docs/modules/baselibs/filesystem/docs/architecture/index.rst +++ b/docs/modules/baselibs/filesystem/docs/architecture/index.rst @@ -29,8 +29,8 @@ see :need:`doc__filesystem` Static Architecture ------------------- -.. comp_arc_sta:: Filesystem - :id: comp_arc_sta__baselibs__filesystem +.. comp:: Filesystem + :id: comp__baselibs_filesystem :security: YES :safety: ASIL_B :status: valid diff --git a/docs/modules/baselibs/json/docs/architecture/index.rst b/docs/modules/baselibs/json/docs/architecture/index.rst index c0efce84bf7..936fd5349db 100644 --- a/docs/modules/baselibs/json/docs/architecture/index.rst +++ b/docs/modules/baselibs/json/docs/architecture/index.rst @@ -58,13 +58,21 @@ the main driver is to re-use existing implementation(s), enable switch of implem Static Architecture ------------------- -.. comp_arc_sta:: JSON - :id: comp_arc_sta__baselibs__json +.. comp:: JSON + :id: comp__baselibs_json :security: YES :safety: ASIL_B :status: valid :implements: logic_arc_int__baselibs__json - :includes: comp_arc_sta__baselibs__json_wrapper, comp_arc_sta__baselibs__nlohman_json + :consists_of: comp__baselibs_json_wrapper, comp__baselibs_nlohman_json + + +.. comp_arc_sta:: JSON Static view + :id: comp_arc_sta__baselibs__json + :security: YES + :safety: ASIL_B + :status: valid + :includes: comp__baselibs_json_wrapper, comp__baselibs_nlohman_json :fulfils: comp_req__json__deserialization, comp_req__json__serialization, comp_req__json__user_format, comp_req__json__lang_idioms, comp_req__json__lang_infra, comp_req__json__type_compatibility, comp_req__json__full_testability, comp_req__json__asil .. needarch:: @@ -119,17 +127,16 @@ Interfaces Lower Level Components ---------------------- -.. comp_arc_sta:: JSON-Wrapper - :id: comp_arc_sta__baselibs__json_wrapper +.. comp:: JSON-Wrapper + :id: comp__baselibs_json_wrapper :security: YES :safety: ASIL_B :status: valid :implements: logic_arc_int__baselibs__json - :fulfils: comp_req__json__user_format, comp_req__json__lang_idioms, comp_req__json__lang_infra, comp_req__json__type_compatibility, comp_req__json__full_testability, comp_req__json__serialization, comp_req__json__asil -.. comp_arc_sta:: nlohman-JSON - :id: comp_arc_sta__baselibs__nlohman_json + +.. comp:: nlohman-JSON + :id: comp__baselibs_nlohman_json :security: YES :safety: ASIL_B :status: valid - :fulfils: comp_req__json__deserialization, comp_req__json__asil diff --git a/docs/modules/baselibs/json/docs/json_wrapper/requirements/index.rst b/docs/modules/baselibs/json/docs/json_wrapper/requirements/index.rst index 7833ce180e1..115ef6d5d7e 100644 --- a/docs/modules/baselibs/json/docs/json_wrapper/requirements/index.rst +++ b/docs/modules/baselibs/json/docs/json_wrapper/requirements/index.rst @@ -28,4 +28,4 @@ The component split was done nevertheless, because "JSON Wrapper" is implemented "nlohman_json" is reused from open source. So the requirements for "JSON Wrapper" are documented in :need:`doc__json_requirements` -(all requirements which are "fulfilled_by" :need:`comp_arc_sta__baselibs__json_wrapper`) +(all requirements which are "fulfilled_by" :need:`comp__baselibs_json_wrapper`) diff --git a/docs/modules/baselibs/message_passing/docs/architecture/index.rst b/docs/modules/baselibs/message_passing/docs/architecture/index.rst index 9a5c760d7e5..cb791c123df 100644 --- a/docs/modules/baselibs/message_passing/docs/architecture/index.rst +++ b/docs/modules/baselibs/message_passing/docs/architecture/index.rst @@ -15,8 +15,8 @@ Message Passing Component Architecture ************************************** -.. comp_arc_sta:: Message Passing - :id: comp_arc_sta__baselibs__message_passing +.. comp:: Message Passing + :id: comp__baselibs_message_passing :security: YES :safety: ASIL_B :status: valid diff --git a/docs/modules/baselibs/result/docs/architecture/index.rst b/docs/modules/baselibs/result/docs/architecture/index.rst index 3699bc35bb1..ef02b36de68 100644 --- a/docs/modules/baselibs/result/docs/architecture/index.rst +++ b/docs/modules/baselibs/result/docs/architecture/index.rst @@ -30,8 +30,8 @@ see :need:`doc__result` Static Architecture ------------------- -.. comp_arc_sta:: Result - :id: comp_arc_sta__baselibs__result +.. comp:: Result + :id: comp__baselibs_result :security: YES :safety: ASIL_B :status: valid diff --git a/docs/modules/baselibs/result/docs/requirements/chklst_req_inspection.rst b/docs/modules/baselibs/result/docs/requirements/chklst_req_inspection.rst index 45b690fbb3d..339fbd41bb9 100644 --- a/docs/modules/baselibs/result/docs/requirements/chklst_req_inspection.rst +++ b/docs/modules/baselibs/result/docs/requirements/chklst_req_inspection.rst @@ -106,7 +106,7 @@ Requirement Inspection Checklist - Does the requirement consider *external interfaces*? - The SW platform's external interfaces (to the user) are defined in the Feature Architecture, so the Feature and Component Requirements should determine the input data use and setting of output data for these interfaces. Are all output values defined? - YES - - Fixed: This could be improved by using the interfaces defined in :need:`comp_arc_sta__baselibs__result` + - Fixed: This could be improved by using the interfaces defined in :need:`comp__baselibs_result` - `#2229 <https://github.com/eclipse-score/score/issues/2229>`_ * - REQ_07_01 - Is the *safety* attribute set correctly? diff --git a/docs/modules/baselibs/utils/docs/architecture/index.rst b/docs/modules/baselibs/utils/docs/architecture/index.rst index 986544ab444..5338606f6d3 100644 --- a/docs/modules/baselibs/utils/docs/architecture/index.rst +++ b/docs/modules/baselibs/utils/docs/architecture/index.rst @@ -29,8 +29,8 @@ see :need:`doc__utils` Static Architecture ------------------- -.. comp_arc_sta:: Utils - :id: comp_arc_sta__baselibs__utils +.. comp:: Utils + :id: comp__baselibs_utils :security: YES :safety: ASIL_B :status: valid From dcdd6a3d1a98a05fcf90fb409f1000f409c1e4b7 Mon Sep 17 00:00:00 2001 From: "jhr2hi@bosch.com" <roland.jentsch@etas.com> Date: Wed, 28 Jan 2026 17:59:25 +0100 Subject: [PATCH 166/214] add missing component --- .../baselibs/memory_shared/docs/architecture/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/modules/baselibs/memory_shared/docs/architecture/index.rst b/docs/modules/baselibs/memory_shared/docs/architecture/index.rst index 19ac0bb81e0..d5f0167b5ef 100644 --- a/docs/modules/baselibs/memory_shared/docs/architecture/index.rst +++ b/docs/modules/baselibs/memory_shared/docs/architecture/index.rst @@ -15,8 +15,8 @@ Memory Shared Component Architecture ************************************ -.. comp_arc_sta:: Memory Shared - :id: comp_arc_sta__baselibs__memory_shared +.. comp:: Memory Shared + :id: comp__baselibs_memory_shared :security: YES :safety: ASIL_B :status: valid From 2e7ec5c82213bc011a5bc3e9a82e6eb047ac1400 Mon Sep 17 00:00:00 2001 From: aschemmel-git <alexander.schemmel@bmw.de> Date: Fri, 21 Nov 2025 16:24:54 +0100 Subject: [PATCH 167/214] Baselibs Feat Arch Inspection Resolves: #2265 --- .../architecture/chklst_arc_inspection.rst | 122 +++++++++++------- .../baselibs/docs/architecture/index.rst | 1 + 2 files changed, 77 insertions(+), 46 deletions(-) diff --git a/docs/features/baselibs/docs/architecture/chklst_arc_inspection.rst b/docs/features/baselibs/docs/architecture/chklst_arc_inspection.rst index 01101981fad..03f3d3befa3 100644 --- a/docs/features/baselibs/docs/architecture/chklst_arc_inspection.rst +++ b/docs/features/baselibs/docs/architecture/chklst_arc_inspection.rst @@ -18,7 +18,7 @@ Architecture Inspection Checklist .. document:: Baselibs Architecture Inspection Checklist :id: doc__baselibs_arc_inspection - :status: draft + :status: valid :safety: ASIL_B :security: YES :realizes: wp__sw_arch_verification @@ -33,15 +33,27 @@ practices. The checklist guides evaluation of the architecture design, identifies potential problems, and aids in communication and documentation of architectural decisions to stakeholders. +Conduct +------- + +As described in the concept :need:`doc_concept__wp_inspections` the following "inspection roles" are expected to be filled: + +- content responsible (author): `<https://github.com/4og>`_ +- reviewer: `<https://github.com/aschemmel-tech>`_ +- moderator: only needed for conflict resolution between author and reviewers, is the safety manager, security manager or quality manager called in as a reviewer (can be derived from version mgt tool) + Checklist --------- +It is mandatory to fill in the "passed" column with "yes" or "no" for each checklist item and additionally to add in the remarks why it is passed or not passed. +In case of "no" an issue link to the issue tracking system has to be added in the last column (if not solved in the same issue). +See also :need:`doc_concept__wp_inspections` for further information about reviews in general and inspection in particular. + .. list-table:: Architecture Design Review Checklist :header-rows: 1 * - Review Id - Acceptance criteria - - Type - Guidance - passed - Remarks @@ -49,107 +61,125 @@ Checklist * - ARC_01_01 - Is the traceability from software architectural elements to requirements, and other level architectural elements (e.g. component to interface) established according to the "Relations between the architectural elements" as described in :need:`doc_concept__arch_process`? - - automated - - Trace should be checked by Sphinx. Will be removed from checklist once requirement is implemented. - - - - - - + - Trace should be checked automatically by tool support in the future. It will be removed from the checklist once the requirement (:need:`Correlations of the architectural building blocks <gd_req__arch_build_blocks_corr>`) is implemented. Refer to `Tool Requirements <https://eclipse-score.github.io/docs-as-code/main/internals/requirements/requirements.html>`_ for the current status. + - NO + - Several functional feature requirements are not linked to the baselibs feature architecture. + - `#2265 <https://github.com/eclipse-score/score/issues/2265>`_ * - ARC_01_02 - If the architectural element is related to any supplier manuals (incl. safety and security) are the relevant parts covered? - - manual - If the architecture makes use of supplied elements, their manuals (like safety) have to be considered (i.e. its provided functionality matches the expectation and assumptions are fulfilled). Note that in case of safety component this means that assumed Technical Safety Requirements and AoUs of the safety manual are covered. - - - - + - YES + - Baselibs uses OS. S-CORE's reference OS safety manual was considered during development, but cannot be published in this open source project - * - ARC_01_03 - Is the architectural element traceable to the lower level artifacts as defined by the workproduct traceability? - - automated - - Will be removed from checklist once requirement is implemented by automated tool check. + - Will be removed from checklist once the requirement (:need:`Correlations of the architectural building blocks <gd_req__arch_build_blocks_corr>`) is implemented by automated tool check. See `Tool Requirements <https://eclipse-score.github.io/docs-as-code/main/internals/requirements/requirements.html>`_. Details of possible linking can be depicted from `traceability concept <https://eclipse-score.github.io/process_description/main/general_concepts/score_traceability_concept.html>`_ - - - - + - YES + - Baselibs feature architecture includes logic interfaces, these can be used to link to components (see static view :need:`feat_arc_sta__baselibs__static_view_arch`) - * - ARC_02_01 - Is the software architecture design compliant with the (overall) feature architecture? - - manual - On component level check against the feature architecture, on feature level check other features with common components used. - - - - + - YES + - Shared module is the OS, which is designed to work with multiple components using it. - * - ARC_02_02 - Is appropriate and comprehensible operation/interface naming present in the architectural design? - - manual - Check :need:`gd_guidl__arch_design` - - - - + - YES + - Interfaces and operations names are abstract but sufficient for understanding. - * - ARC_02_03 - Are correctness of data flow and control flow within the architectural elements considered? - - manual - E.g. examine definitions, transformations, integrity, and interaction of data; check error handling, data exchange between elements, correct response to inputs and documented decision making. Note: consistency is ensured by the process/tooling, by defining each interface only once. - - - - + - YES + - There is no control/data flow between baselibs components (each of it is stand-alone), so no sequence diagram needed. - * - ARC_02_04 - Are the interfaces between the software architectural element and other architectural elements well-defined? - - manual - Check if the interface reacts on non-defined behavior or errors; can established protocols be used; are the interfaces for inputs, outputs, error codes documented; is loose coupling considered and only limited exposure; can unit or integration test be written against the interface; data amount transferred; no sensitive data exposure; - - - - - - + - NO + - Errors are generally managed by the "Result" component (ok) + If an operation is an input or an output is not shown (nok) + Libraries are split in logical way, enable testing, data amount and sensitivity is not an issue. Maybe with the exception of JSON - add a AoU here? + - `#2265 <https://github.com/eclipse-score/score/issues/2265>`_ * - ARC_02_05 - Does the software architectural element consider the timing constraints (from the parent requirement)? - - manual - If there are hard requirements on the timing a programming time estimation should be performed and also deadline supervision considered. - - - - + - YES + - As the functionalities are quite small, timing should not be a problem. No requirements on timing for baselibs. - * - ARC_02_06 - Is the documentation of the software architectural element, including textual and graphical descriptions (e.g., UML diagrams), comprehensible and complete? - - manual - Use of semi-formal notation is expected for architectural elements with an allocated ASIL level. Is the architecture template correctly filled? - - - - - - + - NO + - Architecture template: Requirements section missing, but this is covered by Static View linking, Module View not needed (same as Feature Static View) (ok) + Semi-Formal Notation used (ok) + Mismatch between libraries mentioned in "Description" and the ones depicted in Static View (this also does not match with the 0.5 planning/release note) and also not matching feature request https://eclipse-score.github.io/score/main/features/baselibs/index.html (nok) + - `#2265 <https://github.com/eclipse-score/score/issues/2265>`_ * - ARC_03_01 - Is the architectural element modular and encapsulated? - - manual - Check e.g. that only minimal interfaces are used. Design should be object oriented. Interfaces and interactions are clearly defined. Usage of access types (private, protected) properly set. Limited global variables. - - - - + - YES + - small functionality - * - ARC_03_02 - Is the suitability of the software architecture for future modifications and maintainability considered? - - manual - Check for e.g. loose coupling, separation of concerns, high cohesion, versioning strategy for interfaces, decision records, use of established design patterns. - - - - + - YES + - Nothing which can be seen in the architecture documentation speaks against this. - * - ARC_03_03 - Are simplicity and avoidance of unnecessary complexity present in the software architecture? - - manual - Indicators for complexity are: number of use cases (corresponding to dynamic diagrams) allocated to single design element, number of interfaces and operations in an interface, function parameters, global variables, complex types, limited comprehensibility. Note: If the "number" above exceeds "3" a design rationale is mandatory (for all types) - - - - + - YES + - Baselibs is just a big container for globally shared library functions - thus offers a lot of (unconnected) interfaces. - * - ARC_03_04 - Is the software architecture design following best practices and design principles? - - manual - Refer to architectural guidelines and recommendations within the project documentation. + - YES + - Guideline :need:`gd_guidl__arch_design` is followed, template usage checked in ARC_02_06, some design principles already checked in ARC_03_02, no additional recommendations in the project's PMP - - - - - + +.. attention:: + The above checklist entries must be filled according to your feature architecture in scope. + +Note: If a Review ID is not applicable for your architecture, then state ""n/a" in status and comment accordingly in remarks. + +The following static views in "valid" state and with "inspected" tag set are in the scope of this inspection: + +.. needtable:: + :filter: "baselibs" in docname and "architecture" in docname and docname is not None and status == "valid" + :style: table + :types: feat_arc_sta + :tags: baselibs + :columns: id;status;tags + :colwidths: 25,25,25 + :sort: title + +and the following dynamic views: + +.. needtable:: + :filter: "baselibs" in docname and "architecture" in docname and docname is not None and status == "valid" + :style: table + :types: feat_arc_dyn + :tags: baselibs + :columns: id;status;tags + :colwidths: 25,25,25 + :sort: title diff --git a/docs/features/baselibs/docs/architecture/index.rst b/docs/features/baselibs/docs/architecture/index.rst index 6e2712c6776..6df28e053ec 100644 --- a/docs/features/baselibs/docs/architecture/index.rst +++ b/docs/features/baselibs/docs/architecture/index.rst @@ -91,6 +91,7 @@ Static Architecture :status: valid :fulfils: feat_req__baselibs__core_utilities :includes: logic_arc_int__baselibs__json, logic_arc_int__baselibs__memory_shared, logic_arc_int__baselibs__message_passing, logic_arc_int__baselibs__result, logic_arc_int__baselibs__bit_manipulation, logic_arc_int__baselibs__bit_mask_operator, logic_arc_int__baselibs__dynamic_array, logic_arc_int__baselibs__intrusive_list, logic_arc_int__baselibs__filesystem, logic_arc_int__baselibs__utils_base64, logic_arc_int__baselibs__utils_scoped_op, logic_arc_int__baselibs__promise, logic_arc_int__baselibs__future, logic_arc_int__baselibs__shared_future, logic_arc_int__baselibs__executor, logic_arc_int__baselibs__task, logic_arc_int__baselibs__task_result, logic_arc_int__baselibs__synchronized_queue, logic_arc_int__baselibs__condition_variable + :tags: inspected .. needarch:: :scale: 50 From cefc4b50c74e93a8a1a73b45d09eec91b55ba337 Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Tue, 27 Jan 2026 13:53:07 +0100 Subject: [PATCH 168/214] update quality manager election --- .../platform_quality_manager.rst | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/docs/platform_management_plan/role_assignment/platform_quality_manager.rst b/docs/platform_management_plan/role_assignment/platform_quality_manager.rst index 10254ac3110..45d123cd560 100644 --- a/docs/platform_management_plan/role_assignment/platform_quality_manager.rst +++ b/docs/platform_management_plan/role_assignment/platform_quality_manager.rst @@ -29,6 +29,8 @@ For the platform quality management a pool of quality managers is elected due to `Markus Schu <https://github.com/masc2023>`_ +`Volker Häussler <https://github.com/PandaDo>`_ + Election Reasoning ================== @@ -64,12 +66,34 @@ S-CORE Commits: - major committer in `score repository <https://github.com/eclipse-score/score>`_ +Evidences Volker Häussler +------------------------- + +`LinkedIn Profile <https://www.linkedin.com/in/volker-h%C3%A4ussler-58a840111/details/experience/>`_ + +Quality Management Experiences: + +- Head of Competence for Functional Safety from 2018 to 2024 + +Experiences for Safety and Security Management can be found here: +:need:`doc__platform_safety_manager` and :need:`doc__platform_safety_engineer`. + +Education and Skills: + +- Dipl.-Ing. (FH) Electrical Engineering - certificate +- Safety related development at system, software and hardware level > 10 years - letters of recommendation from employers + +S-CORE Commits: + +- committer in `process_description repository <https://github.com/eclipse-score/process_description>`_ +- committer in `score repository <https://github.com/eclipse-score/score>`_ + Election ======== For the election further Committers with similar skills are asked for approval: -- `<https://github.com/PandaeDo>`_ +- `<https://github.com/masc2023>`_ - `<https://github.com/pahmann>`_ From f08ce6f74aac72b7a36ebf7427c591c772d902aa Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Thu, 29 Jan 2026 08:03:54 +0100 Subject: [PATCH 169/214] include review findings --- .../role_assignment/platform_quality_manager.rst | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/platform_management_plan/role_assignment/platform_quality_manager.rst b/docs/platform_management_plan/role_assignment/platform_quality_manager.rst index 45d123cd560..dc437a4914c 100644 --- a/docs/platform_management_plan/role_assignment/platform_quality_manager.rst +++ b/docs/platform_management_plan/role_assignment/platform_quality_manager.rst @@ -91,11 +91,9 @@ S-CORE Commits: Election ======== -For the election further Committers with similar skills are asked for approval: +For the election Quality Managers are asked for approval: - `<https://github.com/masc2023>`_ -- `<https://github.com/pahmann>`_ - The election is performed by approving the pull request of this document. The nominee is elected if more than half of the above committers in the list approved and nobody "request changes". From 6d72b8a8ece6b24df61cc9e908c9866a1de7e2cb Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Thu, 29 Jan 2026 12:33:40 +0100 Subject: [PATCH 170/214] correct election description --- .../role_assignment/platform_quality_manager.rst | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/platform_management_plan/role_assignment/platform_quality_manager.rst b/docs/platform_management_plan/role_assignment/platform_quality_manager.rst index dc437a4914c..c251798bc3b 100644 --- a/docs/platform_management_plan/role_assignment/platform_quality_manager.rst +++ b/docs/platform_management_plan/role_assignment/platform_quality_manager.rst @@ -91,10 +91,16 @@ S-CORE Commits: Election ======== -For the election Quality Managers are asked for approval: +For the election the following Committers already elected as quality managers are asked: + +Elected quality managers: - `<https://github.com/masc2023>`_ +For the election further Committers with similar skills are asked for approval: + +- `<https://github.com/pahmann>`_ + The election is performed by approving the pull request of this document. The nominee is elected if more than half of the above committers in the list approved and nobody "request changes". Nominees are not allowed to vote for themselves. From 0d0cd3011c07eacccf9a74d79022a48a20800e94 Mon Sep 17 00:00:00 2001 From: Dan Calavrezo <195309321+dcalavrezo-qorix@users.noreply.github.com> Date: Tue, 20 Jan 2026 13:05:23 +0200 Subject: [PATCH 171/214] clippy: added decision record on how to integrate clippy Decision record document for clippy Signed-off-by: Dan Calavrezo <195309321+dcalavrezo-qorix@users.noreply.github.com> --- docs/design_decisions/DR-006-infra.md | 84 +++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 docs/design_decisions/DR-006-infra.md diff --git a/docs/design_decisions/DR-006-infra.md b/docs/design_decisions/DR-006-infra.md new file mode 100644 index 00000000000..a1c18306886 --- /dev/null +++ b/docs/design_decisions/DR-006-infra.md @@ -0,0 +1,84 @@ +<!-- +Copyright (c) 2026 Contributors to the Eclipse Foundation + +See the NOTICE file(s) distributed with this work for additional +information regarding copyright ownership. + +This program and the accompanying materials are made available under the +terms of the Apache License Version 2.0 which is available at +https://www.apache.org/licenses/LICENSE-2.0 + +SPDX-License-Identifier: Apache-2.0 +--> + +# DR-006-Infra: Clippy Integration via rules_lint + +- **Date:** 2026-01-19 + +```{dec_rec} Clippy Integration via rules_lint +:id: dec_rec__infra__clippy_rules_lint +:status: accepted +:context: Infrastructure +:decision: Use rules_lint for Clippy in S-CORE modules +``` + +--- + +## 1. Context / Problem + +S-CORE needs a consistent, Bazel-native way to run Rust Clippy across modules. We +initially aligned on rules_rust for Clippy integration, but rules_lint added native +Clippy support while that work was ongoing. We must choose one approach to reduce +divergence and keep lint workflows maintainable. + +Key constraints: +- Avoid running Clippy across the entire tree by default. +- Avoid maintaining long, manual target lists. +- Keep lint rules centralized and versioned. +- Allow CI-friendly lint runs without additional tooling requirements. + +## 2. Decision + +We adopt rules_lint for Clippy integration in S-CORE modules. + +## 3. Rationale + +rules_lint fits better with the linting workflow: +- It is designed for linting (output groups, lint tests, lint-oriented UX). +- It avoids whole-tree runs and manual target lists by linting only the build graph + of requested targets. +- Clippy support is released and tested, which reduces risk. + +rules_rust remains a valid option, but it requires manual target enumeration for +lint-only runs and is harder to scope for incremental linting. + +## 4. Integration Approach + +Each module integrates Clippy through a rules_lint aspect: +- Use the shared aspect from `@score_rust_policies//clippy:linters.bzl` + (repo-local aspects remain an option if needed). +- Reference the centralized Clippy configuration from the policies repo: + `@score_rust_policies//clippy/strict:clippy.toml`. +- Enable the aspect in `.bazelrc` via `build --aspects=...%clippy` and request + output groups `rules_lint_human` (and optionally `rules_lint_machine`). +- Skip linting for specific targets using the `no-lint` tag. +- For CI, add `--@aspect_rules_lint//lint:fail_on_violation=true` to fail on findings. +- Use `aspect_rules_lint` >= `2.0.0-rc0` to support `fail_on_violation` with Clippy. + +This keeps configuration and behavior consistent while allowing each module to scope +linting to the targets it builds. + +## 5. Consequences + +- Clippy runs on the Rust targets in the build graph of the requested Bazel targets, + not the whole repository by default. +- Lint rules are centralized in `score_rust_policies`, reducing duplication and drift. +- The Aspect CLI is not required for Clippy execution; standard `bazel build` works. +- rules_lint uses Aspect telemetry; this can be disabled via repo environment + variables if required by policy. + +## 6. Future Considerations + +We may integrate the Aspect CLI in the future to enable the `bazel lint` command and +additional lint UX (interactive output, filtering, reporting). This is optional and +separate from the Bazel-based execution path. From e799ef7df6b08f20cec73fe57d91975782754bf0 Mon Sep 17 00:00:00 2001 From: sachinkumarsingh <SachinKumar.Singh@bti.bmwgroup.com> Date: Fri, 30 Jan 2026 19:28:12 +0530 Subject: [PATCH 172/214] component description static reflection with serialization library --- .../docs/index.rst | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 docs/modules/baselibs/static_reflection_with_serialization/docs/index.rst diff --git a/docs/modules/baselibs/static_reflection_with_serialization/docs/index.rst b/docs/modules/baselibs/static_reflection_with_serialization/docs/index.rst new file mode 100644 index 00000000000..3fc2907a443 --- /dev/null +++ b/docs/modules/baselibs/static_reflection_with_serialization/docs/index.rst @@ -0,0 +1,44 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +static_reflection_with_serialization +#################################### + +.. document:: Static Reflection With Serialization Library + :id: doc__static_reflection_with_serialization + :status: draft + :safety: ASIL_B + :tags: baselibs_static_reflection_with_serialization + :realizes: wp__cmpt_request + :security: YES + +.. toctree:: + :hidden: + +Abstract +========= + +This component request proposes a static reflection with serialization library, which provides compile-time visitor pattern +mechanisms and binary serialization capabilities for the S-CORE software platform. The library enables type-safe object +traversal, struct introspection, and efficient data serialization or deserialization. + +Motivation and Rationale +========================= + +The static reflection with serialization library shall provide mechanism for: + +- **Compile-time visitor pattern**: Type-safe traversal of heterogeneous data structures and their nested members using template metaprogramming. +- **Struct introspection**: Automatic field enumeration and metadata extraction for aggregate types. +- **Binary serialization**: Efficient serialization and deserialization of C++ objects with size calculation and type safety. +- **Extensible processing**: Custom visitor implementations for domain-specific operations (logging, IPC, persistence). From 2c04b45dd6eb69d936b25fc73df206871637e50b Mon Sep 17 00:00:00 2001 From: rahulthakre <rahul.thakre@bti.bmwgroup.com> Date: Thu, 22 Jan 2026 16:58:01 +0530 Subject: [PATCH 173/214] lib/concurrency: Add Component Requirement --- .../baselibs/docs/requirements/index.rst | 10 + .../baselibs/concurrency/docs/index.rst | 1 + .../concurrency/docs/requirements/index.rst | 184 ++++++++++++++++++ 3 files changed, 195 insertions(+) create mode 100644 docs/modules/baselibs/concurrency/docs/requirements/index.rst diff --git a/docs/features/baselibs/docs/requirements/index.rst b/docs/features/baselibs/docs/requirements/index.rst index efb9141ecd6..caea7d05981 100644 --- a/docs/features/baselibs/docs/requirements/index.rst +++ b/docs/features/baselibs/docs/requirements/index.rst @@ -142,5 +142,15 @@ Requirements The baselibs shall provide a memory management library that includes utilities for shared memory operations, polymorphic memory resources, position-independent pointers, endianness conversion, and inter-process synchronization mechanisms. +.. feat_req:: Concurrency Library + :id: feat_req__baselibs__concurrency_library + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__functional_req__base_libraries + :status: valid + + The base libraries shall provide a library for parallel execution of C++ callables with thread pool management. + .. needextend:: "__baselibs" in id :+tags: baselibs diff --git a/docs/modules/baselibs/concurrency/docs/index.rst b/docs/modules/baselibs/concurrency/docs/index.rst index a18749ff317..eee90a4cbc2 100644 --- a/docs/modules/baselibs/concurrency/docs/index.rst +++ b/docs/modules/baselibs/concurrency/docs/index.rst @@ -27,6 +27,7 @@ concurrency :hidden: architecture/index.rst + requirements/index.rst Abstract ======== diff --git a/docs/modules/baselibs/concurrency/docs/requirements/index.rst b/docs/modules/baselibs/concurrency/docs/requirements/index.rst new file mode 100644 index 00000000000..0d44adf920e --- /dev/null +++ b/docs/modules/baselibs/concurrency/docs/requirements/index.rst @@ -0,0 +1,184 @@ + +.. + # ******************************************************************************* + # Copyright (c) 2026 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +Requirements +############ + +.. document:: Concurrency Requirements + :id: doc__concurrency_requirements + :status: draft + :safety: ASIL_B + :security: YES + :realizes: wp__requirements_comp + :tags: requirements, concurrency + +Functional Requirements +======================= + +.. comp_req:: Task Abstraction Interface + :id: comp_req__concurrency__task_interface + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__core_utilities, feat_req__baselibs__safety + :status: valid + + The concurrency module shall provide interface that wraps callable objects for asynchronous execution, accepting a stop_token for cooperative cancellation and supporting move semantics. + +.. comp_req:: Simple Task Implementation + :id: comp_req__concurrency__simple_task + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__core_utilities, feat_req__baselibs__safety + :status: valid + + The concurrency module shall provide implementation for executing callable objects without returning results, supporting fire-and-forget asynchronous operations. + +.. comp_req:: Task Result Management + :id: comp_req__concurrency__task_result + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__safety + :status: valid + + The concurrency module shall provide implementation to access the result of an asynchronously running task or to request aborting the task when the result is no longer needed. + +.. comp_req:: Periodic Task Execution + :id: comp_req__concurrency__periodic_task + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__safety + :status: valid + + The concurrency module shall provide implementation for executing callable objects at regular intervals with configurable first execution time and period duration. + +.. comp_req:: Delayed Task Execution + :id: comp_req__concurrency__delayed_task + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__safety + :status: valid + + The concurrency module shall provide implementation for executing callable objects after a specified delay with support for early cancellation. + +.. comp_req:: Executor Interface + :id: comp_req__concurrency__executor_interface + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__consistent_apis + :status: valid + + The concurrency module shall provide interface defining a common API for task submission operations, graceful shutdown, and maximum concurrency level reporting. + +.. comp_req:: Thread Pool Implementation + :id: comp_req__concurrency__thread_pool + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__safety + :status: valid + + The concurrency module shall provide implementation that manages submitted tasks in FIFO order with thread-safe queue operations using condition variables for efficient worker thread wake-up. + +.. comp_req:: Interruptible Condition Variable + :id: comp_req__concurrency__condition_variable + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__safety + :status: valid + + The concurrency module shall provide implementation that allocates a fixed number of threads at construction time and distributes tasks across worker threads with a dynamic task queue. + +.. comp_req:: Interruptible Wait Utilities + :id: comp_req__concurrency__interruptible_wait + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__safety + :status: valid + + The concurrency module shall provide utilities offering simplified APIs for sleep operations. + +.. comp_req:: Destruction Guard + :id: comp_req__concurrency__destruction_guard + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__safety + :status: valid + + The concurrency module shall provide a mechanism to safely detect when an object has been destroyed to prevent accessing it from multiple threads. + +.. comp_req:: Notification Mechanism + :id: comp_req__concurrency__notification + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__safety + :status: valid + + The concurrency module shall allow one thread to notify another thread once, with a timeout option. + +.. comp_req:: Synchronized Queue + :id: comp_req__concurrency__synchronized_queue + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__safety + :status: valid + + The concurrency module shall provide a thread-safe queue where multiple threads can add items and one thread can remove them, with a maximum size limit and optional waiting. + +.. comp_req:: Long-Running Threads Container + :id: comp_req__concurrency__long_running_threads + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__safety + :status: valid + + The concurrency module shall provide a container for managing long-running threads, allowing addition and removal of threads. + +Non-Functional Requirements +=========================== + +.. comp_req:: Resource Determinism + :id: comp_req__concurrency__resource_determinism + :reqtype: Non-Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__concurrency_library + :status: valid + + The concurrency module shall limit memory usage, allow reserving memory upfront for tasks, report the maximum number of concurrent threads, and use timeouts to prevent operations from waiting forever. + +.. comp_req:: Exception Safety + :id: comp_req__concurrency__exception_safety + :reqtype: Non-Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__concurrency_library + :status: valid + + The concurrency module shall maintain strong exception safety guarantees where possible, propagate exceptions from tasks through futures, never leak resources in exception paths, and mark destructors as noexcept. + +.. needextend:: "__concurrency" in id + :+tags: concurrency From cc5d65ac838d2d7f8813a757335f17b1a0242d62 Mon Sep 17 00:00:00 2001 From: rahulthakre <rahul.thakre@bti.bmwgroup.com> Date: Tue, 27 Jan 2026 12:02:10 +0530 Subject: [PATCH 174/214] lib/concurrency: fixed review comments --- .../concurrency/docs/requirements/index.rst | 42 ++++++++++++++++--- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/docs/modules/baselibs/concurrency/docs/requirements/index.rst b/docs/modules/baselibs/concurrency/docs/requirements/index.rst index 0d44adf920e..32bcae7d2fb 100644 --- a/docs/modules/baselibs/concurrency/docs/requirements/index.rst +++ b/docs/modules/baselibs/concurrency/docs/requirements/index.rst @@ -160,25 +160,55 @@ Functional Requirements Non-Functional Requirements =========================== -.. comp_req:: Resource Determinism - :id: comp_req__concurrency__resource_determinism +.. comp_req:: Memory Usage Control + :id: comp_req__concurrency__memory_usage_control :reqtype: Non-Functional :security: NO :safety: ASIL_B :satisfies: feat_req__baselibs__concurrency_library :status: valid - The concurrency module shall limit memory usage, allow reserving memory upfront for tasks, report the maximum number of concurrent threads, and use timeouts to prevent operations from waiting forever. + The concurrency module shall limit memory usage to prevent uncontrolled resource consumption. -.. comp_req:: Exception Safety - :id: comp_req__concurrency__exception_safety +.. comp_req:: Memory Reservation + :id: comp_req__concurrency__memory_reservation :reqtype: Non-Functional :security: NO :safety: ASIL_B :satisfies: feat_req__baselibs__concurrency_library :status: valid - The concurrency module shall maintain strong exception safety guarantees where possible, propagate exceptions from tasks through futures, never leak resources in exception paths, and mark destructors as noexcept. + The concurrency module shall allow reserving memory upfront for tasks to ensure predictable resource allocation. + +.. comp_req:: Thread Count Reporting + :id: comp_req__concurrency__thread_count_reporting + :reqtype: Non-Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__concurrency_library + :status: valid + + The concurrency module shall report the maximum number of concurrent threads available for task execution. + +.. comp_req:: Operation Timeout Protection + :id: comp_req__concurrency__operation_timeout + :reqtype: Non-Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__concurrency_library + :status: valid + + The concurrency module shall use timeouts to prevent operations from waiting forever. + +.. comp_req:: Future Error Handling + :id: comp_req__concurrency__error_handling + :reqtype: Non-Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__concurrency_library + :status: valid + + The concurrency module shall use error codes instead of throwing exceptions. .. needextend:: "__concurrency" in id :+tags: concurrency From 31ba31e5e4580af3817043f7a59a3ed6f609223f Mon Sep 17 00:00:00 2001 From: rahulthakre <rahul.thakre@bti.bmwgroup.com> Date: Tue, 3 Feb 2026 11:39:21 +0530 Subject: [PATCH 175/214] lib/concurrency : Resolve additional review comment --- .../concurrency/docs/requirements/index.rst | 22 +++++-------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/docs/modules/baselibs/concurrency/docs/requirements/index.rst b/docs/modules/baselibs/concurrency/docs/requirements/index.rst index 32bcae7d2fb..5e29539d575 100644 --- a/docs/modules/baselibs/concurrency/docs/requirements/index.rst +++ b/docs/modules/baselibs/concurrency/docs/requirements/index.rst @@ -35,7 +35,7 @@ Functional Requirements :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__core_utilities, feat_req__baselibs__safety :status: valid - The concurrency module shall provide interface that wraps callable objects for asynchronous execution, accepting a stop_token for cooperative cancellation and supporting move semantics. + The concurrency module shall allow running tasks asynchronously and cancelling them when needed. .. comp_req:: Simple Task Implementation :id: comp_req__concurrency__simple_task @@ -95,7 +95,7 @@ Functional Requirements :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__safety :status: valid - The concurrency module shall provide implementation that manages submitted tasks in FIFO order with thread-safe queue operations using condition variables for efficient worker thread wake-up. + The concurrency module shall provide implementation that manages submitted tasks in FIFO order. .. comp_req:: Interruptible Condition Variable :id: comp_req__concurrency__condition_variable @@ -105,7 +105,7 @@ Functional Requirements :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__safety :status: valid - The concurrency module shall provide implementation that allocates a fixed number of threads at construction time and distributes tasks across worker threads with a dynamic task queue. + The concurrency module shall provide mechanism for threads to wait for conditions that can be interrupted when needed. .. comp_req:: Interruptible Wait Utilities :id: comp_req__concurrency__interruptible_wait @@ -115,17 +115,7 @@ Functional Requirements :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__safety :status: valid - The concurrency module shall provide utilities offering simplified APIs for sleep operations. - -.. comp_req:: Destruction Guard - :id: comp_req__concurrency__destruction_guard - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__safety - :status: valid - - The concurrency module shall provide a mechanism to safely detect when an object has been destroyed to prevent accessing it from multiple threads. + The concurrency module shall provide utilities offering APIs for sleep operations allowing early cancellation. .. comp_req:: Notification Mechanism :id: comp_req__concurrency__notification @@ -145,7 +135,7 @@ Functional Requirements :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__safety :status: valid - The concurrency module shall provide a thread-safe queue where multiple threads can add items and one thread can remove them, with a maximum size limit and optional waiting. + The concurrency module shall provide a thread-safe container facilitating FIFO transmission of data in a N:1 communication pattern. .. comp_req:: Long-Running Threads Container :id: comp_req__concurrency__long_running_threads @@ -198,7 +188,7 @@ Non-Functional Requirements :satisfies: feat_req__baselibs__concurrency_library :status: valid - The concurrency module shall use timeouts to prevent operations from waiting forever. + The concurrency module shall avoid indefinitely blocking, unabortable operations. .. comp_req:: Future Error Handling :id: comp_req__concurrency__error_handling From 1c3765646f5ce01bca05c110780f2b58fa3fbc41 Mon Sep 17 00:00:00 2001 From: rahulthakre <rahul.thakre@bti.bmwgroup.com> Date: Tue, 3 Feb 2026 13:30:32 +0530 Subject: [PATCH 176/214] lib/concurrency: fix follow-up review comments --- .../concurrency/docs/requirements/index.rst | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/docs/modules/baselibs/concurrency/docs/requirements/index.rst b/docs/modules/baselibs/concurrency/docs/requirements/index.rst index 5e29539d575..e18d74fa0d5 100644 --- a/docs/modules/baselibs/concurrency/docs/requirements/index.rst +++ b/docs/modules/baselibs/concurrency/docs/requirements/index.rst @@ -27,7 +27,7 @@ Requirements Functional Requirements ======================= -.. comp_req:: Task Abstraction Interface +.. comp_req:: Asynchronous Task Execution :id: comp_req__concurrency__task_interface :reqtype: Functional :security: NO @@ -35,7 +35,17 @@ Functional Requirements :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__core_utilities, feat_req__baselibs__safety :status: valid - The concurrency module shall allow running tasks asynchronously and cancelling them when needed. + The concurrency module shall allow running tasks asynchronously. + +.. comp_req:: Task Cancellation + :id: comp_req__concurrency__task_cancellation + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__core_utilities, feat_req__baselibs__safety + :status: valid + + The concurrency module shall allow cancelling tasks when needed. .. comp_req:: Simple Task Implementation :id: comp_req__concurrency__simple_task @@ -105,7 +115,7 @@ Functional Requirements :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__safety :status: valid - The concurrency module shall provide mechanism for threads to wait for conditions that can be interrupted when needed. + The concurrency module shall provide an abortable mechanism for threads to wait for conditions. .. comp_req:: Interruptible Wait Utilities :id: comp_req__concurrency__interruptible_wait From a2a4937a6c7a1838932b269377f75d4ec442bc5a Mon Sep 17 00:00:00 2001 From: RolandJentschETAS <135332348+RolandJentschETAS@users.noreply.github.com> Date: Thu, 5 Feb 2026 09:57:24 +0100 Subject: [PATCH 177/214] chore: update docs-as-code (#2542) --- MODULE.bazel | 8 +++--- .../baselibs/docs/architecture/index.rst | 1 + .../communication/docs/architecture/index.rst | 1 + .../ipc/docs/architecture/index.rst | 1 + .../feo/architecture/feature_architecture.rst | 10 +++++++ .../lifecycle/architecture/health_monitor.rst | 2 ++ .../lifecycle/architecture/launch_manager.rst | 3 +++ docs/features/lifecycle/index.rst | 8 ++++++ .../orchestration/architecture/index.rst | 1 + .../persistency/architecture/index.rst | 27 ++++++++++++++++++- .../docs/requirements/index.rst | 4 +++ .../concurrency/docs/requirements/index.rst | 18 +++++++++++++ .../containers/docs/requirements/index.rst | 6 +++++ .../filesystem/docs/requirements/index.rst | 7 +++++ .../baselibs/json/docs/architecture/index.rst | 3 ++- .../baselibs/json/docs/requirements/index.rst | 8 ++++++ .../memory_shared/docs/requirements/index.rst | 13 +++++++++ .../result/docs/requirements/index.rst | 7 +++++ .../utils/docs/requirements/index.rst | 3 +++ .../frontent/docs/architecture/index.rst | 3 ++- .../architecture/component_architecture.rst | 10 ++++++- .../requirements/component_requirements.rst | 3 +++ docs/modules/lifecycle/index.rst | 16 +++++++++++ docs/modules/logging/docs/index.rst | 10 ++++++- .../logging/docs/architecture/index.rst | 9 ++++++- .../executor/docs/architecture/index.rst | 2 ++ .../orchestrator/docs/architecture/index.rst | 3 ++- docs/modules/os/docs/index.rst | 10 +++++-- .../os/libc/docs/architecture/index.rst | 10 ++++++- .../docs/architecture/index.rst | 13 +++++++-- docs/modules/tracing/docs/index.rst | 10 ++++++- .../tracing/docs/architecture/index.rst | 11 +++++++- 32 files changed, 223 insertions(+), 18 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 42443a3a221..d0015987115 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -22,7 +22,7 @@ module( # Python version # ############################################################################### -bazel_dep(name = "rules_python", version = "1.4.1") +bazel_dep(name = "rules_python", version = "1.8.3") PYTHON_VERSION = "3.12" @@ -72,6 +72,6 @@ bazel_dep(name = "rules_java", version = "8.15.1") # Score custom modules loading # ############################################################################### -bazel_dep(name = "score_tooling", version = "1.0.4") -bazel_dep(name = "score_docs_as_code", version = "2.3.3") -bazel_dep(name = "score_process", version = "1.4.2") +bazel_dep(name = "score_tooling", version = "1.1.0") +bazel_dep(name = "score_docs_as_code", version = "3.0.0") +bazel_dep(name = "score_process", version = "1.4.3") diff --git a/docs/features/baselibs/docs/architecture/index.rst b/docs/features/baselibs/docs/architecture/index.rst index c5c0b0988c5..a353a3a990e 100644 --- a/docs/features/baselibs/docs/architecture/index.rst +++ b/docs/features/baselibs/docs/architecture/index.rst @@ -100,6 +100,7 @@ Static Architecture :fulfils: feat_req__baselibs__core_utilities :includes: logic_arc_int__baselibs__json, logic_arc_int__baselibs__memory_shared, logic_arc_int__baselibs__message_passing, logic_arc_int__baselibs__result, logic_arc_int__baselibs__bit_manipulation, logic_arc_int__baselibs__bit_mask_operator, logic_arc_int__baselibs__dynamic_array, logic_arc_int__baselibs__intrusive_list, logic_arc_int__baselibs__filesystem, logic_arc_int__baselibs__utils_base64, logic_arc_int__baselibs__utils_scoped_op, logic_arc_int__baselibs__promise, logic_arc_int__baselibs__future, logic_arc_int__baselibs__shared_future, logic_arc_int__baselibs__executor, logic_arc_int__baselibs__task, logic_arc_int__baselibs__task_result, logic_arc_int__baselibs__synchronized_queue, logic_arc_int__baselibs__condition_variable :tags: inspected + :belongs_to: feat__baselibs .. needarch:: :scale: 50 diff --git a/docs/features/communication/docs/architecture/index.rst b/docs/features/communication/docs/architecture/index.rst index 1e72d8ceb66..e47199171a6 100644 --- a/docs/features/communication/docs/architecture/index.rst +++ b/docs/features/communication/docs/architecture/index.rst @@ -51,6 +51,7 @@ This ensures a stable public API, independent of the underlying binding(s). At t :status: valid :fulfils: feat_req__com__interfaces :includes: logic_arc_int__communication__user + :belongs_to: feat__com_communication .. needarch:: :scale: 50 diff --git a/docs/features/communication/ipc/docs/architecture/index.rst b/docs/features/communication/ipc/docs/architecture/index.rst index 5be0442c214..c777421a53c 100644 --- a/docs/features/communication/ipc/docs/architecture/index.rst +++ b/docs/features/communication/ipc/docs/architecture/index.rst @@ -225,6 +225,7 @@ Dynamic Architecture :status: valid :safety: ASIL_B :fulfils: feat_req__com__depl_config_runtime + :belongs_to: feat__com_communication .. uml:: _assets/dyn_arch.puml :scale: 50 diff --git a/docs/features/frameworks/feo/architecture/feature_architecture.rst b/docs/features/frameworks/feo/architecture/feature_architecture.rst index 161c6dcaef3..221d676fdc2 100644 --- a/docs/features/frameworks/feo/architecture/feature_architecture.rst +++ b/docs/features/frameworks/feo/architecture/feature_architecture.rst @@ -95,6 +95,14 @@ expected to be used directly in a productive system. They may become obsolete in Static Architecture ------------------- +.. feat:: Feature FEO + :id: feat__feo + :security: YES + :safety: ASIL_B + :status: valid + :includes: logic_arc_int__feo__activity, logic_arc_int__feo__prim_agent, logic_arc_int__feo__sec_agent, logic_arc_int__feo__lifecycle + :consists_of: comp__feo_main + .. feat_arc_sta:: Static Architecture :id: feat_arc_sta__feo__main :security: YES @@ -102,6 +110,7 @@ Static Architecture :status: valid :fulfils: feat_req__feo__application, feat_req__feo__activity, feat_req__feo__task_chain, feat_req__feo__agent :includes: logic_arc_int__feo__activity, logic_arc_int__feo__prim_agent, logic_arc_int__feo__sec_agent, logic_arc_int__feo__lifecycle + :belongs_to: feat__feo .. uml:: _assets/stat_arch.puml :scale: 50 @@ -117,6 +126,7 @@ Dynamic Architecture :safety: ASIL_B :fulfils: feat_req__feo__application, feat_req__feo__activity, feat_req__feo__task_chain, feat_req__feo__agent :status: valid + :belongs_to: feat__feo .. uml:: _assets/dyn_arch.puml :scale: 50 diff --git a/docs/features/lifecycle/architecture/health_monitor.rst b/docs/features/lifecycle/architecture/health_monitor.rst index b609feaf7a0..deef630097d 100644 --- a/docs/features/lifecycle/architecture/health_monitor.rst +++ b/docs/features/lifecycle/architecture/health_monitor.rst @@ -177,6 +177,7 @@ Dynamic Architecture :status: invalid :safety: ASIL_B :fulfils: feat_req__lifecycle__process_monitoring + :belongs_to: feat__lifecycle .. uml:: _assets/application_health_monitoring_dynamic.puml :scale: 50 @@ -299,6 +300,7 @@ Dynamic Architecture :status: invalid :safety: ASIL_B :fulfils: feat_req__lifecycle__process_monitoring + :belongs_to: feat__lifecycle .. uml:: _assets/logical_sup.puml :scale: 50 diff --git a/docs/features/lifecycle/architecture/launch_manager.rst b/docs/features/lifecycle/architecture/launch_manager.rst index 1db2ea0dac7..0e6d7dc0a02 100644 --- a/docs/features/lifecycle/architecture/launch_manager.rst +++ b/docs/features/lifecycle/architecture/launch_manager.rst @@ -121,6 +121,7 @@ This unified approach allows external state managers to request any run target a :safety: ASIL_B :security: YES :fulfils: feat_req__lifecycle__control_commands, feat_req__lifecycle__request_run_target_start, feat_req__lifecycle__switch_run_targets + :belongs_to: feat__lifecycle .. uml:: _assets/control_interface_start_sequence.puml :scale: 50 @@ -249,6 +250,7 @@ Dynamic Architecture :status: valid :safety: ASIL_B :fulfils: feat_req__lifecycle__control_commands, feat_req__lifecycle__request_run_target_start, feat_req__lifecycle__switch_run_targets + :belongs_to: feat__lifecycle .. uml:: _assets/lifecycle_state_machine.puml :scale: 50 @@ -352,6 +354,7 @@ Dynamic architecture :safety: ASIL_B :fulfils: feat_req__lifecycle__monitoring_processes, feat_req__lifecycle__polling_interval,, feat_req__lifecycle__failure_detect :includes: + :belongs_to: feat__lifecycle .. uml:: _assets/alive_monitoring_dynamic.puml :scale: 50 diff --git a/docs/features/lifecycle/index.rst b/docs/features/lifecycle/index.rst index 2bc7ee8f7d9..c04727f8c3d 100644 --- a/docs/features/lifecycle/index.rst +++ b/docs/features/lifecycle/index.rst @@ -27,6 +27,14 @@ Lifecycle :realizes: wp__feat_request +.. feat:: Lifecycle + :id: feat__lifecycle + :security: YES + :safety: ASIL_B + :status: valid + :includes: logic_arc_int__lifecycle__lifecycle_if, logic_arc_int__lifecycle__controlif, logic_arc_int__lifecycle__alive_if, logic_arc_int__lifecycle__logical_monitor_if, logic_arc_int__lifecycle__deadline_monitor_if + :consists_of: comp__lifecycle_launch_manager, comp__lifecycle_healthmonitor + Feature Flag ============ diff --git a/docs/features/orchestration/architecture/index.rst b/docs/features/orchestration/architecture/index.rst index 09ed6ace919..5c64a624c68 100644 --- a/docs/features/orchestration/architecture/index.rst +++ b/docs/features/orchestration/architecture/index.rst @@ -71,6 +71,7 @@ Static Architecture :status: invalid :fulfils: feat_req__orchestration__orch_static_graphs, feat_req__orchestration__exec_async_rt :includes: logic_arc_int__orchestration__user, logic_arc_int__orchestration__design, logic_arc_int__orchestration__deployment + :belongs_to: feat__orchestration .. needarch:: :scale: 50 diff --git a/docs/features/persistency/architecture/index.rst b/docs/features/persistency/architecture/index.rst index 8f2db370454..d416bc6e6a4 100644 --- a/docs/features/persistency/architecture/index.rst +++ b/docs/features/persistency/architecture/index.rst @@ -25,7 +25,24 @@ Architecture :realizes: wp__feature_arch :tags: persistency -Overview + +.. feat:: Persistency + :id: feat__persistency + :security: YES + :safety: ASIL_B + :status: valid + :includes: logic_arc_int__persistency__interface + :consists_of: comp__persistency_kvs + +.. comp:: persistency::kvs + :id: comp__persistency_kvs + :security: YES + :safety: ASIL_B + :status: valid + :implements: logic_arc_int__persistency__interface + + + -------- The Key-Value-Storage (kvs) provides the capability to efficiently store, @@ -64,6 +81,7 @@ Static Architecture :includes: logic_arc_int__persistency__interface :fulfils: feat_req__persistency__default_value_get,feat_req__persistency__default_values,feat_req__persistency__async_completion,feat_req__persistency__integrity_check,feat_req__persistency__store_data,feat_req__persistency__load_data,feat_req__persistency__snapshot_create,feat_req__persistency__support_datatype_keys,feat_req__persistency__support_datatype_value,feat_req__persistency__variant_management,feat_req__persistency__default_value_file,feat_req__persistency__cfg,feat_req__persistency__async_api,feat_req__persistency__access_control,feat_req__persistency__concurrency :status: valid + :belongs_to: feat__persistency .. uml:: _assets/kvs_static_view.puml @@ -75,6 +93,7 @@ Dynamic Architecture :safety: ASIL_B :fulfils: feat_req__persistency__default_values,feat_req__persistency__default_value_get :status: valid + :belongs_to: feat__persistency .. uml:: _assets/kvs_dyn_check_value_default.puml @@ -84,6 +103,7 @@ Dynamic Architecture :safety: ASIL_B :fulfils: feat_req__persistency__support_datatype_keys,feat_req__persistency__support_datatype_value :status: valid + :belongs_to: feat__persistency .. uml:: _assets/kvs_dyn_delete_data_key.puml @@ -93,6 +113,7 @@ Dynamic Architecture :safety: ASIL_B :fulfils: feat_req__persistency__store_data,feat_req__persistency__snapshot_create,feat_req__persistency__integrity_check,feat_req__persistency__snapshot_restore :status: valid + :belongs_to: feat__persistency .. uml:: _assets/kvs_dyn_flush_local_repr_to_file.puml @@ -102,6 +123,7 @@ Dynamic Architecture :safety: ASIL_B :fulfils: feat_req__persistency__support_datatype_keys,feat_req__persistency__support_datatype_value,feat_req__persistency__default_values,feat_req__persistency__default_value_get :status: valid + :belongs_to: feat__persistency .. uml:: _assets/kvs_dyn_read_data_key.puml @@ -111,6 +133,7 @@ Dynamic Architecture :safety: ASIL_B :fulfils: feat_req__persistency__load_data,feat_req__persistency__integrity_check,feat_req__persistency__snapshot_restore :status: valid + :belongs_to: feat__persistency .. uml:: _assets/kvs_dyn_read_file_into_local_repr.puml @@ -120,6 +143,7 @@ Dynamic Architecture :safety: ASIL_B :fulfils: feat_req__persistency__support_datatype_keys,feat_req__persistency__support_datatype_value :status: valid + :belongs_to: feat__persistency .. uml:: _assets/kvs_dyn_write_data_key.puml @@ -129,6 +153,7 @@ Dynamic Architecture :safety: ASIL_B :fulfils: feat_req__persistency__snapshot_restore,feat_req__persistency__store_data :status: valid + :belongs_to: feat__persistency .. uml:: _assets/kvs_dyn_restore_snapshot.puml diff --git a/docs/modules/baselibs/bitmanipulation/docs/requirements/index.rst b/docs/modules/baselibs/bitmanipulation/docs/requirements/index.rst index d41d990dd1c..204938497b8 100644 --- a/docs/modules/baselibs/bitmanipulation/docs/requirements/index.rst +++ b/docs/modules/baselibs/bitmanipulation/docs/requirements/index.rst @@ -36,6 +36,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__bitmanipulation, feat_req__baselibs__core_utilities :status: valid + :belongs_to: comp__baselibs_bit_manipulation The bit manipulation component shall provide API for setting, clearing, toggling, and checking bits, as well as extracting bytes and manipulating half-bytes and bytes for any integral type up to 64 bits. @@ -46,6 +47,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__bitmanipulation, feat_req__baselibs__core_utilities :status: valid + :belongs_to: comp__baselibs_bit_manipulation The bit manipulation library shall provide type-safe bitmask operations for scoped enumeration types. @@ -56,6 +58,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__bitmanipulation, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_bit_manipulation All bit manipulation functions shall validate input parameters and prevent data corruption. @@ -69,6 +72,7 @@ Non-Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__bitmanipulation :status: valid + :belongs_to: comp__baselibs_bit_manipulation The bit manipulation API shall be header-only and not require external dependencies. diff --git a/docs/modules/baselibs/concurrency/docs/requirements/index.rst b/docs/modules/baselibs/concurrency/docs/requirements/index.rst index e18d74fa0d5..218bb9d5ef4 100644 --- a/docs/modules/baselibs/concurrency/docs/requirements/index.rst +++ b/docs/modules/baselibs/concurrency/docs/requirements/index.rst @@ -34,6 +34,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__core_utilities, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_concurrency The concurrency module shall allow running tasks asynchronously. @@ -44,6 +45,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__core_utilities, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_concurrency The concurrency module shall allow cancelling tasks when needed. @@ -54,6 +56,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__core_utilities, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_concurrency The concurrency module shall provide implementation for executing callable objects without returning results, supporting fire-and-forget asynchronous operations. @@ -64,6 +67,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_concurrency The concurrency module shall provide implementation to access the result of an asynchronously running task or to request aborting the task when the result is no longer needed. @@ -74,6 +78,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_concurrency The concurrency module shall provide implementation for executing callable objects at regular intervals with configurable first execution time and period duration. @@ -84,6 +89,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_concurrency The concurrency module shall provide implementation for executing callable objects after a specified delay with support for early cancellation. @@ -94,6 +100,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__consistent_apis :status: valid + :belongs_to: comp__baselibs_concurrency The concurrency module shall provide interface defining a common API for task submission operations, graceful shutdown, and maximum concurrency level reporting. @@ -104,6 +111,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_concurrency The concurrency module shall provide implementation that manages submitted tasks in FIFO order. @@ -114,6 +122,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_concurrency The concurrency module shall provide an abortable mechanism for threads to wait for conditions. @@ -124,6 +133,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_concurrency The concurrency module shall provide utilities offering APIs for sleep operations allowing early cancellation. @@ -134,6 +144,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_concurrency The concurrency module shall allow one thread to notify another thread once, with a timeout option. @@ -144,6 +155,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_concurrency The concurrency module shall provide a thread-safe container facilitating FIFO transmission of data in a N:1 communication pattern. @@ -154,6 +166,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__concurrency_library, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_concurrency The concurrency module shall provide a container for managing long-running threads, allowing addition and removal of threads. @@ -167,6 +180,7 @@ Non-Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__concurrency_library :status: valid + :belongs_to: comp__baselibs_concurrency The concurrency module shall limit memory usage to prevent uncontrolled resource consumption. @@ -177,6 +191,7 @@ Non-Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__concurrency_library :status: valid + :belongs_to: comp__baselibs_concurrency The concurrency module shall allow reserving memory upfront for tasks to ensure predictable resource allocation. @@ -187,6 +202,7 @@ Non-Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__concurrency_library :status: valid + :belongs_to: comp__baselibs_concurrency The concurrency module shall report the maximum number of concurrent threads available for task execution. @@ -197,6 +213,7 @@ Non-Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__concurrency_library :status: valid + :belongs_to: comp__baselibs_concurrency The concurrency module shall avoid indefinitely blocking, unabortable operations. @@ -207,6 +224,7 @@ Non-Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__concurrency_library :status: valid + :belongs_to: comp__baselibs_concurrency The concurrency module shall use error codes instead of throwing exceptions. diff --git a/docs/modules/baselibs/containers/docs/requirements/index.rst b/docs/modules/baselibs/containers/docs/requirements/index.rst index 39c3f1ff92c..4a78a1cd2d9 100644 --- a/docs/modules/baselibs/containers/docs/requirements/index.rst +++ b/docs/modules/baselibs/containers/docs/requirements/index.rst @@ -33,6 +33,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__containers_library, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_containers The Containers library shall provide a fixed-size array container with construction-time size specification. @@ -43,6 +44,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__containers_library, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_containers The Containers library shall provide an intrusive doubly-linked list based on the C++ standardization proposal P0406R1. @@ -53,6 +55,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__consistent_apis, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_containers The Containers library shall enforce compile-time type safety for all container operations. @@ -63,6 +66,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__containers_library, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_containers The Containers library shall provide a non-relocatable vector container that maintains stable element addresses. @@ -77,6 +81,7 @@ Non-Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_containers The Containers library shall provide deterministic behavior with no dynamic memory allocation. @@ -165,5 +170,6 @@ Assumptions of Use (AoU) .. needextend:: "__containers__" in id :+tags: baselibs + .. needextend:: "containers" in id :+tags: containers diff --git a/docs/modules/baselibs/filesystem/docs/requirements/index.rst b/docs/modules/baselibs/filesystem/docs/requirements/index.rst index 4124606a403..6dc1ec83f98 100644 --- a/docs/modules/baselibs/filesystem/docs/requirements/index.rst +++ b/docs/modules/baselibs/filesystem/docs/requirements/index.rst @@ -33,6 +33,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__consistent_apis, feat_req__baselibs__filesystem_library :status: valid + :belongs_to: comp__baselibs_filesystem The Filesystem library shall provide filesystem API based on the C++ standardization. @@ -43,6 +44,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__consistent_apis, feat_req__baselibs__filesystem_library :status: valid + :belongs_to: comp__baselibs_filesystem The Filesystem library shall provide type-safe utilities for path construction and manipulation. @@ -53,6 +55,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__filesystem_library :status: valid + :belongs_to: comp__baselibs_filesystem The Filesystem library shall provide directory iterator types for traversing directory contents. @@ -63,6 +66,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__filesystem_library :status: valid + :belongs_to: comp__baselibs_filesystem The Filesystem library shall provide functionality for reading from and writing to files, including buffered I/O operations. @@ -73,6 +77,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__filesystem_library :status: valid + :belongs_to: comp__baselibs_filesystem The public API of the library shall support dependency injection with test doubles. @@ -85,6 +90,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__filesystem_library :status: valid + :belongs_to: comp__baselibs_filesystem The Filesystem library shall provide additional file utility functions, such as temporary file handling and file comparison. @@ -95,6 +101,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__filesystem_library :status: valid + :belongs_to: comp__baselibs_filesystem The Filesystem library shall provide mock and fake implementations for unit testing and validation. diff --git a/docs/modules/baselibs/json/docs/architecture/index.rst b/docs/modules/baselibs/json/docs/architecture/index.rst index 936fd5349db..3a499af247f 100644 --- a/docs/modules/baselibs/json/docs/architecture/index.rst +++ b/docs/modules/baselibs/json/docs/architecture/index.rst @@ -72,8 +72,8 @@ Static Architecture :security: YES :safety: ASIL_B :status: valid - :includes: comp__baselibs_json_wrapper, comp__baselibs_nlohman_json :fulfils: comp_req__json__deserialization, comp_req__json__serialization, comp_req__json__user_format, comp_req__json__lang_idioms, comp_req__json__lang_infra, comp_req__json__type_compatibility, comp_req__json__full_testability, comp_req__json__asil + :belongs_to: comp__baselibs_json .. needarch:: :scale: 50 @@ -91,6 +91,7 @@ Dynamic Architecture :safety: ASIL_B :status: invalid :fulfils: comp_req__json__deserialization, comp_req__json__serialization, comp_req__json__user_format, comp_req__json__lang_idioms, comp_req__json__lang_infra, comp_req__json__type_compatibility, comp_req__json__full_testability, comp_req__json__asil + :belongs_to: comp__baselibs_json put here a sequence diagram (TBD) diff --git a/docs/modules/baselibs/json/docs/requirements/index.rst b/docs/modules/baselibs/json/docs/requirements/index.rst index 5c725b4143f..0b1b8c8524b 100644 --- a/docs/modules/baselibs/json/docs/requirements/index.rst +++ b/docs/modules/baselibs/json/docs/requirements/index.rst @@ -32,6 +32,7 @@ General Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__json_library :status: valid + :belongs_to: comp__baselibs_json The JSON-Library shall provide a service to deserialize JSON data according to RFC8259, i.e. parse and check for well-formedness. @@ -43,6 +44,7 @@ General Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__json_library :status: valid + :belongs_to: comp__baselibs_json The JSON-Library shall provide a service to serialize user format into JSON data according to RFC8259. @@ -53,6 +55,7 @@ General Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__json_library :status: valid + :belongs_to: comp__baselibs_json The JSON-Library shall return parsed data in a compatible user format. @@ -68,6 +71,7 @@ User friendly API for information exchange :safety: ASIL_B :satisfies: feat_req__baselibs__json_library, feat_req__baselibs__consistent_apis :status: valid + :belongs_to: comp__baselibs_json The public API shall support the idioms of the programming language it is written in. @@ -78,6 +82,7 @@ User friendly API for information exchange :safety: ASIL_B :satisfies: feat_req__baselibs__json_library :status: valid + :belongs_to: comp__baselibs_json The public API shall use core infrastructure of its programming language and accompanying standard libraries, whenever possible and meaningful. @@ -91,6 +96,7 @@ User friendly API for information exchange :safety: ASIL_B :satisfies: feat_req__baselibs__json_library :status: valid + :belongs_to: comp__baselibs_json The public API shall enforce strict type compatibility. When a user requests a value, the API shall validate that the requested return type is compatible with the type and value of the stored JSON data. @@ -107,6 +113,7 @@ Full testability for the user facing API :safety: ASIL_B :satisfies: feat_req__baselibs__json_library :status: valid + :belongs_to: comp__baselibs_json The public API of the library shall support dependency injection with test doubles. @@ -122,6 +129,7 @@ Safety Impact :safety: ASIL_B :satisfies: feat_req__baselibs__json_library, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_json The JSON library shall be ASIL-B compliant. diff --git a/docs/modules/baselibs/memory_shared/docs/requirements/index.rst b/docs/modules/baselibs/memory_shared/docs/requirements/index.rst index 904bc1e44db..b6322a500ba 100644 --- a/docs/modules/baselibs/memory_shared/docs/requirements/index.rst +++ b/docs/modules/baselibs/memory_shared/docs/requirements/index.rst @@ -33,6 +33,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__memory_library, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_memory_shared The Memory library shall provide capabilities for creating, opening and managing shared memory. @@ -43,6 +44,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__memory_library, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_memory_shared The Memory library shall provide polymorphic memory resource allocators using offset pointers instead of raw pointers to enable allocation in shared memory regions accessible across multiple processes. The standard library's std::pmr::polymorphic_allocator is not applicable as it uses raw pointers that are invalid when shared memory is mapped at different virtual addresses in different processes. @@ -53,6 +55,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__memory_library, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_memory_shared The Memory library shall provide type aliases for STL containers (vector, map, string) that use offset pointers for shared memory storage. @@ -63,6 +66,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__memory_library, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_memory_shared The Memory library shall provide file-based locking mechanisms for inter-process synchronization and mutual exclusion. @@ -73,6 +77,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__safety, feat_req__baselibs__memory_library :status: valid + :belongs_to: comp__baselibs_memory_shared The Memory library shall track and validate memory region boundaries to prevent out-of-bounds access in shared memory. @@ -83,6 +88,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__memory_library :status: valid + :belongs_to: comp__baselibs_memory_shared The Memory library shall provide byte order conversion between host and network byte order (big/little endian). @@ -93,6 +99,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__safety, feat_req__baselibs__memory_library, feat_req__baselibs__security :status: valid + :belongs_to: comp__baselibs_memory_shared The Memory library shall provide immutable shared memory segments that become read-only after initialization. @@ -103,6 +110,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__consistent_apis, feat_req__baselibs__safety, feat_req__baselibs__memory_library :status: valid + :belongs_to: comp__baselibs_memory_shared The Memory library shall provide type-safe wrappers for typed shared memory objects with compile-time type checking. @@ -113,6 +121,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__memory_library :status: valid + :belongs_to: comp__baselibs_memory_shared The Memory library shall provide a global registry for memory resource lookup and management. @@ -123,6 +132,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__memory_library :status: valid + :belongs_to: comp__baselibs_memory_shared The Memory library shall provide zero-allocation string utilities including splitting, comparison, and compile-time literals. @@ -133,6 +143,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__memory_library, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_memory_shared The Memory library shall provide atomic operations on shared memory data for lock-free inter-process communication. @@ -147,6 +158,7 @@ Non-Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_memory_shared The shared memory allocation shall provide deterministic behavior with predictable execution time suitable for real-time automotive systems. @@ -157,5 +169,6 @@ Non-Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__safety, feat_req__baselibs__memory_library :status: valid + :belongs_to: comp__baselibs_memory_shared The Memory library shall ensure shared memory data structures remain valid regardless of process virtual address space mappings. diff --git a/docs/modules/baselibs/result/docs/requirements/index.rst b/docs/modules/baselibs/result/docs/requirements/index.rst index 4f457e5f348..4f9849cd2cf 100644 --- a/docs/modules/baselibs/result/docs/requirements/index.rst +++ b/docs/modules/baselibs/result/docs/requirements/index.rst @@ -34,6 +34,7 @@ Functional Requirements :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__result_library, feat_req__baselibs__safety :status: valid :tags: inspected + :belongs_to: comp__baselibs_result The Result library shall provide an error handling mechanism that enables functions to return either successful values ("Get Value") or error information ("Get Error") without using C++ exceptions. @@ -45,6 +46,7 @@ Functional Requirements :satisfies: feat_req__baselibs__result_library :status: valid :tags: inspected + :belongs_to: comp__baselibs_result The Result library shall provide a "Set Result" operation that accepts either a successful value of type T or an Error object. @@ -56,6 +58,7 @@ Functional Requirements :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__result_library, feat_req__baselibs__safety :status: valid :tags: inspected + :belongs_to: comp__baselibs_result The Result library shall support user-defined error domains and error codes. @@ -67,6 +70,7 @@ Functional Requirements :satisfies: feat_req__baselibs__consistent_apis, feat_req__baselibs__safety :status: valid :tags: inspected + :belongs_to: comp__baselibs_result The Result library shall enforce compile-time type safety for error handling operations. @@ -78,6 +82,7 @@ Functional Requirements :satisfies: feat_req__baselibs__consistent_apis, feat_req__baselibs__safety :status: valid :tags: inspected + :belongs_to: comp__baselibs_result The Result library shall provide conversion utilities to transform Result objects into std::optional<T> types. The conversion shall require explicit handling of error cases before discarding error information, ensuring that errors cannot be silently ignored. @@ -92,6 +97,7 @@ Non-Functional Requirements :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__safety :status: valid :tags: inspected + :belongs_to: comp__baselibs_result The Result library shall provide deterministic behavior with no dynamic memory allocation. @@ -103,6 +109,7 @@ Non-Functional Requirements :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__safety :status: valid :tags: inspected + :belongs_to: comp__baselibs_result The Result library shall operate without throwing C++ exceptions. diff --git a/docs/modules/baselibs/utils/docs/requirements/index.rst b/docs/modules/baselibs/utils/docs/requirements/index.rst index a1fc0e83efb..aeb84ba126b 100644 --- a/docs/modules/baselibs/utils/docs/requirements/index.rst +++ b/docs/modules/baselibs/utils/docs/requirements/index.rst @@ -33,6 +33,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_utils The Utils component shall provide functions for encoding data to Base64 format and decoding Base64 data back to its original form. @@ -43,6 +44,7 @@ Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_utils The Utils component shall provide a functionality that stores a callback and executes it automatically when the class is destructed @@ -56,5 +58,6 @@ Non-Functional Requirements :safety: ASIL_B :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__safety :status: valid + :belongs_to: comp__baselibs_utils The Utils component shall ensure that all operations complete in a predictable manner and without dynamic memory allocation. diff --git a/docs/modules/communication/frontent/docs/architecture/index.rst b/docs/modules/communication/frontent/docs/architecture/index.rst index dc58e7d6d10..78ac02ed139 100644 --- a/docs/modules/communication/frontent/docs/architecture/index.rst +++ b/docs/modules/communication/frontent/docs/architecture/index.rst @@ -29,8 +29,9 @@ Frontend Component Architecture :security: YES :safety: ASIL_B :status: valid - :implements: logic_arc_int__communication__user :uses: logic_arc_int__logging__logging, logic_arc_int__tracing__tracing + :belongs_to: comp__com_frontend + :fulfils: comp_req__component_name__some_title .. needarch:: :scale: 50 diff --git a/docs/modules/feo/feo/docs/architecture/component_architecture.rst b/docs/modules/feo/feo/docs/architecture/component_architecture.rst index dd15a51f281..f50a7e63c6e 100644 --- a/docs/modules/feo/feo/docs/architecture/component_architecture.rst +++ b/docs/modules/feo/feo/docs/architecture/component_architecture.rst @@ -58,12 +58,19 @@ considerations and Rust compiler constraints. (Rust proc-macros must reside in t Static Architecture ------------------- +.. comp:: FEO Main + :id: comp__feo_main + :security: YES + :safety: ASIL_B + :status: valid + .. comp_arc_sta:: Static Architecture :id: comp_arc_sta__feo__main :security: YES :safety: ASIL_B :status: valid - :fulfils: comp_req__feo__application, comp_req__feo__scheduler, comp_req__feo__task_chain, comp_req__feo__agent, comp_req__feo__comp_cfg, comp_req__feo__act_map_cfg + :belongs_to: comp__feo_main + :fulfils: comp_req__feo__application .. uml:: _assets/stat_arch.puml @@ -80,6 +87,7 @@ Dynamic Architecture :safety: ASIL_B :fulfils: comp_req__feo__application, comp_req__feo__application_lifecycle, comp_req__feo__scheduler, comp_req__feo__task_chain, comp_req__feo__agent, comp_req__feo__activity_init, comp_req__feo__activitiy_step, comp_req__feo__activity_shutdown :status: valid + :belongs_to: comp__feo_main The actual dynamic call sequence during the execution of a FEO application depends on the distribution of activities to processes as well as on the activity dependency graph defining the task chain. diff --git a/docs/modules/feo/feo/docs/requirements/component_requirements.rst b/docs/modules/feo/feo/docs/requirements/component_requirements.rst index 43fb461f0f4..30fb8148c0f 100644 --- a/docs/modules/feo/feo/docs/requirements/component_requirements.rst +++ b/docs/modules/feo/feo/docs/requirements/component_requirements.rst @@ -377,3 +377,6 @@ Error Handling for S-CORE v0.5 .. needextend:: docname is not None and "feo/docs/requirements" in docname :+tags: component_feo + +.. needextend:: docname is not None and "feo/docs/requirements" in docname and type == "comp_req" + :+belongs_to: comp__feo_main diff --git a/docs/modules/lifecycle/index.rst b/docs/modules/lifecycle/index.rst index dbc68671139..19e38733887 100644 --- a/docs/modules/lifecycle/index.rst +++ b/docs/modules/lifecycle/index.rst @@ -26,6 +26,18 @@ Lifecycle {{ draw_module(need(), needs) }} +.. comp_req:: Lifecycle + :id: comp_req__lifecycle__launch + :reqtype: Functional + :status: invalid + :security: NO + :safety: ASIL_B + :tags: lifecycle + :satisfies: feat_req__lifecycle__launch_support + :belongs_to: comp__lifecycle_launch_manager + + Dummy requirement + .. comp:: Launch Manager :id: comp__lifecycle_launch_manager :status: valid @@ -40,6 +52,8 @@ Lifecycle :status: valid :safety: ASIL_B :security: NO + :belongs_to: comp__lifecycle_launch_manager + :fulfils: comp_req__lifecycle__launch .. needarch:: :scale: 50 @@ -61,6 +75,8 @@ Lifecycle :safety: ASIL_B :security: NO :uses: logic_arc_int__lifecycle__alive_if + :belongs_to: comp__lifecycle_healthmonitor + :fulfils: comp_req__lifecycle__launch .. needarch:: :scale: 50 diff --git a/docs/modules/logging/docs/index.rst b/docs/modules/logging/docs/index.rst index 439678c1014..720f1be636f 100644 --- a/docs/modules/logging/docs/index.rst +++ b/docs/modules/logging/docs/index.rst @@ -12,9 +12,17 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* +.. mod:: Logging + :id: mod__logging + :status: valid + :safety: ASIL_B + :security: YES + :includes: comp__logging + .. mod_view_sta:: Logging :id: mod_view_sta__logging__logging - :includes: comp_arc_sta__logging__logging + :includes: comp__logging + :belongs_to: mod__logging .. needarch:: :scale: 50 diff --git a/docs/modules/logging/logging/docs/architecture/index.rst b/docs/modules/logging/logging/docs/architecture/index.rst index 5f0882f82f9..50f789d0b1c 100644 --- a/docs/modules/logging/logging/docs/architecture/index.rst +++ b/docs/modules/logging/logging/docs/architecture/index.rst @@ -14,13 +14,20 @@ Component Architecture ********************** +.. comp:: Logging + :id: comp__logging + :security: YES + :safety: ASIL_B + :status: valid + :implements: logic_arc_int__logging__logging .. comp_arc_sta:: Logging :id: comp_arc_sta__logging__logging :security: YES :safety: ASIL_B :status: valid - :implements: logic_arc_int__logging__logging + :belongs_to: comp__logging + :fulfils: comp_req__component_name__some_title .. needarch:: :scale: 50 diff --git a/docs/modules/orchestrator/executor/docs/architecture/index.rst b/docs/modules/orchestrator/executor/docs/architecture/index.rst index 7f5d47ebe1a..bc284caca0f 100644 --- a/docs/modules/orchestrator/executor/docs/architecture/index.rst +++ b/docs/modules/orchestrator/executor/docs/architecture/index.rst @@ -75,6 +75,8 @@ The components are designed to cover the expectations from the feature architect :safety: ASIL_B :status: valid :uses: logic_arc_int__logging__logging, logic_arc_int__tracing__tracing + :belongs_to: comp__orch_executor + :fulfils: comp_req__component_name__some_title .. needarch:: :scale: 50 diff --git a/docs/modules/orchestrator/orchestrator/docs/architecture/index.rst b/docs/modules/orchestrator/orchestrator/docs/architecture/index.rst index 2ce1f7cc1aa..01c849af475 100644 --- a/docs/modules/orchestrator/orchestrator/docs/architecture/index.rst +++ b/docs/modules/orchestrator/orchestrator/docs/architecture/index.rst @@ -100,8 +100,9 @@ The components are designed to cover the expectations from the feature architect :security: YES :safety: ASIL_B :status: valid - :includes: comp__orch_design_impl, comp__orch_deployment_impl :uses: logic_arc_int__logging__logging, logic_arc_int__tracing__tracing, logic_arc_int__communication__user + :belongs_to: comp__orchestrator + :fulfils: comp_req__component_name__some_title .. needarch:: :scale: 50 diff --git a/docs/modules/os/docs/index.rst b/docs/modules/os/docs/index.rst index b6d9e933185..70b684d71ff 100644 --- a/docs/modules/os/docs/index.rst +++ b/docs/modules/os/docs/index.rst @@ -12,11 +12,17 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* - +.. mod:: OS + :id: mod__os + :status: valid + :safety: ASIL_B + :security: YES + :includes: comp__os_libc, comp__os_message_passing .. mod_view_sta:: OS :id: mod_view_sta__os__os - :includes: comp_arc_sta__os__libc, comp_arc_sta__os__message_passing + :includes: comp__os_libc, comp__os_message_passing + :belongs_to: mod__os .. needarch:: :scale: 50 diff --git a/docs/modules/os/libc/docs/architecture/index.rst b/docs/modules/os/libc/docs/architecture/index.rst index a98af055d32..4968359ca15 100644 --- a/docs/modules/os/libc/docs/architecture/index.rst +++ b/docs/modules/os/libc/docs/architecture/index.rst @@ -15,13 +15,21 @@ libc Component Architecture *************************** +.. comp:: os::libc + :id: comp__os_libc + :security: YES + :safety: ASIL_B + :status: valid + :implements: logic_arc_int__os__fcntl, logic_arc_int__os__stat, logic_arc_int__os__mmap, logic_arc_int__os__fork + .. comp_arc_sta:: libc :id: comp_arc_sta__os__libc :security: YES :safety: ASIL_B :status: valid :satisfies: - :implements: logic_arc_int__os__fcntl, logic_arc_int__os__stat, logic_arc_int__os__mmap, logic_arc_int__os__fork + :belongs_to: comp__os_libc + :fulfils: comp_req__component_name__some_title .. needarch:: :scale: 50 diff --git a/docs/modules/os/message_passing/docs/architecture/index.rst b/docs/modules/os/message_passing/docs/architecture/index.rst index dc8bce3c8de..c26e4235153 100644 --- a/docs/modules/os/message_passing/docs/architecture/index.rst +++ b/docs/modules/os/message_passing/docs/architecture/index.rst @@ -15,13 +15,22 @@ Message Passing Component Architecture ************************************** -.. comp_arc_sta:: QNX::Message Passing - :id: comp_arc_sta__os__message_passing +.. comp:: QNX::Message Passing + :id: comp__os_message_passing :security: YES :safety: ASIL_B :status: valid :implements: logic_arc_int__os__message_passing + +.. comp_arc_sta:: QNX::Message Passing Static View + :id: comp_arc_sta__os__message_passing + :security: YES + :safety: ASIL_B + :status: valid + :belongs_to: comp__os_message_passing + :fulfils: comp_req__component_name__some_title + .. needarch:: :scale: 50 :align: center diff --git a/docs/modules/tracing/docs/index.rst b/docs/modules/tracing/docs/index.rst index e414f228a0c..f5f27db583d 100644 --- a/docs/modules/tracing/docs/index.rst +++ b/docs/modules/tracing/docs/index.rst @@ -12,9 +12,17 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* +.. mod:: Tracing + :id: mod__tracing + :status: valid + :safety: ASIL_B + :security: YES + :includes: comp__tracing + .. mod_view_sta:: Tracing :id: mod_view_sta__tracing__tracing - :includes: comp_arc_sta__tracing__tracing + :includes: comp__tracing + :belongs_to: mod__tracing .. needarch:: :scale: 50 diff --git a/docs/modules/tracing/tracing/docs/architecture/index.rst b/docs/modules/tracing/tracing/docs/architecture/index.rst index 87b3ade9f09..c02111cfa43 100644 --- a/docs/modules/tracing/tracing/docs/architecture/index.rst +++ b/docs/modules/tracing/tracing/docs/architecture/index.rst @@ -15,12 +15,21 @@ Tracing Component Architecture ****************************** +.. comp:: Tracing + :id: comp__tracing + :security: YES + :safety: ASIL_B + :status: valid + :implements: logic_arc_int__tracing__tracing + + .. comp_arc_sta:: Tracing :id: comp_arc_sta__tracing__tracing :security: YES :safety: ASIL_B :status: valid - :implements: logic_arc_int__tracing__tracing + :belongs_to: comp__tracing + :fulfils: comp_req__component_name__some_title .. needarch:: :scale: 50 From 12db9ca3a6a942213a280b3ef275daa17d91ba15 Mon Sep 17 00:00:00 2001 From: "jhr2hi@bosch.com" <roland.jentsch@etas.com> Date: Thu, 5 Feb 2026 11:21:19 +0100 Subject: [PATCH 178/214] correct communication architecture picture --- docs/features/communication/docs/architecture/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/communication/docs/architecture/index.rst b/docs/features/communication/docs/architecture/index.rst index e47199171a6..f32f3de7520 100644 --- a/docs/features/communication/docs/architecture/index.rst +++ b/docs/features/communication/docs/architecture/index.rst @@ -58,7 +58,7 @@ This ensures a stable public API, independent of the underlying binding(s). At t :align: center {{ draw_feature(need(), needs) }} - mod_view_sta__tracing__tracing -[hidden]-> mod_view_sta__baselibs__baselibs + mod__tracing -[hidden]-> mod__baselibs In the following sections we will look on the different architectural elements of the communication framework in more detail. From d1b639ee2664cf8bd6176dd8bdedc9e6ea9e7b71 Mon Sep 17 00:00:00 2001 From: sachinkumarsingh <SachinKumar.Singh@bti.bmwgroup.com> Date: Thu, 5 Feb 2026 16:22:57 +0530 Subject: [PATCH 179/214] Component description for memory library --- .../baselibs/memory_shared/docs/index.rst | 49 ++++++++++++++++++- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/docs/modules/baselibs/memory_shared/docs/index.rst b/docs/modules/baselibs/memory_shared/docs/index.rst index a366ef926d5..b362f61c3bf 100644 --- a/docs/modules/baselibs/memory_shared/docs/index.rst +++ b/docs/modules/baselibs/memory_shared/docs/index.rst @@ -14,11 +14,56 @@ .. _comp_doc_memory_shared: -memory_shared -############# +memory +###### + +.. document:: Memory Library + :id: doc__memory + :status: draft + :safety: ASIL_B + :tags: baselibs_memory + :realizes: wp__cmpt_request + :security: YES .. toctree:: :hidden: architecture/index requirements/index.rst + +Abstract +======== + +The Memory library provides APIs for memory management to facilitate inter-process communication (IPC) in the S-CORE software platform. + +Motivation and Rationale +======================== + +The Memory library shall provide mechanisms for creating, accessing, and managing shared memory between different processes. +It includes support for polymorphic memory resource allocators using offset pointers and additional utilities to deal with memory use-cases. + +The Memory library is needed in the S-CORE software platform because subsystems like Communication and Logging rely on shared memory for inter-process communication. + +Specification +============= + +The following details and requirements describe the aspects of the current feature in the context of S-CORE. + +General considerations +---------------------- + +The Memory Library should provide APIs for memory management: + +* :need:`comp_req__memory__shared_memory` +* :need:`comp_req__memory__offset_ptr` +* :need:`comp_req__memory__shared_containers` +* :need:`comp_req__memory__ipc_sync` +* :need:`comp_req__memory__bounds_check` +* :need:`comp_req__memory__endianness` +* :need:`comp_req__memory__sealed_shm` +* :need:`comp_req__memory__typed_shm` +* :need:`comp_req__memory__resource_registry` +* :need:`comp_req__memory__string_utils` +* :need:`comp_req__memory__atomic_ops` + +The library should ensure that all memory operations are performed safely, with appropriate bounds checking and synchronization mechanisms to prevent memory corruption. From 7d252e75b733b09225f1a383bb00d5d7d79fa5ae Mon Sep 17 00:00:00 2001 From: RolandJentschETAS <135332348+RolandJentschETAS@users.noreply.github.com> Date: Thu, 5 Feb 2026 16:37:42 +0100 Subject: [PATCH 180/214] DR-007: add design decision for break cyclic dependency between docs-as-code and process repository (#2499) Co-authored-by: Andreas Zwinkau <Andreas.Zwinkau@etas.com> --- docs/design_decisions/DR-007-infra.rst | 326 +++++++++++++++++++++++++ 1 file changed, 326 insertions(+) create mode 100644 docs/design_decisions/DR-007-infra.rst diff --git a/docs/design_decisions/DR-007-infra.rst b/docs/design_decisions/DR-007-infra.rst new file mode 100644 index 00000000000..7c8f60c6e57 --- /dev/null +++ b/docs/design_decisions/DR-007-infra.rst @@ -0,0 +1,326 @@ +.. + Copyright (c) 2025 Contributors to the Eclipse Foundation + + See the NOTICE file(s) distributed with this work for additional + information regarding copyright ownership. + + This program and the accompanying materials are made available under the + terms of the Apache License Version 2.0 which is available at + https://www.apache.org/licenses/LICENSE-2.0 + + SPDX-License-Identifier: Apache-2.0 + +DR-007-Infra: Solution for cyclic dependencies between docs-as-code and process description +=========================================================================================== + +- **Date:** 2026-02-04 + +.. dec_rec:: Move examples to module_template repository + :id: dec_rec__infra__dependency_docs_as_code + :status: accepted + :context: Infrastructure + :decision: Option 3 + +Context / Problem +----------------- + +Currently, there are two repositories defining the docs-as-code principles with Sphinx and Sphinx-Needs: + +- The ``eclipse_score/process_description`` repository defines the process and the requirements for the meta model of the Sphinx-Needs objects (sphinx objects for requirements, architecture, processes, etc.). + It includes also example Sphinx-Needs objects that illustrate the usage of the defined meta model. +- The ``eclipse_score/docs_as_code`` repository provides the base docs as code infrastructure and uses the process requirements to define the sphinx needs meta model and includes Sphinx-Needs objects from the process repository for testing. + +However, the process repository also uses the ``docs_as_code`` repository's as infrastructure for the process documentation and the meta model for Sphinx-Needs objects, creating a **cyclic dependency** between the two repositories. +Any change in the process requirements (in ``process_description``) for the meta model possibly leads to a change in the docs-as-code meta model, but any change in the docs-as-code meta model can cause build errors in the process_description repo and this happens during the docs-as-code build as Sphinx-Needs objects from the process repo are imported. +This tight coupling makes maintenance and evolution of both repositories difficult and error-prone. + +.. uml:: + :align: center + :caption: Cyclic dependency between process and docs-as-code repositories + + left to right direction + database process_description { + artifact examples + artifact templates + } + database docs_as_code { + artifact metamodel.yaml as yaml + } + + process_description --> docs_as_code : defines metamodel + docs_as_code --> process_description : checks metamodel + +The artifacts within those repos are: + +* "examples" are exemplary instances of the metamodel like :need:`feat__example_feature`. +* "templates" (more precisely `folder templates <https://eclipse-score.github.io/process_description/main/folder_templates/index.html>`_) + are instances which can be copied when creating new modules + like :need:`doc__feature_name_architecture`. +* "metamodel.yaml" is `this file <https://github.com/eclipse-score/docs-as-code/blob/v2.3.3/src/extensions/score_metamodel/metamodel.yaml>`__. + +This means to roll out a change to the process looks like this: + +1. Change ``process_description`` but *not* the examples and folder templates. +2. Change ``docs_as_code`` accordingly (potentially with constraints because ``@process_description//:needs_json`` includes old examples and folder templates) +3. Change ``process_description`` a *second* time adapting the examples and folder templates. +4. Change ``docs_as_code`` a *second* time removing constraints from step 2. + +Currently the `module_template repo <https://github.com/eclipse-score/module_template>`_ +is not used and not up to date. +However, the Process community intends to use it for the folder templates in the future. +Thus, step 3 above will become a pull request to a third repository eventually. +Still, there is no plan to move the examples to that repository. + +Goals and Requirements +^^^^^^^^^^^^^^^^^^^^^^ + +- **Effort**: Don't spend much one-time effort to implement the change proposed here. +- **Independence**: Enable independent evolution of process requirements for the meta model and the meta model verification implementation. +- **UX**: Enable a process change rollout which does not require multiple pull requests in a single repository due to dependency cycles. +- **Clear Ownership**: Each repository should have a clear responsibility and ownership of its contents. +- **Maintainability**: Keep long-term maintenance effort low. + +Non-Goals +~~~~~~~~~ + +- Redesigning the entire docs-as-code or process description approach. +- Removing Sphinx or Sphinx-Needs as documentation tools. +- Avoid inconsistencies between process and tool implementation. + +Options Considered +------------------ + +Option 0: No change +^^^^^^^^^^^^^^^^^^^ + +Keep the current repository structure and workflows as they are. +Accept the cyclic dependency between ``process_description`` and ``docs_as_code`` and manage it through careful coordination and communication between maintainers. +Continue handling build errors manually when they occur. + +Effort 💚: None. + +Independence 😡: The repos ``process_description`` and ``docs_as_code`` are coupled. + +UX 😡: Poor due to the coupling some back and forth changes are necessary. + +Maintainability 😡: Poor (ongoing coordination burden). + +Clear Ownership 💚: Process community and docs-as-code are clearly separated. + + +Option 1: Merge both repositories into one +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Combine ``process_description`` and ``docs_as_code`` into a single repository. +This eliminates the cyclic dependency by having a single source of truth for both the meta model and the Sphinx-Needs objects/examples, but process is repo is potentially large and complex and is implementation specific. + +.. uml:: + :align: center + :caption: Merge both repositories into one + + left to right direction + database "process_description\n+ docs_as_code" { + artifact metamodel.yaml as yaml + artifact examples + artifact templates + } + +Effort 😡😡: Disruptive effort to merge repos. +Such changes conflict with practically all parallel pull requests. +Dependencies across all S-CORE repos are necessary. + +Independence 💚: Coupling is tolerable because both can be changed as an atomic commit. + +UX 💚: Excellent as single source. + +Maintainability 💚: Good because everything is in one place. + +Option 2: Move meta model definition to process repository +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Define and maintain the ``metamodel.yaml`` +solely in the process repository. +The docs-as-code repository would then only provide the infrastructure for the meta model, not define or modify it. +The process repository would be the authoritative source for the meta model. +Also tests (scripts) and examples would be maintained there. + +.. uml:: + :align: center + :caption: Move meta model definition to process repository + + left to right direction + database process_description { + artifact examples + artifact templates + artifact metamodel.yaml as yaml + } + database docs_as_code { + } + + process_description --> docs_as_code : defines metamodel + yaml --> docs_as_code : as input + docs_as_code --> process_description : checks metamodel + +Implication: +If the docs-as-code module would select the metamodel yaml version on its own, +we would not have resolved the cyclic dependency issue. +Thus, ``process_description`` would need to define which version of ``metamodel.yaml`` to use +and ``docs_as_code`` provides a configuration option to specify it. + +Moving only the ``metamodel.yaml`` file means that a few Python-implemented checks still remain in ``docs_as_code``. +While the problem is not solved completely, it should fix most of the cases. + +Effort 😡: Medium effort. + +Independence 😡: Rather good because ``docs_as_code`` mostly consumes except a few remaining checks. + +UX 💚: Excellent since authority is clear. + +Maintainability 💚: Good because of clear ownership. + +Clear Ownership 💚: Cleanly separated. + +Option 3: Move examples to docs_as_code and templates to module_template +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Move all examples from ``process_description`` into ``docs_as_code`` repo +and all templates from ``process_description`` into ``module_template`` repo. +No relevant cyclic dependency remains. + +.. uml:: + :align: center + :caption: Move examples to docs_as_code and templates to module_template + + left to right direction + database process_description { + } + database docs_as_code { + artifact metamodel.yaml as yaml + artifact examples + } + database module_template { + artifact templates + } + + process_description --> docs_as_code : defines metamodel + docs_as_code --> module_template : checks metamodel + +Effort 💚: Low. + +Independence 💚: Good because process repo becomes independent. + +UX 💚: Excellent since authority is clear. + +Maintainability 😡: More repos to maintain. + +Clear Ownership 💚: Process community is responsible for ``process_description`` and ``module_template``. + +Option 4: Move meta model and examples into a separate repository +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Create or use a dedicated meta model repository that contains only the Sphinx-Needs meta model definitions and the examples. +Both the process repository and docs-as-code repository would depend on this meta model repository (if necessary), making it the single source of truth. +This breaks the cycle by introducing a clear hierarchical dependency structure. + +.. uml:: + :align: center + :caption: Move meta model and examples into a separate repository + + left to right direction + database process_description { + } + database docs_as_code { + } + database module_template { + artifact metamodel.yaml as yaml + artifact examples + artifact templates + } + + process_description --> docs_as_code : defines metamodel + docs_as_code --> module_template : checks metamodel + yaml --> docs_as_code : as input + +Effort 😡: High effort for the configurable ``metamodel.yaml``. + +Independence 💚: Good because process repo becomes independent. + +UX 😡: It is strange that same checks are implemented in ``docs_as_code`` and some in ``module_template``. + +Maintainability 😡: More repos to maintain. + +Clear Ownership 💚: Clearly, the Process community takes authority over ``metamodel.yaml``. + +Option 5: Move examples and templates to docs-as-code repository +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Move all example Sphinx-Needs objects from the ``process_description`` repository to the ``docs_as_code`` repository. +The process repository would define requirements for the meta model, while docs-as-code would provide infrastructure, the meta model and host the examples that demonstrate the meta model. +This breaks the cycle by removing the import dependency from docs-as-code back to the process repository. + +.. uml:: + :align: center + :caption: Move examples to docs-as-code repository + + left to right direction + database process_description { + } + database docs_as_code { + artifact examples + artifact templates + artifact metamodel.yaml as yaml + } + + process_description --> docs_as_code : defines metamodel + +Effort 💚: Low effort. + +Independence 💚: Good because ``process_description`` just consumes. + +UX 💚: Fine. + +Maintainability 💚: Good because of clear ownership. + +Clear Ownership 😡: Process community wants control of the templates but they are in the ``docs_as_code`` repo. + +Option 6: Change error handling from warnings as errors to warnings only +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Keep the current repository structure but change the Sphinx build configuration in the docs-as-code repository to treat warnings as warnings instead of errors. +This would allow the build to succeed even when imported Sphinx-Needs objects from the process repository have inconsistencies with the meta model, effectively breaking the tight coupling that causes build failures. +The cyclic dependency would remain, but its impact would be reduced and only real errors like type name changes would cause build failures. +Please notice that missing mandatory links or fields, as well as additional links only generate warnings in this setup. +Only unknown types would still cause errors. + +Effort 💚: Low effort because only config and documentation needs to be changed. + +Independence 💚: Good because no errors are blocking anymore. + +UX 💚: Easy because problems can be ignored. + +Maintainability 😡😡: Poor because warnings won't be fixed as quickly as errors. + +Evaluation +---------- + +The effort for Option 1 is prohibitively high, so we ignore it for the evaluation. +Likewise we ignore Option 6 due to grave maintainability concerns. + +Here is the summary, how well each option achieves the goals in order of goal importance: + +.. csv-table:: + :header: Goals, Option 0, Option 2, Option 3, Option 4, Option 5 + :widths: 15, 10, 10, 10, 10, 10 + + Effort, 💚, 😡, 💚, 😡, 💚 + Independence, 😡, 😡, 💚, 💚, 💚 + UX, 😡, 💚, 💚, 😡, 💚 + Clear Ownership, 💚, 💚, 💚, 💚, 😡 + Maintainability, 😡, 💚, 😡, 😡, 💚 + +Due to our most important goal, effort, Options 2 and 4 are disqualified. +Then Option 0 is disqualified due to independence concerns (among others). +Option 5 is disqualified due to the ownership issue. + +**Decision:** Option 3 is the remaining best choice. +We accept the maintainability tradeoff. From 58a91d497588ac2649a9e7c6bcfa4ef826042523 Mon Sep 17 00:00:00 2001 From: aschemmel-git <alexander.schemmel@bmw.de> Date: Fri, 6 Feb 2026 14:26:05 +0100 Subject: [PATCH 181/214] Introduce Delivery Container in Config Mgt Plan --- .../platform_management_plan/config_management.rst | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/docs/platform_management_plan/config_management.rst b/docs/platform_management_plan/config_management.rst index acbb1f861af..7bce0d230f7 100644 --- a/docs/platform_management_plan/config_management.rst +++ b/docs/platform_management_plan/config_management.rst @@ -70,7 +70,12 @@ The complete list of project documents is defined in the :need:`doc__documentati Ids are checked for uniqueness, see :need:`gd_req__configuration_uid`. sphinx-needs is also used to document the work products properties/attributes defined in the process area descriptions. The work products are stored in text or code files (these are identified by their filenames) within GitHub repositories. -There is one `platform repository <https://GitHub.com/eclipse-score/score/>`_ and one repository for each module. +GitHub repositories are the realization of the Delivery Containers as described in :need:`doc_concept__general_building_blocks`. +There is one `platform repository <https://GitHub.com/eclipse-score/score/>`_ and one repository for each set of Dependable elements +one Delivery Team is responsibel for [TBD add link to role defintion]. + +In S-CORE every repository shall have only one MODULE.bazel file which defines its version and dependencies. +Exceptions from this may be needed for testing reasons only. For other artefacts these are either @@ -125,13 +130,14 @@ Baselines are created by using the GitHub "tag" function. The tag name shall cor the release branch name the tag is created, adding patch version and pre-release tag. See also :need:`doc__platform_release_management_plan`. -As described in "Identification and Properties" above, there are several repositories for the modules and the platform integration. +As described in "Identification and Properties" above, there are several repositories. Baselines are created individually in these repositories, even a different version schema could be adopted. In case of dependent repositories, the repository dependent upon on has to be base-lined first, to be available to refer to this baseline when integrating it. That means that for example a platform baseline also -documents the versions (baselines) of the modules the platform consists of. This can then also be seen in the platform release note. +documents the versions (baselines) of the delivery containers/repositories the platform consists of. +This can then also be seen in the platform release note. -Every change in the release repository is also taken over into the main branch. The module development team +Every change in the release branch is also taken over into the main branch. The Delivery Team can decide how to ensure this (e.g. by development in main and cherry-pick to release branch). From 4c130c5287f7ec1d96f67c12e9fe3524c886f2e1 Mon Sep 17 00:00:00 2001 From: Priyanka Patil <Priyanka.Patil@bti.bmwgroup.com> Date: Tue, 3 Feb 2026 14:30:40 +0530 Subject: [PATCH 182/214] lib/memory-updated typed memory component requirement --- .../baselibs/memory_shared/docs/requirements/index.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/modules/baselibs/memory_shared/docs/requirements/index.rst b/docs/modules/baselibs/memory_shared/docs/requirements/index.rst index b6322a500ba..e127778c19c 100644 --- a/docs/modules/baselibs/memory_shared/docs/requirements/index.rst +++ b/docs/modules/baselibs/memory_shared/docs/requirements/index.rst @@ -103,16 +103,16 @@ Functional Requirements The Memory library shall provide immutable shared memory segments that become read-only after initialization. -.. comp_req:: Type-Safe Shared Memory - :id: comp_req__memory__typed_shm +.. comp_req:: Typed Memory + :id: comp_req__memory__typed_memory :reqtype: Functional :security: YES :safety: ASIL_B - :satisfies: feat_req__baselibs__consistent_apis, feat_req__baselibs__safety, feat_req__baselibs__memory_library + :satisfies: feat_req__baselibs__safety, feat_req__baselibs__memory_library :status: valid :belongs_to: comp__baselibs_memory_shared - The Memory library shall provide type-safe wrappers for typed shared memory objects with compile-time type checking. + The Memory library shall provide an interface to allocate shared memory from typed memory regions. .. comp_req:: Memory Resource Registry :id: comp_req__memory__resource_registry From 662665bedb538a6f05cc7d8042f5862265a70df8 Mon Sep 17 00:00:00 2001 From: sachinkumarsingh <SachinKumar.Singh@bti.bmwgroup.com> Date: Tue, 10 Feb 2026 15:27:46 +0530 Subject: [PATCH 183/214] fixed compilation warning for memory lib. --- docs/modules/baselibs/memory_shared/docs/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/baselibs/memory_shared/docs/index.rst b/docs/modules/baselibs/memory_shared/docs/index.rst index b362f61c3bf..bbb4250a8c1 100644 --- a/docs/modules/baselibs/memory_shared/docs/index.rst +++ b/docs/modules/baselibs/memory_shared/docs/index.rst @@ -61,7 +61,7 @@ The Memory Library should provide APIs for memory management: * :need:`comp_req__memory__bounds_check` * :need:`comp_req__memory__endianness` * :need:`comp_req__memory__sealed_shm` -* :need:`comp_req__memory__typed_shm` +* :need:`comp_req__memory__typed_memory` * :need:`comp_req__memory__resource_registry` * :need:`comp_req__memory__string_utils` * :need:`comp_req__memory__atomic_ops` From e82b68e88484b1f28b0c993a557b7f7c83281d17 Mon Sep 17 00:00:00 2001 From: "jhr2hi@bosch.com" <roland.jentsch@etas.com> Date: Thu, 5 Feb 2026 13:34:56 +0100 Subject: [PATCH 184/214] move infrastructure and integration topics to own folder --- docs/index.rst | 1 + docs/score_technical_base/index.rst | 28 ++++++++++++++++++ .../infrastructure/bazel_registry.rst | 0 .../infrastructure/config_as_code.rst | 0 .../infrastructure/index.rst | 0 .../_assets/score_high_level_dependencies.png | Bin .../integration/index.rst | 0 .../score_tools/_assets/bazel.drawio.svg | 0 .../score_tools/_assets/clippy.drawio.svg | 0 .../_assets/doc_as_code.drawio.svg | 0 .../score_tools/_assets/gtest.drawio.svg | 0 .../score_tools/_assets/itf.drawio.svg | 0 .../score_tools/_assets/rustfmt.drawio.svg | 0 .../score_tools/bazel.rst | 0 .../score_tools/clippy.rst | 0 .../score_tools/doc_as_code.rst | 0 .../score_tools/gtest.rst | 0 .../score_tools/index.rst | 0 .../score_tools/itf.rst | 0 .../score_tools/rustfmt.rst | 0 20 files changed, 29 insertions(+) create mode 100644 docs/score_technical_base/index.rst rename docs/{features => score_technical_base}/infrastructure/bazel_registry.rst (100%) rename docs/{features => score_technical_base}/infrastructure/config_as_code.rst (100%) rename docs/{features => score_technical_base}/infrastructure/index.rst (100%) rename docs/{features => score_technical_base}/integration/_assets/score_high_level_dependencies.png (100%) rename docs/{features => score_technical_base}/integration/index.rst (100%) rename docs/{ => score_technical_base}/score_tools/_assets/bazel.drawio.svg (100%) rename docs/{ => score_technical_base}/score_tools/_assets/clippy.drawio.svg (100%) rename docs/{ => score_technical_base}/score_tools/_assets/doc_as_code.drawio.svg (100%) rename docs/{ => score_technical_base}/score_tools/_assets/gtest.drawio.svg (100%) rename docs/{ => score_technical_base}/score_tools/_assets/itf.drawio.svg (100%) rename docs/{ => score_technical_base}/score_tools/_assets/rustfmt.drawio.svg (100%) rename docs/{ => score_technical_base}/score_tools/bazel.rst (100%) rename docs/{ => score_technical_base}/score_tools/clippy.rst (100%) rename docs/{ => score_technical_base}/score_tools/doc_as_code.rst (100%) rename docs/{ => score_technical_base}/score_tools/gtest.rst (100%) rename docs/{ => score_technical_base}/score_tools/index.rst (100%) rename docs/{ => score_technical_base}/score_tools/itf.rst (100%) rename docs/{ => score_technical_base}/score_tools/rustfmt.rst (100%) diff --git a/docs/index.rst b/docs/index.rst index 870ba5ef98b..82503f87baa 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -106,6 +106,7 @@ Project structure and processes requirements/index modules/index contribute/index + score_technical_base/index Releases <score_releases/index.rst> Tools <score_tools/index.rst> diff --git a/docs/score_technical_base/index.rst b/docs/score_technical_base/index.rst new file mode 100644 index 00000000000..f172252c71c --- /dev/null +++ b/docs/score_technical_base/index.rst @@ -0,0 +1,28 @@ +.. + # ******************************************************************************* + # Copyright (c) 2024 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +.. _features: + +Score Project Technical Base and Infrastructure +=============================================== + +Here we list the elements upon which the actual score project is built. Without them, the platform cannot function and would only deliver some source files. + +The following features are defined: + +.. toctree:: + :maxdepth: 1 + :glob: + + */index diff --git a/docs/features/infrastructure/bazel_registry.rst b/docs/score_technical_base/infrastructure/bazel_registry.rst similarity index 100% rename from docs/features/infrastructure/bazel_registry.rst rename to docs/score_technical_base/infrastructure/bazel_registry.rst diff --git a/docs/features/infrastructure/config_as_code.rst b/docs/score_technical_base/infrastructure/config_as_code.rst similarity index 100% rename from docs/features/infrastructure/config_as_code.rst rename to docs/score_technical_base/infrastructure/config_as_code.rst diff --git a/docs/features/infrastructure/index.rst b/docs/score_technical_base/infrastructure/index.rst similarity index 100% rename from docs/features/infrastructure/index.rst rename to docs/score_technical_base/infrastructure/index.rst diff --git a/docs/features/integration/_assets/score_high_level_dependencies.png b/docs/score_technical_base/integration/_assets/score_high_level_dependencies.png similarity index 100% rename from docs/features/integration/_assets/score_high_level_dependencies.png rename to docs/score_technical_base/integration/_assets/score_high_level_dependencies.png diff --git a/docs/features/integration/index.rst b/docs/score_technical_base/integration/index.rst similarity index 100% rename from docs/features/integration/index.rst rename to docs/score_technical_base/integration/index.rst diff --git a/docs/score_tools/_assets/bazel.drawio.svg b/docs/score_technical_base/score_tools/_assets/bazel.drawio.svg similarity index 100% rename from docs/score_tools/_assets/bazel.drawio.svg rename to docs/score_technical_base/score_tools/_assets/bazel.drawio.svg diff --git a/docs/score_tools/_assets/clippy.drawio.svg b/docs/score_technical_base/score_tools/_assets/clippy.drawio.svg similarity index 100% rename from docs/score_tools/_assets/clippy.drawio.svg rename to docs/score_technical_base/score_tools/_assets/clippy.drawio.svg diff --git a/docs/score_tools/_assets/doc_as_code.drawio.svg b/docs/score_technical_base/score_tools/_assets/doc_as_code.drawio.svg similarity index 100% rename from docs/score_tools/_assets/doc_as_code.drawio.svg rename to docs/score_technical_base/score_tools/_assets/doc_as_code.drawio.svg diff --git a/docs/score_tools/_assets/gtest.drawio.svg b/docs/score_technical_base/score_tools/_assets/gtest.drawio.svg similarity index 100% rename from docs/score_tools/_assets/gtest.drawio.svg rename to docs/score_technical_base/score_tools/_assets/gtest.drawio.svg diff --git a/docs/score_tools/_assets/itf.drawio.svg b/docs/score_technical_base/score_tools/_assets/itf.drawio.svg similarity index 100% rename from docs/score_tools/_assets/itf.drawio.svg rename to docs/score_technical_base/score_tools/_assets/itf.drawio.svg diff --git a/docs/score_tools/_assets/rustfmt.drawio.svg b/docs/score_technical_base/score_tools/_assets/rustfmt.drawio.svg similarity index 100% rename from docs/score_tools/_assets/rustfmt.drawio.svg rename to docs/score_technical_base/score_tools/_assets/rustfmt.drawio.svg diff --git a/docs/score_tools/bazel.rst b/docs/score_technical_base/score_tools/bazel.rst similarity index 100% rename from docs/score_tools/bazel.rst rename to docs/score_technical_base/score_tools/bazel.rst diff --git a/docs/score_tools/clippy.rst b/docs/score_technical_base/score_tools/clippy.rst similarity index 100% rename from docs/score_tools/clippy.rst rename to docs/score_technical_base/score_tools/clippy.rst diff --git a/docs/score_tools/doc_as_code.rst b/docs/score_technical_base/score_tools/doc_as_code.rst similarity index 100% rename from docs/score_tools/doc_as_code.rst rename to docs/score_technical_base/score_tools/doc_as_code.rst diff --git a/docs/score_tools/gtest.rst b/docs/score_technical_base/score_tools/gtest.rst similarity index 100% rename from docs/score_tools/gtest.rst rename to docs/score_technical_base/score_tools/gtest.rst diff --git a/docs/score_tools/index.rst b/docs/score_technical_base/score_tools/index.rst similarity index 100% rename from docs/score_tools/index.rst rename to docs/score_technical_base/score_tools/index.rst diff --git a/docs/score_tools/itf.rst b/docs/score_technical_base/score_tools/itf.rst similarity index 100% rename from docs/score_tools/itf.rst rename to docs/score_technical_base/score_tools/itf.rst diff --git a/docs/score_tools/rustfmt.rst b/docs/score_technical_base/score_tools/rustfmt.rst similarity index 100% rename from docs/score_tools/rustfmt.rst rename to docs/score_technical_base/score_tools/rustfmt.rst From 87f368e181e1bb19a2faa4c7f1cdcd69dccd0942 Mon Sep 17 00:00:00 2001 From: "jhr2hi@bosch.com" <roland.jentsch@etas.com> Date: Thu, 5 Feb 2026 14:00:20 +0100 Subject: [PATCH 185/214] move back tool --- .../score_tools/_assets/bazel.drawio.svg | 0 .../score_tools/_assets/clippy.drawio.svg | 0 .../score_tools/_assets/doc_as_code.drawio.svg | 0 .../score_tools/_assets/gtest.drawio.svg | 0 .../{score_technical_base => }/score_tools/_assets/itf.drawio.svg | 0 .../score_tools/_assets/rustfmt.drawio.svg | 0 docs/{score_technical_base => }/score_tools/bazel.rst | 0 docs/{score_technical_base => }/score_tools/clippy.rst | 0 docs/{score_technical_base => }/score_tools/doc_as_code.rst | 0 docs/{score_technical_base => }/score_tools/gtest.rst | 0 docs/{score_technical_base => }/score_tools/index.rst | 0 docs/{score_technical_base => }/score_tools/itf.rst | 0 docs/{score_technical_base => }/score_tools/rustfmt.rst | 0 13 files changed, 0 insertions(+), 0 deletions(-) rename docs/{score_technical_base => }/score_tools/_assets/bazel.drawio.svg (100%) rename docs/{score_technical_base => }/score_tools/_assets/clippy.drawio.svg (100%) rename docs/{score_technical_base => }/score_tools/_assets/doc_as_code.drawio.svg (100%) rename docs/{score_technical_base => }/score_tools/_assets/gtest.drawio.svg (100%) rename docs/{score_technical_base => }/score_tools/_assets/itf.drawio.svg (100%) rename docs/{score_technical_base => }/score_tools/_assets/rustfmt.drawio.svg (100%) rename docs/{score_technical_base => }/score_tools/bazel.rst (100%) rename docs/{score_technical_base => }/score_tools/clippy.rst (100%) rename docs/{score_technical_base => }/score_tools/doc_as_code.rst (100%) rename docs/{score_technical_base => }/score_tools/gtest.rst (100%) rename docs/{score_technical_base => }/score_tools/index.rst (100%) rename docs/{score_technical_base => }/score_tools/itf.rst (100%) rename docs/{score_technical_base => }/score_tools/rustfmt.rst (100%) diff --git a/docs/score_technical_base/score_tools/_assets/bazel.drawio.svg b/docs/score_tools/_assets/bazel.drawio.svg similarity index 100% rename from docs/score_technical_base/score_tools/_assets/bazel.drawio.svg rename to docs/score_tools/_assets/bazel.drawio.svg diff --git a/docs/score_technical_base/score_tools/_assets/clippy.drawio.svg b/docs/score_tools/_assets/clippy.drawio.svg similarity index 100% rename from docs/score_technical_base/score_tools/_assets/clippy.drawio.svg rename to docs/score_tools/_assets/clippy.drawio.svg diff --git a/docs/score_technical_base/score_tools/_assets/doc_as_code.drawio.svg b/docs/score_tools/_assets/doc_as_code.drawio.svg similarity index 100% rename from docs/score_technical_base/score_tools/_assets/doc_as_code.drawio.svg rename to docs/score_tools/_assets/doc_as_code.drawio.svg diff --git a/docs/score_technical_base/score_tools/_assets/gtest.drawio.svg b/docs/score_tools/_assets/gtest.drawio.svg similarity index 100% rename from docs/score_technical_base/score_tools/_assets/gtest.drawio.svg rename to docs/score_tools/_assets/gtest.drawio.svg diff --git a/docs/score_technical_base/score_tools/_assets/itf.drawio.svg b/docs/score_tools/_assets/itf.drawio.svg similarity index 100% rename from docs/score_technical_base/score_tools/_assets/itf.drawio.svg rename to docs/score_tools/_assets/itf.drawio.svg diff --git a/docs/score_technical_base/score_tools/_assets/rustfmt.drawio.svg b/docs/score_tools/_assets/rustfmt.drawio.svg similarity index 100% rename from docs/score_technical_base/score_tools/_assets/rustfmt.drawio.svg rename to docs/score_tools/_assets/rustfmt.drawio.svg diff --git a/docs/score_technical_base/score_tools/bazel.rst b/docs/score_tools/bazel.rst similarity index 100% rename from docs/score_technical_base/score_tools/bazel.rst rename to docs/score_tools/bazel.rst diff --git a/docs/score_technical_base/score_tools/clippy.rst b/docs/score_tools/clippy.rst similarity index 100% rename from docs/score_technical_base/score_tools/clippy.rst rename to docs/score_tools/clippy.rst diff --git a/docs/score_technical_base/score_tools/doc_as_code.rst b/docs/score_tools/doc_as_code.rst similarity index 100% rename from docs/score_technical_base/score_tools/doc_as_code.rst rename to docs/score_tools/doc_as_code.rst diff --git a/docs/score_technical_base/score_tools/gtest.rst b/docs/score_tools/gtest.rst similarity index 100% rename from docs/score_technical_base/score_tools/gtest.rst rename to docs/score_tools/gtest.rst diff --git a/docs/score_technical_base/score_tools/index.rst b/docs/score_tools/index.rst similarity index 100% rename from docs/score_technical_base/score_tools/index.rst rename to docs/score_tools/index.rst diff --git a/docs/score_technical_base/score_tools/itf.rst b/docs/score_tools/itf.rst similarity index 100% rename from docs/score_technical_base/score_tools/itf.rst rename to docs/score_tools/itf.rst diff --git a/docs/score_technical_base/score_tools/rustfmt.rst b/docs/score_tools/rustfmt.rst similarity index 100% rename from docs/score_technical_base/score_tools/rustfmt.rst rename to docs/score_tools/rustfmt.rst From ab3260547667d7ca86846083c0e84b549ad8df37 Mon Sep 17 00:00:00 2001 From: "jhr2hi@bosch.com" <roland.jentsch@etas.com> Date: Thu, 5 Feb 2026 14:17:54 +0100 Subject: [PATCH 186/214] move to own card --- docs/index.rst | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 82503f87baa..b7e422ab297 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -63,8 +63,6 @@ Software artifacts Features ^^^ :ref:`Features <features>` are the heart of the S-CORE software. - Understand the internal details of :ref:`Infrastructure <infrastructure_feature>` - or :ref:`Integration <integration_features>` Features. .. grid-item-card:: @@ -77,7 +75,7 @@ Software artifacts Project structure and processes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. grid:: 1 1 2 2 +.. grid:: 1 1 3 3 :class-container: score-grid .. grid-item-card:: @@ -96,6 +94,14 @@ Project structure and processes :ref:`Project Handbook <pmp>`. And learn how we deal with :need:`doc__score_platform_safety_plan` or care about :need:`doc__verification_plan`. + .. grid-item-card:: + + Technical Base + ^^^ + Understand the internal details of :ref:`Infrastructure <infrastructure_feature>` + or :ref:`Integration <integration_features>`. + + .. dropdown:: Click to see the complete sitemap .. toctree:: @@ -109,7 +115,6 @@ Project structure and processes score_technical_base/index Releases <score_releases/index.rst> - Tools <score_tools/index.rst> PMP <platform_management_plan/index.rst> Eclipse <https://projects.eclipse.org/projects/automotive.score> design_decisions/index From 467747c83e1e523cba0e7df449936affebcdbaa9 Mon Sep 17 00:00:00 2001 From: "jhr2hi@bosch.com" <roland.jentsch@etas.com> Date: Thu, 5 Feb 2026 14:28:10 +0100 Subject: [PATCH 187/214] add tools again --- docs/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/index.rst b/docs/index.rst index b7e422ab297..a6530063312 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -115,6 +115,7 @@ Project structure and processes score_technical_base/index Releases <score_releases/index.rst> + Tools <score_tools/index.rst> PMP <platform_management_plan/index.rst> Eclipse <https://projects.eclipse.org/projects/automotive.score> design_decisions/index From b7630e6ba6d10f03e2fe7db2cb9ef4720e2074d9 Mon Sep 17 00:00:00 2001 From: "jhr2hi@bosch.com" <roland.jentsch@etas.com> Date: Thu, 5 Feb 2026 14:40:19 +0100 Subject: [PATCH 188/214] wording --- docs/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index a6530063312..8ac3d766b6e 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -98,7 +98,7 @@ Project structure and processes Technical Base ^^^ - Understand the internal details of :ref:`Infrastructure <infrastructure_feature>` + Understand the internal details of the S-CORE :ref:`Infrastructure <infrastructure_feature>` or :ref:`Integration <integration_features>`. From 1af01fd5b5ba45fee52715d353e12c2a082b4516 Mon Sep 17 00:00:00 2001 From: "jhr2hi@bosch.com" <roland.jentsch@etas.com> Date: Thu, 5 Feb 2026 15:22:45 +0100 Subject: [PATCH 189/214] better names in box --- docs/index.rst | 2 +- docs/platform_management_plan/safety_management.rst | 3 +++ docs/platform_management_plan/software_verification.rst | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index 8ac3d766b6e..d99633a8534 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -92,7 +92,7 @@ Project structure and processes ^^^ Read about our project and organization structure in the :ref:`Project Handbook <pmp>`. - And learn how we deal with :need:`doc__score_platform_safety_plan` or care about :need:`doc__verification_plan`. + And learn how we deal with :ref:`Platform Safety Plan <score_platform_safety_plan>` or care about :ref:`Software Verification Plan <software_verification_plan>`. .. grid-item-card:: diff --git a/docs/platform_management_plan/safety_management.rst b/docs/platform_management_plan/safety_management.rst index 8b0e334067a..9b5c35ecdc4 100644 --- a/docs/platform_management_plan/safety_management.rst +++ b/docs/platform_management_plan/safety_management.rst @@ -20,6 +20,9 @@ :realizes: wp__platform_safety_plan, wp__safety_tailoring :tags: platform_management + +.. _score_platform_safety_plan: + Safety management / Platform Safety Plan ---------------------------------------- diff --git a/docs/platform_management_plan/software_verification.rst b/docs/platform_management_plan/software_verification.rst index bc0f0f338bf..eb86887c41a 100644 --- a/docs/platform_management_plan/software_verification.rst +++ b/docs/platform_management_plan/software_verification.rst @@ -20,6 +20,9 @@ :tags: platform_management :realizes: wp__verification_plan + +.. _software_verification_plan: + Software verification ********************* From 9760a2720de311b256f9936d62c622932594521d Mon Sep 17 00:00:00 2001 From: "jhr2hi@bosch.com" <roland.jentsch@etas.com> Date: Fri, 6 Feb 2026 07:39:41 +0100 Subject: [PATCH 190/214] modify name --- docs/score_technical_base/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/score_technical_base/index.rst b/docs/score_technical_base/index.rst index f172252c71c..e58e7b65dbc 100644 --- a/docs/score_technical_base/index.rst +++ b/docs/score_technical_base/index.rst @@ -12,7 +12,7 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -.. _features: +.. _technical_base: Score Project Technical Base and Infrastructure =============================================== From 758f78e50683da5187fb725514b7906e9847a1b7 Mon Sep 17 00:00:00 2001 From: "jhr2hi@bosch.com" <roland.jentsch@etas.com> Date: Tue, 10 Feb 2026 09:21:58 +0100 Subject: [PATCH 191/214] delete infrastructure and integration --- docs/index.rst | 10 +- docs/score_technical_base/index.rst | 28 ----- .../infrastructure/bazel_registry.rst | 100 ---------------- .../infrastructure/config_as_code.rst | 68 ----------- .../infrastructure/index.rst | 40 ------- .../_assets/score_high_level_dependencies.png | Bin 32041 -> 0 bytes .../integration/index.rst | 112 ------------------ 7 files changed, 1 insertion(+), 357 deletions(-) delete mode 100644 docs/score_technical_base/index.rst delete mode 100644 docs/score_technical_base/infrastructure/bazel_registry.rst delete mode 100644 docs/score_technical_base/infrastructure/config_as_code.rst delete mode 100644 docs/score_technical_base/infrastructure/index.rst delete mode 100644 docs/score_technical_base/integration/_assets/score_high_level_dependencies.png delete mode 100644 docs/score_technical_base/integration/index.rst diff --git a/docs/index.rst b/docs/index.rst index d99633a8534..729fd97ca8c 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -75,7 +75,7 @@ Software artifacts Project structure and processes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. grid:: 1 1 3 3 +.. grid:: 1 1 2 2 :class-container: score-grid .. grid-item-card:: @@ -94,13 +94,6 @@ Project structure and processes :ref:`Project Handbook <pmp>`. And learn how we deal with :ref:`Platform Safety Plan <score_platform_safety_plan>` or care about :ref:`Software Verification Plan <software_verification_plan>`. - .. grid-item-card:: - - Technical Base - ^^^ - Understand the internal details of the S-CORE :ref:`Infrastructure <infrastructure_feature>` - or :ref:`Integration <integration_features>`. - .. dropdown:: Click to see the complete sitemap @@ -112,7 +105,6 @@ Project structure and processes requirements/index modules/index contribute/index - score_technical_base/index Releases <score_releases/index.rst> Tools <score_tools/index.rst> diff --git a/docs/score_technical_base/index.rst b/docs/score_technical_base/index.rst deleted file mode 100644 index e58e7b65dbc..00000000000 --- a/docs/score_technical_base/index.rst +++ /dev/null @@ -1,28 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2024 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -.. _technical_base: - -Score Project Technical Base and Infrastructure -=============================================== - -Here we list the elements upon which the actual score project is built. Without them, the platform cannot function and would only deliver some source files. - -The following features are defined: - -.. toctree:: - :maxdepth: 1 - :glob: - - */index diff --git a/docs/score_technical_base/infrastructure/bazel_registry.rst b/docs/score_technical_base/infrastructure/bazel_registry.rst deleted file mode 100644 index 9dfbe4cfa90..00000000000 --- a/docs/score_technical_base/infrastructure/bazel_registry.rst +++ /dev/null @@ -1,100 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2024 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -.. _bazel_registry: - -Bazel registry -############## - -Documentation -************** - -Description -=========== - -S-CORE, as a multi repository projects requires a setup of it's own -registry, that will help managing the dependencies between various -parts. - -The registry is located at: -https://github.com/eclipse-score/bazel_registry - -In order to use it the following lines need to be added to the .bazelrc -file of a module: - -.. code:: - - common --registry=https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/ - common --registry=https://bcr.bazel.build - -S-CORE registry is set as first registry with the fallback to Bazel's -central registry for other open source modules. - -Minimal module entry -==================== - -The following directory layout reflects a minimal module entry: - -.. code:: - - ├── bazel_registry.json - ├── modules - │   └── score_example - │   ├── 0.1 - │   │   ├── MODULE.bazel - │   │   └── source.json - │   └── metadata.json - └── README.md - -The *score_example* directory contains the metadata.json file which holds basic information about the module: - -.. code:: - - { - "homepage": "https://github.com/eclipse-score/example", - "repository": [ - "github:eclipse-score/example" - ], - "versions": [ - "0.1" - ], - "yanked_versions": {} - } - -Each version of the module is stored as a separate directory. Version directory requires a *source.json* and *MODULE.bazel* files. -The *source.json* file tell bazel where to get the sources from. - -.. code:: - - { - "integrity": "sha256-hGJ4VQ+0q/HcxbvOrY/C2UT4SjMnNLVgQAD4k5aAToI=", - "strip_prefix": "example-872caac46177cc3699899ef91348a643881b0981", - "url": "https://github.com/eclipse-score/example/archive/872caac46177cc3699899ef91348a643881b0981.zip" - } - - -The *MODULE.bazel* file should be the same as delpoyed in the referenced sources. - -Module version should comply to the established `Bazel version format <https://bazel.build/external/module#version_format>`_ -and use the `compatibility_level <https://bazel.build/external/module#compatibility_level>`_ to specify breaking changes. - - -References -========== - -- Bazel external dependency management: - https://bazel.build/external/overview#bzlmod -- Bazel central registry browser: https://registry.bazel.build/ -- Bzlmod usage examples: - https://github.com/bazelbuild/examples/tree/main/bzlmod\ diff --git a/docs/score_technical_base/infrastructure/config_as_code.rst b/docs/score_technical_base/infrastructure/config_as_code.rst deleted file mode 100644 index 6ec6457df2c..00000000000 --- a/docs/score_technical_base/infrastructure/config_as_code.rst +++ /dev/null @@ -1,68 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2024 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -Configuration as code -####################### - -Documentation -*************** - -Description -=========== - -S-CORE project uses GitHub for hosting source code as well as GitHub -Actions for all CI/CD task. The configuration of the organization and -repositories is managed by otterdog, a config-as-code solution. GitHub -provides several approaches to set up repositories. In order to provide -unified experience among all the S-CORE repositories, the following rules -should be followed. - -For in depth description of the properties and the relations, please -refer to the otterdog documentation. - -Current setup can be viewed in the dashboard: -https://otterdog.eclipse.org/projects/automotive.score - -Automatically generated documentation for eclipse-score otterdog -configuration is here: https://eclipse-score.github.io/.eclipsefdn/ - -All changes to the configuration should be handled by pull requests in -https://github.com/eclipse-score/.eclipsefdn/ - -Organization settings ---------------------- - -- ``default_branch_name`` - the default branch name for newly created - repositories is set to ``main``. -- ``has_discussions`` - organisation level discussions are enabled. -- ``discussion_source_repository`` - organization level discussiones - are attached to ``eclipse-score/score`` repository. - -Repository settings -------------------- - -- ``homepage`` - the link that is displayed when opening the repository - in github. -- ``environments`` - ``github-pages`` environment needs to be defined - for building documentation. -- ``gh_pages_build_type`` - set to ``workflow`` to build the - documentation rather than serve static content. - -References -========== - -- GitHub documentation: https://docs.github.com/en -- GitHub repositories: https://docs.github.com/en/repositories -- GitHub actions: https://docs.github.com/en/actions -- otterdog: https://otterdog.readthedocs.io/en/latest/ diff --git a/docs/score_technical_base/infrastructure/index.rst b/docs/score_technical_base/infrastructure/index.rst deleted file mode 100644 index 2b2b10200f2..00000000000 --- a/docs/score_technical_base/infrastructure/index.rst +++ /dev/null @@ -1,40 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2024 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -.. _infrastructure_feature: - -################ - Infrastructure -################ - -*************** - Documentation -*************** - -Description -=========== - -The infrastructure section describes the setup of the services and tools -that are used for development. - -************* - Subfeatures -************* - -.. toctree:: - :titlesonly: - :maxdepth: 1 - - bazel_registry - config_as_code diff --git a/docs/score_technical_base/integration/_assets/score_high_level_dependencies.png b/docs/score_technical_base/integration/_assets/score_high_level_dependencies.png deleted file mode 100644 index 44f2334abd13c8070d46d035f5e1d1593a86fcc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32041 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 Hbmu<+ylFo- diff --git a/docs/score_technical_base/integration/index.rst b/docs/score_technical_base/integration/index.rst deleted file mode 100644 index 691cf65fa6f..00000000000 --- a/docs/score_technical_base/integration/index.rst +++ /dev/null @@ -1,112 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2024 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -.. _integration_features: - -Integration -########### - -Documentation -************* - -Description -=========== - -Bazel is the build/test infrastructure of choice for the S-CORE project. -Overall integration and build should be realized using available rules -or custom rules developed for the project. This means that the following -should be integrated with bazel: - -- code build -- documentation build -- test runs -- binary runs -- external tooling - -Running external tooling outside of Bazel should be limited as much as -possible, in order to streamline the development with simple ``bazel -{build,test,run}`` command, across multiple repositories and multiple -languages. - -All dependencies should be managed thru mechanisms available in Bazel. -Dependency to host system should be limited as much as possible. - -Each repository should register an entry in the `bazel_registry <https://github.com/eclipse-score/bazel_registry>`_ -for dependency management between different modules. - -High level integration dependency - -|score_high_level_dependencies| - -Mandatory repositories: - -- bazel_registry (implicit dependency, stores version of all modules) -- process_description (S-CORE development process description) -- score (requirements and architecture) -- reference_integration (brings all parts together) - -Optional repositories: - -- repositories containing implementation of particular features - -Versioning and release cycle -============================ - -Each repository that is planned to be consumed as a dependency, should adopt -the `Bazel versioning scheme <https://bazel.build/external/module#version_format>`_ and use the -`compatibility_level <https://bazel.build/external/module#compatibility_level>`_ -to indicate breaking changes between the versions. - -This requires that each repository has its own release cycle. A release should create a tag in the repository -and publish a new version in `bazel_registry <https://github.com/eclipse-score/bazel_registry>`_, -which can then be consumed by the users. - -Refer to :ref:`Bazel registry <bazel_registry>` for detailed setup of a module entry. - -Incubation repositories -======================= - -For early evaluation of existing implementations and prototypes we introduce -so called `incubation repositories`. -They should serve as a prototyping area where developers can share and build -code with only limited restrictions such as quality KPIs, review processes, etc. - -Incubation repositories are indicated by the prefix `inc_` in the repo name. - -Any incubation repository shall evolve over time towards a fully functional -Bazel module, which can be integrated via an additional dependency in the main -build. - -If a repo has reached this state and the concept is approved in general the -content can be used as input for the score production repositories. - -This means that the existing code can be transferred to the production -repositories as copy via the contribution process. The incubation -repository will be archived at this point in time. - -The content shall be disabled via a Bazel `feature flag` with the following -naming convention `//experimental_[feature]`. -The `experimental` prefix indicates to the user that -this functionality is not yet ready for series production. -Additionally the relevant code might not meet all required quality KPIs. - - -References -========== - -- Bazel: https://bazel.build/ -- Bazel modules: https://bazel.build/external/module -- Bazel registries: https://bazel.build/external/registry - -.. |score_high_level_dependencies| image:: _assets/score_high_level_dependencies.png From 6396d2ed431e51ff4f8b96f108aae38f1fcc257d Mon Sep 17 00:00:00 2001 From: "jhr2hi@bosch.com" <roland.jentsch@etas.com> Date: Tue, 10 Feb 2026 10:16:19 +0100 Subject: [PATCH 192/214] Nulledit to trigger the pipeline again --- docs/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 729fd97ca8c..8417fd620e1 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -60,9 +60,9 @@ Software artifacts .. grid-item-card:: - Features + Features & Modules ^^^ - :ref:`Features <features>` are the heart of the S-CORE software. + :ref:`Features <features>` and :ref:`Modules <modules>` are the heart of the S-CORE software. .. grid-item-card:: From 44392f295fe96730731679df8dbc481780fb5257 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20S=C3=B6ren=20Pollak?= <maximilian.pollak@qorix.com> Date: Tue, 10 Feb 2026 14:38:08 +0100 Subject: [PATCH 193/214] Fixes permissions bug for bazel commands (#2570) This fixes a permissions bug when running bazel commands. Version 1.6.3 does not seem to be compatible with rules_py 1.8.3. An upgrade to 1.8.4 of aspect_rules_py (newest version) was tried but that runs into other issues and is not a viable solution without further changes --- MODULE.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MODULE.bazel b/MODULE.bazel index d0015987115..f44c0331a31 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -36,7 +36,7 @@ use_repo(python) # Additional Python rules provided by aspect, e.g. an improved version of # `py_binary`. But more importantly, it provides `py_venv`. -bazel_dep(name = "aspect_rules_py", version = "1.6.3", dev_dependency = True) +bazel_dep(name = "aspect_rules_py", version = "1.6.6", dev_dependency = True) ############################################################################### # From 773b08211081b9bf9f258900c45b135186cd43c7 Mon Sep 17 00:00:00 2001 From: FScholPer <frank.scholter_peres@mercedes-benz.com> Date: Fri, 4 Jul 2025 07:16:11 +0200 Subject: [PATCH 194/214] docs: added nonipc feature(#916) --- docs/features/non-ipc/index.rst | 120 +++++++++++++++ docs/features/non-ipc/requirements/index.rst | 146 +++++++++++++++++++ docs/requirements/stakeholder/index.rst | 10 ++ 3 files changed, 276 insertions(+) create mode 100644 docs/features/non-ipc/index.rst create mode 100644 docs/features/non-ipc/requirements/index.rst diff --git a/docs/features/non-ipc/index.rst b/docs/features/non-ipc/index.rst new file mode 100644 index 00000000000..b698b3ffd2c --- /dev/null +++ b/docs/features/non-ipc/index.rst @@ -0,0 +1,120 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +.. _non-ipc_feature: + +NonIPC Communication +#################### + +.. document:: NonIPC Communication + :id: doc__nonipc + :status: valid + :safety: ASIL_B + :tags: feature_request + + +.. toctree:: + :maxdepth: 2 + + ./requirements/index + + +Feature flag +============ + +To activate this feature, use the following feature flag: + +``experimental_nonipc_com`` + +Abstract +======== + +This feature provides mechanisms for communication and data exchange between processes without using IPC. +It includes two classes of communication/data-exchange: + +1. One-way data sharing into a VM for (vehicle) state read-only for the VM (snapshot state) + - Read-only for consumer (VM) + - Support for consistent data-sets (consumer must be able to get a consistent version of related data items) + - Consistent access must be lock-free + - Producer time stamps shall be available for related data-sets + +2. Streamed data based on shared queues (stream of events or data) + - Queues shall be configurable by client (VM) (number of elements etc..) + - Size of a queue + - Allocation of buffers for the data elements + - Queues shall support lock-free access to data elements + - Support for bi-directional communication via writable data elements by the client + - Asynchronous bi-directional support via multiple queues + +Motivation +========== + +NonIPC communication mechanisms are essential to ensure efficient and reliable data exchange between processes, especially in scenarios where IPC may not be suitable or desired. + +Rationale +========= + +These communication mechanisms are developed to address specific needs for data sharing and streaming in a VM environment, ensuring consistent and lock-free access to data. + +Specification +============= + +The NonIPC communication feature consists of the following mechanisms: + +- **One-way data sharing**: Allows read-only access to vehicle state data in a VM, ensuring consistency and lock-free access. +- **Streamed data**: Utilizes shared queues for streaming events or data, configurable by the client, supporting bi-directional communication. + +General requirements: +--------------------- + +- Multiple chunks of shared memory shall be supported to allow required access control. +- Notifications for data updates shall be available (virtual IRQs in a VM). +- Notifications shall be configurable by consumers of data (using flags or watermarks in shared memory from client to producer). + +Backwards Compatibility +======================= + +As this is a new feature, there are no backwards compatibility concerns. + +Security Impact +=============== + +NonIPC communication mechanisms present varying security risks as vulnerabilities could affect multiple components simultaneously. +Each mechanism requires individual security impact analysis based on its functionality and usage patterns. + +Safety Impact +============= + +- Due to wide usage of these communication mechanisms throughout the platform, extra care is needed in design, implementation, and testing to minimize safety impact. +- Mechanisms are developed at various integrity levels from QM (non-safety) up to ASIL-B, depending on their intended use cases. + +License Impact +============== + +The NonIPC communication mechanisms are licensed under Apache License 2.0. + +How to Teach This +================= + +Each mechanism is expected to have a user manual that includes an API reference and usage examples where necessary. + +Rejected Ideas +============== + +There are no rejected ideas related to the NonIPC communication feature at this time. + +Open Issues +=========== + +There are currently no open issues related to the NonIPC communication feature. diff --git a/docs/features/non-ipc/requirements/index.rst b/docs/features/non-ipc/requirements/index.rst new file mode 100644 index 00000000000..6af5831dfef --- /dev/null +++ b/docs/features/non-ipc/requirements/index.rst @@ -0,0 +1,146 @@ +.. + # ******************************************************************************* + # Copyright (c) 2025 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +Requirements +############ + +.. feat_req:: One-way data sharing into a VM + :id: feat_req__nonipc__one_way_sharing + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__vm + :status: valid + + The system shall support one-way data sharing into a VM for vehicle state read-only for the VM (snapshot state). + +.. feat_req:: Read-only access for VM + :id: feat_req__nonipc__readonly_vm + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__vm + :status: valid + + The consumer (VM) shall have read-only access to the shared data. + +.. feat_req:: Consistent data-sets + :id: feat_req__nonipc__consistent_data + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__vm + :status: valid + + The system shall support consistent data-sets, allowing the consumer to obtain a consistent version of related data items. + +.. feat_req:: Lock-free access + :id: feat_req__nonipc__lock_free_access + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__vm + :status: valid + + Consistent access to data must be lock-free. + +.. feat_req:: Producer time stamps + :id: feat_req__nonipc__producer_timestamps + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__vm + :status: valid + + Producer time stamps shall be available for related data-sets. + +.. feat_req:: Streamed data based on shared queues + :id: feat_req__nonipc__streamed_data + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__vm + :status: valid + + The system shall support streamed data based on shared queues (stream of events or data). + +.. feat_req:: Configurable queues + :id: feat_req__nonipc__configurable_queues + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__vm + :status: valid + + Queues shall be configurable by the client (VM), including the number of elements and buffer allocation. + +.. feat_req:: Lock-free queue access + :id: feat_req__nonipc__lock_free_queue + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__vm + :status: valid + + Queues shall support lock-free access to data elements. + +.. feat_req:: Bi-directional communication + :id: feat_req__nonipc__bi_directional_comm + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__vm + :status: valid + + The system shall support bi-directional communication via writable data elements by the client. + +.. feat_req:: Asynchronous support + :id: feat_req__nonipc__async_support + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__vm + :status: valid + + The system shall provide asynchronous bi-directional support via multiple queues. + +.. feat_req:: Shared memory chunks + :id: feat_req__nonipc__shared_memory + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__vm + :status: valid + + The system shall support multiple chunks of shared memory to allow required access control. + +.. feat_req:: Data update notifications + :id: feat_req__nonipc__data_notifications + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__vm + :status: valid + + Notifications for data updates shall be available (virtual IRQs in a VM). + +.. feat_req:: Configurable notifications + :id: feat_req__nonipc__config_notifications + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__vm + :status: valid + + Notifications shall be configurable by consumers of data (using flags or watermarks in shared memory from client to producer). diff --git a/docs/requirements/stakeholder/index.rst b/docs/requirements/stakeholder/index.rst index e916fabf3d2..52eebb53bec 100644 --- a/docs/requirements/stakeholder/index.rst +++ b/docs/requirements/stakeholder/index.rst @@ -564,6 +564,16 @@ Communication The SW-platform shall support intra-process communication. +.. stkh_req:: Non-Intra-process Communication + :id: stkh_req__communication__vm + :reqtype: Functional + :security: NO + :safety: QM + :rationale: Application software typically maps software building blocks into the same process. + :status: valid + + The platform shall support not only IPC but also intra VM communication. + .. stkh_req:: Stable application interfaces :id: stkh_req__communication__stable_app_inter :reqtype: Functional From 68c20a37e14acae4b26daf3ce01fe5c302b92c15 Mon Sep 17 00:00:00 2001 From: FScholPer <frank.scholter_peres@mercedes-benz.com> Date: Tue, 8 Jul 2025 08:14:10 +0200 Subject: [PATCH 195/214] fix: renamed dir (#916) --- docs/features/{non-ipc => nonipc}/index.rst | 0 docs/features/{non-ipc => nonipc}/requirements/index.rst | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename docs/features/{non-ipc => nonipc}/index.rst (100%) rename docs/features/{non-ipc => nonipc}/requirements/index.rst (100%) diff --git a/docs/features/non-ipc/index.rst b/docs/features/nonipc/index.rst similarity index 100% rename from docs/features/non-ipc/index.rst rename to docs/features/nonipc/index.rst diff --git a/docs/features/non-ipc/requirements/index.rst b/docs/features/nonipc/requirements/index.rst similarity index 100% rename from docs/features/non-ipc/requirements/index.rst rename to docs/features/nonipc/requirements/index.rst From 3a0da819542665220df409d50444f1b6e6a05639 Mon Sep 17 00:00:00 2001 From: FScholPer <frank.scholter_peres@mercedes-benz.com> Date: Tue, 8 Jul 2025 09:10:13 +0200 Subject: [PATCH 196/214] fix: removed idents as this leads to strage errors(#916) --- docs/features/nonipc/index.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/features/nonipc/index.rst b/docs/features/nonipc/index.rst index b698b3ffd2c..3c94d866c45 100644 --- a/docs/features/nonipc/index.rst +++ b/docs/features/nonipc/index.rst @@ -51,8 +51,9 @@ It includes two classes of communication/data-exchange: 2. Streamed data based on shared queues (stream of events or data) - Queues shall be configurable by client (VM) (number of elements etc..) - - Size of a queue - - Allocation of buffers for the data elements + - Size of a queue + - Allocation of buffers for the data elements + - Queues shall support lock-free access to data elements - Support for bi-directional communication via writable data elements by the client - Asynchronous bi-directional support via multiple queues From b5e519ef30dee555c6be0c1c265eff5cfe911b50 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres <frank.scholter_peres@mercedes-benz.com> Date: Wed, 6 Aug 2025 14:13:17 +0200 Subject: [PATCH 197/214] switched to new name and changed wording somethimes --- .gitignore | 4 +++ .../crossvm}/index.rst | 30 +++++++++---------- .../crossvm}/requirements/index.rst | 26 ++++++++-------- docs/features/communication/index.rst | 1 + docs/requirements/stakeholder/index.rst | 6 ++-- 5 files changed, 36 insertions(+), 31 deletions(-) rename docs/features/{nonipc => communication/crossvm}/index.rst (77%) rename docs/features/{nonipc => communication/crossvm}/requirements/index.rst (87%) diff --git a/.gitignore b/.gitignore index 5b56c3953a3..ecf96856b66 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,7 @@ __pycache__/ # Mac .DS_Store + +# IDE +/.clwb +/.idea diff --git a/docs/features/nonipc/index.rst b/docs/features/communication/crossvm/index.rst similarity index 77% rename from docs/features/nonipc/index.rst rename to docs/features/communication/crossvm/index.rst index 3c94d866c45..01ad8e0e106 100644 --- a/docs/features/nonipc/index.rst +++ b/docs/features/communication/crossvm/index.rst @@ -12,16 +12,16 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -.. _non-ipc_feature: +.. _crossvm_feature: -NonIPC Communication +Cross Virtual Machine Communication #################### -.. document:: NonIPC Communication - :id: doc__nonipc +.. document:: Cross-VM Communication + :id: doc__com_crossvm :status: valid :safety: ASIL_B - :tags: feature_request + :tags: feature_modification_request .. toctree:: @@ -35,12 +35,12 @@ Feature flag To activate this feature, use the following feature flag: -``experimental_nonipc_com`` +``experimental_crossvm_com`` Abstract ======== -This feature provides mechanisms for communication and data exchange between processes without using IPC. +This feature provides mechanisms for communication and data exchange between processes in different Virtual Machines (VM). It includes two classes of communication/data-exchange: 1. One-way data sharing into a VM for (vehicle) state read-only for the VM (snapshot state) @@ -53,7 +53,6 @@ It includes two classes of communication/data-exchange: - Queues shall be configurable by client (VM) (number of elements etc..) - Size of a queue - Allocation of buffers for the data elements - - Queues shall support lock-free access to data elements - Support for bi-directional communication via writable data elements by the client - Asynchronous bi-directional support via multiple queues @@ -61,7 +60,7 @@ It includes two classes of communication/data-exchange: Motivation ========== -NonIPC communication mechanisms are essential to ensure efficient and reliable data exchange between processes, especially in scenarios where IPC may not be suitable or desired. +Cross-VM communication mechanisms are essential to ensure efficient and reliable data exchange between VMs. Rationale ========= @@ -71,7 +70,7 @@ These communication mechanisms are developed to address specific needs for data Specification ============= -The NonIPC communication feature consists of the following mechanisms: +The Cross-VM communication feature consists of the following mechanisms: - **One-way data sharing**: Allows read-only access to vehicle state data in a VM, ensuring consistency and lock-free access. - **Streamed data**: Utilizes shared queues for streaming events or data, configurable by the client, supporting bi-directional communication. @@ -86,12 +85,12 @@ General requirements: Backwards Compatibility ======================= -As this is a new feature, there are no backwards compatibility concerns. +It should be shure that both Cross-VM and normal IPC work seamlessly together Security Impact =============== -NonIPC communication mechanisms present varying security risks as vulnerabilities could affect multiple components simultaneously. +Cross-VM communication mechanisms present varying security risks as vulnerabilities could affect multiple components simultaneously. Each mechanism requires individual security impact analysis based on its functionality and usage patterns. Safety Impact @@ -99,11 +98,12 @@ Safety Impact - Due to wide usage of these communication mechanisms throughout the platform, extra care is needed in design, implementation, and testing to minimize safety impact. - Mechanisms are developed at various integrity levels from QM (non-safety) up to ASIL-B, depending on their intended use cases. +- Freedom from Interference has to be taken into account when different VMs License Impact ============== -The NonIPC communication mechanisms are licensed under Apache License 2.0. +The Cross-VM communication mechanisms are licensed under Apache License 2.0. How to Teach This ================= @@ -113,9 +113,9 @@ Each mechanism is expected to have a user manual that includes an API reference Rejected Ideas ============== -There are no rejected ideas related to the NonIPC communication feature at this time. +There are no rejected ideas related to the Cross-VM communication feature at this time. Open Issues =========== -There are currently no open issues related to the NonIPC communication feature. +There are currently no open issues related to the Cross-VM communication feature. diff --git a/docs/features/nonipc/requirements/index.rst b/docs/features/communication/crossvm/requirements/index.rst similarity index 87% rename from docs/features/nonipc/requirements/index.rst rename to docs/features/communication/crossvm/requirements/index.rst index 6af5831dfef..1dc501730c3 100644 --- a/docs/features/nonipc/requirements/index.rst +++ b/docs/features/communication/crossvm/requirements/index.rst @@ -16,7 +16,7 @@ Requirements ############ .. feat_req:: One-way data sharing into a VM - :id: feat_req__nonipc__one_way_sharing + :id: feat_req__crossvm__one_way_sharing :reqtype: Functional :security: NO :safety: QM @@ -26,7 +26,7 @@ Requirements The system shall support one-way data sharing into a VM for vehicle state read-only for the VM (snapshot state). .. feat_req:: Read-only access for VM - :id: feat_req__nonipc__readonly_vm + :id: feat_req__crossvm__readonly_vm :reqtype: Functional :security: NO :safety: QM @@ -36,7 +36,7 @@ Requirements The consumer (VM) shall have read-only access to the shared data. .. feat_req:: Consistent data-sets - :id: feat_req__nonipc__consistent_data + :id: feat_req__crossvm__consistent_data :reqtype: Functional :security: NO :safety: QM @@ -46,7 +46,7 @@ Requirements The system shall support consistent data-sets, allowing the consumer to obtain a consistent version of related data items. .. feat_req:: Lock-free access - :id: feat_req__nonipc__lock_free_access + :id: feat_req__crossvm__lock_free_access :reqtype: Functional :security: NO :safety: QM @@ -56,7 +56,7 @@ Requirements Consistent access to data must be lock-free. .. feat_req:: Producer time stamps - :id: feat_req__nonipc__producer_timestamps + :id: feat_req__crossvm__producer_timestamps :reqtype: Functional :security: NO :safety: QM @@ -66,7 +66,7 @@ Requirements Producer time stamps shall be available for related data-sets. .. feat_req:: Streamed data based on shared queues - :id: feat_req__nonipc__streamed_data + :id: feat_req__crossvm__streamed_data :reqtype: Functional :security: NO :safety: QM @@ -76,7 +76,7 @@ Requirements The system shall support streamed data based on shared queues (stream of events or data). .. feat_req:: Configurable queues - :id: feat_req__nonipc__configurable_queues + :id: feat_req__crossvm__configurable_queues :reqtype: Functional :security: NO :safety: QM @@ -86,7 +86,7 @@ Requirements Queues shall be configurable by the client (VM), including the number of elements and buffer allocation. .. feat_req:: Lock-free queue access - :id: feat_req__nonipc__lock_free_queue + :id: feat_req__crossvm__lock_free_queue :reqtype: Functional :security: NO :safety: QM @@ -96,7 +96,7 @@ Requirements Queues shall support lock-free access to data elements. .. feat_req:: Bi-directional communication - :id: feat_req__nonipc__bi_directional_comm + :id: feat_req__crossvm__bi_directional_comm :reqtype: Functional :security: NO :safety: QM @@ -106,7 +106,7 @@ Requirements The system shall support bi-directional communication via writable data elements by the client. .. feat_req:: Asynchronous support - :id: feat_req__nonipc__async_support + :id: feat_req__crossvm__async_support :reqtype: Functional :security: NO :safety: QM @@ -116,7 +116,7 @@ Requirements The system shall provide asynchronous bi-directional support via multiple queues. .. feat_req:: Shared memory chunks - :id: feat_req__nonipc__shared_memory + :id: feat_req__crossvm__shared_memory :reqtype: Functional :security: NO :safety: QM @@ -126,7 +126,7 @@ Requirements The system shall support multiple chunks of shared memory to allow required access control. .. feat_req:: Data update notifications - :id: feat_req__nonipc__data_notifications + :id: feat_req__crossvm__data_notifications :reqtype: Functional :security: NO :safety: QM @@ -136,7 +136,7 @@ Requirements Notifications for data updates shall be available (virtual IRQs in a VM). .. feat_req:: Configurable notifications - :id: feat_req__nonipc__config_notifications + :id: feat_req__crossvm__config_notifications :reqtype: Functional :security: NO :safety: QM diff --git a/docs/features/communication/index.rst b/docs/features/communication/index.rst index 62000c6fc91..10dca492432 100644 --- a/docs/features/communication/index.rst +++ b/docs/features/communication/index.rst @@ -35,6 +35,7 @@ Communication (v0.5 beta) ipc/index some_ip_gateway/index abi_compatible_data_types/index + crossvm/index Feature flag ============ diff --git a/docs/requirements/stakeholder/index.rst b/docs/requirements/stakeholder/index.rst index 52eebb53bec..a387bd91c5f 100644 --- a/docs/requirements/stakeholder/index.rst +++ b/docs/requirements/stakeholder/index.rst @@ -564,15 +564,15 @@ Communication The SW-platform shall support intra-process communication. -.. stkh_req:: Non-Intra-process Communication +.. stkh_req:: Cross-VM Communication :id: stkh_req__communication__vm :reqtype: Functional :security: NO :safety: QM - :rationale: Application software typically maps software building blocks into the same process. + :rationale: Different VMs in a system involved. Somethimes they interact. :status: valid - The platform shall support not only IPC but also intra VM communication. + The platform shall support not only IPC but also intra Virtual Machine communication. .. stkh_req:: Stable application interfaces :id: stkh_req__communication__stable_app_inter From 86b1e20ca09948ffcb05a088acf87406b73c1a72 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres <frank.scholter_peres@mercedes-benz.com> Date: Wed, 6 Aug 2025 14:30:19 +0200 Subject: [PATCH 198/214] fixed warning --- docs/features/communication/crossvm/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/communication/crossvm/index.rst b/docs/features/communication/crossvm/index.rst index 01ad8e0e106..3183402674c 100644 --- a/docs/features/communication/crossvm/index.rst +++ b/docs/features/communication/crossvm/index.rst @@ -15,7 +15,7 @@ .. _crossvm_feature: Cross Virtual Machine Communication -#################### +################################### .. document:: Cross-VM Communication :id: doc__com_crossvm From 19198105de0c68729c20315fa603bd20a09fef97 Mon Sep 17 00:00:00 2001 From: "Frank Scholter Peres(MBTI)" <145544737+FScholPer@users.noreply.github.com> Date: Thu, 7 Aug 2025 08:21:11 +0200 Subject: [PATCH 199/214] Update docs/features/communication/crossvm/index.rst Co-authored-by: ThomasHahn <83017581+hth9fe@users.noreply.github.com> Signed-off-by: Frank Scholter Peres(MBTI) <145544737+FScholPer@users.noreply.github.com> --- docs/features/communication/crossvm/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/communication/crossvm/index.rst b/docs/features/communication/crossvm/index.rst index 3183402674c..b99cb14ccbd 100644 --- a/docs/features/communication/crossvm/index.rst +++ b/docs/features/communication/crossvm/index.rst @@ -85,7 +85,7 @@ General requirements: Backwards Compatibility ======================= -It should be shure that both Cross-VM and normal IPC work seamlessly together +It should be sure that both Cross-VM and normal IPC work seamlessly together Security Impact =============== From a5b34d7910e69c6280220a29dab26e8945919a15 Mon Sep 17 00:00:00 2001 From: "Frank Scholter Peres(MBTI)" <145544737+FScholPer@users.noreply.github.com> Date: Thu, 7 Aug 2025 08:21:33 +0200 Subject: [PATCH 200/214] Update docs/features/communication/crossvm/requirements/index.rst Co-authored-by: ThomasHahn <83017581+hth9fe@users.noreply.github.com> Signed-off-by: Frank Scholter Peres(MBTI) <145544737+FScholPer@users.noreply.github.com> --- docs/features/communication/crossvm/requirements/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/communication/crossvm/requirements/index.rst b/docs/features/communication/crossvm/requirements/index.rst index 1dc501730c3..9c79ea1d739 100644 --- a/docs/features/communication/crossvm/requirements/index.rst +++ b/docs/features/communication/crossvm/requirements/index.rst @@ -23,7 +23,7 @@ Requirements :satisfies: stkh_req__communication__vm :status: valid - The system shall support one-way data sharing into a VM for vehicle state read-only for the VM (snapshot state). + The system shall support one-way data sharing into a Virtual Machine (VM) for vehicle state read-only for the VM (snapshot state). .. feat_req:: Read-only access for VM :id: feat_req__crossvm__readonly_vm From a1ca099e77365b71f2541e8a0200fd98d4d76171 Mon Sep 17 00:00:00 2001 From: "Frank Scholter Peres(MBTI)" <145544737+FScholPer@users.noreply.github.com> Date: Thu, 7 Aug 2025 08:21:48 +0200 Subject: [PATCH 201/214] Update docs/requirements/stakeholder/index.rst Co-authored-by: ThomasHahn <83017581+hth9fe@users.noreply.github.com> Signed-off-by: Frank Scholter Peres(MBTI) <145544737+FScholPer@users.noreply.github.com> --- docs/requirements/stakeholder/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements/stakeholder/index.rst b/docs/requirements/stakeholder/index.rst index a387bd91c5f..f8cedaf63b8 100644 --- a/docs/requirements/stakeholder/index.rst +++ b/docs/requirements/stakeholder/index.rst @@ -572,7 +572,7 @@ Communication :rationale: Different VMs in a system involved. Somethimes they interact. :status: valid - The platform shall support not only IPC but also intra Virtual Machine communication. + The platform shall support not only IPC but also intra Virtual Machine (VM) communication. .. stkh_req:: Stable application interfaces :id: stkh_req__communication__stable_app_inter From 1674880bfcc6af89de50478b12cdb4fed37bf499 Mon Sep 17 00:00:00 2001 From: "Frank Scholter Peres(MBTI)" <145544737+FScholPer@users.noreply.github.com> Date: Thu, 7 Aug 2025 08:22:01 +0200 Subject: [PATCH 202/214] Update docs/features/communication/crossvm/index.rst Co-authored-by: ThomasHahn <83017581+hth9fe@users.noreply.github.com> Signed-off-by: Frank Scholter Peres(MBTI) <145544737+FScholPer@users.noreply.github.com> --- docs/features/communication/crossvm/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/communication/crossvm/index.rst b/docs/features/communication/crossvm/index.rst index b99cb14ccbd..464bd115897 100644 --- a/docs/features/communication/crossvm/index.rst +++ b/docs/features/communication/crossvm/index.rst @@ -14,7 +14,7 @@ .. _crossvm_feature: -Cross Virtual Machine Communication +Cross Virtual Machine (VM) Communication ################################### .. document:: Cross-VM Communication From f1fe0a1882b61b25a60e7f31acb1ca87b8178710 Mon Sep 17 00:00:00 2001 From: "Frank Scholter Peres(MBTI)" <145544737+FScholPer@users.noreply.github.com> Date: Thu, 7 Aug 2025 08:22:18 +0200 Subject: [PATCH 203/214] Update docs/features/communication/crossvm/index.rst Co-authored-by: ThomasHahn <83017581+hth9fe@users.noreply.github.com> Signed-off-by: Frank Scholter Peres(MBTI) <145544737+FScholPer@users.noreply.github.com> --- docs/features/communication/crossvm/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/communication/crossvm/index.rst b/docs/features/communication/crossvm/index.rst index 464bd115897..fae42202dab 100644 --- a/docs/features/communication/crossvm/index.rst +++ b/docs/features/communication/crossvm/index.rst @@ -15,7 +15,7 @@ .. _crossvm_feature: Cross Virtual Machine (VM) Communication -################################### +######################################## .. document:: Cross-VM Communication :id: doc__com_crossvm From 3bd072442639b9e5a82d12aeb2556402d025793a Mon Sep 17 00:00:00 2001 From: "Frank Scholter Peres(MBTI)" <145544737+FScholPer@users.noreply.github.com> Date: Thu, 7 Aug 2025 11:24:50 +0200 Subject: [PATCH 204/214] Update docs/requirements/stakeholder/index.rst Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Frank Scholter Peres(MBTI) <145544737+FScholPer@users.noreply.github.com> --- docs/requirements/stakeholder/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements/stakeholder/index.rst b/docs/requirements/stakeholder/index.rst index f8cedaf63b8..c3dc119ffc9 100644 --- a/docs/requirements/stakeholder/index.rst +++ b/docs/requirements/stakeholder/index.rst @@ -569,7 +569,7 @@ Communication :reqtype: Functional :security: NO :safety: QM - :rationale: Different VMs in a system involved. Somethimes they interact. + :rationale: Different VMs in a system involved. Sometimes they interact. :status: valid The platform shall support not only IPC but also intra Virtual Machine (VM) communication. From 0e49ef45c2e3dbd3248f91823b57e442c7c54242 Mon Sep 17 00:00:00 2001 From: "Frank Scholter Peres(MBTI)" <145544737+FScholPer@users.noreply.github.com> Date: Thu, 7 Aug 2025 11:25:03 +0200 Subject: [PATCH 205/214] Update docs/features/communication/crossvm/index.rst Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Frank Scholter Peres(MBTI) <145544737+FScholPer@users.noreply.github.com> --- docs/features/communication/crossvm/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/communication/crossvm/index.rst b/docs/features/communication/crossvm/index.rst index fae42202dab..a6f1898fe5f 100644 --- a/docs/features/communication/crossvm/index.rst +++ b/docs/features/communication/crossvm/index.rst @@ -85,7 +85,7 @@ General requirements: Backwards Compatibility ======================= -It should be sure that both Cross-VM and normal IPC work seamlessly together +It should be ensured that both Cross-VM and normal IPC work seamlessly together Security Impact =============== From 1a75d416c92d809551b1a893bf6e6dcb515edac6 Mon Sep 17 00:00:00 2001 From: "Frank Scholter Peres(MBTI)" <145544737+FScholPer@users.noreply.github.com> Date: Thu, 7 Aug 2025 11:25:23 +0200 Subject: [PATCH 206/214] Update docs/features/communication/crossvm/index.rst Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Frank Scholter Peres(MBTI) <145544737+FScholPer@users.noreply.github.com> --- docs/features/communication/crossvm/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/communication/crossvm/index.rst b/docs/features/communication/crossvm/index.rst index a6f1898fe5f..aeed928bee8 100644 --- a/docs/features/communication/crossvm/index.rst +++ b/docs/features/communication/crossvm/index.rst @@ -98,7 +98,7 @@ Safety Impact - Due to wide usage of these communication mechanisms throughout the platform, extra care is needed in design, implementation, and testing to minimize safety impact. - Mechanisms are developed at various integrity levels from QM (non-safety) up to ASIL-B, depending on their intended use cases. -- Freedom from Interference has to be taken into account when different VMs +- Freedom from Interference has to be taken into account when different VMs with different integrity or safety levels communicate or share resources, to ensure that faults or failures in one VM do not adversely affect others. License Impact ============== From 183676febe21936358af09c2ec3d43210dd5d528 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres <frank.scholter_peres@mercedes-benz.com> Date: Wed, 10 Sep 2025 12:51:09 +0200 Subject: [PATCH 207/214] fix: removed cross-vm section --- docs/features/communication/crossvm/index.rst | 121 --------------- .../crossvm/requirements/index.rst | 146 ------------------ .../communication/docs/requirements/index.rst | 13 ++ 3 files changed, 13 insertions(+), 267 deletions(-) delete mode 100644 docs/features/communication/crossvm/index.rst delete mode 100644 docs/features/communication/crossvm/requirements/index.rst diff --git a/docs/features/communication/crossvm/index.rst b/docs/features/communication/crossvm/index.rst deleted file mode 100644 index aeed928bee8..00000000000 --- a/docs/features/communication/crossvm/index.rst +++ /dev/null @@ -1,121 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2025 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -.. _crossvm_feature: - -Cross Virtual Machine (VM) Communication -######################################## - -.. document:: Cross-VM Communication - :id: doc__com_crossvm - :status: valid - :safety: ASIL_B - :tags: feature_modification_request - - -.. toctree:: - :maxdepth: 2 - - ./requirements/index - - -Feature flag -============ - -To activate this feature, use the following feature flag: - -``experimental_crossvm_com`` - -Abstract -======== - -This feature provides mechanisms for communication and data exchange between processes in different Virtual Machines (VM). -It includes two classes of communication/data-exchange: - -1. One-way data sharing into a VM for (vehicle) state read-only for the VM (snapshot state) - - Read-only for consumer (VM) - - Support for consistent data-sets (consumer must be able to get a consistent version of related data items) - - Consistent access must be lock-free - - Producer time stamps shall be available for related data-sets - -2. Streamed data based on shared queues (stream of events or data) - - Queues shall be configurable by client (VM) (number of elements etc..) - - Size of a queue - - Allocation of buffers for the data elements - - Queues shall support lock-free access to data elements - - Support for bi-directional communication via writable data elements by the client - - Asynchronous bi-directional support via multiple queues - -Motivation -========== - -Cross-VM communication mechanisms are essential to ensure efficient and reliable data exchange between VMs. - -Rationale -========= - -These communication mechanisms are developed to address specific needs for data sharing and streaming in a VM environment, ensuring consistent and lock-free access to data. - -Specification -============= - -The Cross-VM communication feature consists of the following mechanisms: - -- **One-way data sharing**: Allows read-only access to vehicle state data in a VM, ensuring consistency and lock-free access. -- **Streamed data**: Utilizes shared queues for streaming events or data, configurable by the client, supporting bi-directional communication. - -General requirements: ---------------------- - -- Multiple chunks of shared memory shall be supported to allow required access control. -- Notifications for data updates shall be available (virtual IRQs in a VM). -- Notifications shall be configurable by consumers of data (using flags or watermarks in shared memory from client to producer). - -Backwards Compatibility -======================= - -It should be ensured that both Cross-VM and normal IPC work seamlessly together - -Security Impact -=============== - -Cross-VM communication mechanisms present varying security risks as vulnerabilities could affect multiple components simultaneously. -Each mechanism requires individual security impact analysis based on its functionality and usage patterns. - -Safety Impact -============= - -- Due to wide usage of these communication mechanisms throughout the platform, extra care is needed in design, implementation, and testing to minimize safety impact. -- Mechanisms are developed at various integrity levels from QM (non-safety) up to ASIL-B, depending on their intended use cases. -- Freedom from Interference has to be taken into account when different VMs with different integrity or safety levels communicate or share resources, to ensure that faults or failures in one VM do not adversely affect others. - -License Impact -============== - -The Cross-VM communication mechanisms are licensed under Apache License 2.0. - -How to Teach This -================= - -Each mechanism is expected to have a user manual that includes an API reference and usage examples where necessary. - -Rejected Ideas -============== - -There are no rejected ideas related to the Cross-VM communication feature at this time. - -Open Issues -=========== - -There are currently no open issues related to the Cross-VM communication feature. diff --git a/docs/features/communication/crossvm/requirements/index.rst b/docs/features/communication/crossvm/requirements/index.rst deleted file mode 100644 index 9c79ea1d739..00000000000 --- a/docs/features/communication/crossvm/requirements/index.rst +++ /dev/null @@ -1,146 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2025 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -Requirements -############ - -.. feat_req:: One-way data sharing into a VM - :id: feat_req__crossvm__one_way_sharing - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__communication__vm - :status: valid - - The system shall support one-way data sharing into a Virtual Machine (VM) for vehicle state read-only for the VM (snapshot state). - -.. feat_req:: Read-only access for VM - :id: feat_req__crossvm__readonly_vm - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__communication__vm - :status: valid - - The consumer (VM) shall have read-only access to the shared data. - -.. feat_req:: Consistent data-sets - :id: feat_req__crossvm__consistent_data - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__communication__vm - :status: valid - - The system shall support consistent data-sets, allowing the consumer to obtain a consistent version of related data items. - -.. feat_req:: Lock-free access - :id: feat_req__crossvm__lock_free_access - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__communication__vm - :status: valid - - Consistent access to data must be lock-free. - -.. feat_req:: Producer time stamps - :id: feat_req__crossvm__producer_timestamps - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__communication__vm - :status: valid - - Producer time stamps shall be available for related data-sets. - -.. feat_req:: Streamed data based on shared queues - :id: feat_req__crossvm__streamed_data - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__communication__vm - :status: valid - - The system shall support streamed data based on shared queues (stream of events or data). - -.. feat_req:: Configurable queues - :id: feat_req__crossvm__configurable_queues - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__communication__vm - :status: valid - - Queues shall be configurable by the client (VM), including the number of elements and buffer allocation. - -.. feat_req:: Lock-free queue access - :id: feat_req__crossvm__lock_free_queue - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__communication__vm - :status: valid - - Queues shall support lock-free access to data elements. - -.. feat_req:: Bi-directional communication - :id: feat_req__crossvm__bi_directional_comm - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__communication__vm - :status: valid - - The system shall support bi-directional communication via writable data elements by the client. - -.. feat_req:: Asynchronous support - :id: feat_req__crossvm__async_support - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__communication__vm - :status: valid - - The system shall provide asynchronous bi-directional support via multiple queues. - -.. feat_req:: Shared memory chunks - :id: feat_req__crossvm__shared_memory - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__communication__vm - :status: valid - - The system shall support multiple chunks of shared memory to allow required access control. - -.. feat_req:: Data update notifications - :id: feat_req__crossvm__data_notifications - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__communication__vm - :status: valid - - Notifications for data updates shall be available (virtual IRQs in a VM). - -.. feat_req:: Configurable notifications - :id: feat_req__crossvm__config_notifications - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__communication__vm - :status: valid - - Notifications shall be configurable by consumers of data (using flags or watermarks in shared memory from client to producer). diff --git a/docs/features/communication/docs/requirements/index.rst b/docs/features/communication/docs/requirements/index.rst index be5fea73627..fcb6e7086e7 100644 --- a/docs/features/communication/docs/requirements/index.rst +++ b/docs/features/communication/docs/requirements/index.rst @@ -291,6 +291,19 @@ Mixed-Criticality safety systems Consumers with lower criticality shall not be able to drop data before it is consumed by partners with higher criticality. +Cross VM Communication +^^^^^^^^^^^^^^^^^^^^^^ + +.. feat_req:: Cross VM + :id: feat_req__cross__vm + :reqtype: Functional + :security: YES + :safety: ASIL_B + :satisfies: stkh_req__communication__vm + :status: valid + + The communication framework show allow to communicate between different vms over shared memory + Performance ^^^^^^^^^^^ From 6c316206963011156afb72f0ee481bcf985ee1a2 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres <frank.scholter_peres@mercedes-benz.com> Date: Wed, 10 Sep 2025 12:53:49 +0200 Subject: [PATCH 208/214] fix: removed crossvm index --- docs/features/communication/index.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/features/communication/index.rst b/docs/features/communication/index.rst index 10dca492432..62000c6fc91 100644 --- a/docs/features/communication/index.rst +++ b/docs/features/communication/index.rst @@ -35,7 +35,6 @@ Communication (v0.5 beta) ipc/index some_ip_gateway/index abi_compatible_data_types/index - crossvm/index Feature flag ============ From eba38ae369804a35ffc64eff6a3c833a9783673a Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres <frank.scholter_peres@mercedes-benz.com> Date: Wed, 10 Sep 2025 12:59:11 +0200 Subject: [PATCH 209/214] fix: typo --- docs/features/communication/docs/requirements/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/communication/docs/requirements/index.rst b/docs/features/communication/docs/requirements/index.rst index fcb6e7086e7..3000c8f014e 100644 --- a/docs/features/communication/docs/requirements/index.rst +++ b/docs/features/communication/docs/requirements/index.rst @@ -302,7 +302,7 @@ Cross VM Communication :satisfies: stkh_req__communication__vm :status: valid - The communication framework show allow to communicate between different vms over shared memory + The communication framework shall allow to communicate between different VMs over shared memory Performance From 9a51b62207ed7142a7c9a1a68ecd89e83aea1f76 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres <frank.scholter_peres@mercedes-benz.com> Date: Wed, 10 Sep 2025 13:06:26 +0200 Subject: [PATCH 210/214] fixed: id --- docs/features/communication/docs/requirements/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/communication/docs/requirements/index.rst b/docs/features/communication/docs/requirements/index.rst index 3000c8f014e..36265d88a85 100644 --- a/docs/features/communication/docs/requirements/index.rst +++ b/docs/features/communication/docs/requirements/index.rst @@ -295,7 +295,7 @@ Cross VM Communication ^^^^^^^^^^^^^^^^^^^^^^ .. feat_req:: Cross VM - :id: feat_req__cross__vm + :id: feat_req__com__cross__vm :reqtype: Functional :security: YES :safety: ASIL_B From cb598fb4265f44d716559743c764d902124fcea7 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres <frank.scholter_peres@mercedes-benz.com> Date: Wed, 10 Sep 2025 13:14:02 +0200 Subject: [PATCH 211/214] fixed: id #2 --- docs/features/communication/docs/requirements/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/communication/docs/requirements/index.rst b/docs/features/communication/docs/requirements/index.rst index 36265d88a85..4392402bbc1 100644 --- a/docs/features/communication/docs/requirements/index.rst +++ b/docs/features/communication/docs/requirements/index.rst @@ -295,7 +295,7 @@ Cross VM Communication ^^^^^^^^^^^^^^^^^^^^^^ .. feat_req:: Cross VM - :id: feat_req__com__cross__vm + :id: feat_req__com__cross_vm :reqtype: Functional :security: YES :safety: ASIL_B From 179a203c4cd525045a63c684a2daec86ced61ac3 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres <frank.scholter_peres@mercedes-benz.com> Date: Tue, 21 Oct 2025 10:16:41 +0200 Subject: [PATCH 212/214] docs: added until flags --- docs/features/communication/docs/requirements/index.rst | 5 +++-- docs/requirements/stakeholder/index.rst | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/features/communication/docs/requirements/index.rst b/docs/features/communication/docs/requirements/index.rst index 4392402bbc1..88d040723fd 100644 --- a/docs/features/communication/docs/requirements/index.rst +++ b/docs/features/communication/docs/requirements/index.rst @@ -301,6 +301,7 @@ Cross VM Communication :safety: ASIL_B :satisfies: stkh_req__communication__vm :status: valid + :valid_from: v1.0.0 The communication framework shall allow to communicate between different VMs over shared memory @@ -656,5 +657,5 @@ Safety Impact The communication framework shall support safe communication up to ASIL-B. -.. needextend:: "__com_" in id - :+tags: com +.. needextend:: docname is not None and "communication/ipc/requirements" in docname + :+tags: ipc diff --git a/docs/requirements/stakeholder/index.rst b/docs/requirements/stakeholder/index.rst index c3dc119ffc9..86d9c68633a 100644 --- a/docs/requirements/stakeholder/index.rst +++ b/docs/requirements/stakeholder/index.rst @@ -571,6 +571,7 @@ Communication :safety: QM :rationale: Different VMs in a system involved. Sometimes they interact. :status: valid + :valid_from The platform shall support not only IPC but also intra Virtual Machine (VM) communication. From fd9954edeabf0f999ea8503c1f750f960b11b024 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres <frank.scholter_peres@mercedes-benz.com> Date: Tue, 21 Oct 2025 10:22:26 +0200 Subject: [PATCH 213/214] fix: valid block --- docs/requirements/stakeholder/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements/stakeholder/index.rst b/docs/requirements/stakeholder/index.rst index 86d9c68633a..7618db893a8 100644 --- a/docs/requirements/stakeholder/index.rst +++ b/docs/requirements/stakeholder/index.rst @@ -571,7 +571,7 @@ Communication :safety: QM :rationale: Different VMs in a system involved. Sometimes they interact. :status: valid - :valid_from + :valid_from: v1.0.0 The platform shall support not only IPC but also intra Virtual Machine (VM) communication. From f2750bc8804cd1ce3f02d0416e3fa659e6face4d Mon Sep 17 00:00:00 2001 From: "Frank Scholter Peres(MBTI)" <145544737+FScholPer@users.noreply.github.com> Date: Thu, 20 Nov 2025 10:27:53 +0100 Subject: [PATCH 214/214] Update docs/requirements/stakeholder/index.rst Co-authored-by: Oliver Pajonk <oliver.pajonk@elektrobit.com> Signed-off-by: Frank Scholter Peres(MBTI) <145544737+FScholPer@users.noreply.github.com> --- docs/requirements/stakeholder/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements/stakeholder/index.rst b/docs/requirements/stakeholder/index.rst index 7618db893a8..e9cc34b272f 100644 --- a/docs/requirements/stakeholder/index.rst +++ b/docs/requirements/stakeholder/index.rst @@ -573,7 +573,7 @@ Communication :status: valid :valid_from: v1.0.0 - The platform shall support not only IPC but also intra Virtual Machine (VM) communication. + The platform shall support not only IPC but also inter Virtual Machine (VM) communication. .. stkh_req:: Stable application interfaces :id: stkh_req__communication__stable_app_inter