From fd2cadf0ba7ddd21ddee74cda32cfc944c1a305a Mon Sep 17 00:00:00 2001 From: Alexandru Iulian Date: Tue, 1 Apr 2025 15:34:58 +0300 Subject: [PATCH 001/109] json-lib: JSON Feature Proposal Signed-off-by: Alexandru Iulian --- docs/features/communication/json/index.rst | 132 ++++++++++++++++++ .../communication/json/requirements/index.rst | 101 ++++++++++++++ docs/requirements/stakeholder/index.rst | 11 ++ 3 files changed, 244 insertions(+) create mode 100644 docs/features/communication/json/index.rst create mode 100644 docs/features/communication/json/requirements/index.rst diff --git a/docs/features/communication/json/index.rst b/docs/features/communication/json/index.rst new file mode 100644 index 0000000000..9984c12fc0 --- /dev/null +++ b/docs/features/communication/json/index.rst @@ -0,0 +1,132 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +JSON Parser +=========================== + +.. document:: JSON Parser + :id: doc__json + :status: valid + :safety: ASIL_B + :tags: contribution_request, feature_request + + +.. toctree:: + :hidden: + + requirements/index.rst + + +Feature flag +============ + +To activate this feature, use the following feature flag: + +``experimental_json`` + +Abstract +======== + +This feature request proposes the integration of a safe JSON parser. + + +Basic Functionality +---------------------- +The component shall support reading from a .json file or a buffer and convert that information to a compatible user format. + + +Future Extensions +---------------------- +The component shall suppot a future extension for converting from user format into .json format and storing it into a file or buffer. + + +Motivation +========== + +S-CORE is targeting high-performance automotive systems with safety impact. +Some applications, like the IPC communication solution, require a safe JSON parser to enable loading of configuration information at runtime. +There is currently no solution for this inside S-CORE. + +Rationale +========= + +A JSON parser needs to be introduced in S-CORE software platform due to specific functional dependencies of different features (ex: IPC). + +Further details are available in the following section: +.. _Specification: + +Specification +============= + +The following details and requirements describe the aspects of current feature in the context of S-CORE. + +General considerations +---------------------- + +The JSON parser should provide read and data conversion capabilities: + +:need:`feat_req__json__buffer_reading` +:need:`feat_req__json__file_reading` +:need:`feat_req__json__deserialization` + +The component should be extensible in the future in order to support conversion of user data to JSON format, and write capabilities to files and buffers. + +User friendly API +----------------- + +Programming languages have their own feature set and idioms. +It is crucial for any library that it seamlessly integrates into both. +This means, wherever possible and meaningful, infrastructure of the programming language and accompanying standard +libraries shall be reused. +Further, a developer used to the programming language shall have no problems understanding the API. +It should feel natural to use. +This includes error handling, which shall follow one of the error handling concepts of the programming language. + +1. :need:`feat_req__json__lang_idioms` +2. :need:`feat_req__json__lang_infra` + +Full testability for the public API +---------------------------------------- + +Our users will be required to proof certain coverage metrics, like line coverage or branch coverage. +For them to reach full coverage, they need to be easily able to mock or fake parts of the JSON functionality in their +unit tests. + +:need:`feat_req__json__testability_mock_api` + +Backwards Compatibility +======================= + +As there is currently no previous solution in S-CORE, no backwards compatibility is required. + +Security Impact +=============== + +The module will likely work with input and output streams. + +Safety Impact +============= + +Overall, the component shall support use cases up to ASIL-B. + +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.] + diff --git a/docs/features/communication/json/requirements/index.rst b/docs/features/communication/json/requirements/index.rst new file mode 100644 index 0000000000..65d86bc9b3 --- /dev/null +++ b/docs/features/communication/json/requirements/index.rst @@ -0,0 +1,101 @@ +.. + # ******************************************************************************* + # 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 +############ + +General Requirements +==================== + +.. feat_req:: Support for JSON buffer reading + :id: feat_req__json__buffer_reading + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__communication__json_parser,stkh_req__functional_req__file_based + :status: valid + + The JSON parser should be able to read data from a JSON formatted buffer. + +.. feat_req:: Support for JSON file reading + :id: feat_req__json__file_reading + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__communication__json_parser,stkh_req__functional_req__file_based + :status: valid + + The JSON parser should be able to open a JSON formatted file and read data from it. + +.. feat_req:: Support for JSON deserialization + :id: feat_req__json__deserialization + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__communication__json_parser,stkh_req__functional_req__file_based + :status: valid + + The JSON parser should be able to convert data from JSON format to the user format. + +User friendly API for information exchange +========================================== + +.. feat_req:: Support for programming language idioms + :id: feat_req__json__lang_idioms + :reqtype: Non-Functional + :security: NO + :safety: QM + :satisfies: stkh_req__dev_experience__prog_languages + :status: valid + + Each public API shall support the idioms of the programming language it is written in. + +.. feat_req:: Use programming language infrastructure + :id: feat_req__json__lang_infra + :reqtype: Non-Functional + :security: NO + :safety: QM + :satisfies: stkh_req__dev_experience__prog_languages + :status: valid + + Each public API shall use core infrastructure of its programming language and accompanying standard libraries, + whenever possible and meaningful. + + Note: This includes error handling. + +Full testability for the user facing API +======================================== + +.. feat_req:: Fully mockable public API + :id: feat_req__json__testability_mock_api + :reqtype: Non-Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__json_parser + :status: valid + + The public API shall be fully mockable. + +Safety Impact +============= + +.. feat_req:: JSON parser ASIL level + :id: feat_req__json__asil + :reqtype: Functional + :security: YES + :safety: ASIL_B + :satisfies: stkh_req__communication__json_parser + :status: valid + + The JSON parser shall support safe communication up to ASIL-B. diff --git a/docs/requirements/stakeholder/index.rst b/docs/requirements/stakeholder/index.rst index 341111d729..7409329352 100644 --- a/docs/requirements/stakeholder/index.rst +++ b/docs/requirements/stakeholder/index.rst @@ -539,6 +539,17 @@ Communication * Diagnostic jobs +.. stkh_req:: JSON parser + :id: stkh_req__communication__json_parser + :reqtype: Functional + :security: NO + :safety: ASIL_B + :rationale: tbd + :status: valid + + The software platform shall provide a JSON parser. + + Hardware support ---------------- From adf23df42218110623c35b23dae39b67245c5c8c Mon Sep 17 00:00:00 2001 From: Alexandru Iulian Date: Tue, 1 Apr 2025 15:34:58 +0300 Subject: [PATCH 002/109] json-lib: Fix typo in /docs/features/communication/json/index.rst Signed-off-by: Alexandru Iulian --- docs/features/communication/json/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/communication/json/index.rst b/docs/features/communication/json/index.rst index 9984c12fc0..83ac540a6c 100644 --- a/docs/features/communication/json/index.rst +++ b/docs/features/communication/json/index.rst @@ -48,7 +48,7 @@ The component shall support reading from a .json file or a buffer and convert th Future Extensions ---------------------- -The component shall suppot a future extension for converting from user format into .json format and storing it into a file or buffer. +The component shall support a future extension for converting from user format into .json format and storing it into a file or buffer. Motivation From 008bb9bc785076508ffd6b6221362ce48e5d228a Mon Sep 17 00:00:00 2001 From: Alexandru Iulian Date: Fri, 11 Apr 2025 15:29:10 +0300 Subject: [PATCH 003/109] json-lib: Rephrase JSON parser requirements to be more generic. Co-authored-by: rattenking52 Signed-off-by: Alexandru Iulian --- .../communication/json/requirements/index.rst | 20 +++++-------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/docs/features/communication/json/requirements/index.rst b/docs/features/communication/json/requirements/index.rst index 65d86bc9b3..25d9d15b34 100644 --- a/docs/features/communication/json/requirements/index.rst +++ b/docs/features/communication/json/requirements/index.rst @@ -18,27 +18,17 @@ Requirements General Requirements ==================== -.. feat_req:: Support for JSON buffer reading - :id: feat_req__json__buffer_reading +.. feat_req:: JSON Validation + :id: feat_req__json__validation :reqtype: Functional :security: NO :safety: ASIL_B :satisfies: stkh_req__communication__json_parser,stkh_req__functional_req__file_based :status: valid - The JSON parser should be able to read data from a JSON formatted buffer. + The JSON-Library shall provide a service to check the well-formedness of JSON data. -.. feat_req:: Support for JSON file reading - :id: feat_req__json__file_reading - :reqtype: Functional - :security: NO - :safety: ASIL_B - :satisfies: stkh_req__communication__json_parser,stkh_req__functional_req__file_based - :status: valid - - The JSON parser should be able to open a JSON formatted file and read data from it. - -.. feat_req:: Support for JSON deserialization +.. feat_req:: JSON Deserialization :id: feat_req__json__deserialization :reqtype: Functional :security: NO @@ -46,7 +36,7 @@ General Requirements :satisfies: stkh_req__communication__json_parser,stkh_req__functional_req__file_based :status: valid - The JSON parser should be able to convert data from JSON format to the user format. + The JSON-Library shall provide a service to parse JSON data according to RFC8259. User friendly API for information exchange ========================================== From ebf220930076192e45588e0429fdc54e30d5fe9c Mon Sep 17 00:00:00 2001 From: Alexandru Iulian Date: Tue, 15 Apr 2025 11:33:08 +0300 Subject: [PATCH 004/109] json-lib: Move JSON Parser feature request to baselibs folder Signed-off-by: Alexandru Iulian --- docs/features/baselibs/index.rst | 23 +++++++++++++++++++ .../json/index.rst | 0 .../json/requirements/index.rst | 0 3 files changed, 23 insertions(+) create mode 100644 docs/features/baselibs/index.rst rename docs/features/{communication => baselibs}/json/index.rst (100%) rename docs/features/{communication => baselibs}/json/requirements/index.rst (100%) diff --git a/docs/features/baselibs/index.rst b/docs/features/baselibs/index.rst new file mode 100644 index 0000000000..65aa7ddfeb --- /dev/null +++ b/docs/features/baselibs/index.rst @@ -0,0 +1,23 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +Baselibs +############# + +.. toctree:: + :maxdepth: 1 + :glob: + :titlesonly: + + */index diff --git a/docs/features/communication/json/index.rst b/docs/features/baselibs/json/index.rst similarity index 100% rename from docs/features/communication/json/index.rst rename to docs/features/baselibs/json/index.rst diff --git a/docs/features/communication/json/requirements/index.rst b/docs/features/baselibs/json/requirements/index.rst similarity index 100% rename from docs/features/communication/json/requirements/index.rst rename to docs/features/baselibs/json/requirements/index.rst From fd85fb6bcb8549af77fe734dd47bfd067893e037 Mon Sep 17 00:00:00 2001 From: Alexandru Iulian Date: Wed, 7 May 2025 13:56:35 +0300 Subject: [PATCH 005/109] json-lib: Rephrase some descriptions to be consistent with requirements Co-authored-by: rattenking52 Signed-off-by: Alexandru Iulian --- docs/features/baselibs/json/index.rst | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/features/baselibs/json/index.rst b/docs/features/baselibs/json/index.rst index 83ac540a6c..d2c6107e2b 100644 --- a/docs/features/baselibs/json/index.rst +++ b/docs/features/baselibs/json/index.rst @@ -43,12 +43,12 @@ This feature request proposes the integration of a safe JSON parser. Basic Functionality ---------------------- -The component shall support reading from a .json file or a buffer and convert that information to a compatible user format. +The component shall support parsing JSON data and convert that information to a compatible user format. Future Extensions ---------------------- -The component shall support a future extension for converting from user format into .json format and storing it into a file or buffer. +The component shall support a future extension for serializing from user format into JSON data. Motivation @@ -76,11 +76,9 @@ General considerations The JSON parser should provide read and data conversion capabilities: -:need:`feat_req__json__buffer_reading` -:need:`feat_req__json__file_reading` :need:`feat_req__json__deserialization` -The component should be extensible in the future in order to support conversion of user data to JSON format, and write capabilities to files and buffers. +The component should be extensible in the future in order to support conversion of user format to JSON data. User friendly API ----------------- From 6295864370f6b943c737171eb7888691fcc7722a Mon Sep 17 00:00:00 2001 From: Alexandru Iulian Date: Wed, 7 May 2025 14:18:30 +0300 Subject: [PATCH 006/109] json-lib: Remove unneeded linkage in JSON parser requrements Signed-off-by: Alexandru Iulian --- docs/features/baselibs/json/index.rst | 1 + docs/features/baselibs/json/requirements/index.rst | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/features/baselibs/json/index.rst b/docs/features/baselibs/json/index.rst index d2c6107e2b..d094eb4630 100644 --- a/docs/features/baselibs/json/index.rst +++ b/docs/features/baselibs/json/index.rst @@ -76,6 +76,7 @@ General considerations The JSON parser should provide read and data conversion capabilities: +:need:`feat_req__json__validation` :need:`feat_req__json__deserialization` The component should be extensible in the future in order to support conversion of user format to JSON data. diff --git a/docs/features/baselibs/json/requirements/index.rst b/docs/features/baselibs/json/requirements/index.rst index 25d9d15b34..03bab0cc95 100644 --- a/docs/features/baselibs/json/requirements/index.rst +++ b/docs/features/baselibs/json/requirements/index.rst @@ -23,7 +23,7 @@ General Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: stkh_req__communication__json_parser,stkh_req__functional_req__file_based + :satisfies: stkh_req__communication__json_parser :status: valid The JSON-Library shall provide a service to check the well-formedness of JSON data. @@ -33,7 +33,7 @@ General Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: stkh_req__communication__json_parser,stkh_req__functional_req__file_based + :satisfies: stkh_req__communication__json_parser :status: valid The JSON-Library shall provide a service to parse JSON data according to RFC8259. From 0684f44bc9429dae5e26563322ac63df74834f87 Mon Sep 17 00:00:00 2001 From: Alexandru Iulian Date: Fri, 9 May 2025 12:38:41 +0300 Subject: [PATCH 007/109] json-lib: Rename JSON Parser to JSON-Library Co-authored-by: rattenking52 Signed-off-by: Alexandru Iulian --- docs/features/baselibs/json/index.rst | 15 +++++++-------- docs/requirements/stakeholder/index.rst | 4 ++-- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/docs/features/baselibs/json/index.rst b/docs/features/baselibs/json/index.rst index d094eb4630..cb0105f5da 100644 --- a/docs/features/baselibs/json/index.rst +++ b/docs/features/baselibs/json/index.rst @@ -12,10 +12,10 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -JSON Parser +JSON-Library =========================== -.. document:: JSON Parser +.. document:: JSON-Library :id: doc__json :status: valid :safety: ASIL_B @@ -38,7 +38,7 @@ To activate this feature, use the following feature flag: Abstract ======== -This feature request proposes the integration of a safe JSON parser. +This feature request proposes the integration of a safe JSON-Library with parsing functionality. Basic Functionality @@ -55,13 +55,13 @@ Motivation ========== S-CORE is targeting high-performance automotive systems with safety impact. -Some applications, like the IPC communication solution, require a safe JSON parser to enable loading of configuration information at runtime. +Some applications, like the IPC communication solution, require a safe JSON-Library with parsing functionality to enable loading of configuration information at runtime. There is currently no solution for this inside S-CORE. Rationale ========= -A JSON parser needs to be introduced in S-CORE software platform due to specific functional dependencies of different features (ex: IPC). +A JSON-Library with parsing functionality needs to be introduced in S-CORE software platform due to specific functional dependencies of different features (ex: IPC). Further details are available in the following section: .. _Specification: @@ -74,7 +74,7 @@ The following details and requirements describe the aspects of current feature i General considerations ---------------------- -The JSON parser should provide read and data conversion capabilities: +The JSON-Library should provide parsing and data conversion capabilities: :need:`feat_req__json__validation` :need:`feat_req__json__deserialization` @@ -99,8 +99,7 @@ Full testability for the public API ---------------------------------------- Our users will be required to proof certain coverage metrics, like line coverage or branch coverage. -For them to reach full coverage, they need to be easily able to mock or fake parts of the JSON functionality in their -unit tests. +For them to reach full coverage, they need to be easily able to mock or fake the public API of the JSON-Library in their unit tests. :need:`feat_req__json__testability_mock_api` diff --git a/docs/requirements/stakeholder/index.rst b/docs/requirements/stakeholder/index.rst index 7409329352..f30e1b9e5c 100644 --- a/docs/requirements/stakeholder/index.rst +++ b/docs/requirements/stakeholder/index.rst @@ -539,7 +539,7 @@ Communication * Diagnostic jobs -.. stkh_req:: JSON parser +.. stkh_req:: JSON-Library :id: stkh_req__communication__json_parser :reqtype: Functional :security: NO @@ -547,7 +547,7 @@ Communication :rationale: tbd :status: valid - The software platform shall provide a JSON parser. + The software platform shall provide a JSON-Library with parsing functionality. Hardware support From 70b96a90f57a5fd8f2ea32b1f67d46e7609fd50e Mon Sep 17 00:00:00 2001 From: Alexandru Iulian Date: Thu, 15 May 2025 12:37:17 +0300 Subject: [PATCH 008/109] json-lib: Rename requirement to stkh_req__communication__json_library Co-authored-by: Jonas Lammers <161199397+lammjo@users.noreply.github.com> Signed-off-by: Alexandru Iulian --- docs/features/baselibs/json/requirements/index.rst | 12 ++++++------ docs/requirements/stakeholder/index.rst | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/features/baselibs/json/requirements/index.rst b/docs/features/baselibs/json/requirements/index.rst index 03bab0cc95..0064c1cb40 100644 --- a/docs/features/baselibs/json/requirements/index.rst +++ b/docs/features/baselibs/json/requirements/index.rst @@ -23,7 +23,7 @@ General Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: stkh_req__communication__json_parser + :satisfies: stkh_req__communication__json_library :status: valid The JSON-Library shall provide a service to check the well-formedness of JSON data. @@ -33,7 +33,7 @@ General Requirements :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: stkh_req__communication__json_parser + :satisfies: stkh_req__communication__json_library :status: valid The JSON-Library shall provide a service to parse JSON data according to RFC8259. @@ -72,7 +72,7 @@ Full testability for the user facing API :reqtype: Non-Functional :security: NO :safety: QM - :satisfies: stkh_req__communication__json_parser + :satisfies: stkh_req__communication__json_library :status: valid The public API shall be fully mockable. @@ -80,12 +80,12 @@ Full testability for the user facing API Safety Impact ============= -.. feat_req:: JSON parser ASIL level +.. feat_req:: JSON library ASIL level :id: feat_req__json__asil :reqtype: Functional :security: YES :safety: ASIL_B - :satisfies: stkh_req__communication__json_parser + :satisfies: stkh_req__communication__json_library :status: valid - The JSON parser shall support safe communication up to ASIL-B. + The JSON library shall support safe communication up to ASIL-B. diff --git a/docs/requirements/stakeholder/index.rst b/docs/requirements/stakeholder/index.rst index f30e1b9e5c..8b0fa7dd07 100644 --- a/docs/requirements/stakeholder/index.rst +++ b/docs/requirements/stakeholder/index.rst @@ -540,7 +540,7 @@ Communication .. stkh_req:: JSON-Library - :id: stkh_req__communication__json_parser + :id: stkh_req__communication__json_library :reqtype: Functional :security: NO :safety: ASIL_B From 08ea68454be55a868e700def1b35d9800a1f437f Mon Sep 17 00:00:00 2001 From: Alexandru Iulian Date: Fri, 16 May 2025 15:25:34 +0300 Subject: [PATCH 009/109] json-lib: Remove Feature flag section and correct deprecated flag Signed-off-by: Alexandru Iulian --- docs/features/baselibs/json/index.rst | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/docs/features/baselibs/json/index.rst b/docs/features/baselibs/json/index.rst index cb0105f5da..b741139ad0 100644 --- a/docs/features/baselibs/json/index.rst +++ b/docs/features/baselibs/json/index.rst @@ -19,7 +19,7 @@ JSON-Library :id: doc__json :status: valid :safety: ASIL_B - :tags: contribution_request, feature_request + :tags: component_request, feature_request .. toctree:: @@ -28,13 +28,6 @@ JSON-Library requirements/index.rst -Feature flag -============ - -To activate this feature, use the following feature flag: - -``experimental_json`` - Abstract ======== @@ -127,4 +120,3 @@ How to Teach This ================= [How to teach users, new and experienced, how to apply the CR to their work.] - From 9031dbd42f672014fa79f30721f90a43ab564e2a Mon Sep 17 00:00:00 2001 From: Alexandru Iulian Date: Wed, 18 Jun 2025 17:05:29 +0300 Subject: [PATCH 010/109] json-lib: Redo requirements linkage. It was decided that for each component in the Base Libs there will be at least one feature requirement, which will link to the Base libs stakeholder requirement. The component requirements will link to that respective feature requirement. Signed-off-by: Alexandru Iulian --- .../baselibs/docs/requirements/index.rst | 10 ++++++ docs/features/baselibs/index.rst | 1 + docs/features/baselibs/json/index.rst | 12 +++---- .../baselibs/json/requirements/index.rst | 36 +++++++++---------- docs/requirements/stakeholder/index.rst | 11 ------ 5 files changed, 35 insertions(+), 35 deletions(-) diff --git a/docs/features/baselibs/docs/requirements/index.rst b/docs/features/baselibs/docs/requirements/index.rst index f8b783bd12..9733ada23d 100644 --- a/docs/features/baselibs/docs/requirements/index.rst +++ b/docs/features/baselibs/docs/requirements/index.rst @@ -74,3 +74,13 @@ Requirements :status: valid The base libraries shall adhere to secure coding standards to prevent vulnerabilities across platform components. + +.. feat_req:: JSON-Library + :id: feat_req__baselibs__json_library + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__functional_req__base_libraries + :status: valid + + The base libraries shall provide a JSON-Library with parsing functionality. diff --git a/docs/features/baselibs/index.rst b/docs/features/baselibs/index.rst index e515c2ba4b..e060bcaad0 100644 --- a/docs/features/baselibs/index.rst +++ b/docs/features/baselibs/index.rst @@ -28,6 +28,7 @@ Base Libraries :hidden: docs/requirements/index.rst + json/index Feature flag diff --git a/docs/features/baselibs/json/index.rst b/docs/features/baselibs/json/index.rst index b741139ad0..ab34ff2000 100644 --- a/docs/features/baselibs/json/index.rst +++ b/docs/features/baselibs/json/index.rst @@ -19,7 +19,7 @@ JSON-Library :id: doc__json :status: valid :safety: ASIL_B - :tags: component_request, feature_request + :tags: component_request .. toctree:: @@ -69,8 +69,8 @@ General considerations The JSON-Library should provide parsing and data conversion capabilities: -:need:`feat_req__json__validation` -:need:`feat_req__json__deserialization` +:need:`comp_req__json__validation` +:need:`comp_req__json__deserialization` The component should be extensible in the future in order to support conversion of user format to JSON data. @@ -85,8 +85,8 @@ Further, a developer used to the programming language shall have no problems und It should feel natural to use. This includes error handling, which shall follow one of the error handling concepts of the programming language. -1. :need:`feat_req__json__lang_idioms` -2. :need:`feat_req__json__lang_infra` +1. :need:`comp_req__json__lang_idioms` +2. :need:`comp_req__json__lang_infra` Full testability for the public API ---------------------------------------- @@ -94,7 +94,7 @@ Full testability for the public API Our users will be required to proof certain coverage metrics, like line coverage or branch coverage. For them to reach full coverage, they need to be easily able to mock or fake the public API of the JSON-Library in their unit tests. -:need:`feat_req__json__testability_mock_api` +:need:`comp_req__json__testability_mock_api` Backwards Compatibility ======================= diff --git a/docs/features/baselibs/json/requirements/index.rst b/docs/features/baselibs/json/requirements/index.rst index 0064c1cb40..d2a2930f22 100644 --- a/docs/features/baselibs/json/requirements/index.rst +++ b/docs/features/baselibs/json/requirements/index.rst @@ -18,22 +18,22 @@ Requirements General Requirements ==================== -.. feat_req:: JSON Validation - :id: feat_req__json__validation +.. comp_req:: JSON Validation + :id: comp_req__json__validation :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: stkh_req__communication__json_library + :satisfies: feat_req__baselibs__json_library :status: valid The JSON-Library shall provide a service to check the well-formedness of JSON data. -.. feat_req:: JSON Deserialization - :id: feat_req__json__deserialization +.. comp_req:: JSON Deserialization + :id: comp_req__json__deserialization :reqtype: Functional :security: NO :safety: ASIL_B - :satisfies: stkh_req__communication__json_library + :satisfies: feat_req__baselibs__json_library :status: valid The JSON-Library shall provide a service to parse JSON data according to RFC8259. @@ -41,22 +41,22 @@ General Requirements User friendly API for information exchange ========================================== -.. feat_req:: Support for programming language idioms - :id: feat_req__json__lang_idioms +.. comp_req:: Support for programming language idioms + :id: comp_req__json__lang_idioms :reqtype: Non-Functional :security: NO :safety: QM - :satisfies: stkh_req__dev_experience__prog_languages + :satisfies: feat_req__baselibs__json_library :status: valid Each public API shall support the idioms of the programming language it is written in. -.. feat_req:: Use programming language infrastructure - :id: feat_req__json__lang_infra +.. comp_req:: Use programming language infrastructure + :id: comp_req__json__lang_infra :reqtype: Non-Functional :security: NO :safety: QM - :satisfies: stkh_req__dev_experience__prog_languages + :satisfies: feat_req__baselibs__json_library :status: valid Each public API shall use core infrastructure of its programming language and accompanying standard libraries, @@ -67,12 +67,12 @@ User friendly API for information exchange Full testability for the user facing API ======================================== -.. feat_req:: Fully mockable public API - :id: feat_req__json__testability_mock_api +.. comp_req:: Fully mockable public API + :id: comp_req__json__testability_mock_api :reqtype: Non-Functional :security: NO :safety: QM - :satisfies: stkh_req__communication__json_library + :satisfies: feat_req__baselibs__json_library :status: valid The public API shall be fully mockable. @@ -80,12 +80,12 @@ Full testability for the user facing API Safety Impact ============= -.. feat_req:: JSON library ASIL level - :id: feat_req__json__asil +.. comp_req:: JSON library ASIL level + :id: comp_req__json__asil :reqtype: Functional :security: YES :safety: ASIL_B - :satisfies: stkh_req__communication__json_library + :satisfies: feat_req__baselibs__json_library :status: valid The JSON library shall support safe communication up to ASIL-B. diff --git a/docs/requirements/stakeholder/index.rst b/docs/requirements/stakeholder/index.rst index 88d5fc80fc..3e5571085e 100644 --- a/docs/requirements/stakeholder/index.rst +++ b/docs/requirements/stakeholder/index.rst @@ -550,17 +550,6 @@ Communication * Diagnostic jobs -.. stkh_req:: JSON-Library - :id: stkh_req__communication__json_library - :reqtype: Functional - :security: NO - :safety: ASIL_B - :rationale: tbd - :status: valid - - The software platform shall provide a JSON-Library with parsing functionality. - - Hardware support ---------------- From a9538d9c749ea7d032105d682000db2f3f06777b Mon Sep 17 00:00:00 2001 From: Alexandru Iulian Date: Wed, 9 Jul 2025 12:59:05 +0300 Subject: [PATCH 011/109] json-lib: Link additional feature requirements Signed-off-by: Alexandru Iulian --- docs/features/baselibs/json/index.rst | 4 ++-- docs/features/baselibs/json/requirements/index.rst | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/features/baselibs/json/index.rst b/docs/features/baselibs/json/index.rst index ab34ff2000..d6d11a93e0 100644 --- a/docs/features/baselibs/json/index.rst +++ b/docs/features/baselibs/json/index.rst @@ -31,7 +31,7 @@ JSON-Library Abstract ======== -This feature request proposes the integration of a safe JSON-Library with parsing functionality. +This component request proposes the integration of a safe JSON-Library with parsing functionality. Basic Functionality @@ -104,7 +104,7 @@ As there is currently no previous solution in S-CORE, no backwards compatibility Security Impact =============== -The module will likely work with input and output streams. +For access control and manipulation prevention (e.g. dm-verity) the hosting process and system configuration are responsible. Safety Impact ============= diff --git a/docs/features/baselibs/json/requirements/index.rst b/docs/features/baselibs/json/requirements/index.rst index d2a2930f22..b34bb5f06b 100644 --- a/docs/features/baselibs/json/requirements/index.rst +++ b/docs/features/baselibs/json/requirements/index.rst @@ -46,7 +46,7 @@ User friendly API for information exchange :reqtype: Non-Functional :security: NO :safety: QM - :satisfies: feat_req__baselibs__json_library + :satisfies: feat_req__baselibs__json_library, feat_req__baselibs__consistent_apis :status: valid Each public API shall support the idioms of the programming language it is written in. @@ -85,7 +85,7 @@ Safety Impact :reqtype: Functional :security: YES :safety: ASIL_B - :satisfies: feat_req__baselibs__json_library + :satisfies: feat_req__baselibs__json_library, feat_req__baselibs__safety :status: valid The JSON library shall support safe communication up to ASIL-B. From baa1bba1b5932cf44fb8d90b237cc23eea06731f Mon Sep 17 00:00:00 2001 From: Alexandru Iulian Date: Mon, 14 Jul 2025 14:21:05 +0300 Subject: [PATCH 012/109] json-lib: Add type compatibility requirement. Signed-off-by: Alexandru Iulian --- .../baselibs/json/requirements/index.rst | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/docs/features/baselibs/json/requirements/index.rst b/docs/features/baselibs/json/requirements/index.rst index b34bb5f06b..bc3fea0db8 100644 --- a/docs/features/baselibs/json/requirements/index.rst +++ b/docs/features/baselibs/json/requirements/index.rst @@ -49,7 +49,7 @@ User friendly API for information exchange :satisfies: feat_req__baselibs__json_library, feat_req__baselibs__consistent_apis :status: valid - Each public API shall support the idioms of the programming language it is written in. + The public API shall support the idioms of the programming language it is written in. .. comp_req:: Use programming language infrastructure :id: comp_req__json__lang_infra @@ -59,11 +59,24 @@ User friendly API for information exchange :satisfies: feat_req__baselibs__json_library :status: valid - Each public API shall use core infrastructure of its programming language and accompanying standard libraries, + The public API shall use core infrastructure of its programming language and accompanying standard libraries, whenever possible and meaningful. Note: This includes error handling. +.. comp_req:: Enforce strict type compatibility + :id: comp_req__json__type_compatibility + :reqtype: Non-Functional + :security: NO + :safety: QM + :satisfies: feat_req__baselibs__json_library + :status: valid + + 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 of the stored JSON data. + + Note: This includes checking if the stored value exceeds the range of the expected type. + Full testability for the user facing API ======================================== From 7bbe3397ed5c6332dbc3d58f88f85fa321373058 Mon Sep 17 00:00:00 2001 From: Alexandru Iulian Date: Wed, 16 Jul 2025 10:24:24 +0300 Subject: [PATCH 013/109] json-lib: Rewrite full testability requirement. Signed-off-by: Alexandru Iulian --- docs/features/baselibs/json/index.rst | 2 +- docs/features/baselibs/json/requirements/index.rst | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/features/baselibs/json/index.rst b/docs/features/baselibs/json/index.rst index d6d11a93e0..a2cd6e77f1 100644 --- a/docs/features/baselibs/json/index.rst +++ b/docs/features/baselibs/json/index.rst @@ -94,7 +94,7 @@ Full testability for the public API Our users will be required to proof certain coverage metrics, like line coverage or branch coverage. For them to reach full coverage, they need to be easily able to mock or fake the public API of the JSON-Library in their unit tests. -:need:`comp_req__json__testability_mock_api` +:need:`comp_req__json__full_testability` Backwards Compatibility ======================= diff --git a/docs/features/baselibs/json/requirements/index.rst b/docs/features/baselibs/json/requirements/index.rst index bc3fea0db8..ff47cd1764 100644 --- a/docs/features/baselibs/json/requirements/index.rst +++ b/docs/features/baselibs/json/requirements/index.rst @@ -80,15 +80,17 @@ User friendly API for information exchange Full testability for the user facing API ======================================== -.. comp_req:: Fully mockable public API - :id: comp_req__json__testability_mock_api +.. comp_req:: Fully testable public API + :id: comp_req__json__full_testability :reqtype: Non-Functional :security: NO :safety: QM :satisfies: feat_req__baselibs__json_library :status: valid - The public API shall be fully mockable. + The public API of the library shall support dependency injection with test doubles. + + Note: This enables full testability of the user code. Safety Impact ============= From 2ef2a60f72fe2b7eefab0cef19076d26c799055d Mon Sep 17 00:00:00 2001 From: Alexandru Iulian Date: Mon, 21 Jul 2025 12:12:53 +0300 Subject: [PATCH 014/109] json-lib: Add requirement for returning data in user format Signed-off-by: Alexandru Iulian --- docs/features/baselibs/json/index.rst | 1 + .../baselibs/json/requirements/index.rst | 20 +++++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/docs/features/baselibs/json/index.rst b/docs/features/baselibs/json/index.rst index a2cd6e77f1..4f21562588 100644 --- a/docs/features/baselibs/json/index.rst +++ b/docs/features/baselibs/json/index.rst @@ -71,6 +71,7 @@ The JSON-Library should provide parsing and data conversion capabilities: :need:`comp_req__json__validation` :need:`comp_req__json__deserialization` +:need:`comp_req__json__user_format` The component should be extensible in the future in order to support conversion of user format to JSON data. diff --git a/docs/features/baselibs/json/requirements/index.rst b/docs/features/baselibs/json/requirements/index.rst index ff47cd1764..e817c65bc6 100644 --- a/docs/features/baselibs/json/requirements/index.rst +++ b/docs/features/baselibs/json/requirements/index.rst @@ -38,6 +38,18 @@ General Requirements The JSON-Library shall provide a service to parse JSON data according to RFC8259. +.. comp_req:: Return data in user format + :id: comp_req__json__user_format + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__json_library + :status: valid + + The JSON-Library shall return parsed data in a compatible user format. + + Note: The user format shall be a regular type and not defined within the library. + User friendly API for information exchange ========================================== @@ -45,7 +57,7 @@ User friendly API for information exchange :id: comp_req__json__lang_idioms :reqtype: Non-Functional :security: NO - :safety: QM + :safety: ASIL_B :satisfies: feat_req__baselibs__json_library, feat_req__baselibs__consistent_apis :status: valid @@ -55,7 +67,7 @@ User friendly API for information exchange :id: comp_req__json__lang_infra :reqtype: Non-Functional :security: NO - :safety: QM + :safety: ASIL_B :satisfies: feat_req__baselibs__json_library :status: valid @@ -68,7 +80,7 @@ User friendly API for information exchange :id: comp_req__json__type_compatibility :reqtype: Non-Functional :security: NO - :safety: QM + :safety: ASIL_B :satisfies: feat_req__baselibs__json_library :status: valid @@ -84,7 +96,7 @@ Full testability for the user facing API :id: comp_req__json__full_testability :reqtype: Non-Functional :security: NO - :safety: QM + :safety: ASIL_B :satisfies: feat_req__baselibs__json_library :status: valid From 397f68e1ec1524281bebc261fd64549a8b3fecb2 Mon Sep 17 00:00:00 2001 From: Alexandru Iulian Date: Wed, 30 Jul 2025 10:46:28 +0300 Subject: [PATCH 015/109] json-lib: Move JSON component request files to modules folder Signed-off-by: Alexandru Iulian --- docs/features/baselibs/index.rst | 1 - docs/features/baselibs/json/index.rst | 123 ------------------ docs/modules/baselibs/json/docs/index.rst | 109 +++++++++++++++- .../json/docs}/requirements/index.rst | 0 4 files changed, 105 insertions(+), 128 deletions(-) delete mode 100644 docs/features/baselibs/json/index.rst rename docs/{features/baselibs/json => modules/baselibs/json/docs}/requirements/index.rst (100%) diff --git a/docs/features/baselibs/index.rst b/docs/features/baselibs/index.rst index e060bcaad0..e515c2ba4b 100644 --- a/docs/features/baselibs/index.rst +++ b/docs/features/baselibs/index.rst @@ -28,7 +28,6 @@ Base Libraries :hidden: docs/requirements/index.rst - json/index Feature flag diff --git a/docs/features/baselibs/json/index.rst b/docs/features/baselibs/json/index.rst deleted file mode 100644 index 4f21562588..0000000000 --- a/docs/features/baselibs/json/index.rst +++ /dev/null @@ -1,123 +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 - # ******************************************************************************* - -JSON-Library -=========================== - -.. document:: JSON-Library - :id: doc__json - :status: valid - :safety: ASIL_B - :tags: component_request - - -.. toctree:: - :hidden: - - requirements/index.rst - - -Abstract -======== - -This component request proposes the integration of a safe JSON-Library with parsing functionality. - - -Basic Functionality ----------------------- -The component shall support parsing JSON data and convert that information to a compatible user format. - - -Future Extensions ----------------------- -The component shall support a future extension for serializing from user format into JSON data. - - -Motivation -========== - -S-CORE is targeting high-performance automotive systems with safety impact. -Some applications, like the IPC communication solution, require a safe JSON-Library with parsing functionality to enable loading of configuration information at runtime. -There is currently no solution for this inside S-CORE. - -Rationale -========= - -A JSON-Library with parsing functionality needs to be introduced in S-CORE software platform due to specific functional dependencies of different features (ex: IPC). - -Further details are available in the following section: -.. _Specification: - -Specification -============= - -The following details and requirements describe the aspects of current feature in the context of S-CORE. - -General considerations ----------------------- - -The JSON-Library should provide parsing and data conversion capabilities: - -:need:`comp_req__json__validation` -:need:`comp_req__json__deserialization` -:need:`comp_req__json__user_format` - -The component should be extensible in the future in order to support conversion of user format to JSON data. - -User friendly API ------------------ - -Programming languages have their own feature set and idioms. -It is crucial for any library that it seamlessly integrates into both. -This means, wherever possible and meaningful, infrastructure of the programming language and accompanying standard -libraries shall be reused. -Further, a developer used to the programming language shall have no problems understanding the API. -It should feel natural to use. -This includes error handling, which shall follow one of the error handling concepts of the programming language. - -1. :need:`comp_req__json__lang_idioms` -2. :need:`comp_req__json__lang_infra` - -Full testability for the public API ----------------------------------------- - -Our users will be required to proof certain coverage metrics, like line coverage or branch coverage. -For them to reach full coverage, they need to be easily able to mock or fake the public API of the JSON-Library in their unit tests. - -:need:`comp_req__json__full_testability` - -Backwards Compatibility -======================= - -As there is currently no previous solution in S-CORE, no backwards compatibility is required. - -Security Impact -=============== - -For access control and manipulation prevention (e.g. dm-verity) the hosting process and system configuration are responsible. - -Safety Impact -============= - -Overall, the component shall support use cases up to ASIL-B. - -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.] diff --git a/docs/modules/baselibs/json/docs/index.rst b/docs/modules/baselibs/json/docs/index.rst index 629d95a4bb..4f2025d0cb 100644 --- a/docs/modules/baselibs/json/docs/index.rst +++ b/docs/modules/baselibs/json/docs/index.rst @@ -12,12 +12,113 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -.. _comp_doc_json: +JSON-Library +=========================== + +.. document:: JSON-Library + :id: doc__json + :status: valid + :safety: ASIL_B + :tags: component_request -json -#### .. toctree:: :hidden: - architecture/index + requirements/index.rst + architecture/index.rst + + +Abstract +======== + +This component request proposes the integration of a safe JSON-Library with parsing functionality. + + +Basic Functionality +---------------------- +The component shall support parsing JSON data and convert that information to a compatible user format. + + +Future Extensions +---------------------- +The component shall support a future extension for serializing from user format into JSON data. + + +Motivation +========== + +S-CORE is targeting high-performance automotive systems with safety impact. +Some applications, like the IPC communication solution, require a safe JSON-Library with parsing functionality to enable loading of configuration information at runtime. +There is currently no solution for this inside S-CORE. + +Rationale +========= + +A JSON-Library with parsing functionality needs to be introduced in S-CORE software platform due to specific functional dependencies of different features (ex: IPC). + +Further details are available in the following section: +.. _Specification: + +Specification +============= + +The following details and requirements describe the aspects of current feature in the context of S-CORE. + +General considerations +---------------------- + +The JSON-Library should provide parsing and data conversion capabilities: + +:need:`comp_req__json__validation` +:need:`comp_req__json__deserialization` +:need:`comp_req__json__user_format` + +The component should be extensible in the future in order to support conversion of user format to JSON data. + +User friendly API +----------------- + +Programming languages have their own feature set and idioms. +It is crucial for any library that it seamlessly integrates into both. +This means, wherever possible and meaningful, infrastructure of the programming language and accompanying standard +libraries shall be reused. +Further, a developer used to the programming language shall have no problems understanding the API. +It should feel natural to use. +This includes error handling, which shall follow one of the error handling concepts of the programming language. + +1. :need:`comp_req__json__lang_idioms` +2. :need:`comp_req__json__lang_infra` + +Full testability for the public API +---------------------------------------- + +Our users will be required to proof certain coverage metrics, like line coverage or branch coverage. +For them to reach full coverage, they need to be easily able to mock or fake the public API of the JSON-Library in their unit tests. + +:need:`comp_req__json__full_testability` + +Backwards Compatibility +======================= + +As there is currently no previous solution in S-CORE, no backwards compatibility is required. + +Security Impact +=============== + +For access control and manipulation prevention (e.g. dm-verity) the hosting process and system configuration are responsible. + +Safety Impact +============= + +Overall, the component shall support use cases up to ASIL-B. + +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.] diff --git a/docs/features/baselibs/json/requirements/index.rst b/docs/modules/baselibs/json/docs/requirements/index.rst similarity index 100% rename from docs/features/baselibs/json/requirements/index.rst rename to docs/modules/baselibs/json/docs/requirements/index.rst From 0a44e59f54ce1b6b8be8d2608d9367939a3e1390 Mon Sep 17 00:00:00 2001 From: Alexandru Iulian Date: Wed, 30 Jul 2025 16:35:47 +0300 Subject: [PATCH 016/109] json-lib: Rephrase comp_req__json__asil and add AOUs subsection Signed-off-by: Alexandru Iulian --- docs/modules/baselibs/json/docs/index.rst | 3 +++ docs/modules/baselibs/json/docs/requirements/index.rst | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/modules/baselibs/json/docs/index.rst b/docs/modules/baselibs/json/docs/index.rst index 4f2025d0cb..f3c84ec587 100644 --- a/docs/modules/baselibs/json/docs/index.rst +++ b/docs/modules/baselibs/json/docs/index.rst @@ -106,7 +106,10 @@ As there is currently no previous solution in S-CORE, no backwards compatibility Security Impact =============== +Assumptions of Use +---------------------------------------- For access control and manipulation prevention (e.g. dm-verity) the hosting process and system configuration are responsible. +The integrity of input JSON data shall be ensured by the user. Safety Impact ============= diff --git a/docs/modules/baselibs/json/docs/requirements/index.rst b/docs/modules/baselibs/json/docs/requirements/index.rst index e817c65bc6..4aa1851fec 100644 --- a/docs/modules/baselibs/json/docs/requirements/index.rst +++ b/docs/modules/baselibs/json/docs/requirements/index.rst @@ -115,4 +115,4 @@ Safety Impact :satisfies: feat_req__baselibs__json_library, feat_req__baselibs__safety :status: valid - The JSON library shall support safe communication up to ASIL-B. + The JSON library shall be ASIL-B compliant. From 547e594d3f50682875673ee7ab0d8c3e6d6d9d7d Mon Sep 17 00:00:00 2001 From: aschemmel-git Date: Thu, 31 Jul 2025 14:52:42 +0200 Subject: [PATCH 017/109] Create draft API guideline Ref: resolves #1533 --- docs/contribute/development/api_guideline.rst | 33 +++++++++++++++++++ docs/contribute/development/index.rst | 1 + .../software_development.rst | 6 ++++ 3 files changed, 40 insertions(+) create mode 100644 docs/contribute/development/api_guideline.rst diff --git a/docs/contribute/development/api_guideline.rst b/docs/contribute/development/api_guideline.rst new file mode 100644 index 0000000000..0b110a875d --- /dev/null +++ b/docs/contribute/development/api_guideline.rst @@ -0,0 +1,33 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +Designing API +############# + +.. document:: API Guidelines + :id: doc__api_guidelines + :status: draft + +User friendly API design +======================== + +* Each public API shall support the idioms of the programming language it is written in. +* Each public API shall use core infrastructure of its programming language and accompanying standard libraries, whenever possible and meaningful. + +Error handling +============== + +* (C++) exceptions shall not be used for error handling, as these will be directly leading to an abort and thus reducing availability of the S-CORE platform. +* The best way to deal with errors is to try to resolve those component internally. If not possible the caller of the function shall be notified of the error. +* For (error) returns there is a specific library to be used in S-CORE, it is the Score::Result library which is part of the :ref:`baselibs_feature` feature. diff --git a/docs/contribute/development/index.rst b/docs/contribute/development/index.rst index 086e6be44b..b8428b2ae8 100644 --- a/docs/contribute/development/index.rst +++ b/docs/contribute/development/index.rst @@ -19,6 +19,7 @@ Development :maxdepth: 1 development_environment + api_guideline cpp/index rust/index python/index diff --git a/docs/platform_management_plan/software_development.rst b/docs/platform_management_plan/software_development.rst index 1fc54164ad..0844381797 100644 --- a/docs/platform_management_plan/software_development.rst +++ b/docs/platform_management_plan/software_development.rst @@ -66,6 +66,12 @@ Design guideline The design guideline is defined in :need:`PROCESS_doc_concept__imp__concept` and :need:`PROCESS_gd_guidl__implementation`. +API guideline +^^^^^^^^^^^^^ + +To provide the user with a consistent approach on the use of APIs, there is a guideline documented in :need:`doc__api_guidelines`, +this defines for example the error handling concept or rules to improve user experience. + Coding guideline ^^^^^^^^^^^^^^^^ From d1dc7bdc6fe98cff99e624280feee1280023143b Mon Sep 17 00:00:00 2001 From: Sven Bachmann Date: Sat, 26 Jul 2025 00:06:20 +0200 Subject: [PATCH 018/109] persistency_kvs: re-add component arch/module and safety docs Signed-off-by: Sven Bachmann --- docs/features/persistency/kvs/index.rst | 3 + .../persistency/kvs/safety_analysis/dfa.rst | 868 ++++++++++++++++++ .../persistency/kvs/safety_analysis/fmea.rst | 393 ++++++++ .../persistency/kvs/safety_planning/index.rst | 130 +++ docs/modules/persistency/docs/index.rst | 25 + .../modules/persistency/docs/manual/index.rst | 21 + .../persistency/docs/manual/safety_manual.rst | 89 ++ .../persistency/docs/release/release_note.rst | 90 ++ .../persistency/docs/safety_mgt/index.rst | 19 + .../module_verification_report.rst | 90 ++ .../json/docs/component_classification.rst | 181 ++++ docs/modules/persistency/json/docs/index.rst | 176 ++++ .../kvs/docs/architecture/index.rst | 130 +++ .../kvs/docs/component_classification.rst | 195 ++++ docs/modules/persistency/kvs/docs/index.rst | 180 ++++ .../kvs/docs/requirements/index.rst | 175 ++++ .../kvs/docs/safety_analysis/dfa.rst | 53 ++ .../kvs/docs/safety_analysis/fmea.rst | 53 ++ 18 files changed, 2871 insertions(+) create mode 100644 docs/features/persistency/kvs/safety_analysis/dfa.rst create mode 100644 docs/features/persistency/kvs/safety_analysis/fmea.rst create mode 100644 docs/features/persistency/kvs/safety_planning/index.rst create mode 100644 docs/modules/persistency/docs/index.rst create mode 100644 docs/modules/persistency/docs/manual/index.rst create mode 100644 docs/modules/persistency/docs/manual/safety_manual.rst create mode 100644 docs/modules/persistency/docs/release/release_note.rst create mode 100644 docs/modules/persistency/docs/safety_mgt/index.rst create mode 100644 docs/modules/persistency/docs/verification/module_verification_report.rst create mode 100644 docs/modules/persistency/json/docs/component_classification.rst create mode 100644 docs/modules/persistency/json/docs/index.rst create mode 100644 docs/modules/persistency/kvs/docs/architecture/index.rst create mode 100644 docs/modules/persistency/kvs/docs/component_classification.rst create mode 100644 docs/modules/persistency/kvs/docs/index.rst create mode 100644 docs/modules/persistency/kvs/docs/requirements/index.rst create mode 100644 docs/modules/persistency/kvs/docs/safety_analysis/dfa.rst create mode 100644 docs/modules/persistency/kvs/docs/safety_analysis/fmea.rst diff --git a/docs/features/persistency/kvs/index.rst b/docs/features/persistency/kvs/index.rst index 290937da5a..f595a26e23 100644 --- a/docs/features/persistency/kvs/index.rst +++ b/docs/features/persistency/kvs/index.rst @@ -24,6 +24,9 @@ Key-Value-Storage .. toctree:: requirements/index.rst architecture/index.rst + safety_analysis/fmea.rst + safety_analysis/dfa.rst + safety_planning/index.rst Feature flag diff --git a/docs/features/persistency/kvs/safety_analysis/dfa.rst b/docs/features/persistency/kvs/safety_analysis/dfa.rst new file mode 100644 index 0000000000..8aed7eed32 --- /dev/null +++ b/docs/features/persistency/kvs/safety_analysis/dfa.rst @@ -0,0 +1,868 @@ +.. + # ******************************************************************************* + # 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 DFA +############### + +.. document:: DFA + :id: doc__persistency_dfa + :status: draft + :safety: ASIL_B + :tags: feature_persistency + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: SR_01_01 + | :violation_cause: Reused software module. N/A + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: SR_01_02 + | :violation_cause: Libraries. . N/A + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: SR_01_04 + | :violation_cause: Basic software. N/A + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: SR_01_05 + | :violation_cause: Operating system including scheduler. Platformebene. Nicht von Middleware handlebar + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: SR_01_06 + | :violation_cause: Any service stack, e.g. communication stack. N/A + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: SR_01_07 + | :violation_cause: Configuration data. Return values might be falsified. + | :mitigation: < NONE|ID from Feature Requirement> Integritry check feat_req__persistency__integrity_check + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: SR_01_09 + | :violation_cause: Execution time. N/A + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: SR_01_10 + | :violation_cause: Allocated memory. Diskussion aktuell in Feature-Community. JSON kann das, sollte aber eigentlich nicht erlaubt sein + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: CO_01_01 + | :violation_cause: Information passed via argument through a function call, or via writing/reading a variable being global to the two software functions (data flow) <- Checken ob das Fehlerbild überhaupt passt. 1. Satzteil nicht passen zu 2.> + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: CO_01_02 + | :violation_cause: Data or message corruption / repetition / loss / delay / masquerading or incorrect addressing of information. Fehlerhafte ausführung oder nichtverfügbarkeit vom feature + | :mitigation: < NONE|ID from Feature Requirement> feat_req__persistency__integrity_check + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: CO_01_03 + | :violation_cause: Insertion / sequence of information wie CO_01_02 + | :mitigation: < NONE|ID from Feature Requirement> feat_req__persistency__integrity_check + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: CO_01_04 + | :violation_cause: Corruption of information, inconsistent data wie CO_01_02 + | :mitigation: < NONE|ID from Feature Requirement> keine Erkennung + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: CO_01_05 + | :violation_cause: Asymmetric information sent from a sender to multiple receivers, so that not all defined receivers have the same informations N/A + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: CO_01_06 + | :violation_cause: Information from a sender received by only a subset of the receivers. N/A + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: CO_01_07 + | :violation_cause: Blocking access to a communication channel N/A + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: SI_01_02 + | :violation_cause: Configuration data. N/A + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: SI_01_03 + | :violation_cause: Constants, or variables, being global to the two software functions. N/A + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: SI_01_04 + | :violation_cause: Basic software passes data (read from hardware register and converted into logical information) to two applications software functions. N/A + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: SI_01_05 + | :violation_cause: Data / function parameter arguments / messages delivered by software function to more than one other function. Unklar was das Fehlerbild ist + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: UI_01_01 + | :violation_cause: Memory miss-allocation and leaks. Platformebene + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: UI_01_02 + | :violation_cause: Read/Write access to memory allocated to another software element. Platformebene + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: UI_01_03 + | :violation_cause: Stack/Buffer under-/overflow. Könnte passieren, ist aber unwahrscheinlich in RUST. Recursive Funktionen könnten die Ursache sein. + | :mitigation: < NONE|ID from Feature Requirement> Compilerüberwachung / AoU + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: UI_01_04 + | :violation_cause: Deadlocks. Könnten auftreten. Würde von Applikation verursacht werden. KVS kann da nichts machen + | :mitigation: < NONE|ID from Feature Requirement> AoU + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: UI_01_05 + | :violation_cause: Livelocks wie UI_01_04 + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: UI_01_06 + | :violation_cause: Blocking of execution. Feature is not available. + | :mitigation: < NONE|ID from Feature Requirement> AoU + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: UI_01_07 + | :violation_cause: Incorrect allocation of execution time. N/A + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: UI_01_08 + | :violation_cause: Incorrect execution flow N/A + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: UI_01_09 + | :violation_cause: Incorrect synchronization between software elements N/A + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: UI_01_10 + | :violation_cause: CPU time depletion N/A + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: UI_01_11 + | :violation_cause: Memory depletion N/A + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: UI_01_12 + | :violation_cause: Other HW unavailability N/A + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: SC_01_02 + | :violation_cause: Same development approaches (e.g. IDE, programming and/or modelling language) + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: SC_01_03 + | :violation_cause: Same personal + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: SC_01_04 + | :violation_cause: Same social-cultural context (even if different personnel). Only applicable if diverse development is needed. + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_DFA__persistency__check_key_default + | :violation_id: SC_01_05 + | :violation_cause: Development fault (e.g. human error, insufficient qualification, insufficient methods). Only applicable if diverse development is needed. + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + + + + + + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: SR_01_01 + | :violation_cause: Reused software modules + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: SR_01_02 + | :violation_cause: Libraries + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: SR_01_04 + | :violation_cause: Basic software + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: SR_01_05 + | :violation_cause: Operating system including scheduler + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: SR_01_06 + | :violation_cause: Any service stack, e.g. communication stack + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: SR_01_07 + | :violation_cause: Configuration data + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: SR_01_09 + | :violation_cause: Execution time + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: SR_01_10 + | :violation_cause: Allocated memory + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: CO_01_01 + | :violation_cause: Information passed via argument through a function call, or via writing/reading a variable being global to the two software functions (data flow) + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: CO_01_02 + | :violation_cause: Data or message corruption / repetition / loss / delay / masquerading or incorrect addressing of information + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: CO_01_03 + | :violation_cause: Insertion / sequence of information + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: CO_01_04 + | :violation_cause: Corruption of information, inconsistent data + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: CO_01_05 + | :violation_cause: Asymmetric information sent from a sender to multiple receivers, so that not all defined receivers have the same informations + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: CO_01_06 + | :violation_cause: Information from a sender received by only a subset of the receivers + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: CO_01_07 + | :violation_cause: Blocking access to a communication channel + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: SI_01_02 + | :violation_cause: Configuration data + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: SI_01_03 + | :violation_cause: Constants, or variables, being global to the two software functions + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: SI_01_04 + | :violation_cause: Basic software passes data (read from hardware register and converted into logical information) to two applications software functions + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: SI_01_05 + | :violation_cause: Data / function parameter arguments / messages delivered by software function to more than one other function + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: UI_01_01 + | :violation_cause: Memory miss-allocation and leaks + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: UI_01_02 + | :violation_cause: Read/Write access to memory allocated to another software element + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: UI_01_03 + | :violation_cause: Stack/Buffer under-/overflow + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: UI_01_04 + | :violation_cause: Deadlocks + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: UI_01_05 + | :violation_cause: Livelocks + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: UI_01_06 + | :violation_cause: Blocking of execution + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: UI_01_07 + | :violation_cause: Incorrect allocation of execution time + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: UI_01_08 + | :violation_cause: Incorrect execution flow + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: UI_01_09 + | :violation_cause: Incorrect synchronization between software elements + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: UI_01_10 + | :violation_cause: CPU time depletion + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: UI_01_11 + | :violation_cause: Memory depletion + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: UI_01_12 + | :violation_cause: Other HW unavailability + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: SC_01_02 + | :violation_cause: Same development approaches (e.g. IDE, programming and/or modelling language) + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: SC_01_03 + | :violation_cause: Same personal + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: SC_01_04 + | :violation_cause: Same social-cultural context (even if different personnel). Only applicable if diverse development is needed. + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_dfa:: + | :verifies: + | :id: feat_saf_DFA____ + | :violation_id: SC_01_05 + | :violation_cause: Development fault (e.g. human error, insufficient qualification, insufficient methods). Only applicable if diverse development is needed. + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: diff --git a/docs/features/persistency/kvs/safety_analysis/fmea.rst b/docs/features/persistency/kvs/safety_analysis/fmea.rst new file mode 100644 index 0000000000..7097c89ac2 --- /dev/null +++ b/docs/features/persistency/kvs/safety_analysis/fmea.rst @@ -0,0 +1,393 @@ +.. + # ******************************************************************************* + # 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 Safety Analysis +########################### + +.. document:: Safety Analysis + :id: doc__persistency_safety_analysis + :status: draft + :safety: ASIL_B + :tags: feature_persistency + + | .. feat_saf_fmea:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_FMEA__persistency__open_KVS + | :failure_mode: MF_01_01 + | :failure_effect: Message is not received. User is not able to use the feature. Middleware cant be used.A + | :mitigation: < NONE|ID from Feature Requirement> AoU: Detetion and error handling shall be done outside of the middleware. + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_FMEA__persistency__open_KVS + | :failure_mode: MF_01_02 + | :failure_effect: message received too late. User might not able to use the feature. Middleware cant be used. + | :mitigation: < NONE|ID from Feature Requirement> AoU: Detetion and error handling shall be done outside of the middleware. + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_FMEA__persistency__open_KVS + | :failure_mode: MF_01_03 + | :failure_effect: message received too early. No impact / feature reacts only if triggered on the trigger. + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_FMEA__persistency__open_KVS + | :failure_mode: MF_01_04 + | :failure_effect: message not received correctly by all recipients (different messages or messages partly lost). N/A + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_FMEA__persistency__open_KVS + | :failure_mode: MF_01_05 + | :failure_effect: message is corrupted. Covered by MF_01_01 + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_FMEA__persistency__open_KVS + | :failure_mode: MF_01_06 + | :failure_effect: message is not sent. Covered by MF_01_01 + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_FMEA__persistency__open_KVS + | :failure_mode: MF_01_07 + | :failure_effect: message is unintended sent. Covered by MF_01_01 + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_FMEA__persistency__open_KVS + | :failure_mode: CO_01_01 + | :failure_effect: minimum constraint boundary is violated. N/A + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_FMEA__persistency__open_KVS + | :failure_mode: CO_01_02 + | :failure_effect: maximum constraint boundary is violated. N/A + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_FMEA__persistency__open_KVS + | :failure_mode: EX_01_01 + | :failure_effect: Process calculates wrong result(s). Feature is not usable. + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_FMEA__persistency__open_KVS + | :failure_mode: EX_01_02 + | :failure_effect: processing too slow. N/A + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_FMEA__persistency__open_KVS + | :failure_mode: EX_01_03 + | :failure_effect: processing too fast. N/A + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_FMEA__persistency__open_KVS + | :failure_mode: EX_01_04 + | :failure_effect: loss of execution. User is not able to use the feature. Middleware cant be used. + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_FMEA__persistency__open_KVS + | :failure_mode: EX_01_05 + | :failure_effect: processing changes to arbitrary process. N/A + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_FMEA__persistency__open_KVS + | :failure_mode: EX_01_06 + | :failure_effect: processing is not complete (infinite loop). User is not able to use the feature. Middleware cant be used. + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + + + + + + + + + + + + | .. feat_saf_fmea:: Persistency + | :verifies: + | :id: feat_saf_FMEA__persistency__ + | :failure_mode: MF_01_01 + | :failure_effect: message is not received + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: + | :id: feat_saf_FMEA__persistency__ + | :failure_mode: MF_01_02 + | :failure_effect: message received too late + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: + | :id: feat_saf_FMEA__persistency__ + | :failure_mode: MF_01_03 + | :failure_effect: message received too early + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: + | :id: feat_saf_FMEA__persistency__ + | :failure_mode: MF_01_04 + | :failure_effect: message not received correctly by all recipients (different messages or messages partly lost) + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: + | :id: feat_saf_FMEA__persistency__ + | :failure_mode: MF_01_05 + | :failure_effect: message is corrupted + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: + | :id: feat_saf_FMEA__persistency__ + | :failure_mode: MF_01_06 + | :failure_effect: message is not sent + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: + | :id: feat_saf_FMEA__persistency__ + | :failure_mode: MF_01_07 + | :failure_effect: message is unintended sent + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: + | :id: feat_saf_FMEA__persistency__ + | :failure_mode: CO_01_01 + | :failure_effect: minimum constraint boundary is violated + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: + | :id: feat_saf_FMEA__persistency__ + | :failure_mode: CO_01_02 + | :failure_effect: maximum constraint boundary is violated + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: + | :id: feat_saf_FMEA__persistency__ + | :failure_mode: EX_01_01 + | :failure_effect: Process calculates wrong result(s) + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: + | :id: feat_saf_FMEA__persistency__ + | :failure_mode: EX_01_02 + | :failure_effect: processing too slow + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: + | :id: feat_saf_FMEA__persistency__ + | :failure_mode: EX_01_03 + | :failure_effect: processing too fast + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: + | :id: feat_saf_FMEA__persistency__ + | :failure_mode: EX_01_04 + | :failure_effect: loss of execution + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: + | :id: feat_saf_FMEA__persistency__ + | :failure_mode: EX_01_05 + | :failure_effect: processing changes to arbitrary process + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: + + | .. feat_saf_fmea:: Persistency + | :verifies: + | :id: feat_saf_FMEA__persistency__ + | :failure_mode: EX_01_06 + | :failure_effect: processing is not complete (infinite loop) + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: + | :mitigation_coverage: <0..100%> + | :sufficient: + | :argument: + | :status: diff --git a/docs/features/persistency/kvs/safety_planning/index.rst b/docs/features/persistency/kvs/safety_planning/index.rst new file mode 100644 index 0000000000..cd9e60b781 --- /dev/null +++ b/docs/features/persistency/kvs/safety_planning/index.rst @@ -0,0 +1,130 @@ +.. + # ******************************************************************************* + # 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_safety_wp_template: + +Feature Safety Planning +======================= + +.. list-table:: Feature Workproducts + :header-rows: 1 + + * - Workproduct Id + - Link to process + - Process status + - Link to issue + - Link to WP + - WP status + + * - :need:`PROCESS_wp__feat_request` + - :need:`PROCESS_gd_temp__change__feature_request` + - :ndf:`copy('status', need_id='PROCESS_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:`PROCESS_wp__requirements__feat` + - :need:`PROCESS_gd_temp__req__feat_req` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__req__feat_req')` + - https://github.com/eclipse-score/score/issues/960 + - :doc:`../requirements/index` + - see below + + * - :need:`PROCESS_wp__requirements__feat_aou` + - :need:`PROCESS_gd_temp__req__aou_req` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__req__aou_req')` + - https://github.com/eclipse-score/score/issues/960 + - :doc:`../requirements/index` + - see below + + * - :need:`PROCESS_wp__feature_arch` + - :need:`PROCESS_gd_temp__arch__feature` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__arch__feature')` + - https://github.com/eclipse-score/score/issues/1020 + - :doc:`../architecture/index` + - see below + + * - :need:`PROCESS_wp__feature_safety_analysis` + - + - + - https://github.com/eclipse-score/score/issues/965 + - :need:`doc__persistency_safety_analysis` + - + + * - :need:`PROCESS_wp__feature_dfa` + - + - + - https://github.com/eclipse-score/score/issues/965 + - :need:`doc__persistency_dfa` + - + + * - :need:`PROCESS_wp__requirements__inspect` + - :need:`PROCESS_gd_chklst__req__inspection` + - :ndf:`copy('status', need_id='PROCESS_gd_chklst__req__inspection')` + - n/a + - Checklist used in Pull Request Review + - n/a + + * - :need:`PROCESS_wp__sw_arch_verification` + - :need:`PROCESS_gd_chklst__arch__inspection_checklist` + - :ndf:`copy('status', need_id='PROCESS_gd_chklst__arch__inspection_checklist')` + - n/a + - Checklist used in Pull Request Review + - n/a + + * - :need:`PROCESS_wp__verification__feat_int_test` + - :need:`PROCESS_gd_guidl__verification_guide` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__verification_guide')` + - + - https://github.com/eclipse-score/score/issues/964 + - + +.. attention:: + The above table must be updated according to your feature safety planning. + + - Create and link the issues to plan the work products (according to :need:`PROCESS_gd_guidl__saf_plan_definitions`) + - Fill the work producs links and add their status (also possible below) to create the safety package (according to :need:`PROCESS_gd_guidl__saf_package`) + +Feature Requirements Status +--------------------------- + +.. needtable:: + :style: table + :types: feat_req + :tags: feature_name + :columns: id;status + :colwidths: 25,25 + :sort: title + +Feature AoU Status +------------------ + +.. needtable:: + :style: table + :types: aou_req + :tags: feature_name + :columns: id;status + :colwidths: 25,25 + :sort: title + +Feature Architecture Status +--------------------------- + +.. needtable:: + :style: table + :types: feat_arc_sta; feat_arc_dyn + :tags: feature_name + :columns: id;status + :colwidths: 25,25 + :sort: title diff --git a/docs/modules/persistency/docs/index.rst b/docs/modules/persistency/docs/index.rst new file mode 100644 index 0000000000..3fc9455078 --- /dev/null +++ b/docs/modules/persistency/docs/index.rst @@ -0,0 +1,25 @@ +.. + # ******************************************************************************* + # 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 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 new file mode 100644 index 0000000000..08ba1a6e1a --- /dev/null +++ b/docs/modules/persistency/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/persistency/docs/manual/safety_manual.rst b/docs/modules/persistency/docs/manual/safety_manual.rst new file mode 100644 index 0000000000..70108acee3 --- /dev/null +++ b/docs/modules/persistency/docs/manual/safety_manual.rst @@ -0,0 +1,89 @@ +.. + # ******************************************************************************* + # 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 Template +====================== + +.. document:: Persistency Safety Manual + :id: doc__persistency_safety_manual + :status: draft + :safety: ASIL_B + :tags: feature_persistency + +This document implements + +Introduction/Scope +------------------ +| This manual will cover the Feature Persistency. It's based on the components + +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 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 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 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"]: + 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/persistency/docs/release/release_note.rst b/docs/modules/persistency/docs/release/release_note.rst new file mode 100644 index 0000000000..80682eb639 --- /dev/null +++ b/docs/modules/persistency/docs/release/release_note.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 + # ******************************************************************************* + +Release Note +============ + +.. note:: Document header + +.. document:: [Your Module Name] Release Note + :id: doc__module_name_release_note + :status: draft + :safety: ASIL_D + :realizes: wp__module_sw_release_note + :tags: template + +.. attention:: + The above directive must be updated according to your Module. + + - Modify ``Your Module Name`` to be your Module Name + - Modify ``id`` to be your Module Name in upper snake case preceded by ``doc_`` and succeeded by ``release_note`` + - Adjust ``status`` to be ``valid`` + - Adjust ``safety`` and ``tags`` according to your needs + + + +| Module Name: [Module Name] +| 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 new file mode 100644 index 0000000000..fa3a7ff35c --- /dev/null +++ b/docs/modules/persistency/docs/safety_mgt/index.rst @@ -0,0 +1,19 @@ +.. + # ******************************************************************************* + # 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: diff --git a/docs/modules/persistency/docs/verification/module_verification_report.rst b/docs/modules/persistency/docs/verification/module_verification_report.rst new file mode 100644 index 0000000000..8af04d22e6 --- /dev/null +++ b/docs/modules/persistency/docs/verification/module_verification_report.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 + # ******************************************************************************* + +Verification Report +=================== + +.. note:: Document header + +.. document:: [Your Module Name] Verification Report + :id: doc__module_name_verification_report + :status: draft + :safety: ASIL_D + :realizes: wp__verification__module_ver_report + :tags: template + +.. attention:: + The above directive must be updated according to your Module. + + - Modify ``Your Module Name`` to be your Module Name + - Modify ``id`` to be your Module Name in upper snake case preceded by ``doc_`` and succeeded by ``verification_report`` + - Adjust ``status`` to be ``valid`` + - Adjust ``safety`` and ``tags`` according to your needs + + +This verification report is based on the verfication 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/json/docs/component_classification.rst b/docs/modules/persistency/json/docs/component_classification.rst new file mode 100644 index 0000000000..68d3a5d262 --- /dev/null +++ b/docs/modules/persistency/json/docs/component_classification.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 + # ******************************************************************************* + +Component Classification +======================== + +.. document:: Persistency Component Classification + :id: doc__persistency_component_classification + :status: draft + :safety: ASIL_B + :realizes: wp__sw_component_class + :tags: feature_persistency + +| Classification of tiny json +| +| `tiny jason `_ V.2.5.1 +| +| Additional documentation considered: +| `Documentation for tiny jason `_ + + +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. Tinyjson 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 tinyjson. + + * - 4 + - Are design specifications available? + - PE + - n/a + + * - 5 + - Are configuration specification and data available, if applicable? + - PE + - Yes in the documentation of tinyjson. + + * - 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. + +Tinyjson 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: ** + +.. 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. Tinyjson is written in Safe Rust. + - 0 + + * - 3 + - | Test exists / Coverage (Function, Line) + | (maybe better: testability, but how to measure?) + - Existing Tests Coverage + - NH + - + + * - 4 + - High amount of public function interfaces + - Number of public function interfaces + - NH + - + + * - 5 + - High amount of function parameters + - Number of parameters + - NH + - + + +| (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. +| + +Tinyjson 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 | ++-------+-------+-------+-------+ + +Tinyjson 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 new file mode 100644 index 0000000000..e9e1403dcc --- /dev/null +++ b/docs/modules/persistency/json/docs/index.rst @@ -0,0 +1,176 @@ +.. + # ******************************************************************************* + # 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_PersistencyJson: + +Tiny JSON +######### + +.. note:: Document header + +.. document:: Persistency JSON + :id: doc__persistencyjson + :status: draft + :safety: ASIL_B + :realizes: wp__cmpt_request + :tags: template + +.. attention:: + The above directive must be updated according to your Component. + + - Modify ``document`` to be your Component Name + - Modify ``id`` to be your Component Name in upper snake case preceded by ``doc__`` + - Adjust ``status`` to be ``valid`` + - Adjust ``safety`` and ``tags`` according to your needs + +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. + + +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:`PROCESS_rl__module_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:`PROCESS_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:: + :hidden: + + component_classification.rst diff --git a/docs/modules/persistency/kvs/docs/architecture/index.rst b/docs/modules/persistency/kvs/docs/architecture/index.rst new file mode 100644 index 0000000000..a7c0ba8243 --- /dev/null +++ b/docs/modules/persistency/kvs/docs/architecture/index.rst @@ -0,0 +1,130 @@ +.. + # ******************************************************************************* + # 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: + +Component Architecture +====================== + +.. document:: Persistency KVS Architecture + :id: doc__persistency_kvs_architecture + :status: draft + :safety: ASIL_B + :realizes: wp__component_arch + :tags: template + +.. attention:: + The above directive must be updated according to your needs. + + - Modify ``Your Component Name`` to be your Component Name + - Modify ``id`` to be your Component Name in upper snake case preceded by ``doc__`` and followed by ``_architecture`` + - Adjust ``status`` to be ``valid`` + - Adjust ``safety`` and ``tags`` according to your needs + +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_D + :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_D + :status: invalid + :fulfils: + + 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|ASIL_D> + :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_D + :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:`PROCESS_gd_guidl__arch__design`) + - Set the status to valid and start the review/merge process diff --git a/docs/modules/persistency/kvs/docs/component_classification.rst b/docs/modules/persistency/kvs/docs/component_classification.rst new file mode 100644 index 0000000000..7a6214f3a3 --- /dev/null +++ b/docs/modules/persistency/kvs/docs/component_classification.rst @@ -0,0 +1,195 @@ +.. + # ******************************************************************************* + # 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 +======================== + +.. note:: Document header + +.. document:: [Your Component Name] Component Classification + :id: doc__component_name_comp_class + :status: draft + :safety: ASIL_D + :realizes: wp__sw_component_class + :tags: template + +.. attention:: + The above directive must be updated according to your Component. + + - Modify ``Your Component Name`` to be your Component Name + - Modify ``id`` to be your Component Name in upper snake case preceded by ``doc__`` + - Adjust ``status`` to be ``valid`` + - Adjust ``safety`` and ``tags`` according to your needs + +| Classification of <component> +| +| <Link to OSS component source (e.g. in github) including the selected version> +| +| Additional documentation considered: +| <list of documentation links> + + +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? + - <HE|PE|NE> + - <Rationale for result> + + * - 2 + - Are requirements available? + - <HE|PE|NE> + - <Rationale for result> + + * - 3 + - Are specifications for functionalities and properties available (architecture)? + - <HE|PE|NE> + - <Rationale for result> + + * - 4 + - Are design specifications available? + - <HE|PE|NE> + - <Rationale for result> + + * - 5 + - Are configuration specification and data available, if applicable? + - <HE|PE|NE> + - <Rationale for result> + + * - 6 + - Are verification measures including tests and reports available? + - <HE|PE|NE> + - <Rationale for result> + + +| (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. + +<component name> is determined as P=<1|2|3> + + +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>** + +<select the correct table below (table for C++ is TBD)> + +.. 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|HM|NM> + - <Number> + + * - 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|HM|NM> + - <Number> + + * - 3 + - | Test exists / Coverage (Function, Line) + | (maybe better: testability, but how to measure?) + - Existing Tests Coverage + - <NH|HM|NM> + - <Number> + + * - 4 + - High amount of public function interfaces + - Number of public function interfaces + - <NH|HM|NM> + - <RNumber> + + * - 5 + - High amount of function parameters + - Number of parameters + - <NH|HM|NM> + - <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. +| + +<component name> is determined as C=<1|2|3> + + +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 | ++-------+-------+-------+-------+ + +<component name> is classified as CLAS_OUT=<Q|QR|NQ> + + +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 change request containing this is in status "Accepted", the module safety plan for the component development is adapted based on the following: (select according to above result) +| - Q: Follow the processes for qualification of software components in a safety context. +| - QR: Follow the process for pre-existing software architectural elements +| - NQ: Do no use this element in safety context diff --git a/docs/modules/persistency/kvs/docs/index.rst b/docs/modules/persistency/kvs/docs/index.rst new file mode 100644 index 0000000000..5cc5ee50fd --- /dev/null +++ b/docs/modules/persistency/kvs/docs/index.rst @@ -0,0 +1,180 @@ +.. + # ******************************************************************************* + # 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) +##################### + +.. note:: Document header + +.. document:: Persistency KVS + :id: doc__persistencykvs + :status: draft + :safety: ASIL_B + :realizes: wp__cmpt_request + :tags: template + +.. attention:: + The above directive must be updated according to your Component. + + - Modify ``document`` to be your Component Name + - Modify ``id`` to be your Component Name in upper snake case preceded by ``doc__`` + - Adjust ``status`` to be ``valid`` + - Adjust ``safety`` and ``tags`` according to your needs + +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. + + +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:`PROCESS_rl__module_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:`PROCESS_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:: + :hidden: + + requirements/index.rst + architecture/index.rst + safety_analysis/fmea.rst + safety_analysis/dfa.rst + component_classification.rst diff --git a/docs/modules/persistency/kvs/docs/requirements/index.rst b/docs/modules/persistency/kvs/docs/requirements/index.rst new file mode 100644 index 0000000000..3c7caf8e7a --- /dev/null +++ b/docs/modules/persistency/kvs/docs/requirements/index.rst @@ -0,0 +1,175 @@ +.. + # ******************************************************************************* + # 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 Requirements +###################### + +.. comp_req:: Key Handling + :id: comp_req__persistency__key_handling + :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. + The component shall encode each key as valid UTF-8. + The component shall guarantee that each key is unique. + The component shall limit the maximum length of a key to 32 bytes. + +.. comp_req:: Value Handling + :id: comp_req__persistency__value_handling + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__persistency__support_datatype_value,feat_req__persistency__default_values + :status: valid + + The component shall accept only values of the following data types: Number, String, Null, Array[Value], or Dictionary{Key:Value}. + The component shall serialize and deserialize all values to and from JSON. + The component shall limit the maximum length of a value to 1024 bytes. + The component shall support unset values and shall provide a default value when a value is unset. + The component shall allow resetting a value to its default if a default is defined. + +.. comp_req:: Default Value Handling + :id: comp_req__persistency__default_value_handling + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: feat_req__persistency__default_values,feat_req__persistency__default_value_get,feat_req__persistency__default_value_reset,feat_req__persistency__default_value_file + :status: valid + + The component shall accept default values of only permitted value data types. + The component shall provide an API to retrieve default values. + The component shall allow configuration of default values in code or in a separate configuration file. + 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: QM + :satisfies: feat_req__persistency__config_file + :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:: Language Agnostic + :id: comp_req__persistency__language_agnostic + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: feat_req__persistency__cpp_rust_interop + :status: valid + + The component shall provide an API that supports bindings to other languages or shall use a storage and memory exchange format that is adaptable to other languages. + +.. comp_req:: Concurrency + :id: comp_req__persistency__concurrency + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: feat_req__persistency__intra_process_comm + :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 + :id: comp_req__persistency__persist_data_storage + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: feat_req__persistency__persistency,feat_req__persistency__integrity_check,feat_req__persistency__persist_data + :status: valid + + The component shall use the file API and the JSON data format to persist data. + The component shall generate a checksum for each data file and shall store it alongside the data. + The component shall verify the checksum when loading data. + +.. comp_req:: Persistent Data Schema Handling + :id: comp_req__persistency__persistent_data_schema + :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. + 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:: Snapshots + :id: comp_req__persistency__snapshots + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__persistency__snapshots + :status: valid + + The component shall create a snapshot each time data is stored. + The component shall maintain a configurable maximum number of snapshots. + The component shall assign the ID 1 to the newest snapshot and shall increment the IDs of older snapshots accordingly. + The component shall rotate and delete the oldest snapshot when the maximum number is reached. + The component shall allow restoration of a snapshot by its ID. + The component shall allow deletion of individual snapshots. + +.. comp_req:: Develop Mode + :id: comp_req__persistency__dev_mode + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__persistency__dev_mode + :status: valid + + The component shall provide a developer mode that can be enabled during build time to display debugging and internal information. + +.. comp_req:: Async API + :id: comp_req__persistency__async_api + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: feat_req__persistency__async_api + :status: valid + + The component shall provide an asynchronous API in addition to the standard API. + +.. comp_req:: Permission Handling + :id: comp_req__persistency__permission_handling + :reqtype: Functional + :security: NO + :safety: QM + :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. + 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__events + :status: valid + + The component shall provide an API for registering callbacks that are triggered by data change events. diff --git a/docs/modules/persistency/kvs/docs/safety_analysis/dfa.rst b/docs/modules/persistency/kvs/docs/safety_analysis/dfa.rst new file mode 100644 index 0000000000..be4e82b4b1 --- /dev/null +++ b/docs/modules/persistency/kvs/docs/safety_analysis/dfa.rst @@ -0,0 +1,53 @@ +.. + # ******************************************************************************* + # 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__kvs_dfa + :status: valid + :safety: ASIL_B + :realizes: wp__sw_component_dfa + :tags: template + +.. attention:: + The above directive must be updated according to your Component. + + - Modify ``Your Component Name`` to be your Component Name + - Modify ``id`` to be your Component Name in upper snake case preceded by ``doc__`` and succeeded by ``_dfa`` + - Adjust ``status`` to be ``valid`` + - Adjust ``safety`` and ``tags`` according to your needs + +Dependent Failure Intitiators +----------------------------- + +.. code-block:: rst + + .. comp_saf_dfa:: <Element descriptor> + :id: comp_saf_DFA__<Component>__<Element descriptor> + :violation_id: <ID from Dependent Failure Initiators list :need:`gd_guidl__dfi`> + :violation_effect: <Effect caused by the initiator (leading to a violation of a safety goal)> + :verifies: <ID from Component Architecture> + :mitigated_by: < NONE|ID from Component Requirement> + :sufficient: <yes|no> + :argument: <text to argument why measure is sufficient> + :status: <valid|invalid> + +.. attention:: + The above directive must be updated according to your component DFA. + + - Remove the ``code-block`` + - Fill in all the needed information in the <brackets> diff --git a/docs/modules/persistency/kvs/docs/safety_analysis/fmea.rst b/docs/modules/persistency/kvs/docs/safety_analysis/fmea.rst new file mode 100644 index 0000000000..7a5c4eccc8 --- /dev/null +++ b/docs/modules/persistency/kvs/docs/safety_analysis/fmea.rst @@ -0,0 +1,53 @@ +.. + # ******************************************************************************* + # 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__kvs_fmea + :status: valid + :safety: ASIL_B + :realizes: wp__sw_component_safety_analysis + :tags: template + +.. attention:: + The above directive must be updated according to your Component. + + - Modify ``Your Component Name`` to be your Component Name + - Modify ``id`` to be your Component Name in upper snake case preceded by ``doc__`` and succeeded by ``_fmea`` + - Adjust ``status`` to be ``valid`` + - Adjust ``safety`` and ``tags`` according to your needs + +Failure Mode List +----------------- + +.. code-block:: rst + + .. comp_saf_fmea:: <Element descriptor> + :id: comp_saf_FMEA__<Component>__<Element descriptor> + :failure_mode: <ID from fault model :need:`gd_guidl__fault_models`> + :failure_effect: <Effect caused by the failure (leading to a violation of a safety goal)> + :verifies: <ID from Component Architecture> + :mitigated_by: < NONE|ID from Component Requirement> + :sufficient: <yes|no> + :argument: <text to argument why measure is sufficient> + :status: <valid|invalid> + +.. attention:: + The above directive must be updated according to your component FMEA. + + - Remove the ``code-block`` + - Fill in all the needed information in the <brackets> From 5df823fd2b871dd7a61e76cdd2c790aee0b90301 Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Sat, 26 Jul 2025 00:06:20 +0200 Subject: [PATCH 019/109] process: update analysis to new template structure Ref: closes #1068 --- .../persistency/kvs/safety_analysis/dfa.rst | 988 +++++------------- .../persistency/kvs/safety_analysis/fmea.rst | 266 +++-- 2 files changed, 387 insertions(+), 867 deletions(-) diff --git a/docs/features/persistency/kvs/safety_analysis/dfa.rst b/docs/features/persistency/kvs/safety_analysis/dfa.rst index 8aed7eed32..f9b17343f5 100644 --- a/docs/features/persistency/kvs/safety_analysis/dfa.rst +++ b/docs/features/persistency/kvs/safety_analysis/dfa.rst @@ -22,847 +22,397 @@ Persistency DFA :tags: feature_persistency | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: SR_01_01 - | :violation_cause: Reused software module. N/A - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :violation_cause: Reused software module + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: There are no reused software modules, so no mitigation is needed. + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: SR_01_02 - | :violation_cause: Libraries. . N/A - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :violation_cause: Library fs + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: The file system fs is a library. No mitigation for persistency is needed, because is an elementary library without the functionalites of S-CORE are not availabe. + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static + | :violation_id: SR_01_02 + | :violation_cause: Library json + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: JSON is a library. A mitigation might be needed but it will not be considered at persistency. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: SR_01_04 - | :violation_cause: Basic software. N/A - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :violation_cause: Basic software + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: There are no basic software within persistency, so no mitigation is needed. + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: SR_01_05 - | :violation_cause: Operating system including scheduler. Platformebene. Nicht von Middleware handlebar - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :violation_cause: Operating system including scheduler + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Will be considered at feature platform DFA. Mitigation can't be handled at middleware. + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: SR_01_06 - | :violation_cause: Any service stack, e.g. communication stack. N/A - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :violation_cause: Any service stack, e.g. communication stack + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: There is no service stack at persistency used, so no mitigation is needed. + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: SR_01_07 | :violation_cause: Configuration data. Return values might be falsified. - | :mitigation: < NONE|ID from Feature Requirement> Integritry check feat_req__persistency__integrity_check - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :mitigation: Integritry check feat_req__persistency__integrity_check + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Integrity check will fail, so the failure will be detected. + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: SR_01_09 - | :violation_cause: Execution time. N/A - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :violation_cause: Execution time. + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: There is timing impact at persistency, so no mitigation is needed. + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: SR_01_10 - | :violation_cause: Allocated memory. Diskussion aktuell in Feature-Community. JSON kann das, sollte aber eigentlich nicht erlaubt sein + | :violation_cause: Allocated memory. | :mitigation: < NONE|ID from Feature Requirement> | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :argument: Acutally discussed in feature community. JSON can do it, but it should not be allowed. + | :status: <valid|invalid> | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: CO_01_01 - | :violation_cause: Information passed via argument through a function call, or via writing/reading a variable being global to the two software functions (data flow) <- Checken ob das Fehlerbild überhaupt passt. 1. Satzteil nicht passen zu 2.> - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :violation_cause: Information passed via argument through a function call, or via writing/reading a variable being global to the two software functions (data flow) + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: CO_01_02 - | :violation_cause: Data or message corruption / repetition / loss / delay / masquerading or incorrect addressing of information. Fehlerhafte ausführung oder nichtverfügbarkeit vom feature - | :mitigation: < NONE|ID from Feature Requirement> feat_req__persistency__integrity_check + | :violation_cause: Data or message corruption / repetition / loss / delay / masquerading or incorrect addressing of information. + | :mitigation: < NONE|ID from Feature Requirement> feat_req__persistency__integrity_check? Maybe mitigation is needed. Persistency will be not available or be falsified executed. | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> | :argument: <text to argument why mitigation is sufficient> | :status: <valid|invalid> | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: CO_01_03 - | :violation_cause: Insertion / sequence of information wie CO_01_02 - | :mitigation: < NONE|ID from Feature Requirement> feat_req__persistency__integrity_check - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :violation_cause: Insertion / sequence of information + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Subset of feat_saf_DFA__persistency__static CO_01_02 + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: CO_01_04 - | :violation_cause: Corruption of information, inconsistent data wie CO_01_02 - | :mitigation: < NONE|ID from Feature Requirement> keine Erkennung - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :violation_cause: Corruption of information, inconsistent data + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Subset of feat_saf_DFA__persistency__static CO_01_02 + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: CO_01_05 - | :violation_cause: Asymmetric information sent from a sender to multiple receivers, so that not all defined receivers have the same informations N/A - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :violation_cause: Asymmetric information sent from a sender to multiple receivers, so that not all defined receivers have the same informations + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: CO_01_06 - | :violation_cause: Information from a sender received by only a subset of the receivers. N/A - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :violation_cause: Information from a sender received by only a subset of the receivers. + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: CO_01_07 - | :violation_cause: Blocking access to a communication channel N/A - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :violation_cause: Blocking access to a communication channel + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: SI_01_02 - | :violation_cause: Configuration data. N/A - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :violation_cause: Configuration data. + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: SI_01_03 - | :violation_cause: Constants, or variables, being global to the two software functions. N/A - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :violation_cause: Constants, or variables, being global to the two software functions. + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: SI_01_04 - | :violation_cause: Basic software passes data (read from hardware register and converted into logical information) to two applications software functions. N/A - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :violation_cause: Basic software passes data (read from hardware register and converted into logical information) to two applications software functions. + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: SI_01_05 - | :violation_cause: Data / function parameter arguments / messages delivered by software function to more than one other function. Unklar was das Fehlerbild ist - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :violation_cause: Data / function parameter arguments / messages delivered by software function to more than one other function. + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: UI_01_01 - | :violation_cause: Memory miss-allocation and leaks. Platformebene - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :violation_cause: Memory miss-allocation and leaks. + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Will be considered at feature platform DFA. + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: UI_01_02 - | :violation_cause: Read/Write access to memory allocated to another software element. Platformebene - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :violation_cause: Read/Write access to memory allocated to another software element. + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Will be considered at feature platform DFA. + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: UI_01_03 | :violation_cause: Stack/Buffer under-/overflow. Könnte passieren, ist aber unwahrscheinlich in RUST. Recursive Funktionen könnten die Ursache sein. | :mitigation: < NONE|ID from Feature Requirement> Compilerüberwachung / AoU | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> | :argument: <text to argument why mitigation is sufficient> | :status: <valid|invalid> | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: UI_01_04 - | :violation_cause: Deadlocks. Könnten auftreten. Würde von Applikation verursacht werden. KVS kann da nichts machen - | :mitigation: < NONE|ID from Feature Requirement> AoU - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> + | :violation_cause: Deadlocks. + | :mitigation: AoU + | :mitigation_issue: Issue shall be created in Issue Tracker | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> + | :argument: Deadlocks are not caused by the KVS, but by the application. The application shall be designed in a way that deadlocks are avoided. This shall be documented in the AoU. | :status: <valid|invalid> | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: UI_01_05 - | :violation_cause: Livelocks wie UI_01_04 - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :violation_cause: Livelocks + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Same consideration as done in feat_saf_DFA__persistency__static UI_01_04 + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: UI_01_06 - | :violation_cause: Blocking of execution. Feature is not available. - | :mitigation: < NONE|ID from Feature Requirement> AoU - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> + | :violation_cause: Blocking of execution. + | :mitigation: AoU + | :mitigation_issue: Issue shall be created in Issue Tracker | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> + | :argument: Execution blocking will make persistency not available. This shall be documented in the AoU. | :status: <valid|invalid> | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: UI_01_07 - | :violation_cause: Incorrect allocation of execution time. N/A - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :violation_cause: Incorrect allocation of execution time. + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: UI_01_08 - | :violation_cause: Incorrect execution flow N/A - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :violation_cause: Incorrect execution flow + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: UI_01_09 - | :violation_cause: Incorrect synchronization between software elements N/A - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :violation_cause: Incorrect synchronization between software elements + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: UI_01_10 - | :violation_cause: CPU time depletion N/A - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :violation_cause: CPU time depletion + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: UI_01_11 - | :violation_cause: Memory depletion N/A - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :violation_cause: Memory depletion + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: UI_01_12 - | :violation_cause: Other HW unavailability N/A - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :violation_cause: Other HW unavailability + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: SC_01_02 | :violation_cause: Same development approaches (e.g. IDE, programming and/or modelling language) - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Will be considered at feature platform DFA. + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: SC_01_03 | :violation_cause: Same personal - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Will be considered at feature platform DFA. + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: SC_01_04 | :violation_cause: Same social-cultural context (even if different personnel). Only applicable if diverse development is needed. - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Will be considered at feature platform DFA. + | :status: valid | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_DFA__persistency__check_key_default - | :violation_id: SC_01_05 - | :violation_cause: Development fault (e.g. human error, insufficient qualification, insufficient methods). Only applicable if diverse development is needed. - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - - - - - - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: SR_01_01 - | :violation_cause: Reused software modules - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: SR_01_02 - | :violation_cause: Libraries - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: SR_01_04 - | :violation_cause: Basic software - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: SR_01_05 - | :violation_cause: Operating system including scheduler - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: SR_01_06 - | :violation_cause: Any service stack, e.g. communication stack - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: SR_01_07 - | :violation_cause: Configuration data - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: SR_01_09 - | :violation_cause: Execution time - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: SR_01_10 - | :violation_cause: Allocated memory - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: CO_01_01 - | :violation_cause: Information passed via argument through a function call, or via writing/reading a variable being global to the two software functions (data flow) - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: CO_01_02 - | :violation_cause: Data or message corruption / repetition / loss / delay / masquerading or incorrect addressing of information - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: CO_01_03 - | :violation_cause: Insertion / sequence of information - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: CO_01_04 - | :violation_cause: Corruption of information, inconsistent data - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: CO_01_05 - | :violation_cause: Asymmetric information sent from a sender to multiple receivers, so that not all defined receivers have the same informations - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: CO_01_06 - | :violation_cause: Information from a sender received by only a subset of the receivers - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: CO_01_07 - | :violation_cause: Blocking access to a communication channel - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: SI_01_02 - | :violation_cause: Configuration data - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: SI_01_03 - | :violation_cause: Constants, or variables, being global to the two software functions - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: SI_01_04 - | :violation_cause: Basic software passes data (read from hardware register and converted into logical information) to two applications software functions - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: SI_01_05 - | :violation_cause: Data / function parameter arguments / messages delivered by software function to more than one other function - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: UI_01_01 - | :violation_cause: Memory miss-allocation and leaks - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: UI_01_02 - | :violation_cause: Read/Write access to memory allocated to another software element - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: UI_01_03 - | :violation_cause: Stack/Buffer under-/overflow - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: UI_01_04 - | :violation_cause: Deadlocks - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: UI_01_05 - | :violation_cause: Livelocks - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: UI_01_06 - | :violation_cause: Blocking of execution - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: UI_01_07 - | :violation_cause: Incorrect allocation of execution time - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: UI_01_08 - | :violation_cause: Incorrect execution flow - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: UI_01_09 - | :violation_cause: Incorrect synchronization between software elements - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: UI_01_10 - | :violation_cause: CPU time depletion - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: UI_01_11 - | :violation_cause: Memory depletion - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: UI_01_12 - | :violation_cause: Other HW unavailability - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: SC_01_02 - | :violation_cause: Same development approaches (e.g. IDE, programming and/or modelling language) - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: SC_01_03 - | :violation_cause: Same personal - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> - | :violation_id: SC_01_04 - | :violation_cause: Same social-cultural context (even if different personnel). Only applicable if diverse development is needed. - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: <Element descriptor> - | :verifies: <Feature architecture> - | :id: feat_saf_DFA__<Feature>__<Element descriptor> + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__static | :violation_id: SC_01_05 | :violation_cause: Development fault (e.g. human error, insufficient qualification, insufficient methods). Only applicable if diverse development is needed. - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Will be considered at feature platform DFA. + | :status: valid diff --git a/docs/features/persistency/kvs/safety_analysis/fmea.rst b/docs/features/persistency/kvs/safety_analysis/fmea.rst index 7097c89ac2..557ca3ebd7 100644 --- a/docs/features/persistency/kvs/safety_analysis/fmea.rst +++ b/docs/features/persistency/kvs/safety_analysis/fmea.rst @@ -21,185 +21,170 @@ Persistency Safety Analysis :safety: ASIL_B :tags: feature_persistency - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_FMEA__persistency__open_KVS + | .. feat_saf_fmea:: Check if Key contains Default Value + | :verifies: feat_arc_dyn__persistency__check_key_default + | :id: feat_saf_FMEA__persistency_kvs | :failure_mode: MF_01_01 - | :failure_effect: Message is not received. User is not able to use the feature. Middleware cant be used.A + | :failure_effect: Message is not received. | :mitigation: < NONE|ID from Feature Requirement> AoU: Detetion and error handling shall be done outside of the middleware. | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> + | :argument: User is not able to use the feature. Middleware cant be used. | :status: <valid|invalid> - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_FMEA__persistency__open_KVS + | .. feat_saf_fmea:: Persistency + | :verifies: + | :id: | :failure_mode: MF_01_02 | :failure_effect: message received too late. User might not able to use the feature. Middleware cant be used. | :mitigation: < NONE|ID from Feature Requirement> AoU: Detetion and error handling shall be done outside of the middleware. | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> | :argument: <text to argument why mitigation is sufficient> | :status: <valid|invalid> - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_FMEA__persistency__open_KVS + | .. feat_saf_fmea:: Persistency + | :verifies: + | :id: | :failure_mode: MF_01_03 | :failure_effect: message received too early. No impact / feature reacts only if triggered on the trigger. | :mitigation: < NONE|ID from Feature Requirement> | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> | :argument: <text to argument why mitigation is sufficient> | :status: <valid|invalid> - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_FMEA__persistency__open_KVS + | .. feat_saf_fmea:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + | :id: feat_saf_FMEA__persistency_kvs | :failure_mode: MF_01_04 - | :failure_effect: message not received correctly by all recipients (different messages or messages partly lost). N/A - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_FMEA__persistency__open_KVS + | :failure_effect: message not received correctly by all recipients (different messages or messages partly lost). + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Failure mode not applicable at persistency, so no mitigation is needed. + | :status: valid + + | .. feat_saf_fmea:: Persistency + | :verifies: + | :id: | :failure_mode: MF_01_05 | :failure_effect: message is corrupted. Covered by MF_01_01 | :mitigation: < NONE|ID from Feature Requirement> | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :status: <valid|invalid> - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_FMEA__persistency__open_KVS + | .. feat_saf_fmea:: Persistency + | :verifies: + | :id: | :failure_mode: MF_01_06 | :failure_effect: message is not sent. Covered by MF_01_01 | :mitigation: < NONE|ID from Feature Requirement> | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> | :argument: <text to argument why mitigation is sufficient> | :status: <valid|invalid> - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_FMEA__persistency__open_KVS + | .. feat_saf_fmea:: Persistency + | :verifies: + | :id: | :failure_mode: MF_01_07 | :failure_effect: message is unintended sent. Covered by MF_01_01 | :mitigation: < NONE|ID from Feature Requirement> | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> | :argument: <text to argument why mitigation is sufficient> | :status: <valid|invalid> - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_FMEA__persistency__open_KVS + | .. feat_saf_fmea:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + | :id: feat_saf_FMEA__persistency_kvs | :failure_mode: CO_01_01 - | :failure_effect: minimum constraint boundary is violated. N/A - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_FMEA__persistency__open_KVS + | :failure_effect: minimum constraint boundary is violated. + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Failure mode not applicable at persistency, so no mitigation is needed. + | :status: valid + + | .. feat_saf_fmea:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + | :id: feat_saf_FMEA__persistency_kvs | :failure_mode: CO_01_02 - | :failure_effect: maximum constraint boundary is violated. N/A - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_FMEA__persistency__open_KVS + | :failure_effect: maximum constraint boundary is violated. + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Failure mode not applicable at persistency, so no mitigation is needed. + | :status: valid + + | .. feat_saf_fmea:: Persistency + | :verifies: + | :id: | :failure_mode: EX_01_01 - | :failure_effect: Process calculates wrong result(s). Feature is not usable. + | :failure_effect: Process calculates wrong result(s). Feature is not usable. | :mitigation: < NONE|ID from Feature Requirement> | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :status: <valid|invalid> - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_FMEA__persistency__open_KVS + | .. feat_saf_fmea:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + | :id: feat_saf_FMEA__persistency_kvs | :failure_mode: EX_01_02 - | :failure_effect: processing too slow. N/A - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_FMEA__persistency__open_KVS + | :failure_effect: processing too slow. + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Failure mode not applicable at persistency, so no mitigation is needed. + | :status: valid + + | .. feat_saf_fmea:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + | :id: feat_saf_FMEA__persistency_kvs | :failure_mode: EX_01_03 - | :failure_effect: processing too fast. N/A - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_FMEA__persistency__open_KVS + | :failure_effect: processing too fast. + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Failure mode not applicable at persistency, so no mitigation is needed. + | :status: valid + + | .. feat_saf_fmea:: Persistency + | :verifies: + | :id: | :failure_mode: EX_01_04 | :failure_effect: loss of execution. User is not able to use the feature. Middleware cant be used. | :mitigation: < NONE|ID from Feature Requirement> | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :status: <valid|invalid> - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_FMEA__persistency__open_KVS + | .. feat_saf_fmea:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + | :id: feat_saf_FMEA__persistency_kvs | :failure_mode: EX_01_05 - | :failure_effect: processing changes to arbitrary process. N/A - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_FMEA__persistency__open_KVS + | :failure_effect: processing changes to arbitrary process. + | :mitigation: NONE + | :mitigation_issue: no issue needed + | :sufficient: yes + | :argument: Failure mode not applicable at persistency, so no mitigation is needed. + | :status: valid + + | .. feat_saf_fmea:: Persistency + | :verifies: + | :id: | :failure_mode: EX_01_06 | :failure_effect: processing is not complete (infinite loop). User is not able to use the feature. Middleware cant be used. | :mitigation: < NONE|ID from Feature Requirement> | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :status: <valid|invalid> @@ -212,182 +197,167 @@ Persistency Safety Analysis - | .. feat_saf_fmea:: Persistency + | .. feat_saf_fmea:: Persistency | :verifies: <Feature architecture> | :id: feat_saf_FMEA__persistency__<Element descriptor> | :failure_mode: MF_01_01 | :failure_effect: message is not received | :mitigation: < NONE|ID from Feature Requirement> | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> | :argument: <text to argument why mitigation is sufficient> | :status: <valid|invalid> - | .. feat_saf_fmea:: Persistency + | .. feat_saf_fmea:: Persistency | :verifies: <Feature architecture> | :id: feat_saf_FMEA__persistency__<Element descriptor> | :failure_mode: MF_01_02 | :failure_effect: message received too late | :mitigation: < NONE|ID from Feature Requirement> | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> | :argument: <text to argument why mitigation is sufficient> | :status: <valid|invalid> - | .. feat_saf_fmea:: Persistency + | .. feat_saf_fmea:: Persistency | :verifies: <Feature architecture> | :id: feat_saf_FMEA__persistency__<Element descriptor> | :failure_mode: MF_01_03 | :failure_effect: message received too early | :mitigation: < NONE|ID from Feature Requirement> | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> | :argument: <text to argument why mitigation is sufficient> | :status: <valid|invalid> - | .. feat_saf_fmea:: Persistency + | .. feat_saf_fmea:: Persistency | :verifies: <Feature architecture> | :id: feat_saf_FMEA__persistency__<Element descriptor> | :failure_mode: MF_01_04 | :failure_effect: message not received correctly by all recipients (different messages or messages partly lost) | :mitigation: < NONE|ID from Feature Requirement> | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> | :argument: <text to argument why mitigation is sufficient> | :status: <valid|invalid> - | .. feat_saf_fmea:: Persistency + | .. feat_saf_fmea:: Persistency | :verifies: <Feature architecture> | :id: feat_saf_FMEA__persistency__<Element descriptor> | :failure_mode: MF_01_05 | :failure_effect: message is corrupted | :mitigation: < NONE|ID from Feature Requirement> | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :status: <valid|invalid> - | .. feat_saf_fmea:: Persistency + | .. feat_saf_fmea:: Persistency | :verifies: <Feature architecture> | :id: feat_saf_FMEA__persistency__<Element descriptor> | :failure_mode: MF_01_06 | :failure_effect: message is not sent | :mitigation: < NONE|ID from Feature Requirement> | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> | :argument: <text to argument why mitigation is sufficient> | :status: <valid|invalid> - | .. feat_saf_fmea:: Persistency + | .. feat_saf_fmea:: Persistency | :verifies: <Feature architecture> | :id: feat_saf_FMEA__persistency__<Element descriptor> | :failure_mode: MF_01_07 | :failure_effect: message is unintended sent | :mitigation: < NONE|ID from Feature Requirement> | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> | :argument: <text to argument why mitigation is sufficient> | :status: <valid|invalid> - | .. feat_saf_fmea:: Persistency + | .. feat_saf_fmea:: Persistency | :verifies: <Feature architecture> | :id: feat_saf_FMEA__persistency__<Element descriptor> | :failure_mode: CO_01_01 | :failure_effect: minimum constraint boundary is violated | :mitigation: < NONE|ID from Feature Requirement> | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :status: <valid|invalid> - | .. feat_saf_fmea:: Persistency + | .. feat_saf_fmea:: Persistency | :verifies: <Feature architecture> | :id: feat_saf_FMEA__persistency__<Element descriptor> | :failure_mode: CO_01_02 | :failure_effect: maximum constraint boundary is violated | :mitigation: < NONE|ID from Feature Requirement> | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :status: <valid|invalid> - | .. feat_saf_fmea:: Persistency + | .. feat_saf_fmea:: Persistency | :verifies: <Feature architecture> | :id: feat_saf_FMEA__persistency__<Element descriptor> | :failure_mode: EX_01_01 | :failure_effect: Process calculates wrong result(s) | :mitigation: < NONE|ID from Feature Requirement> | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :status: <valid|invalid> - | .. feat_saf_fmea:: Persistency + | .. feat_saf_fmea:: Persistency | :verifies: <Feature architecture> | :id: feat_saf_FMEA__persistency__<Element descriptor> | :failure_mode: EX_01_02 | :failure_effect: processing too slow | :mitigation: < NONE|ID from Feature Requirement> | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :status: <valid|invalid> - | .. feat_saf_fmea:: Persistency + | .. feat_saf_fmea:: Persistency | :verifies: <Feature architecture> | :id: feat_saf_FMEA__persistency__<Element descriptor> | :failure_mode: EX_01_03 | :failure_effect: processing too fast | :mitigation: < NONE|ID from Feature Requirement> | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :status: <valid|invalid> - | .. feat_saf_fmea:: Persistency + | .. feat_saf_fmea:: Persistency | :verifies: <Feature architecture> | :id: feat_saf_FMEA__persistency__<Element descriptor> | :failure_mode: EX_01_04 | :failure_effect: loss of execution | :mitigation: < NONE|ID from Feature Requirement> | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :status: <valid|invalid> - | .. feat_saf_fmea:: Persistency + | .. feat_saf_fmea:: Persistency | :verifies: <Feature architecture> | :id: feat_saf_FMEA__persistency__<Element descriptor> | :failure_mode: EX_01_05 | :failure_effect: processing changes to arbitrary process | :mitigation: < NONE|ID from Feature Requirement> | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :status: <valid|invalid> - | .. feat_saf_fmea:: Persistency + | .. feat_saf_fmea:: Persistency | :verifies: <Feature architecture> | :id: feat_saf_FMEA__persistency__<Element descriptor> | :failure_mode: EX_01_06 | :failure_effect: processing is not complete (infinite loop) | :mitigation: < NONE|ID from Feature Requirement> | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :mitigation_coverage: <0..100%> | :sufficient: <yes|no> | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :status: <valid|invalid> From 8457a8cfa2d40572d3f9ea0cf24f90032b6990b2 Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Sat, 26 Jul 2025 00:06:20 +0200 Subject: [PATCH 020/109] process: update fmea and dfa Ref: closes #965 --- .../persistency/kvs/safety_analysis/dfa.rst | 156 ++++---- .../persistency/kvs/safety_analysis/fmea.rst | 348 +++++------------- 2 files changed, 164 insertions(+), 340 deletions(-) diff --git a/docs/features/persistency/kvs/safety_analysis/dfa.rst b/docs/features/persistency/kvs/safety_analysis/dfa.rst index f9b17343f5..0e6ca4f7ae 100644 --- a/docs/features/persistency/kvs/safety_analysis/dfa.rst +++ b/docs/features/persistency/kvs/safety_analysis/dfa.rst @@ -23,95 +23,95 @@ Persistency DFA | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__SR_01_01 | :violation_id: SR_01_01 | :violation_cause: Reused software module | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: There are no reused software modules, so no mitigation is needed. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__SR_01_02 | :violation_id: SR_01_02 | :violation_cause: Library fs | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: The file system fs is a library. No mitigation for persistency is needed, because is an elementary library without the functionalites of S-CORE are not availabe. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__SR_01_02 | :violation_id: SR_01_02 | :violation_cause: Library json | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: JSON is a library. A mitigation might be needed but it will not be considered at persistency. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__SR_01_04 | :violation_id: SR_01_04 | :violation_cause: Basic software | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: There are no basic software within persistency, so no mitigation is needed. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__SR_01_05 | :violation_id: SR_01_05 | :violation_cause: Operating system including scheduler | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: Will be considered at feature platform DFA. Mitigation can't be handled at middleware. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__SR_01_06 | :violation_id: SR_01_06 | :violation_cause: Any service stack, e.g. communication stack | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: There is no service stack at persistency used, so no mitigation is needed. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__SR_01_07 | :violation_id: SR_01_07 | :violation_cause: Configuration data. Return values might be falsified. | :mitigation: Integritry check feat_req__persistency__integrity_check - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: Integrity check will fail, so the failure will be detected. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__SR_01_09 | :violation_id: SR_01_09 | :violation_cause: Execution time. | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: There is timing impact at persistency, so no mitigation is needed. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__SR_01_10 | :violation_id: SR_01_10 | :violation_cause: Allocated memory. | :mitigation: < NONE|ID from Feature Requirement> @@ -122,18 +122,18 @@ Persistency DFA | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__CO_01_01 | :violation_id: CO_01_01 | :violation_cause: Information passed via argument through a function call, or via writing/reading a variable being global to the two software functions (data flow) | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__CO_01_02 | :violation_id: CO_01_02 | :violation_cause: Data or message corruption / repetition / loss / delay / masquerading or incorrect addressing of information. | :mitigation: < NONE|ID from Feature Requirement> feat_req__persistency__integrity_check? Maybe mitigation is needed. Persistency will be not available or be falsified executed. @@ -144,130 +144,130 @@ Persistency DFA | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__CO_01_03 | :violation_id: CO_01_03 | :violation_cause: Insertion / sequence of information | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: Subset of feat_saf_DFA__persistency__static CO_01_02 | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__CO_01_04 | :violation_id: CO_01_04 | :violation_cause: Corruption of information, inconsistent data | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: Subset of feat_saf_DFA__persistency__static CO_01_02 | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__CO_01_05 | :violation_id: CO_01_05 | :violation_cause: Asymmetric information sent from a sender to multiple receivers, so that not all defined receivers have the same informations | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__CO_01_06 | :violation_id: CO_01_06 | :violation_cause: Information from a sender received by only a subset of the receivers. | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__CO_01_07 | :violation_id: CO_01_07 | :violation_cause: Blocking access to a communication channel | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__SI_01_02 | :violation_id: SI_01_02 | :violation_cause: Configuration data. | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__SI_01_03 | :violation_id: SI_01_03 | :violation_cause: Constants, or variables, being global to the two software functions. | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__SI_01_04 | :violation_id: SI_01_04 | :violation_cause: Basic software passes data (read from hardware register and converted into logical information) to two applications software functions. | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__SI_01_05 | :violation_id: SI_01_05 | :violation_cause: Data / function parameter arguments / messages delivered by software function to more than one other function. | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__UI_01_01 | :violation_id: UI_01_01 | :violation_cause: Memory miss-allocation and leaks. | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: Will be considered at feature platform DFA. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__UI_01_02 | :violation_id: UI_01_02 | :violation_cause: Read/Write access to memory allocated to another software element. | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: Will be considered at feature platform DFA. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__UI_01_03 | :violation_id: UI_01_03 - | :violation_cause: Stack/Buffer under-/overflow. Könnte passieren, ist aber unwahrscheinlich in RUST. Recursive Funktionen könnten die Ursache sein. + | :violation_cause: Stack/Buffer under-/overflow. Might happens but very unlikely in RUST. Recursive functions could be the violation cause. | :mitigation: < NONE|ID from Feature Requirement> Compilerüberwachung / AoU | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> | :sufficient: <yes|no> @@ -276,143 +276,143 @@ Persistency DFA | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__UI_01_04 | :violation_id: UI_01_04 | :violation_cause: Deadlocks. - | :mitigation: AoU - | :mitigation_issue: Issue shall be created in Issue Tracker - | :sufficient: <yes|no> - | :argument: Deadlocks are not caused by the KVS, but by the application. The application shall be designed in a way that deadlocks are avoided. This shall be documented in the AoU. - | :status: <valid|invalid> + | :mitigation: aou_req__persistency__appl_design + | :mitigation_issue: None + | :sufficient: yes + | :argument: Deadlocks are not caused by the KVS, but by the application. + | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__UI_01_05 | :violation_id: UI_01_05 | :violation_cause: Livelocks | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: Same consideration as done in feat_saf_DFA__persistency__static UI_01_04 | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__UI_01_06 | :violation_id: UI_01_06 | :violation_cause: Blocking of execution. - | :mitigation: AoU - | :mitigation_issue: Issue shall be created in Issue Tracker - | :sufficient: <yes|no> - | :argument: Execution blocking will make persistency not available. This shall be documented in the AoU. - | :status: <valid|invalid> + | :mitigation: aou_req__persistency__appl_exec + | :mitigation_issue: None + | :sufficient: yes + | :argument: Execution blocking will make persistency not available. + | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__UI_01_07 | :violation_id: UI_01_07 | :violation_cause: Incorrect allocation of execution time. | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__UI_01_08 | :violation_id: UI_01_08 | :violation_cause: Incorrect execution flow | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__UI_01_09 | :violation_id: UI_01_09 | :violation_cause: Incorrect synchronization between software elements | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__UI_01_10 | :violation_id: UI_01_10 | :violation_cause: CPU time depletion | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__UI_01_11 | :violation_id: UI_01_11 | :violation_cause: Memory depletion | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__UI_01_12 | :violation_id: UI_01_12 | :violation_cause: Other HW unavailability | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__SC_01_02 | :violation_id: SC_01_02 | :violation_cause: Same development approaches (e.g. IDE, programming and/or modelling language) | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: Will be considered at feature platform DFA. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__SC_01_03 | :violation_id: SC_01_03 | :violation_cause: Same personal | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: Will be considered at feature platform DFA. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__SC_01_04 | :violation_id: SC_01_04 | :violation_cause: Same social-cultural context (even if different personnel). Only applicable if diverse development is needed. | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: Will be considered at feature platform DFA. | :status: valid | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__static + | :id: feat_saf_DFA__persistency__SC_01_05 | :violation_id: SC_01_05 | :violation_cause: Development fault (e.g. human error, insufficient qualification, insufficient methods). Only applicable if diverse development is needed. | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: NONE | :sufficient: yes | :argument: Will be considered at feature platform DFA. | :status: valid diff --git a/docs/features/persistency/kvs/safety_analysis/fmea.rst b/docs/features/persistency/kvs/safety_analysis/fmea.rst index 557ca3ebd7..e25c94a1cb 100644 --- a/docs/features/persistency/kvs/safety_analysis/fmea.rst +++ b/docs/features/persistency/kvs/safety_analysis/fmea.rst @@ -21,343 +21,167 @@ Persistency Safety Analysis :safety: ASIL_B :tags: feature_persistency - | .. feat_saf_fmea:: Check if Key contains Default Value - | :verifies: feat_arc_dyn__persistency__check_key_default - | :id: feat_saf_FMEA__persistency_kvs + | .. feat_saf_fmea:: Persistency + | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + | :id: feat_saf_FMEA__persistency_MF_01_01 | :failure_mode: MF_01_01 | :failure_effect: Message is not received. - | :mitigation: < NONE|ID from Feature Requirement> AoU: Detetion and error handling shall be done outside of the middleware. - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> + | :mitigation: aou_req__persistency__error_handling + | :mitigation_issue: None + | :sufficient: yes | :argument: User is not able to use the feature. Middleware cant be used. - | :status: <valid|invalid> + | :status: valid | .. feat_saf_fmea:: Persistency - | :verifies: - | :id: + | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + | :id: feat_saf_FMEA__persistency_MF_01_02 | :failure_mode: MF_01_02 - | :failure_effect: message received too late. User might not able to use the feature. Middleware cant be used. - | :mitigation: < NONE|ID from Feature Requirement> AoU: Detetion and error handling shall be done outside of the middleware. - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :failure_effect: message received too late. + | :mitigation: aou_req__persistency__error_handling + | :mitigation_issue: None + | :sufficient: yes + | :argument: User is not able to use the feature. Middleware cant be used. + | :status: valid | .. feat_saf_fmea:: Persistency - | :verifies: - | :id: - | :failure_mode: MF_01_03 - | :failure_effect: message received too early. No impact / feature reacts only if triggered on the trigger. - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + | :id: feat_saf_FMEA__persistency_MF_01_03 + | :failure_mode: MF_01_03 + | :failure_effect: message received too early. + | :mitigation: NONE + | :mitigation_issue: None + | :sufficient: yes + | :argument: No impact / feature reacts only if triggered on the trigger. + | :status: valid | .. feat_saf_fmea:: Persistency | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - | :id: feat_saf_FMEA__persistency_kvs + | :id: feat_saf_FMEA__persistency_MF_01_04 | :failure_mode: MF_01_04 | :failure_effect: message not received correctly by all recipients (different messages or messages partly lost). | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: None | :sufficient: yes | :argument: Failure mode not applicable at persistency, so no mitigation is needed. | :status: valid | .. feat_saf_fmea:: Persistency - | :verifies: - | :id: + | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + | :id: feat_saf_FMEA__persistency_MF_01_05 | :failure_mode: MF_01_05 - | :failure_effect: message is corrupted. Covered by MF_01_01 - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :failure_effect: message is corrupted. + | :mitigation: NONE + | :mitigation_issue: None + | :sufficient: yes + | :argument: Covered by MF_01_01 + | :status: valid | .. feat_saf_fmea:: Persistency - | :verifies: - | :id: + | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + | :id: feat_saf_FMEA__persistency_MF_01_06 | :failure_mode: MF_01_06 - | :failure_effect: message is not sent. Covered by MF_01_01 - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :failure_effect: message is not sent. + | :mitigation: NONE + | :mitigation_issue: None + | :sufficient: yes + | :argument: Covered by MF_01_01 + | :status: valid | .. feat_saf_fmea:: Persistency - | :verifies: - | :id: + | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + | :id: feat_saf_FMEA__persistency_MF_01_07 | :failure_mode: MF_01_07 - | :failure_effect: message is unintended sent. Covered by MF_01_01 - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :failure_effect: message is unintended sent. + | :mitigation: NONE + | :mitigation_issue: None + | :sufficient: yes + | :argument: Covered by MF_01_01 + | :status: valid | .. feat_saf_fmea:: Persistency | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - | :id: feat_saf_FMEA__persistency_kvs + | :id: feat_saf_FMEA__persistency_CO_01_01 | :failure_mode: CO_01_01 | :failure_effect: minimum constraint boundary is violated. | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: None | :sufficient: yes | :argument: Failure mode not applicable at persistency, so no mitigation is needed. | :status: valid | .. feat_saf_fmea:: Persistency | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - | :id: feat_saf_FMEA__persistency_kvs + | :id: feat_saf_FMEA__persistency_CO_01_02 | :failure_mode: CO_01_02 | :failure_effect: maximum constraint boundary is violated. | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: None | :sufficient: yes | :argument: Failure mode not applicable at persistency, so no mitigation is needed. | :status: valid | .. feat_saf_fmea:: Persistency - | :verifies: - | :id: + | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + | :id: feat_saf_FMEA__persistency_EX_01_01 | :failure_mode: EX_01_01 - | :failure_effect: Process calculates wrong result(s). Feature is not usable. - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :failure_effect: Process calculates wrong result(s). + | :mitigation: aou_req__persistency__error_handling + | :mitigation_issue: None + | :sufficient: yes + | :argument: User is not able to use the feature. Middleware cant be used. + | :status: valid | .. feat_saf_fmea:: Persistency | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - | :id: feat_saf_FMEA__persistency_kvs + | :id: feat_saf_FMEA__persistency_EX_01_02 | :failure_mode: EX_01_02 | :failure_effect: processing too slow. - | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation: aou_req__persistency__error_handling + | :mitigation_issue: None | :sufficient: yes - | :argument: Failure mode not applicable at persistency, so no mitigation is needed. + | :argument: User is not able to use the feature. Middleware cant be used. | :status: valid | .. feat_saf_fmea:: Persistency | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - | :id: feat_saf_FMEA__persistency_kvs + | :id: feat_saf_FMEA__persistency_EX_01_03 | :failure_mode: EX_01_03 | :failure_effect: processing too fast. | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: None | :sufficient: yes | :argument: Failure mode not applicable at persistency, so no mitigation is needed. | :status: valid | .. feat_saf_fmea:: Persistency - | :verifies: - | :id: + | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + | :id: feat_saf_FMEA__persistency_EX_01_04 | :failure_mode: EX_01_04 - | :failure_effect: loss of execution. User is not able to use the feature. Middleware cant be used. - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :failure_effect: loss of execution. + | :mitigation: aou_req__persistency__error_handling + | :mitigation_issue: None + | :sufficient: yes + | :argument: User is not able to use the feature. Middleware cant be used. + | :status: valid | .. feat_saf_fmea:: Persistency | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - | :id: feat_saf_FMEA__persistency_kvs + | :id: feat_saf_FMEA__persistency_EX_01_05 | :failure_mode: EX_01_05 | :failure_effect: processing changes to arbitrary process. | :mitigation: NONE - | :mitigation_issue: no issue needed + | :mitigation_issue: None | :sufficient: yes | :argument: Failure mode not applicable at persistency, so no mitigation is needed. | :status: valid | .. feat_saf_fmea:: Persistency - | :verifies: - | :id: - | :failure_mode: EX_01_06 - | :failure_effect: processing is not complete (infinite loop). User is not able to use the feature. Middleware cant be used. - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - - - - - - - - - - - - | .. feat_saf_fmea:: Persistency - | :verifies: <Feature architecture> - | :id: feat_saf_FMEA__persistency__<Element descriptor> - | :failure_mode: MF_01_01 - | :failure_effect: message is not received - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_fmea:: Persistency - | :verifies: <Feature architecture> - | :id: feat_saf_FMEA__persistency__<Element descriptor> - | :failure_mode: MF_01_02 - | :failure_effect: message received too late - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_fmea:: Persistency - | :verifies: <Feature architecture> - | :id: feat_saf_FMEA__persistency__<Element descriptor> - | :failure_mode: MF_01_03 - | :failure_effect: message received too early - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_fmea:: Persistency - | :verifies: <Feature architecture> - | :id: feat_saf_FMEA__persistency__<Element descriptor> - | :failure_mode: MF_01_04 - | :failure_effect: message not received correctly by all recipients (different messages or messages partly lost) - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_fmea:: Persistency - | :verifies: <Feature architecture> - | :id: feat_saf_FMEA__persistency__<Element descriptor> - | :failure_mode: MF_01_05 - | :failure_effect: message is corrupted - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_fmea:: Persistency - | :verifies: <Feature architecture> - | :id: feat_saf_FMEA__persistency__<Element descriptor> - | :failure_mode: MF_01_06 - | :failure_effect: message is not sent - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_fmea:: Persistency - | :verifies: <Feature architecture> - | :id: feat_saf_FMEA__persistency__<Element descriptor> - | :failure_mode: MF_01_07 - | :failure_effect: message is unintended sent - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_fmea:: Persistency - | :verifies: <Feature architecture> - | :id: feat_saf_FMEA__persistency__<Element descriptor> - | :failure_mode: CO_01_01 - | :failure_effect: minimum constraint boundary is violated - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_fmea:: Persistency - | :verifies: <Feature architecture> - | :id: feat_saf_FMEA__persistency__<Element descriptor> - | :failure_mode: CO_01_02 - | :failure_effect: maximum constraint boundary is violated - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_fmea:: Persistency - | :verifies: <Feature architecture> - | :id: feat_saf_FMEA__persistency__<Element descriptor> - | :failure_mode: EX_01_01 - | :failure_effect: Process calculates wrong result(s) - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_fmea:: Persistency - | :verifies: <Feature architecture> - | :id: feat_saf_FMEA__persistency__<Element descriptor> - | :failure_mode: EX_01_02 - | :failure_effect: processing too slow - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_fmea:: Persistency - | :verifies: <Feature architecture> - | :id: feat_saf_FMEA__persistency__<Element descriptor> - | :failure_mode: EX_01_03 - | :failure_effect: processing too fast - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_fmea:: Persistency - | :verifies: <Feature architecture> - | :id: feat_saf_FMEA__persistency__<Element descriptor> - | :failure_mode: EX_01_04 - | :failure_effect: loss of execution - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_fmea:: Persistency - | :verifies: <Feature architecture> - | :id: feat_saf_FMEA__persistency__<Element descriptor> - | :failure_mode: EX_01_05 - | :failure_effect: processing changes to arbitrary process - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_fmea:: Persistency - | :verifies: <Feature architecture> - | :id: feat_saf_FMEA__persistency__<Element descriptor> + | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + | :id: feat_saf_FMEA__persistency_EX_01_06 | :failure_mode: EX_01_06 - | :failure_effect: processing is not complete (infinite loop) - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> + | :failure_effect: processing is not complete (infinite loop). + | :mitigation: aou_req__persistency__error_handling + | :mitigation_issue: None + | :sufficient: yes + | :argument: User is not able to use the feature. Middleware cant be used. + | :status: valid From 601aaa27964327731e8f47996ebd2b233bf9980f Mon Sep 17 00:00:00 2001 From: Sven Bachmann <sven.bachmann.ext@qorix.ai> Date: Sat, 26 Jul 2025 00:06:20 +0200 Subject: [PATCH 021/109] persistency_kvs: fix feature architecture header naming Signed-off-by: Sven Bachmann <sven.bachmann.ext@qorix.ai> --- docs/features/persistency/kvs/architecture/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/features/persistency/kvs/architecture/index.rst b/docs/features/persistency/kvs/architecture/index.rst index 60862ea825..0c9f3acaa7 100644 --- a/docs/features/persistency/kvs/architecture/index.rst +++ b/docs/features/persistency/kvs/architecture/index.rst @@ -12,8 +12,8 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -Feature Architecture : persistency/kvs -====================================== +Architecture +============ Overview -------- From 144853af87d8d5900489eb427176b8f5923c6348 Mon Sep 17 00:00:00 2001 From: Sven Bachmann <sven.bachmann.ext@qorix.ai> Date: Sat, 26 Jul 2025 00:06:20 +0200 Subject: [PATCH 022/109] persistency: added abstract to persistency main feature description Signed-off-by: Sven Bachmann <sven.bachmann.ext@qorix.ai> --- docs/features/persistency/index.rst | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/features/persistency/index.rst b/docs/features/persistency/index.rst index 019f7e14b3..5e8cf741cb 100644 --- a/docs/features/persistency/index.rst +++ b/docs/features/persistency/index.rst @@ -21,3 +21,17 @@ Persistency :titlesonly: */index + + +Abstract +======== + +Persistency is a critical feature that ensures the long-term storage and +retrieval of data within the system. 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 +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. From 65772b3333f7ba84d7cf9aba5a023a7125836595 Mon Sep 17 00:00:00 2001 From: Sven Bachmann <sven.bachmann.ext@qorix.ai> Date: Sat, 26 Jul 2025 00:06:20 +0200 Subject: [PATCH 023/109] persistency_kvs: added application-definition to KVS abstract Signed-off-by: Sven Bachmann <sven.bachmann.ext@qorix.ai> --- docs/features/persistency/kvs/index.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/features/persistency/kvs/index.rst b/docs/features/persistency/kvs/index.rst index f595a26e23..3ea2a1a982 100644 --- a/docs/features/persistency/kvs/index.rst +++ b/docs/features/persistency/kvs/index.rst @@ -46,6 +46,14 @@ 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 ========== From 57066525d2cbe77805784bbe8b7c74d277eef6f6 Mon Sep 17 00:00:00 2001 From: Sven Bachmann <sven.bachmann.ext@qorix.ai> Date: Sat, 26 Jul 2025 00:06:20 +0200 Subject: [PATCH 024/109] persistency: replaced "System" with "S-CORE" Signed-off-by: Sven Bachmann <sven.bachmann.ext@qorix.ai> --- docs/features/persistency/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/persistency/index.rst b/docs/features/persistency/index.rst index 5e8cf741cb..32e439f92b 100644 --- a/docs/features/persistency/index.rst +++ b/docs/features/persistency/index.rst @@ -27,7 +27,7 @@ Abstract ======== Persistency is a critical feature that ensures the long-term storage and -retrieval of data within the system. It provides a reliable mechanism for +retrieval of data within the 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 From 271d86b63ad10f30a9a901a6a4a193d676afb3aa Mon Sep 17 00:00:00 2001 From: Sven Bachmann <sven.bachmann.ext@qorix.ai> Date: Sat, 26 Jul 2025 00:06:20 +0200 Subject: [PATCH 025/109] persistency_kvs: split multi-component-reqs into separate reqs Signed-off-by: Sven Bachmann <sven.bachmann.ext@qorix.ai> --- .../kvs/docs/requirements/index.rst | 278 +++++++++++++++--- 1 file changed, 245 insertions(+), 33 deletions(-) diff --git a/docs/modules/persistency/kvs/docs/requirements/index.rst b/docs/modules/persistency/kvs/docs/requirements/index.rst index 3c7caf8e7a..dc76a515bc 100644 --- a/docs/modules/persistency/kvs/docs/requirements/index.rst +++ b/docs/modules/persistency/kvs/docs/requirements/index.rst @@ -15,8 +15,8 @@ Component Requirements ###################### -.. comp_req:: Key Handling - :id: comp_req__persistency__key_handling +.. comp_req:: Key Naming + :id: comp_req__persistency__key_naming :reqtype: Functional :security: NO :safety: ASIL_B @@ -24,36 +24,132 @@ Component Requirements :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 Handling - :id: comp_req__persistency__value_handling +.. 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,feat_req__persistency__default_values + :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 accept only values of the following data types: Number, String, Null, Array[Value], or Dictionary{Key:Value}. 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. - The component shall support unset values and shall provide a default value when a value is unset. - The component shall allow resetting a value to its default if a default is defined. -.. comp_req:: Default Value Handling - :id: comp_req__persistency__default_value_handling +.. 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: QM + :satisfies: feat_req__persistency__default_values,feat_req__persistency__default_value_get,feat_req__persistency__default_value_reset,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: QM :satisfies: feat_req__persistency__default_values,feat_req__persistency__default_value_get,feat_req__persistency__default_value_reset,feat_req__persistency__default_value_file :status: valid - The component shall accept default values of only permitted value data types. The component shall provide an API to retrieve default values. - The component shall allow configuration of default values in code or in a separate configuration file. - 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:: Default Value Config + :id: comp_req__persistency__default_value_config + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: feat_req__persistency__default_values,feat_req__persistency__default_value_get,feat_req__persistency__default_value_reset,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: QM + :satisfies: feat_req__persistency__default_values,feat_req__persistency__default_value_get,feat_req__persistency__default_value_reset,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 @@ -63,7 +159,8 @@ Component Requirements :satisfies: feat_req__persistency__config_file :status: valid - The component shall allow configuration of KVS constraints at compile-time using source code constants or at runtime using a configuration file. + The component shall allow configuration of KVS constraints at compile-time + using source code constants or at runtime using a configuration file. .. comp_req:: Language Agnostic :id: comp_req__persistency__language_agnostic @@ -73,7 +170,9 @@ Component Requirements :satisfies: feat_req__persistency__cpp_rust_interop :status: valid - The component shall provide an API that supports bindings to other languages or shall use a storage and memory exchange format that is adaptable to other languages. + The component shall provide an API that supports bindings to other languages + or shall use a storage and memory exchange format that is adaptable to other + languages. .. comp_req:: Concurrency :id: comp_req__persistency__concurrency @@ -83,7 +182,8 @@ Component Requirements :satisfies: feat_req__persistency__intra_process_comm :status: valid - The component shall implement thread-safe mechanisms to enable concurrent access to data without data races. + 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 @@ -93,10 +193,12 @@ Component Requirements :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. + 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 - :id: comp_req__persistency__persist_data_storage +.. comp_req:: Persistent Data Storage Components + :id: comp_req__persistency__persist_data_storage_comp :reqtype: Functional :security: NO :safety: QM @@ -104,11 +206,41 @@ Component Requirements :status: valid The component shall use the file API and the JSON data format to persist data. - The component shall generate a checksum for each data file and shall store it alongside the data. + +.. comp_req:: Persistent Data Storage Checksum + :id: comp_req__persistency__persist_data_storage_checksum + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: feat_req__persistency__persistency,feat_req__persistency__integrity_check,feat_req__persistency__persist_data + :status: valid + + The component shall generate a checksum for each data file and shall store + it alongside the data. The component shall verify the checksum when loading data. -.. comp_req:: Persistent Data Schema Handling - :id: comp_req__persistency__persistent_data_schema +.. comp_req:: Persistent Data Storage Backend + :id: comp_req__persistency__persist_data_storage_backend + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: feat_req__persistency__persistency,feat_req__persistency__integrity_check,feat_req__persistency__persist_data + :status: valid + + The component shall use the file API to persist data. + +.. comp_req:: Persistent Data Storage Format + :id: comp_req__persistency__persist_data_storage_format + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: feat_req__persistency__persistency,feat_req__persistency__integrity_check,feat_req__persistency__persist_data + :status: valid + + The component shall use the JSON data format to persist data. + +.. comp_req:: Persistent Data Versioning + :id: comp_req__persistency__persistent_data_versioning :reqtype: Functional :security: NO :safety: ASIL_B @@ -116,10 +248,21 @@ Component Requirements :status: valid The component shall not provide built-in versioning. - 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:: Snapshots - :id: comp_req__persistency__snapshots +.. comp_req:: Persistent Data Schema + :id: comp_req__persistency__persistent_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 @@ -127,21 +270,78 @@ Component Requirements :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__snapshots + :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__snapshots + :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__snapshots + :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__snapshots + :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__snapshots + :status: valid + The component shall allow deletion of individual snapshots. -.. comp_req:: Develop Mode - :id: comp_req__persistency__dev_mode +.. comp_req:: Engineering Mode + :id: comp_req__persistency__eng_mode + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__persistency__eng_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__dev_mode + :satisfies: feat_req__persistency__field_mode :status: valid - The component shall provide a developer mode that can be enabled during build time to display debugging and internal information. + 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 @@ -153,16 +353,28 @@ Component Requirements The component shall provide an asynchronous API in addition to the standard API. -.. comp_req:: Permission Handling - :id: comp_req__persistency__permission_handling +.. comp_req:: Permission Control + :id: comp_req__persistency__permission_control + :reqtype: Functional + :security: NO + :safety: QM + :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_handling :reqtype: Functional :security: NO :safety: QM :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. - The component shall report any access or permission errors encountered at the filesystem level to the application. + 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 From 22a22bc5c9c2e6726f637aabbedf0434d9b050a6 Mon Sep 17 00:00:00 2001 From: Sven Bachmann <sven.bachmann.ext@qorix.ai> Date: Sat, 26 Jul 2025 00:06:21 +0200 Subject: [PATCH 026/109] persistency_kvs: fix Bazel hints in component reqs Signed-off-by: Sven Bachmann <sven.bachmann.ext@qorix.ai> --- .../persistency/kvs/docs/requirements/index.rst | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/modules/persistency/kvs/docs/requirements/index.rst b/docs/modules/persistency/kvs/docs/requirements/index.rst index dc76a515bc..dfd8527220 100644 --- a/docs/modules/persistency/kvs/docs/requirements/index.rst +++ b/docs/modules/persistency/kvs/docs/requirements/index.rst @@ -198,7 +198,7 @@ Component Requirements single software architecture element. .. comp_req:: Persistent Data Storage Components - :id: comp_req__persistency__persist_data_storage_comp + :id: comp_req__persistency__persist_data_store_com :reqtype: Functional :security: NO :safety: QM @@ -208,7 +208,7 @@ Component Requirements The component shall use the file API and the JSON data format to persist data. .. comp_req:: Persistent Data Storage Checksum - :id: comp_req__persistency__persist_data_storage_checksum + :id: comp_req__persistency__pers_data_store_csum :reqtype: Functional :security: NO :safety: QM @@ -220,7 +220,7 @@ Component Requirements The component shall verify the checksum when loading data. .. comp_req:: Persistent Data Storage Backend - :id: comp_req__persistency__persist_data_storage_backend + :id: comp_req__persistency__pers_data_store_bend :reqtype: Functional :security: NO :safety: QM @@ -230,7 +230,7 @@ Component Requirements The component shall use the file API to persist data. .. comp_req:: Persistent Data Storage Format - :id: comp_req__persistency__persist_data_storage_format + :id: comp_req__persistency__pers_data_store_fmt :reqtype: Functional :security: NO :safety: QM @@ -240,7 +240,7 @@ Component Requirements The component shall use the JSON data format to persist data. .. comp_req:: Persistent Data Versioning - :id: comp_req__persistency__persistent_data_versioning + :id: comp_req__persistency__pers_data_version :reqtype: Functional :security: NO :safety: ASIL_B @@ -250,7 +250,7 @@ Component Requirements The component shall not provide built-in versioning. .. comp_req:: Persistent Data Schema - :id: comp_req__persistency__persistent_data_schema + :id: comp_req__persistency__pers_data_schema :reqtype: Functional :security: NO :safety: ASIL_B @@ -366,7 +366,7 @@ Component Requirements controls. .. comp_req:: Permission Error Handling - :id: comp_req__persistency__permission_err_handling + :id: comp_req__persistency__permission_err_handle :reqtype: Functional :security: NO :safety: QM From 9766296532bc8611c0496ac748fe65714d3e2a0d Mon Sep 17 00:00:00 2001 From: Sven Bachmann <sven.bachmann.ext@qorix.ai> Date: Sat, 26 Jul 2025 00:06:21 +0200 Subject: [PATCH 027/109] persistency_kvs: add missing links Links added for safety analysis and component classification. Signed-off-by: Sven Bachmann <sven.bachmann.ext@qorix.ai> --- docs/features/persistency/kvs/index.rst | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/docs/features/persistency/kvs/index.rst b/docs/features/persistency/kvs/index.rst index 3ea2a1a982..f45f613b36 100644 --- a/docs/features/persistency/kvs/index.rst +++ b/docs/features/persistency/kvs/index.rst @@ -117,15 +117,13 @@ 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. - .. note:: - TODO: Link to safety analysis. +:need:`doc__persistency_safety_analysis` 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. - .. note:: - TODO: Link to 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. @@ -137,7 +135,3 @@ License Impact .. note:: The key-value storage itself uses the Apache-2.0 license. Licenses of used libraries are need to be checked. - - -How to Teach This -================= From a86c601dc1d6a62a526035304ab6101ffa2c038f Mon Sep 17 00:00:00 2001 From: Sven Bachmann <sven.bachmann.ext@qorix.ai> Date: Sat, 26 Jul 2025 00:06:21 +0200 Subject: [PATCH 028/109] persistency_kvs: fill component index Signed-off-by: Sven Bachmann <sven.bachmann.ext@qorix.ai> --- .../kvs/docs/component_classification.rst | 195 ------------------ docs/modules/persistency/kvs/docs/index.rst | 118 +++++------ 2 files changed, 51 insertions(+), 262 deletions(-) delete mode 100644 docs/modules/persistency/kvs/docs/component_classification.rst diff --git a/docs/modules/persistency/kvs/docs/component_classification.rst b/docs/modules/persistency/kvs/docs/component_classification.rst deleted file mode 100644 index 7a6214f3a3..0000000000 --- a/docs/modules/persistency/kvs/docs/component_classification.rst +++ /dev/null @@ -1,195 +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 -======================== - -.. note:: Document header - -.. document:: [Your Component Name] Component Classification - :id: doc__component_name_comp_class - :status: draft - :safety: ASIL_D - :realizes: wp__sw_component_class - :tags: template - -.. attention:: - The above directive must be updated according to your Component. - - - Modify ``Your Component Name`` to be your Component Name - - Modify ``id`` to be your Component Name in upper snake case preceded by ``doc__`` - - Adjust ``status`` to be ``valid`` - - Adjust ``safety`` and ``tags`` according to your needs - -| Classification of <component> -| -| <Link to OSS component source (e.g. in github) including the selected version> -| -| Additional documentation considered: -| <list of documentation links> - - -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? - - <HE|PE|NE> - - <Rationale for result> - - * - 2 - - Are requirements available? - - <HE|PE|NE> - - <Rationale for result> - - * - 3 - - Are specifications for functionalities and properties available (architecture)? - - <HE|PE|NE> - - <Rationale for result> - - * - 4 - - Are design specifications available? - - <HE|PE|NE> - - <Rationale for result> - - * - 5 - - Are configuration specification and data available, if applicable? - - <HE|PE|NE> - - <Rationale for result> - - * - 6 - - Are verification measures including tests and reports available? - - <HE|PE|NE> - - <Rationale for result> - - -| (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. - -<component name> is determined as P=<1|2|3> - - -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>** - -<select the correct table below (table for C++ is TBD)> - -.. 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|HM|NM> - - <Number> - - * - 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|HM|NM> - - <Number> - - * - 3 - - | Test exists / Coverage (Function, Line) - | (maybe better: testability, but how to measure?) - - Existing Tests Coverage - - <NH|HM|NM> - - <Number> - - * - 4 - - High amount of public function interfaces - - Number of public function interfaces - - <NH|HM|NM> - - <RNumber> - - * - 5 - - High amount of function parameters - - Number of parameters - - <NH|HM|NM> - - <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. -| - -<component name> is determined as C=<1|2|3> - - -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 | -+-------+-------+-------+-------+ - -<component name> is classified as CLAS_OUT=<Q|QR|NQ> - - -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 change request containing this is in status "Accepted", the module safety plan for the component development is adapted based on the following: (select according to above result) -| - Q: Follow the processes for qualification of software components in a safety context. -| - QR: Follow the process for pre-existing software architectural elements -| - NQ: Do no use this element in safety context diff --git a/docs/modules/persistency/kvs/docs/index.rst b/docs/modules/persistency/kvs/docs/index.rst index 5cc5ee50fd..f844eba735 100644 --- a/docs/modules/persistency/kvs/docs/index.rst +++ b/docs/modules/persistency/kvs/docs/index.rst @@ -37,30 +37,47 @@ KVS (Key Value Store) Abstract ======== -[A short (~200 word) description of the contribution being addressed.] +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 ========== -[Clearly explain why the existing platform/project solution is inadequate to address the topic that the CR solves.] +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. - .. 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. +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 ========= -[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. +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 @@ -74,83 +91,51 @@ Specification Thereby the :need:`PROCESS_rl__module_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.] +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 =============== -[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] +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 ============= -[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. +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. -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? +:need:`doc__persistency_safety_analysis` - .. note:: - Use Dependency Failure Analysis and/or Safety Software Critically Analysis. - [Methods will be defined later in Process area Safety Analysis] +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. -For new feature/component contributions: +:need:`doc__persistency_component_classification` -[What is the expected ASIL level?] -[What is the expected classification of the contribution?] +To ensure the freedom of interference the feature key-value storage should not +be used within different processes. - .. note:: - Use the component classification method here to classify your component, if it shall to be used in a safety context: :need:`PROCESS_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. - + The key-value storage itself uses the Apache-2.0 license. Licenses of + used libraries are need to be checked. Open Issues @@ -177,4 +162,3 @@ Footnotes architecture/index.rst safety_analysis/fmea.rst safety_analysis/dfa.rst - component_classification.rst From c8b8825cf67e6aa3d890cafee05191491fdf9144 Mon Sep 17 00:00:00 2001 From: Sven Bachmann <sven.bachmann.ext@qorix.ai> Date: Sat, 26 Jul 2025 00:06:21 +0200 Subject: [PATCH 029/109] persistency_kvs: apply review findings Added file header ids and linked QM reqs. Signed-off-by: Sven Bachmann <sven.bachmann.ext@qorix.ai> --- .../persistency/kvs/architecture/index.rst | 21 ++++++++++++++++--- .../kvs/docs/architecture/index.rst | 17 ++++----------- .../kvs/docs/requirements/index.rst | 10 +++++++-- 3 files changed, 30 insertions(+), 18 deletions(-) diff --git a/docs/features/persistency/kvs/architecture/index.rst b/docs/features/persistency/kvs/architecture/index.rst index 0c9f3acaa7..7520234734 100644 --- a/docs/features/persistency/kvs/architecture/index.rst +++ b/docs/features/persistency/kvs/architecture/index.rst @@ -12,14 +12,22 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* +.. _feature_architecture_PersistencyKvs: + Architecture ============ +.. document:: Persistency KVS Feature Architecture + :id: doc__persistency_kvs_feat_arch + :status: valid + :safety: ASIL_B + :realizes: wp__feature_arch + Overview -------- -- kvs provides the capability to efficiently store, retrieve, and - manage key-value pairs in a persistent storage system. +The Key-Value-Storage (kvs) provides the capability to efficiently store, +retrieve, and manage key-value pairs in a persistent storage system. Description ----------- @@ -37,6 +45,13 @@ Rationale Behind Architecture Decomposition - The architecture is decomposed to include a FileStorage component (fs) to read and write to the file system. +Glossary +-------- + +- User: Program code that is written by a person that initiates the given + functionality call or receives a callback. + + Static Architecture ------------------- @@ -45,7 +60,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 + :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 :status: valid .. uml:: _assets/kvs_static_view.puml diff --git a/docs/modules/persistency/kvs/docs/architecture/index.rst b/docs/modules/persistency/kvs/docs/architecture/index.rst index a7c0ba8243..ac299c58af 100644 --- a/docs/modules/persistency/kvs/docs/architecture/index.rst +++ b/docs/modules/persistency/kvs/docs/architecture/index.rst @@ -14,23 +14,14 @@ .. _component_architecture_PersistencyKvs: -Component Architecture -====================== +Architecture +============ -.. document:: Persistency KVS Architecture - :id: doc__persistency_kvs_architecture +.. document:: Persistency KVS Module Architecture + :id: doc__persistency_kvs_mod_arch :status: draft :safety: ASIL_B :realizes: wp__component_arch - :tags: template - -.. attention:: - The above directive must be updated according to your needs. - - - Modify ``Your Component Name`` to be your Component Name - - Modify ``id`` to be your Component Name in upper snake case preceded by ``doc__`` and followed by ``_architecture`` - - Adjust ``status`` to be ``valid`` - - Adjust ``safety`` and ``tags`` according to your needs Overview -------- diff --git a/docs/modules/persistency/kvs/docs/requirements/index.rst b/docs/modules/persistency/kvs/docs/requirements/index.rst index dfd8527220..f637aec7ba 100644 --- a/docs/modules/persistency/kvs/docs/requirements/index.rst +++ b/docs/modules/persistency/kvs/docs/requirements/index.rst @@ -12,8 +12,14 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -Component Requirements -###################### +Requirements +############ + +.. document:: Persistency KVS Module Requirements + :id: doc__persistency_kvs_mod_req + :status: valid + :safety: ASIL_B + :realizes: wp__component_req .. comp_req:: Key Naming :id: comp_req__persistency__key_naming From e725481765e0968874d0c5118fdb5760b2bb02c5 Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Sat, 26 Jul 2025 00:06:21 +0200 Subject: [PATCH 030/109] process: update safety documents Ref: closes #952 --- docs/features/persistency/kvs/index.rst | 2 + .../requirements/chklst_req_inspection.rst | 123 +++++++ .../persistency/kvs/safety_planning/index.rst | 48 ++- docs/modules/persistency/docs/index.rst | 2 + .../persistency/docs/manual/safety_manual.rst | 31 +- .../persistency/docs/release/release_note.rst | 22 +- .../persistency/docs/safety_mgt/index.rst | 4 + .../safety_mgt/module_safety_package_fdr.rst | 62 ++++ .../docs/safety_mgt/module_safety_plan.rst | 346 ++++++++++++++++++ .../safety_mgt/module_safety_plan_fdr.rst | 92 +++++ .../module_verification_report.rst | 20 +- .../json/docs/component_classification.rst | 24 +- docs/modules/persistency/json/docs/index.rst | 160 +------- .../kvs/docs/architecture/index.rst | 16 +- docs/modules/persistency/kvs/docs/index.rst | 12 +- .../kvs/docs/requirements/index.rst | 3 + .../kvs/docs/safety_analysis/dfa.rst | 31 +- .../kvs/docs/safety_analysis/fmea.rst | 31 +- 18 files changed, 727 insertions(+), 302 deletions(-) create mode 100644 docs/features/persistency/kvs/requirements/chklst_req_inspection.rst create mode 100644 docs/modules/persistency/docs/safety_mgt/module_safety_package_fdr.rst create mode 100644 docs/modules/persistency/docs/safety_mgt/module_safety_plan.rst create mode 100644 docs/modules/persistency/docs/safety_mgt/module_safety_plan_fdr.rst diff --git a/docs/features/persistency/kvs/index.rst b/docs/features/persistency/kvs/index.rst index f45f613b36..7db04583aa 100644 --- a/docs/features/persistency/kvs/index.rst +++ b/docs/features/persistency/kvs/index.rst @@ -24,11 +24,13 @@ Key-Value-Storage .. 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 ============ diff --git a/docs/features/persistency/kvs/requirements/chklst_req_inspection.rst b/docs/features/persistency/kvs/requirements/chklst_req_inspection.rst new file mode 100644 index 0000000000..74fb719f7c --- /dev/null +++ b/docs/features/persistency/kvs/requirements/chklst_req_inspection.rst @@ -0,0 +1,123 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +.. _requirement inspection checklist: + +Requirement Inspection Checklist Persistency KVS +================================================ + +.. document:: Requirements Inspection Checklist Persistency KVS + :id: doc__req_inspection_persistency + :status: valid + :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 + :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 sentence template used? + - see :need:`PROCESS_gd_temp__req__formulation`, this includes the use of "shall". + - Yes + - No remarks + - https://github.com/eclipse-score/score/issues/960 + * - REQ_02_01 + - Is the requirement description *comprehensible* ? + - If you think the requirement is hard to understand, comment here. + - Yes + - No remarks + - https://github.com/eclipse-score/score/issues/960 + * - 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. + - Yes + - No remarks + - https://github.com/eclipse-score/score/issues/960 + * - 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. + - Yes + - No remarks + - https://github.com/eclipse-score/score/issues/960 + * - REQ_02_04 + - Is the requirement description *feasible* ? + - Expectation is that at the time of the inspection the requirement has already some implementation. This can be checked via traces, but also :need:`PROCESS_gd_req__req__attr_impl` shows this. In case the requirement is not mature enough 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. + - Yes + - No remarks + - https://github.com/eclipse-score/score/issues/960 + * - 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. + - Yes + - No remarks + - https://github.com/eclipse-score/score/issues/960 + * - REQ_03_01 + - For stakeholder requirements: Is the *rationale* correct? + - Rationales explain why the top level requirements were invented. Do those cover the requirement? + - N/A + - No stakeholder requirements for Persistency KVS needed. + - https://github.com/eclipse-score/score/issues/960 + * - REQ_03_02 + - For other 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. + - Yes + - No remarks + - https://github.com/eclipse-score/score/issues/960 + * - 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. + - Yes + - No remarks + - https://github.com/eclipse-score/score/issues/960 + * - REQ_05_01 + - Do the software requirements consider *timing constraints of the parent requirement*? + - This bullet point 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 implementation will be time consuming, one should think of the expectation of a "user". + - Yes + - No remarks + - https://github.com/eclipse-score/score/issues/960 + * - 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 data consumed and set on these interfaces. Are output values completely defined? + - Yes + - No remarks + - https://github.com/eclipse-score/score/issues/960 + * - REQ_07_01 + - Is the *ASIL Attribute* set correctly? + - Derived requirements are checked automatically, see :need:`PROCESS_gd_req__req__linkage_safety`. But for the top level requirements this needs to be checked for correctness. Also AoU from external components need check for correct ASIL as those are the "origin" of safety requirements towards the SW platform. + - Yes + - No remarks + - https://github.com/eclipse-score/score/issues/960 + * - 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). Checklist item is supported by automated check: "Every requirement which satisfies a requirement with security attribute set to YES inherits this". Expectation is that the feature/component requirements/architecture may also be subject to a Software Security Criticality Analysis (process is TBD). + - Yes + - No remarks + - https://github.com/eclipse-score/score/issues/960 + * - REQ_08_01 + - Is the requirement *verifiable*? + - Expectation is that at the time of the inspection already tests are created for the requirement. This can be checked via traces, but also :need:`PROCESS_gd_req__req__attr_test_covered` shows this. In case the requirement is not mature enough at the time of inspection (i.e. missing test cases), a test expert should be invited to the Pull-Request review to explicitly check this item. + - Yes + - No remarks + - https://github.com/eclipse-score/score/issues/960 diff --git a/docs/features/persistency/kvs/safety_planning/index.rst b/docs/features/persistency/kvs/safety_planning/index.rst index cd9e60b781..fba7464743 100644 --- a/docs/features/persistency/kvs/safety_planning/index.rst +++ b/docs/features/persistency/kvs/safety_planning/index.rst @@ -17,7 +17,7 @@ Feature Safety Planning ======================= -.. list-table:: Feature <feature> Workproducts +.. list-table:: Feature persistency Workproducts :header-rows: 1 * - Workproduct Id @@ -38,63 +38,58 @@ Feature Safety Planning - :need:`PROCESS_gd_temp__req__feat_req` - :ndf:`copy('status', need_id='PROCESS_gd_temp__req__feat_req')` - https://github.com/eclipse-score/score/issues/960 - - :doc:`../requirements/index` - - see below + - :ref:`feature_requirements_PersistencyKvs` + - valid * - :need:`PROCESS_wp__requirements__feat_aou` - :need:`PROCESS_gd_temp__req__aou_req` - :ndf:`copy('status', need_id='PROCESS_gd_temp__req__aou_req')` - https://github.com/eclipse-score/score/issues/960 - - :doc:`../requirements/index` - - see below + - :ref:`feature_requirements_PersistencyKvs` + - valid * - :need:`PROCESS_wp__feature_arch` - :need:`PROCESS_gd_temp__arch__feature` - :ndf:`copy('status', need_id='PROCESS_gd_temp__arch__feature')` - https://github.com/eclipse-score/score/issues/1020 - - :doc:`../architecture/index` - - see below + - :ref:`feature_architecture_PersistencyKvs` + - valid * - :need:`PROCESS_wp__feature_safety_analysis` - - <link to process> - - <automated> + - :need:`PROCESS_gd_guidl__safety_analysis` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__safety_analysis')` - https://github.com/eclipse-score/score/issues/965 - :need:`doc__persistency_safety_analysis` - - <automated> + - valid * - :need:`PROCESS_wp__feature_dfa` - - <Link to process> - - <Process status> + - :need:`PROCESS_gd_guidl__safety_analysis` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__safety_analysis')` - https://github.com/eclipse-score/score/issues/965 - :need:`doc__persistency_dfa` - - <automated> + - valid * - :need:`PROCESS_wp__requirements__inspect` - :need:`PROCESS_gd_chklst__req__inspection` - :ndf:`copy('status', need_id='PROCESS_gd_chklst__req__inspection')` - - n/a - - Checklist used in Pull Request Review - - n/a + - https://github.com/eclipse-score/score/issues/960 + - :need:`doc__req_inspection_persistency` + - valid * - :need:`PROCESS_wp__sw_arch_verification` - :need:`PROCESS_gd_chklst__arch__inspection_checklist` - :ndf:`copy('status', need_id='PROCESS_gd_chklst__arch__inspection_checklist')` - - n/a + - https://github.com/eclipse-score/score/issues/1020 - Checklist used in Pull Request Review - n/a * - :need:`PROCESS_wp__verification__feat_int_test` - :need:`PROCESS_gd_guidl__verification_guide` - :ndf:`copy('status', need_id='PROCESS_gd_guidl__verification_guide')` - - <link to issue> - https://github.com/eclipse-score/score/issues/964 + - Checklist used in Pull Request Review - <automated> -.. attention:: - The above table must be updated according to your feature safety planning. - - - Create and link the issues to plan the work products (according to :need:`PROCESS_gd_guidl__saf_plan_definitions`) - - Fill the work producs links and add their status (also possible below) to create the safety package (according to :need:`PROCESS_gd_guidl__saf_package`) Feature Requirements Status --------------------------- @@ -102,7 +97,7 @@ Feature Requirements Status .. needtable:: :style: table :types: feat_req - :tags: feature_name + :tags: persistency :columns: id;status :colwidths: 25,25 :sort: title @@ -113,7 +108,7 @@ Feature AoU Status .. needtable:: :style: table :types: aou_req - :tags: feature_name + :tags: persistency :columns: id;status :colwidths: 25,25 :sort: title @@ -124,7 +119,8 @@ Feature Architecture Status .. needtable:: :style: table :types: feat_arc_sta; feat_arc_dyn - :tags: feature_name + :tags: persistency :columns: id;status :colwidths: 25,25 :sort: title + diff --git a/docs/modules/persistency/docs/index.rst b/docs/modules/persistency/docs/index.rst index 3fc9455078..62a2a1fd06 100644 --- a/docs/modules/persistency/docs/index.rst +++ b/docs/modules/persistency/docs/index.rst @@ -12,6 +12,8 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* +.. _module_documentation: + Module Documents Persistency ############################ diff --git a/docs/modules/persistency/docs/manual/safety_manual.rst b/docs/modules/persistency/docs/manual/safety_manual.rst index 70108acee3..f3627e2b80 100644 --- a/docs/modules/persistency/docs/manual/safety_manual.rst +++ b/docs/modules/persistency/docs/manual/safety_manual.rst @@ -20,17 +20,29 @@ Safety Manual Template :status: draft :safety: ASIL_B :tags: feature_persistency - -This document implements <add "need" link> Introduction/Scope ------------------ -| This manual will cover the Feature Persistency. It's based on the components +| This manual will cover the Feature Persistency. It's based on the components KVS and Tiny JSON. Assumed Platform Safety Requirements ------------------------------------ -| For the <S-CORE platform / module name> the following safety related stakeholder requirements are assumed to define the top level functionality (purpose) of the <S-CORE platform / module name>. I.e. from these all the feature and component requirements implemented are derived. -| <List here all the stakeholder requirements, with safety not equal to QM, the module's components requirements are derived from.> +| 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 ------------------ @@ -38,9 +50,8 @@ 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 here all the OS calls the S-CORE platform expects to be safe.> -List of AoUs expected from the environment the platform / module runs on: +List of AoUs expected from the environment the module runs on: .. needtable:: :style: table @@ -51,13 +62,14 @@ List of AoUs expected from the environment the platform / module runs on: results = [] for need in needs.filter_types(["aou_req"]): - if need and "environment" in need["tags"]: + 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: <link to add>. Assumptions from components to their users can be fulfilled in two ways: +| 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. @@ -73,6 +85,7 @@ List of AoUs on the user of the platform features or the module of this safety m 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 diff --git a/docs/modules/persistency/docs/release/release_note.rst b/docs/modules/persistency/docs/release/release_note.rst index 80682eb639..9ea8894c0c 100644 --- a/docs/modules/persistency/docs/release/release_note.rst +++ b/docs/modules/persistency/docs/release/release_note.rst @@ -15,26 +15,14 @@ Release Note ============ -.. note:: Document header - -.. document:: [Your Module Name] Release Note - :id: doc__module_name_release_note +.. document:: Persistency Release Note + :id: doc__persistency_release_note :status: draft - :safety: ASIL_D + :safety: ASIL_B :realizes: wp__module_sw_release_note - :tags: template - -.. attention:: - The above directive must be updated according to your Module. - - - Modify ``Your Module Name`` to be your Module Name - - Modify ``id`` to be your Module Name in upper snake case preceded by ``doc_`` and succeeded by ``release_note`` - - Adjust ``status`` to be ``valid`` - - Adjust ``safety`` and ``tags`` according to your needs - - + :tags: persistency -| Module Name: [Module Name] +| Module Name: Persistency | Release Tag: vX.Y.Z | Release Commit Hash: a1b2c3d4e5f6g7h8i9j0 | Release Date: YYYY-MM-DD diff --git a/docs/modules/persistency/docs/safety_mgt/index.rst b/docs/modules/persistency/docs/safety_mgt/index.rst index fa3a7ff35c..04718ba355 100644 --- a/docs/modules/persistency/docs/safety_mgt/index.rst +++ b/docs/modules/persistency/docs/safety_mgt/index.rst @@ -17,3 +17,7 @@ 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 new file mode 100644 index 0000000000..b91d7c4ce1 --- /dev/null +++ b/docs/modules/persistency/docs/safety_mgt/module_safety_package_fdr.rst @@ -0,0 +1,62 @@ +.. + # ******************************************************************************* + # 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 + :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 new file mode 100644 index 0000000000..d347ebdbc4 --- /dev/null +++ b/docs/modules/persistency/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:: Persistency Safety Plan + :id: doc__persistency_safety_plan + :status: valid + :safety: ASIL_B + :realizes: wp__module_safety_plan + :tags: persistency + +Functional Safety Management Context +==================================== + +This Safety Plan adds to the :need:`PROCESS_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 +================================== + ++---------------------------+--------------------------------------------------------+ +| Safety Manager | Volker Häussler | ++---------------------------+--------------------------------------------------------+ +| Project Manager | Lars Bauhofer | ++---------------------------+--------------------------------------------------------+ + +Tailoring +========= + +Additional to the tailoring in the SW platform project as defined in the :need:`PROCESS_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 issue + - Link to WP + - WP status + + * - :need:`PROCESS_wp__module_safety_plan` + - :need:`PROCESS_gd_guidl__saf_plan_definitions` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__saf_plan_definitions')` + - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C963 + - this document + - valid + + * - :need:`PROCESS_wp__module_safety_package` + - :need:`PROCESS_gd_guidl__saf_package` + - :ndf:`copy('status', need_id='PROCESS_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:`PROCESS_wp__fdr_reports` (module Safety Plan) + - :need:`PROCESS_gd_chklst__safety_plan` + - :ndf:`copy('status', need_id='PROCESS_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:`PROCESS_wp__fdr_reports` (module Safety Package) + - :need:`PROCESS_gd_chklst__safety_package` + - :ndf:`copy('status', need_id='PROCESS_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:`PROCESS_wp__fdr_reports` (module's Safety Analyses & DFA) + - :need:`PROCESS_gd_guidl__safety_analysis` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__safety_analysis')` + - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C965 + - :need:`doc__kvs_fmea` + - :ndf:`copy('status', need_id='doc__kvs_fmea')` + + * - :need:`PROCESS_wp__audit_report` + - performed by external experts + - n/a + - <Link to issue> + - <Link to WP> + - <WP status (manual)> + + * - :need:`PROCESS_wp__module_sw_build_config` + - `doc__software_development_plan` + - `copy('status', need_id='doc__software_development_plan')` + - <Link to issue> + - <Link to WP> + - <automated> + + * - :need:`PROCESS_wp__module_safety_manual` + - :need:`PROCESS_gd_temp__safety_manual` + - :ndf:`copy('status', need_id='PROCESS_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:`PROCESS_wp__verification__module_ver_report` + - :need:`PROCESS_gd_temp__mod_ver_report` + - :ndf:`copy('status', need_id='PROCESS_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:`PROCESS_wp__module_sw_release_note` + - :need:`PROCESS_gd_temp__rel__mod_rel_note` + - :ndf:`copy('status', need_id='PROCESS_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 +---------------------------------- + +.. list-table:: Component <name> Workproducts + :header-rows: 1 + + * - Workproduct Id + - Link to process + - Process status + - Link to issue + - Link to WP + - WP/doc status + + * - :need:`PROCESS_wp__requirements__comp` + - :need:`PROCESS_gd_temp__req__comp_req` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__req__comp_req')` + - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C960 + - :need:`doc__persistency_kvs_mod_req` + - :ndf:`copy('status', need_id='doc__persistency_kvs_mod_req')` & WP below + + * - :need:`PROCESS_wp__requirements__comp_aou` + - :need:`PROCESS_gd_temp__req__aou_req` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__req__aou_req')` + - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C960 + - :need:`doc__persistency_kvs_mod_req` + - :ndf:`copy('status', need_id='doc__persistency_kvs_mod_req')` & WP below + + * - :need:`PROCESS_wp__hsi` + - <Link to process> + - <automated> + - <Link to issue> + - <Link to WP> + - <automated> + + * - :need:`PROCESS_wp__requirements__inspect` + - :need:`PROCESS_gd_chklst__req__inspection` + - :ndf:`copy('status', need_id='PROCESS_gd_chklst__req__inspection')` + - n/a + - Checklist used in Pull Request Review + - n/a + + * - :need:`PROCESS_wp__component_arch` + - :need:`PROCESS_gd_temp__arch__comp` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__arch__comp')` + - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C1020 + - :need:`doc__persistency_kvs_mod_arch` + - :ndf:`copy('status', need_id='doc__persistency_kvs_mod_arch')` & WP below + + * - :need:`PROCESS_wp__sw_arch_verification` + - :need:`PROCESS_gd_chklst__arch__inspection_checklist` + - :ndf:`copy('status', need_id='PROCESS_gd_chklst__arch__inspection_checklist')` + - n/a + - Checklist used in Pull Request Review + - n/a + + * - :need:`PROCESS_wp__sw_component_safety_analysis` + - :need:`PROCESS_wp__sw_component_safety_analysis` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__safety_analysis')` + - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C965 + - :need:`doc__kvs_fmea` + - :ndf:`copy('status', need_id='doc__kvs_fmea')` & WP below + + * - :need:`PROCESS_wp__sw_component_dfa` + - :need:`PROCESS_wp__sw_component_dfa` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__safety_analysis')` + - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C965 + - :need:`doc__kvs_dfa` + - :ndf:`copy('status', need_id='doc__kvs_dfa')` & WP below + + * - :need:`PROCESS_wp__sw_implementation` + - :need:`PROCESS_gd_guidl__implementation` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__implementation')` + - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C961 + - <Link to WP> + - <automated> + + * - :need:`PROCESS_wp__verification__sw_unit_test` + - :need:`PROCESS_gd_guidl__verification_guide` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__verification_guide')` + - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C964 + - <Link to WP> + - <automated> + + * - :need:`PROCESS_wp__sw_implementation_inspection` + - :need:`PROCESS_gd_chklst__impl_inspection_checklist` + - :ndf:`copy('status', need_id='PROCESS_gd_chklst__impl_inspection_checklist')` + - n/a + - Checklist used in Pull Request Review + - n/a + + * - :need:`PROCESS_wp__verification__comp_int_test` + - :need:`PROCESS_gd_guidl__verification_guide` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__verification_guide')` + - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C964 + - <Link to WP> + - <automated> + + * - :need:`PROCESS_wp__sw_component_class` + - :need:`PROCESS_gd_guidl__component_classification` + - :ndf:`copy('status', need_id='PROCESS_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:`PROCESS_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 + - 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 + - Link to issue + - Reasoning for tailoring + + * - :need:`PROCESS_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:`PROCESS_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:`PROCESS_wp__hsi` + - n/a + - OSS needing special HW is an extreme exception. + + * - :need:`PROCESS_wp__requirements__inspect` + - n/a + - Checklist used in Pull Request Review + + * - :need:`PROCESS_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:`PROCESS_wp__sw_component_safety_analysis` + - 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:`PROCESS_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:`PROCESS_wp__sw_implementation` + - n/a + - If source code is modified, this is not a OSS qualification any more. + + * - :need:`PROCESS_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:`PROCESS_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:`PROCESS_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:`PROCESS_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) +======================================== + +Component Requirements Status +----------------------------- + +.. needtable:: + :style: table + :types: comp_req + :tags: persistencykvs + :columns: id;status;tags + :colwidths: 25,25,25 + :sort: title + +Component AoU Status +-------------------- + +.. needtable:: + :style: table + :types: aou_req + :tags: persistencykvs + :columns: id;status;tags + :colwidths: 25,25,25 + :sort: title + +Component Architecture Status +----------------------------- + +.. needtable:: + :style: table + :types: comp_arc_sta; comp_arc_dyn + :tags: persistencykvs + :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 new file mode 100644 index 0000000000..198e9489ef --- /dev/null +++ b/docs/modules/persistency/docs/safety_mgt/module_safety_plan_fdr.rst @@ -0,0 +1,92 @@ +.. + # ******************************************************************************* + # 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 + :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 index 8af04d22e6..d7f7a21637 100644 --- a/docs/modules/persistency/docs/verification/module_verification_report.rst +++ b/docs/modules/persistency/docs/verification/module_verification_report.rst @@ -15,25 +15,15 @@ Verification Report =================== -.. note:: Document header - -.. document:: [Your Module Name] Verification Report - :id: doc__module_name_verification_report +.. document:: Persistency Verification Report + :id: doc__persistency_verification_report :status: draft - :safety: ASIL_D + :safety: ASIL_B :realizes: wp__verification__module_ver_report - :tags: template - -.. attention:: - The above directive must be updated according to your Module. - - - Modify ``Your Module Name`` to be your Module Name - - Modify ``id`` to be your Module Name in upper snake case preceded by ``doc_`` and succeeded by ``verification_report`` - - Adjust ``status`` to be ``valid`` - - Adjust ``safety`` and ``tags`` according to your needs + :tags: persistency -This verification report is based on the verfication plan. +This verification report is based on the verification plan. It covers all the components of the above stated module. Verification Report contains: diff --git a/docs/modules/persistency/json/docs/component_classification.rst b/docs/modules/persistency/json/docs/component_classification.rst index 68d3a5d262..98c20ecebd 100644 --- a/docs/modules/persistency/json/docs/component_classification.rst +++ b/docs/modules/persistency/json/docs/component_classification.rst @@ -17,17 +17,17 @@ Component Classification .. document:: Persistency Component Classification :id: doc__persistency_component_classification - :status: draft + :status: valid :safety: ASIL_B - :realizes: wp__sw_component_class + :realizes: wp__sw_component_class :tags: feature_persistency -| Classification of tiny json +| Classification of Tiny JSON | -| `tiny jason <https://github.com/rhysd/tinyjson>`_ V.2.5.1 +| `Tiny JSON <https://github.com/rhysd/tinyjson>`_ V.2.5.1 | | Additional documentation considered: -| `Documentation for tiny jason <https://docs.rs/tinyjson/latest/tinyjson/>`_ +| `Documentation for Tiny JSON <https://docs.rs/tinyjson/latest/tinyjson/>`_ Step 1: Determine (P): the uncertainty of the Processes applied @@ -55,12 +55,12 @@ Step 1: Determine (P): the uncertainty of the Processes applied * - 2 - Are requirements available? - PE - - n/a. Tinyjson is a library to parse/generate JSON format document. So this is the main requirement. + - 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 tinyjson. + - Yes in the documentation of Tiny JSON. * - 4 - Are design specifications available? @@ -70,7 +70,7 @@ Step 1: Determine (P): the uncertainty of the Processes applied * - 5 - Are configuration specification and data available, if applicable? - PE - - Yes in the documentation of tinyjson. + - Yes in the documentation of Tiny JSON. * - 6 - Are verification measures including tests and reports available? @@ -83,7 +83,7 @@ Step 1: Determine (P): the uncertainty of the Processes applied | the risk of systematic faults due to these gaps is sufficiently low or manageable by mitigating the gaps. | (P=3) in all other cases. -Tinyjson determined as P=2. +Tiny JSON determined as P=2. Step 2: Determine (C): the uncertainty of finding systematic faults based on the Complexity @@ -117,7 +117,7 @@ Step 2: Determine (C): the uncertainty of finding systematic faults based on the - Count: * LoUC+N: lines of unsafe code with safety note * LoUC : lines of unsafe code, no safety note - - NH. Tinyjson is written in Safe Rust. + - NH. Tiny JSON is written in Safe Rust. - 0 * - 3 @@ -146,7 +146,7 @@ Step 2: Determine (C): the uncertainty of finding systematic faults based on the | (C=3) in all other cases. | -Tinyjson is determined as C=1 +Tiny JSON is determined as C=1 Step 3: Determine (CLAS_OUT): the classification outcome @@ -166,7 +166,7 @@ Step 3: Determine (CLAS_OUT): the classification outcome | 3 | QR | QR | NQ | +-------+-------+-------+-------+ -Tinyjson is classified as CLAS_OUT=Q +Tiny JSON is classified as CLAS_OUT=Q Step 4: Document all results and rationale for choosing (P) and (C) and (CLAS_OUT) diff --git a/docs/modules/persistency/json/docs/index.rst b/docs/modules/persistency/json/docs/index.rst index e9e1403dcc..fb14b6cb48 100644 --- a/docs/modules/persistency/json/docs/index.rst +++ b/docs/modules/persistency/json/docs/index.rst @@ -12,13 +12,20 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* + +.. toctree:: + :maxdepth: 1 + :glob: + + component_classification.rst + + + .. _component_PersistencyJson: Tiny JSON ######### -.. note:: Document header - .. document:: Persistency JSON :id: doc__persistencyjson :status: draft @@ -26,151 +33,12 @@ Tiny JSON :realizes: wp__cmpt_request :tags: template -.. attention:: - The above directive must be updated according to your Component. - - - Modify ``document`` to be your Component Name - - Modify ``id`` to be your Component Name in upper snake case preceded by ``doc__`` - - Adjust ``status`` to be ``valid`` - - Adjust ``safety`` and ``tags`` according to your needs 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. - - -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:`PROCESS_rl__module_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:`PROCESS_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:: - :hidden: - - component_classification.rst +| 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 index ac299c58af..c43988e87c 100644 --- a/docs/modules/persistency/kvs/docs/architecture/index.rst +++ b/docs/modules/persistency/kvs/docs/architecture/index.rst @@ -62,10 +62,10 @@ The components are designed to cover the expectations from the feature architect .. comp_arc_sta:: Component Name (Static View) :id: comp_arc_sta__persistency__static_view :security: YES - :safety: ASIL_D + :safety: ASIL_B :status: invalid - :implements: - :fulfils: + :implements: + :fulfils: :includes: comp_arc_sta__persistency__2 .. needarch:: @@ -80,9 +80,9 @@ Dynamic Architecture .. comp_arc_dyn:: Dynamic View :id: comp_arc_dyn__persistency__dynamic_view :security: YES - :safety: ASIL_D + :safety: ASIL_B :status: invalid - :fulfils: + :fulfils: put here a sequence diagram @@ -95,7 +95,7 @@ Interfaces .. real_arc_int:: <Title> :id: real_arc_int__<component>__<Title> :security: <YES|NO> - :safety: <QM|ASIL_B|ASIL_D> + :safety: <QM|ASIL_B|ASIL_B> :fulfils: <link to component requirement id> :language: cpp @@ -105,9 +105,9 @@ Lower Level Components .. comp_arc_sta:: Component Name 2 :id: comp_arc_sta__persistency__2 :status: invalid - :safety: ASIL_D + :safety: ASIL_B :security: YES - :implements: + :implements: no architecture but detailed design diff --git a/docs/modules/persistency/kvs/docs/index.rst b/docs/modules/persistency/kvs/docs/index.rst index f844eba735..5774c051e5 100644 --- a/docs/modules/persistency/kvs/docs/index.rst +++ b/docs/modules/persistency/kvs/docs/index.rst @@ -17,22 +17,12 @@ KVS (Key Value Store) ##################### -.. note:: Document header - .. document:: Persistency KVS :id: doc__persistencykvs :status: draft :safety: ASIL_B :realizes: wp__cmpt_request - :tags: template - -.. attention:: - The above directive must be updated according to your Component. - - - Modify ``document`` to be your Component Name - - Modify ``id`` to be your Component Name in upper snake case preceded by ``doc__`` - - Adjust ``status`` to be ``valid`` - - Adjust ``safety`` and ``tags`` according to your needs + :tags: Persistency KVS Abstract ======== diff --git a/docs/modules/persistency/kvs/docs/requirements/index.rst b/docs/modules/persistency/kvs/docs/requirements/index.rst index f637aec7ba..fbf1eaac9f 100644 --- a/docs/modules/persistency/kvs/docs/requirements/index.rst +++ b/docs/modules/persistency/kvs/docs/requirements/index.rst @@ -391,3 +391,6 @@ Requirements :status: valid The component shall provide an API for registering callbacks that are triggered by data change events. + +.. needextend:: docname is not None + :+tags: persistencykvs diff --git a/docs/modules/persistency/kvs/docs/safety_analysis/dfa.rst b/docs/modules/persistency/kvs/docs/safety_analysis/dfa.rst index be4e82b4b1..9331abfdc0 100644 --- a/docs/modules/persistency/kvs/docs/safety_analysis/dfa.rst +++ b/docs/modules/persistency/kvs/docs/safety_analysis/dfa.rst @@ -21,33 +21,6 @@ Dependent Failure Analysis :status: valid :safety: ASIL_B :realizes: wp__sw_component_dfa - :tags: template + :tags: Persistency KVS -.. attention:: - The above directive must be updated according to your Component. - - - Modify ``Your Component Name`` to be your Component Name - - Modify ``id`` to be your Component Name in upper snake case preceded by ``doc__`` and succeeded by ``_dfa`` - - Adjust ``status`` to be ``valid`` - - Adjust ``safety`` and ``tags`` according to your needs - -Dependent Failure Intitiators ------------------------------ - -.. code-block:: rst - - .. comp_saf_dfa:: <Element descriptor> - :id: comp_saf_DFA__<Component>__<Element descriptor> - :violation_id: <ID from Dependent Failure Initiators list :need:`gd_guidl__dfi`> - :violation_effect: <Effect caused by the initiator (leading to a violation of a safety goal)> - :verifies: <ID from Component Architecture> - :mitigated_by: < NONE|ID from Component Requirement> - :sufficient: <yes|no> - :argument: <text to argument why measure is sufficient> - :status: <valid|invalid> - -.. attention:: - The above directive must be updated according to your component DFA. - - - Remove the ``code-block`` - - Fill in all the needed information in the <brackets> +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 index 7a5c4eccc8..cd3c070fe5 100644 --- a/docs/modules/persistency/kvs/docs/safety_analysis/fmea.rst +++ b/docs/modules/persistency/kvs/docs/safety_analysis/fmea.rst @@ -21,33 +21,6 @@ Safety Analysis : FMEA :status: valid :safety: ASIL_B :realizes: wp__sw_component_safety_analysis - :tags: template + :tags: Persistency KVS -.. attention:: - The above directive must be updated according to your Component. - - - Modify ``Your Component Name`` to be your Component Name - - Modify ``id`` to be your Component Name in upper snake case preceded by ``doc__`` and succeeded by ``_fmea`` - - Adjust ``status`` to be ``valid`` - - Adjust ``safety`` and ``tags`` according to your needs - -Failure Mode List ------------------ - -.. code-block:: rst - - .. comp_saf_fmea:: <Element descriptor> - :id: comp_saf_FMEA__<Component>__<Element descriptor> - :failure_mode: <ID from fault model :need:`gd_guidl__fault_models`> - :failure_effect: <Effect caused by the failure (leading to a violation of a safety goal)> - :verifies: <ID from Component Architecture> - :mitigated_by: < NONE|ID from Component Requirement> - :sufficient: <yes|no> - :argument: <text to argument why measure is sufficient> - :status: <valid|invalid> - -.. attention:: - The above directive must be updated according to your component FMEA. - - - Remove the ``code-block`` - - Fill in all the needed information in the <brackets> +Because there is no sub-components in KVS, the results of the FMEA are the same as on feature level :need:`doc__persistency_safety_analysis`. From 5ab1a0c75a3a5f9d0a9efb679b7b01c5f419bd47 Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Sat, 26 Jul 2025 00:06:21 +0200 Subject: [PATCH 031/109] process: update dfa Ref: closes #1069 --- docs/features/persistency/kvs/safety_analysis/dfa.rst | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/features/persistency/kvs/safety_analysis/dfa.rst b/docs/features/persistency/kvs/safety_analysis/dfa.rst index 0e6ca4f7ae..b237d11c21 100644 --- a/docs/features/persistency/kvs/safety_analysis/dfa.rst +++ b/docs/features/persistency/kvs/safety_analysis/dfa.rst @@ -21,6 +21,17 @@ Persistency DFA :safety: ASIL_B :tags: feature_persistency + .. feat_saf_dfa:: Persistency + :verifies: feat_arc_sta__persistency__static + :id: feat_saf_DFA__persistency__SR_01_01 + :violation_id: SR_01_01 + :violation_cause: Reused software module + :mitigation: NONE + :mitigation_issue: NONE + :sufficient: yes + :argument: There are no reused software modules, so no mitigation is needed. + :status: valid + | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static | :id: feat_saf_DFA__persistency__SR_01_01 From 8adf81399a3f11c051c7e3e9c035c18096f074fe Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Sat, 26 Jul 2025 00:06:21 +0200 Subject: [PATCH 032/109] process: small findings documents Ref: closes # 1069 --- docs/features/persistency/kvs/safety_analysis/dfa.rst | 11 ----------- .../modules/persistency/docs/manual/safety_manual.rst | 4 ++-- .../docs/safety_mgt/module_safety_plan.rst | 4 ++-- docs/modules/persistency/json/docs/index.rst | 7 +++---- 4 files changed, 7 insertions(+), 19 deletions(-) diff --git a/docs/features/persistency/kvs/safety_analysis/dfa.rst b/docs/features/persistency/kvs/safety_analysis/dfa.rst index b237d11c21..0e6ca4f7ae 100644 --- a/docs/features/persistency/kvs/safety_analysis/dfa.rst +++ b/docs/features/persistency/kvs/safety_analysis/dfa.rst @@ -21,17 +21,6 @@ Persistency DFA :safety: ASIL_B :tags: feature_persistency - .. feat_saf_dfa:: Persistency - :verifies: feat_arc_sta__persistency__static - :id: feat_saf_DFA__persistency__SR_01_01 - :violation_id: SR_01_01 - :violation_cause: Reused software module - :mitigation: NONE - :mitigation_issue: NONE - :sufficient: yes - :argument: There are no reused software modules, so no mitigation is needed. - :status: valid - | .. feat_saf_dfa:: Persistency | :verifies: feat_arc_sta__persistency__static | :id: feat_saf_DFA__persistency__SR_01_01 diff --git a/docs/modules/persistency/docs/manual/safety_manual.rst b/docs/modules/persistency/docs/manual/safety_manual.rst index f3627e2b80..d78fbd15ae 100644 --- a/docs/modules/persistency/docs/manual/safety_manual.rst +++ b/docs/modules/persistency/docs/manual/safety_manual.rst @@ -12,8 +12,8 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -Safety Manual Template -====================== +Safety Manual +============= .. document:: Persistency Safety Manual :id: doc__persistency_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 d347ebdbc4..8259a68303 100644 --- a/docs/modules/persistency/docs/safety_mgt/module_safety_plan.rst +++ b/docs/modules/persistency/docs/safety_mgt/module_safety_plan.rst @@ -111,8 +111,8 @@ Module Workproducts List - <WP status (manual)> * - :need:`PROCESS_wp__module_sw_build_config` - - `doc__software_development_plan` - - `copy('status', need_id='doc__software_development_plan')` + - `PROCESS_gd_temp__software_development_plan` + - `copy('status', need_id='PROCESS_doc__software_development_plan')` - <Link to issue> - <Link to WP> - <automated> diff --git a/docs/modules/persistency/json/docs/index.rst b/docs/modules/persistency/json/docs/index.rst index fb14b6cb48..0d133a2597 100644 --- a/docs/modules/persistency/json/docs/index.rst +++ b/docs/modules/persistency/json/docs/index.rst @@ -14,12 +14,11 @@ .. toctree:: - :maxdepth: 1 - :glob: + :titlesonly: + + component_classification.rst - component_classification.rst - .. _component_PersistencyJson: From 39d6df7e0b96953eebc5e2e69a731f7f0c315ab0 Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Sat, 26 Jul 2025 00:06:21 +0200 Subject: [PATCH 033/109] process: correct link Ref: closes#1069 --- docs/modules/persistency/json/docs/index.rst | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/docs/modules/persistency/json/docs/index.rst b/docs/modules/persistency/json/docs/index.rst index 0d133a2597..6477c794a9 100644 --- a/docs/modules/persistency/json/docs/index.rst +++ b/docs/modules/persistency/json/docs/index.rst @@ -12,13 +12,10 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* - .. toctree:: :titlesonly: - component_classification.rst - - + component_classification .. _component_PersistencyJson: From a86a8eb2468ce986edb6525de408dc169a57325b Mon Sep 17 00:00:00 2001 From: Sven Bachmann <sven.bachmann.ext@qorix.ai> Date: Sat, 26 Jul 2025 00:06:21 +0200 Subject: [PATCH 034/109] persistency_kvs: move functional requirements to ASIL_B Signed-off-by: Sven Bachmann <sven.bachmann.ext@qorix.ai> --- .../persistency}/modules/index.rst | 0 .../modules/persistency/docs/index.rst | 0 .../modules/persistency/docs/manual/index.rst | 0 .../persistency/docs/manual/safety_manual.rst | 0 .../persistency/docs/release/release_note.rst | 0 .../persistency/docs/safety_mgt/index.rst | 0 .../safety_mgt/module_safety_package_fdr.rst | 0 .../docs/safety_mgt/module_safety_plan.rst | 0 .../safety_mgt/module_safety_plan_fdr.rst | 0 .../module_verification_report.rst | 0 .../json/docs/component_classification.rst | 0 .../modules/persistency/json/docs/index.rst | 0 .../kvs/docs/architecture/index.rst | 0 .../modules/persistency/kvs/docs/index.rst | 0 .../kvs/docs/requirements/index.rst | 51 +++++++++---------- .../kvs/docs/safety_analysis/dfa.rst | 0 .../kvs/docs/safety_analysis/fmea.rst | 0 17 files changed, 24 insertions(+), 27 deletions(-) rename docs/{ => features/persistency}/modules/index.rst (100%) rename docs/{ => features/persistency}/modules/persistency/docs/index.rst (100%) rename docs/{ => features/persistency}/modules/persistency/docs/manual/index.rst (100%) rename docs/{ => features/persistency}/modules/persistency/docs/manual/safety_manual.rst (100%) rename docs/{ => features/persistency}/modules/persistency/docs/release/release_note.rst (100%) rename docs/{ => features/persistency}/modules/persistency/docs/safety_mgt/index.rst (100%) rename docs/{ => features/persistency}/modules/persistency/docs/safety_mgt/module_safety_package_fdr.rst (100%) rename docs/{ => features/persistency}/modules/persistency/docs/safety_mgt/module_safety_plan.rst (100%) rename docs/{ => features/persistency}/modules/persistency/docs/safety_mgt/module_safety_plan_fdr.rst (100%) rename docs/{ => features/persistency}/modules/persistency/docs/verification/module_verification_report.rst (100%) rename docs/{ => features/persistency}/modules/persistency/json/docs/component_classification.rst (100%) rename docs/{ => features/persistency}/modules/persistency/json/docs/index.rst (100%) rename docs/{ => features/persistency}/modules/persistency/kvs/docs/architecture/index.rst (100%) rename docs/{ => features/persistency}/modules/persistency/kvs/docs/index.rst (100%) rename docs/{ => features/persistency}/modules/persistency/kvs/docs/requirements/index.rst (95%) rename docs/{ => features/persistency}/modules/persistency/kvs/docs/safety_analysis/dfa.rst (100%) rename docs/{ => features/persistency}/modules/persistency/kvs/docs/safety_analysis/fmea.rst (100%) diff --git a/docs/modules/index.rst b/docs/features/persistency/modules/index.rst similarity index 100% rename from docs/modules/index.rst rename to docs/features/persistency/modules/index.rst diff --git a/docs/modules/persistency/docs/index.rst b/docs/features/persistency/modules/persistency/docs/index.rst similarity index 100% rename from docs/modules/persistency/docs/index.rst rename to docs/features/persistency/modules/persistency/docs/index.rst diff --git a/docs/modules/persistency/docs/manual/index.rst b/docs/features/persistency/modules/persistency/docs/manual/index.rst similarity index 100% rename from docs/modules/persistency/docs/manual/index.rst rename to docs/features/persistency/modules/persistency/docs/manual/index.rst diff --git a/docs/modules/persistency/docs/manual/safety_manual.rst b/docs/features/persistency/modules/persistency/docs/manual/safety_manual.rst similarity index 100% rename from docs/modules/persistency/docs/manual/safety_manual.rst rename to docs/features/persistency/modules/persistency/docs/manual/safety_manual.rst diff --git a/docs/modules/persistency/docs/release/release_note.rst b/docs/features/persistency/modules/persistency/docs/release/release_note.rst similarity index 100% rename from docs/modules/persistency/docs/release/release_note.rst rename to docs/features/persistency/modules/persistency/docs/release/release_note.rst diff --git a/docs/modules/persistency/docs/safety_mgt/index.rst b/docs/features/persistency/modules/persistency/docs/safety_mgt/index.rst similarity index 100% rename from docs/modules/persistency/docs/safety_mgt/index.rst rename to docs/features/persistency/modules/persistency/docs/safety_mgt/index.rst diff --git a/docs/modules/persistency/docs/safety_mgt/module_safety_package_fdr.rst b/docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_package_fdr.rst similarity index 100% rename from docs/modules/persistency/docs/safety_mgt/module_safety_package_fdr.rst rename to docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_package_fdr.rst diff --git a/docs/modules/persistency/docs/safety_mgt/module_safety_plan.rst b/docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_plan.rst similarity index 100% rename from docs/modules/persistency/docs/safety_mgt/module_safety_plan.rst rename to docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_plan.rst diff --git a/docs/modules/persistency/docs/safety_mgt/module_safety_plan_fdr.rst b/docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_plan_fdr.rst similarity index 100% rename from docs/modules/persistency/docs/safety_mgt/module_safety_plan_fdr.rst rename to docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_plan_fdr.rst diff --git a/docs/modules/persistency/docs/verification/module_verification_report.rst b/docs/features/persistency/modules/persistency/docs/verification/module_verification_report.rst similarity index 100% rename from docs/modules/persistency/docs/verification/module_verification_report.rst rename to docs/features/persistency/modules/persistency/docs/verification/module_verification_report.rst diff --git a/docs/modules/persistency/json/docs/component_classification.rst b/docs/features/persistency/modules/persistency/json/docs/component_classification.rst similarity index 100% rename from docs/modules/persistency/json/docs/component_classification.rst rename to docs/features/persistency/modules/persistency/json/docs/component_classification.rst diff --git a/docs/modules/persistency/json/docs/index.rst b/docs/features/persistency/modules/persistency/json/docs/index.rst similarity index 100% rename from docs/modules/persistency/json/docs/index.rst rename to docs/features/persistency/modules/persistency/json/docs/index.rst diff --git a/docs/modules/persistency/kvs/docs/architecture/index.rst b/docs/features/persistency/modules/persistency/kvs/docs/architecture/index.rst similarity index 100% rename from docs/modules/persistency/kvs/docs/architecture/index.rst rename to docs/features/persistency/modules/persistency/kvs/docs/architecture/index.rst diff --git a/docs/modules/persistency/kvs/docs/index.rst b/docs/features/persistency/modules/persistency/kvs/docs/index.rst similarity index 100% rename from docs/modules/persistency/kvs/docs/index.rst rename to docs/features/persistency/modules/persistency/kvs/docs/index.rst diff --git a/docs/modules/persistency/kvs/docs/requirements/index.rst b/docs/features/persistency/modules/persistency/kvs/docs/requirements/index.rst similarity index 95% rename from docs/modules/persistency/kvs/docs/requirements/index.rst rename to docs/features/persistency/modules/persistency/kvs/docs/requirements/index.rst index fbf1eaac9f..370bff3fd5 100644 --- a/docs/modules/persistency/kvs/docs/requirements/index.rst +++ b/docs/features/persistency/modules/persistency/kvs/docs/requirements/index.rst @@ -118,7 +118,7 @@ Requirements :id: comp_req__persistency__default_value_types :reqtype: Functional :security: NO - :safety: QM + :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 :status: valid @@ -129,7 +129,7 @@ Requirements :id: comp_req__persistency__default_value_query :reqtype: Functional :security: NO - :safety: QM + :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 :status: valid @@ -139,7 +139,7 @@ Requirements :id: comp_req__persistency__default_value_config :reqtype: Functional :security: NO - :safety: QM + :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 :status: valid @@ -150,7 +150,7 @@ Requirements :id: comp_req__persistency__default_value_checksum :reqtype: Functional :security: NO - :safety: QM + :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 :status: valid @@ -161,30 +161,18 @@ Requirements :id: comp_req__persistency__constraints :reqtype: Functional :security: NO - :safety: QM + :safety: ASIL_B :satisfies: feat_req__persistency__config_file :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:: Language Agnostic - :id: comp_req__persistency__language_agnostic - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: feat_req__persistency__cpp_rust_interop - :status: valid - - The component shall provide an API that supports bindings to other languages - or shall use a storage and memory exchange format that is adaptable to other - languages. - .. comp_req:: Concurrency :id: comp_req__persistency__concurrency :reqtype: Functional :security: NO - :safety: QM + :safety: ASIL_B :satisfies: feat_req__persistency__intra_process_comm :status: valid @@ -207,29 +195,38 @@ Requirements :id: comp_req__persistency__persist_data_store_com :reqtype: Functional :security: NO - :safety: QM + :safety: ASIL_B :satisfies: feat_req__persistency__persistency,feat_req__persistency__integrity_check,feat_req__persistency__persist_data :status: valid The component shall use the file API and the JSON data format to persist data. -.. comp_req:: Persistent Data Storage Checksum - :id: comp_req__persistency__pers_data_store_csum +.. comp_req:: Persistent Data Storage Checksum Write + :id: comp_req__persistency__pers_data_csum_write :reqtype: Functional :security: NO - :safety: QM + :safety: ASIL_B :satisfies: feat_req__persistency__persistency,feat_req__persistency__integrity_check,feat_req__persistency__persist_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__persistency,feat_req__persistency__integrity_check,feat_req__persistency__persist_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: QM + :safety: ASIL_B :satisfies: feat_req__persistency__persistency,feat_req__persistency__integrity_check,feat_req__persistency__persist_data :status: valid @@ -239,7 +236,7 @@ Requirements :id: comp_req__persistency__pers_data_store_fmt :reqtype: Functional :security: NO - :safety: QM + :safety: ASIL_B :satisfies: feat_req__persistency__persistency,feat_req__persistency__integrity_check,feat_req__persistency__persist_data :status: valid @@ -353,7 +350,7 @@ Requirements :id: comp_req__persistency__async_api :reqtype: Functional :security: NO - :safety: QM + :safety: ASIL_B :satisfies: feat_req__persistency__async_api :status: valid @@ -363,7 +360,7 @@ Requirements :id: comp_req__persistency__permission_control :reqtype: Functional :security: NO - :safety: QM + :safety: ASIL_B :satisfies: feat_req__persistency__access_control :status: valid @@ -375,7 +372,7 @@ Requirements :id: comp_req__persistency__permission_err_handle :reqtype: Functional :security: NO - :safety: QM + :safety: ASIL_B :satisfies: feat_req__persistency__access_control :status: valid diff --git a/docs/modules/persistency/kvs/docs/safety_analysis/dfa.rst b/docs/features/persistency/modules/persistency/kvs/docs/safety_analysis/dfa.rst similarity index 100% rename from docs/modules/persistency/kvs/docs/safety_analysis/dfa.rst rename to docs/features/persistency/modules/persistency/kvs/docs/safety_analysis/dfa.rst diff --git a/docs/modules/persistency/kvs/docs/safety_analysis/fmea.rst b/docs/features/persistency/modules/persistency/kvs/docs/safety_analysis/fmea.rst similarity index 100% rename from docs/modules/persistency/kvs/docs/safety_analysis/fmea.rst rename to docs/features/persistency/modules/persistency/kvs/docs/safety_analysis/fmea.rst From 6bcc41ca64112b6125555333fd237e453b81bbd7 Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Sat, 26 Jul 2025 00:06:21 +0200 Subject: [PATCH 035/109] Version update docs-as-code. Update FMEA and DFA accoring process --- .../persistency/kvs/safety_analysis/dfa.rst | 479 +++--------------- .../persistency/kvs/safety_analysis/fmea.rst | 289 +++++------ 2 files changed, 209 insertions(+), 559 deletions(-) diff --git a/docs/features/persistency/kvs/safety_analysis/dfa.rst b/docs/features/persistency/kvs/safety_analysis/dfa.rst index 0e6ca4f7ae..ea0c58718b 100644 --- a/docs/features/persistency/kvs/safety_analysis/dfa.rst +++ b/docs/features/persistency/kvs/safety_analysis/dfa.rst @@ -21,398 +21,87 @@ Persistency DFA :safety: ASIL_B :tags: feature_persistency - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SR_01_01 - | :violation_id: SR_01_01 - | :violation_cause: Reused software module - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: There are no reused software modules, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SR_01_02 - | :violation_id: SR_01_02 - | :violation_cause: Library fs - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: The file system fs is a library. No mitigation for persistency is needed, because is an elementary library without the functionalites of S-CORE are not availabe. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SR_01_02 - | :violation_id: SR_01_02 - | :violation_cause: Library json - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: JSON is a library. A mitigation might be needed but it will not be considered at persistency. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SR_01_04 - | :violation_id: SR_01_04 - | :violation_cause: Basic software - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: There are no basic software within persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SR_01_05 - | :violation_id: SR_01_05 - | :violation_cause: Operating system including scheduler - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Will be considered at feature platform DFA. Mitigation can't be handled at middleware. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SR_01_06 - | :violation_id: SR_01_06 - | :violation_cause: Any service stack, e.g. communication stack - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: There is no service stack at persistency used, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SR_01_07 - | :violation_id: SR_01_07 - | :violation_cause: Configuration data. Return values might be falsified. - | :mitigation: Integritry check feat_req__persistency__integrity_check - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Integrity check will fail, so the failure will be detected. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SR_01_09 - | :violation_id: SR_01_09 - | :violation_cause: Execution time. - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: There is timing impact at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SR_01_10 - | :violation_id: SR_01_10 - | :violation_cause: Allocated memory. - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: Acutally discussed in feature community. JSON can do it, but it should not be allowed. - | :status: <valid|invalid> - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__CO_01_01 - | :violation_id: CO_01_01 - | :violation_cause: Information passed via argument through a function call, or via writing/reading a variable being global to the two software functions (data flow) - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__CO_01_02 - | :violation_id: CO_01_02 - | :violation_cause: Data or message corruption / repetition / loss / delay / masquerading or incorrect addressing of information. - | :mitigation: < NONE|ID from Feature Requirement> feat_req__persistency__integrity_check? Maybe mitigation is needed. Persistency will be not available or be falsified executed. - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__CO_01_03 - | :violation_id: CO_01_03 - | :violation_cause: Insertion / sequence of information - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Subset of feat_saf_DFA__persistency__static CO_01_02 - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__CO_01_04 - | :violation_id: CO_01_04 - | :violation_cause: Corruption of information, inconsistent data - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Subset of feat_saf_DFA__persistency__static CO_01_02 - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__CO_01_05 - | :violation_id: CO_01_05 - | :violation_cause: Asymmetric information sent from a sender to multiple receivers, so that not all defined receivers have the same informations - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__CO_01_06 - | :violation_id: CO_01_06 - | :violation_cause: Information from a sender received by only a subset of the receivers. - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__CO_01_07 - | :violation_id: CO_01_07 - | :violation_cause: Blocking access to a communication channel - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SI_01_02 - | :violation_id: SI_01_02 - | :violation_cause: Configuration data. - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SI_01_03 - | :violation_id: SI_01_03 - | :violation_cause: Constants, or variables, being global to the two software functions. - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SI_01_04 - | :violation_id: SI_01_04 - | :violation_cause: Basic software passes data (read from hardware register and converted into logical information) to two applications software functions. - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SI_01_05 - | :violation_id: SI_01_05 - | :violation_cause: Data / function parameter arguments / messages delivered by software function to more than one other function. - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__UI_01_01 - | :violation_id: UI_01_01 - | :violation_cause: Memory miss-allocation and leaks. - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Will be considered at feature platform DFA. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__UI_01_02 - | :violation_id: UI_01_02 - | :violation_cause: Read/Write access to memory allocated to another software element. - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Will be considered at feature platform DFA. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__UI_01_03 - | :violation_id: UI_01_03 - | :violation_cause: Stack/Buffer under-/overflow. Might happens but very unlikely in RUST. Recursive functions could be the violation cause. - | :mitigation: < NONE|ID from Feature Requirement> Compilerüberwachung / AoU - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__UI_01_04 - | :violation_id: UI_01_04 - | :violation_cause: Deadlocks. - | :mitigation: aou_req__persistency__appl_design - | :mitigation_issue: None - | :sufficient: yes - | :argument: Deadlocks are not caused by the KVS, but by the application. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__UI_01_05 - | :violation_id: UI_01_05 - | :violation_cause: Livelocks - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Same consideration as done in feat_saf_DFA__persistency__static UI_01_04 - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__UI_01_06 - | :violation_id: UI_01_06 - | :violation_cause: Blocking of execution. - | :mitigation: aou_req__persistency__appl_exec - | :mitigation_issue: None - | :sufficient: yes - | :argument: Execution blocking will make persistency not available. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__UI_01_07 - | :violation_id: UI_01_07 - | :violation_cause: Incorrect allocation of execution time. - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__UI_01_08 - | :violation_id: UI_01_08 - | :violation_cause: Incorrect execution flow - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__UI_01_09 - | :violation_id: UI_01_09 - | :violation_cause: Incorrect synchronization between software elements - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__UI_01_10 - | :violation_id: UI_01_10 - | :violation_cause: CPU time depletion - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__UI_01_11 - | :violation_id: UI_01_11 - | :violation_cause: Memory depletion - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__UI_01_12 - | :violation_id: UI_01_12 - | :violation_cause: Other HW unavailability - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SC_01_02 - | :violation_id: SC_01_02 - | :violation_cause: Same development approaches (e.g. IDE, programming and/or modelling language) - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Will be considered at feature platform DFA. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SC_01_03 - | :violation_id: SC_01_03 - | :violation_cause: Same personal - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Will be considered at feature platform DFA. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SC_01_04 - | :violation_id: SC_01_04 - | :violation_cause: Same social-cultural context (even if different personnel). Only applicable if diverse development is needed. - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Will be considered at feature platform DFA. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SC_01_05 - | :violation_id: SC_01_05 - | :violation_cause: Development fault (e.g. human error, insufficient qualification, insufficient methods). Only applicable if diverse development is needed. - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Will be considered at feature platform DFA. - | :status: valid + For the DFA the failure initiator list was used to identify potential violations. If a violation doesn't apply, it is not listed here. + Most of the violations that doesn't apply shall be analysed with the platform feature DFA. It can be shown with the DFA that at + persistency the freedom from interference is not violated. Persistency is using the component fs and JSON but there are not used in a way that + it's used in an combination of a feature and it's related safety mechanism. + + All failures will lead to a failure of the persistency feature. The persistency feature is not able to provide the required functionality. + This must be handled by the application. Due to the deterministic approach, persistency will return the specified results or error codes. + +.. feat_saf_dfa:: Persistency + :verifies: feat_arc_sta__persistency__static + :id: feat_saf_dfa__persistency__config + :violation_id: SR_01_07 + :violation_cause: Configuration data. Return values might be falsified. + :mitigates: feat_req__persistency__integrity_check + :sufficient: yes + :status: valid + + Integrity check will fail, so the failure will be detected. + +.. feat_saf_dfa:: Persistency + :verifies: feat_arc_sta__persistency__static + :id: feat_saf_dfa__persistency__message_corr + :violation_id: CO_01_02 + :violation_cause: Data or message corruption / repetition / loss / delay / masquerading or incorrect addressing of information. + :mitigates: feat_req__persistency__integrity_check + :sufficient: yes + :status: valid + + Maybe mitigates is needed. Persistency will be not available or be falsified executed. + +.. feat_saf_dfa:: Persistency + :verifies: feat_arc_sta__persistency__static + :id: feat_saf_dfa__persistency__instert + :violation_id: CO_01_03 + :violation_cause: Insertion / sequence of information + :mitigates: feat_req__persistency__integrity_check + :sufficient: yes + :status: valid + + Subset of feat_saf_dfa__persistency__static CO_01_02 + +.. feat_saf_dfa:: Persistency + :verifies: feat_arc_sta__persistency__static + :id: feat_saf_dfa__persistency__corrup_info + :violation_id: CO_01_04 + :violation_cause: Corruption of information, inconsistent data + :mitigates: feat_req__persistency__integrity_check + :sufficient: yes + :status: valid + + Subset of feat_saf_dfa__persistency__static CO_01_02 + +.. feat_saf_dfa:: Persistency + :verifies: feat_arc_sta__persistency__static + :id: feat_saf_dfa__persistency__deadlock + :violation_id: UI_01_04 + :violation_cause: Deadlocks. + :mitigates: aou_req__persistency__appl_design + :sufficient: yes + :status: valid + + Deadlocks are not caused by the KVS, but by the application. + +.. feat_saf_dfa:: Persistency + :verifies: feat_arc_sta__persistency__static + :id: feat_saf_dfa__persistency__livelock + :violation_id: UI_01_05 + :violation_cause: Livelocks + :mitigates: aou_req__persistency__appl_design + :sufficient: yes + :status: valid + + Same consideration as done in feat_saf_dfa__persistency__static UI_01_04 + +.. feat_saf_dfa:: Persistency + :verifies: feat_arc_sta__persistency__static + :id: feat_saf_dfa__persistency__exec_block + :violation_id: UI_01_06 + :violation_cause: Blocking of execution. + :mitigates: aou_req__persistency__appl_exec + :sufficient: yes + :status: valid + + Execution blocking will make persistency not available. diff --git a/docs/features/persistency/kvs/safety_analysis/fmea.rst b/docs/features/persistency/kvs/safety_analysis/fmea.rst index e25c94a1cb..2e2bad76a0 100644 --- a/docs/features/persistency/kvs/safety_analysis/fmea.rst +++ b/docs/features/persistency/kvs/safety_analysis/fmea.rst @@ -21,167 +21,128 @@ Persistency Safety Analysis :safety: ASIL_B :tags: feature_persistency - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - | :id: feat_saf_FMEA__persistency_MF_01_01 - | :failure_mode: MF_01_01 - | :failure_effect: Message is not received. - | :mitigation: aou_req__persistency__error_handling - | :mitigation_issue: None - | :sufficient: yes - | :argument: User is not able to use the feature. Middleware cant be used. - | :status: valid - - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - | :id: feat_saf_FMEA__persistency_MF_01_02 - | :failure_mode: MF_01_02 - | :failure_effect: message received too late. - | :mitigation: aou_req__persistency__error_handling - | :mitigation_issue: None - | :sufficient: yes - | :argument: User is not able to use the feature. Middleware cant be used. - | :status: valid - - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - | :id: feat_saf_FMEA__persistency_MF_01_03 - | :failure_mode: MF_01_03 - | :failure_effect: message received too early. - | :mitigation: NONE - | :mitigation_issue: None - | :sufficient: yes - | :argument: No impact / feature reacts only if triggered on the trigger. - | :status: valid - - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - | :id: feat_saf_FMEA__persistency_MF_01_04 - | :failure_mode: MF_01_04 - | :failure_effect: message not received correctly by all recipients (different messages or messages partly lost). - | :mitigation: NONE - | :mitigation_issue: None - | :sufficient: yes - | :argument: Failure mode not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - | :id: feat_saf_FMEA__persistency_MF_01_05 - | :failure_mode: MF_01_05 - | :failure_effect: message is corrupted. - | :mitigation: NONE - | :mitigation_issue: None - | :sufficient: yes - | :argument: Covered by MF_01_01 - | :status: valid - - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - | :id: feat_saf_FMEA__persistency_MF_01_06 - | :failure_mode: MF_01_06 - | :failure_effect: message is not sent. - | :mitigation: NONE - | :mitigation_issue: None - | :sufficient: yes - | :argument: Covered by MF_01_01 - | :status: valid - - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - | :id: feat_saf_FMEA__persistency_MF_01_07 - | :failure_mode: MF_01_07 - | :failure_effect: message is unintended sent. - | :mitigation: NONE - | :mitigation_issue: None - | :sufficient: yes - | :argument: Covered by MF_01_01 - | :status: valid - - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - | :id: feat_saf_FMEA__persistency_CO_01_01 - | :failure_mode: CO_01_01 - | :failure_effect: minimum constraint boundary is violated. - | :mitigation: NONE - | :mitigation_issue: None - | :sufficient: yes - | :argument: Failure mode not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - | :id: feat_saf_FMEA__persistency_CO_01_02 - | :failure_mode: CO_01_02 - | :failure_effect: maximum constraint boundary is violated. - | :mitigation: NONE - | :mitigation_issue: None - | :sufficient: yes - | :argument: Failure mode not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - | :id: feat_saf_FMEA__persistency_EX_01_01 - | :failure_mode: EX_01_01 - | :failure_effect: Process calculates wrong result(s). - | :mitigation: aou_req__persistency__error_handling - | :mitigation_issue: None - | :sufficient: yes - | :argument: User is not able to use the feature. Middleware cant be used. - | :status: valid - - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - | :id: feat_saf_FMEA__persistency_EX_01_02 - | :failure_mode: EX_01_02 - | :failure_effect: processing too slow. - | :mitigation: aou_req__persistency__error_handling - | :mitigation_issue: None - | :sufficient: yes - | :argument: User is not able to use the feature. Middleware cant be used. - | :status: valid - - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - | :id: feat_saf_FMEA__persistency_EX_01_03 - | :failure_mode: EX_01_03 - | :failure_effect: processing too fast. - | :mitigation: NONE - | :mitigation_issue: None - | :sufficient: yes - | :argument: Failure mode not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - | :id: feat_saf_FMEA__persistency_EX_01_04 - | :failure_mode: EX_01_04 - | :failure_effect: loss of execution. - | :mitigation: aou_req__persistency__error_handling - | :mitigation_issue: None - | :sufficient: yes - | :argument: User is not able to use the feature. Middleware cant be used. - | :status: valid - - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - | :id: feat_saf_FMEA__persistency_EX_01_05 - | :failure_mode: EX_01_05 - | :failure_effect: processing changes to arbitrary process. - | :mitigation: NONE - | :mitigation_issue: None - | :sufficient: yes - | :argument: Failure mode not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_fmea:: Persistency - | :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - | :id: feat_saf_FMEA__persistency_EX_01_06 - | :failure_mode: EX_01_06 - | :failure_effect: processing is not complete (infinite loop). - | :mitigation: aou_req__persistency__error_handling - | :mitigation_issue: None - | :sufficient: yes - | :argument: User is not able to use the feature. Middleware cant be used. - | :status: valid + The FMEA is done by applying the fault model list. If a fault model doesn't apply, it is not listed here. + Persistency is developed in a full deterministic way. A failure will lead to a specified reaction of the persistency feature. + These failures must be handled by the application. Also failures that will lead to a unspecified usage of the feature + like signals were corrupted or messages are not sent. + +.. feat_saf_fmea:: Persistency + :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + :id: feat_saf_FMEA__persistency__message_nreived + :violation_id: MF_01_01 + :violation_cause: Message is not received. + :mitigates: aou_req__persistency__error_handling + :sufficient: yes + :status: valid + + User is not able to use the feature. Middleware cant be used. + +.. feat_saf_fmea:: Persistency + :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + :id: feat_saf_FMEA__persistency__late_message + :violation_id: MF_01_02 + :violation_cause: message received too late. + :mitigates: aou_req__persistency__error_handling + :sufficient: yes + :status: valid + + User is not able to use the feature. Middleware cant be used. + +.. feat_saf_fmea:: Persistency + :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + :id: feat_saf_FMEA__persistency__corrupted_message + :violation_id: MF_01_05 + :violation_cause: message is corrupted. + :mitigates: aou_req__persistency__error_handling + :sufficient: yes + :status: valid + + Covered by MF_01_01 + +.. feat_saf_fmea:: Persistency + :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + :id: feat_saf_FMEA__persistency__not_sent + :violation_id: MF_01_06 + :violation_cause: message is not sent. + :mitigates: aou_req__persistency__error_handling + :sufficient: yes + :status: valid + + Covered by MF_01_01 + +.. feat_saf_fmea:: Persistency + :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + :id: feat_saf_FMEA__persistency__unintendend + :violation_id: MF_01_07 + :violation_cause: message is unintended sent. + :mitigates: aou_req__persistency__error_handling + :sufficient: yes + :status: valid + + Covered by MF_01_01 + +.. feat_saf_fmea:: Persistency + :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + :id: feat_saf_FMEA__persistency__calc_wrong + :violation_id: EX_01_01 + :violation_cause: Process calculates wrong result(s). + :mitigates: aou_req__persistency__error_handling + :sufficient: yes + :status: valid + + User is not able to use the feature. Middleware cant be used. + +.. feat_saf_fmea:: Persistency + :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + :id: feat_saf_FMEA__persistency__too_slow + :violation_id: EX_01_02 + :violation_cause: processing too slow. + :mitigates: aou_req__persistency__error_handling + :sufficient: yes + :status: valid + + User is not able to use the feature. Middleware cant be used. + +.. feat_saf_fmea:: Persistency + :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + :id: feat_saf_FMEA__persistency__too_fast + :violation_id: EX_01_03 + :violation_cause: processing too fast. + :mitigates: + :sufficient: yes + :status: valid + + User is not able to use the feature. Middleware cant be used. + +.. feat_saf_fmea:: Persistency + :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + :id: feat_saf_FMEA__persistency__err_handl + :violation_id: EX_01_04 + :violation_cause: loss of execution. + :mitigates: aou_req__persistency__error_handling + :sufficient: yes + :status: valid + + User is not able to use the feature. Middleware cant be used. + +.. feat_saf_fmea:: Persistency + :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + :id: feat_saf_FMEA__persistency__arbitrary + :violation_id: EX_01_05 + :violation_cause: processing changes to arbitrary process. + :mitigates: + :sufficient: yes + :status: valid + + User is not able to use the feature. Middleware cant be used. + +.. feat_saf_fmea:: Persistency + :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + :id: feat_saf_FMEA__persistency__infinite + :violation_id: EX_01_06 + :violation_cause: processing is not complete (infinite loop). + :mitigates: aou_req__persistency__error_handling + :sufficient: yes + :status: valid + + User is not able to use the feature. Middleware cant be used. From d56f29f4d4ad6db7a31758210ac1b804a86a1397 Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Sat, 26 Jul 2025 00:06:21 +0200 Subject: [PATCH 036/109] fix link fmea --- .../persistency/kvs/safety_analysis/dfa.rst | 479 +++++++++++++++--- .../persistency/kvs/safety_analysis/fmea.rst | 26 +- 2 files changed, 408 insertions(+), 97 deletions(-) diff --git a/docs/features/persistency/kvs/safety_analysis/dfa.rst b/docs/features/persistency/kvs/safety_analysis/dfa.rst index ea0c58718b..0e6ca4f7ae 100644 --- a/docs/features/persistency/kvs/safety_analysis/dfa.rst +++ b/docs/features/persistency/kvs/safety_analysis/dfa.rst @@ -21,87 +21,398 @@ Persistency DFA :safety: ASIL_B :tags: feature_persistency - For the DFA the failure initiator list was used to identify potential violations. If a violation doesn't apply, it is not listed here. - Most of the violations that doesn't apply shall be analysed with the platform feature DFA. It can be shown with the DFA that at - persistency the freedom from interference is not violated. Persistency is using the component fs and JSON but there are not used in a way that - it's used in an combination of a feature and it's related safety mechanism. - - All failures will lead to a failure of the persistency feature. The persistency feature is not able to provide the required functionality. - This must be handled by the application. Due to the deterministic approach, persistency will return the specified results or error codes. - -.. feat_saf_dfa:: Persistency - :verifies: feat_arc_sta__persistency__static - :id: feat_saf_dfa__persistency__config - :violation_id: SR_01_07 - :violation_cause: Configuration data. Return values might be falsified. - :mitigates: feat_req__persistency__integrity_check - :sufficient: yes - :status: valid - - Integrity check will fail, so the failure will be detected. - -.. feat_saf_dfa:: Persistency - :verifies: feat_arc_sta__persistency__static - :id: feat_saf_dfa__persistency__message_corr - :violation_id: CO_01_02 - :violation_cause: Data or message corruption / repetition / loss / delay / masquerading or incorrect addressing of information. - :mitigates: feat_req__persistency__integrity_check - :sufficient: yes - :status: valid - - Maybe mitigates is needed. Persistency will be not available or be falsified executed. - -.. feat_saf_dfa:: Persistency - :verifies: feat_arc_sta__persistency__static - :id: feat_saf_dfa__persistency__instert - :violation_id: CO_01_03 - :violation_cause: Insertion / sequence of information - :mitigates: feat_req__persistency__integrity_check - :sufficient: yes - :status: valid - - Subset of feat_saf_dfa__persistency__static CO_01_02 - -.. feat_saf_dfa:: Persistency - :verifies: feat_arc_sta__persistency__static - :id: feat_saf_dfa__persistency__corrup_info - :violation_id: CO_01_04 - :violation_cause: Corruption of information, inconsistent data - :mitigates: feat_req__persistency__integrity_check - :sufficient: yes - :status: valid - - Subset of feat_saf_dfa__persistency__static CO_01_02 - -.. feat_saf_dfa:: Persistency - :verifies: feat_arc_sta__persistency__static - :id: feat_saf_dfa__persistency__deadlock - :violation_id: UI_01_04 - :violation_cause: Deadlocks. - :mitigates: aou_req__persistency__appl_design - :sufficient: yes - :status: valid - - Deadlocks are not caused by the KVS, but by the application. - -.. feat_saf_dfa:: Persistency - :verifies: feat_arc_sta__persistency__static - :id: feat_saf_dfa__persistency__livelock - :violation_id: UI_01_05 - :violation_cause: Livelocks - :mitigates: aou_req__persistency__appl_design - :sufficient: yes - :status: valid - - Same consideration as done in feat_saf_dfa__persistency__static UI_01_04 - -.. feat_saf_dfa:: Persistency - :verifies: feat_arc_sta__persistency__static - :id: feat_saf_dfa__persistency__exec_block - :violation_id: UI_01_06 - :violation_cause: Blocking of execution. - :mitigates: aou_req__persistency__appl_exec - :sufficient: yes - :status: valid - - Execution blocking will make persistency not available. + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__SR_01_01 + | :violation_id: SR_01_01 + | :violation_cause: Reused software module + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: There are no reused software modules, so no mitigation is needed. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__SR_01_02 + | :violation_id: SR_01_02 + | :violation_cause: Library fs + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: The file system fs is a library. No mitigation for persistency is needed, because is an elementary library without the functionalites of S-CORE are not availabe. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__SR_01_02 + | :violation_id: SR_01_02 + | :violation_cause: Library json + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: JSON is a library. A mitigation might be needed but it will not be considered at persistency. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__SR_01_04 + | :violation_id: SR_01_04 + | :violation_cause: Basic software + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: There are no basic software within persistency, so no mitigation is needed. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__SR_01_05 + | :violation_id: SR_01_05 + | :violation_cause: Operating system including scheduler + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: Will be considered at feature platform DFA. Mitigation can't be handled at middleware. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__SR_01_06 + | :violation_id: SR_01_06 + | :violation_cause: Any service stack, e.g. communication stack + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: There is no service stack at persistency used, so no mitigation is needed. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__SR_01_07 + | :violation_id: SR_01_07 + | :violation_cause: Configuration data. Return values might be falsified. + | :mitigation: Integritry check feat_req__persistency__integrity_check + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: Integrity check will fail, so the failure will be detected. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__SR_01_09 + | :violation_id: SR_01_09 + | :violation_cause: Execution time. + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: There is timing impact at persistency, so no mitigation is needed. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__SR_01_10 + | :violation_id: SR_01_10 + | :violation_cause: Allocated memory. + | :mitigation: < NONE|ID from Feature Requirement> + | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> + | :sufficient: <yes|no> + | :argument: Acutally discussed in feature community. JSON can do it, but it should not be allowed. + | :status: <valid|invalid> + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__CO_01_01 + | :violation_id: CO_01_01 + | :violation_cause: Information passed via argument through a function call, or via writing/reading a variable being global to the two software functions (data flow) + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__CO_01_02 + | :violation_id: CO_01_02 + | :violation_cause: Data or message corruption / repetition / loss / delay / masquerading or incorrect addressing of information. + | :mitigation: < NONE|ID from Feature Requirement> feat_req__persistency__integrity_check? Maybe mitigation is needed. Persistency will be not available or be falsified executed. + | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> + | :sufficient: <yes|no> + | :argument: <text to argument why mitigation is sufficient> + | :status: <valid|invalid> + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__CO_01_03 + | :violation_id: CO_01_03 + | :violation_cause: Insertion / sequence of information + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: Subset of feat_saf_DFA__persistency__static CO_01_02 + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__CO_01_04 + | :violation_id: CO_01_04 + | :violation_cause: Corruption of information, inconsistent data + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: Subset of feat_saf_DFA__persistency__static CO_01_02 + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__CO_01_05 + | :violation_id: CO_01_05 + | :violation_cause: Asymmetric information sent from a sender to multiple receivers, so that not all defined receivers have the same informations + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__CO_01_06 + | :violation_id: CO_01_06 + | :violation_cause: Information from a sender received by only a subset of the receivers. + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__CO_01_07 + | :violation_id: CO_01_07 + | :violation_cause: Blocking access to a communication channel + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__SI_01_02 + | :violation_id: SI_01_02 + | :violation_cause: Configuration data. + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__SI_01_03 + | :violation_id: SI_01_03 + | :violation_cause: Constants, or variables, being global to the two software functions. + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__SI_01_04 + | :violation_id: SI_01_04 + | :violation_cause: Basic software passes data (read from hardware register and converted into logical information) to two applications software functions. + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__SI_01_05 + | :violation_id: SI_01_05 + | :violation_cause: Data / function parameter arguments / messages delivered by software function to more than one other function. + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__UI_01_01 + | :violation_id: UI_01_01 + | :violation_cause: Memory miss-allocation and leaks. + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: Will be considered at feature platform DFA. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__UI_01_02 + | :violation_id: UI_01_02 + | :violation_cause: Read/Write access to memory allocated to another software element. + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: Will be considered at feature platform DFA. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__UI_01_03 + | :violation_id: UI_01_03 + | :violation_cause: Stack/Buffer under-/overflow. Might happens but very unlikely in RUST. Recursive functions could be the violation cause. + | :mitigation: < NONE|ID from Feature Requirement> Compilerüberwachung / AoU + | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> + | :sufficient: <yes|no> + | :argument: <text to argument why mitigation is sufficient> + | :status: <valid|invalid> + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__UI_01_04 + | :violation_id: UI_01_04 + | :violation_cause: Deadlocks. + | :mitigation: aou_req__persistency__appl_design + | :mitigation_issue: None + | :sufficient: yes + | :argument: Deadlocks are not caused by the KVS, but by the application. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__UI_01_05 + | :violation_id: UI_01_05 + | :violation_cause: Livelocks + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: Same consideration as done in feat_saf_DFA__persistency__static UI_01_04 + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__UI_01_06 + | :violation_id: UI_01_06 + | :violation_cause: Blocking of execution. + | :mitigation: aou_req__persistency__appl_exec + | :mitigation_issue: None + | :sufficient: yes + | :argument: Execution blocking will make persistency not available. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__UI_01_07 + | :violation_id: UI_01_07 + | :violation_cause: Incorrect allocation of execution time. + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__UI_01_08 + | :violation_id: UI_01_08 + | :violation_cause: Incorrect execution flow + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__UI_01_09 + | :violation_id: UI_01_09 + | :violation_cause: Incorrect synchronization between software elements + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__UI_01_10 + | :violation_id: UI_01_10 + | :violation_cause: CPU time depletion + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__UI_01_11 + | :violation_id: UI_01_11 + | :violation_cause: Memory depletion + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__UI_01_12 + | :violation_id: UI_01_12 + | :violation_cause: Other HW unavailability + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__SC_01_02 + | :violation_id: SC_01_02 + | :violation_cause: Same development approaches (e.g. IDE, programming and/or modelling language) + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: Will be considered at feature platform DFA. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__SC_01_03 + | :violation_id: SC_01_03 + | :violation_cause: Same personal + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: Will be considered at feature platform DFA. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__SC_01_04 + | :violation_id: SC_01_04 + | :violation_cause: Same social-cultural context (even if different personnel). Only applicable if diverse development is needed. + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: Will be considered at feature platform DFA. + | :status: valid + + | .. feat_saf_dfa:: Persistency + | :verifies: feat_arc_sta__persistency__static + | :id: feat_saf_DFA__persistency__SC_01_05 + | :violation_id: SC_01_05 + | :violation_cause: Development fault (e.g. human error, insufficient qualification, insufficient methods). Only applicable if diverse development is needed. + | :mitigation: NONE + | :mitigation_issue: NONE + | :sufficient: yes + | :argument: Will be considered at feature platform DFA. + | :status: valid diff --git a/docs/features/persistency/kvs/safety_analysis/fmea.rst b/docs/features/persistency/kvs/safety_analysis/fmea.rst index 2e2bad76a0..b872eb7cb3 100644 --- a/docs/features/persistency/kvs/safety_analysis/fmea.rst +++ b/docs/features/persistency/kvs/safety_analysis/fmea.rst @@ -28,7 +28,7 @@ Persistency Safety Analysis .. feat_saf_fmea:: Persistency :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - :id: feat_saf_FMEA__persistency__message_nreived + :id: feat_saf_fmea__persistency__message_nreived :violation_id: MF_01_01 :violation_cause: Message is not received. :mitigates: aou_req__persistency__error_handling @@ -39,7 +39,7 @@ Persistency Safety Analysis .. feat_saf_fmea:: Persistency :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - :id: feat_saf_FMEA__persistency__late_message + :id: feat_saf_fmea__persistency__late_message :violation_id: MF_01_02 :violation_cause: message received too late. :mitigates: aou_req__persistency__error_handling @@ -50,7 +50,7 @@ Persistency Safety Analysis .. feat_saf_fmea:: Persistency :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - :id: feat_saf_FMEA__persistency__corrupted_message + :id: feat_saf_fmea__persistency__corrupted_message :violation_id: MF_01_05 :violation_cause: message is corrupted. :mitigates: aou_req__persistency__error_handling @@ -61,7 +61,7 @@ Persistency Safety Analysis .. feat_saf_fmea:: Persistency :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - :id: feat_saf_FMEA__persistency__not_sent + :id: feat_saf_fmea__persistency__not_sent :violation_id: MF_01_06 :violation_cause: message is not sent. :mitigates: aou_req__persistency__error_handling @@ -72,7 +72,7 @@ Persistency Safety Analysis .. feat_saf_fmea:: Persistency :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - :id: feat_saf_FMEA__persistency__unintendend + :id: feat_saf_fmea__persistency__unintendend :violation_id: MF_01_07 :violation_cause: message is unintended sent. :mitigates: aou_req__persistency__error_handling @@ -83,7 +83,7 @@ Persistency Safety Analysis .. feat_saf_fmea:: Persistency :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - :id: feat_saf_FMEA__persistency__calc_wrong + :id: feat_saf_fmea__persistency__calc_wrong :violation_id: EX_01_01 :violation_cause: Process calculates wrong result(s). :mitigates: aou_req__persistency__error_handling @@ -94,7 +94,7 @@ Persistency Safety Analysis .. feat_saf_fmea:: Persistency :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - :id: feat_saf_FMEA__persistency__too_slow + :id: feat_saf_fmea__persistency__too_slow :violation_id: EX_01_02 :violation_cause: processing too slow. :mitigates: aou_req__persistency__error_handling @@ -105,10 +105,10 @@ Persistency Safety Analysis .. feat_saf_fmea:: Persistency :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - :id: feat_saf_FMEA__persistency__too_fast + :id: feat_saf_fmea__persistency__too_fast :violation_id: EX_01_03 :violation_cause: processing too fast. - :mitigates: + :mitigates: aou_req__persistency__error_handling :sufficient: yes :status: valid @@ -116,7 +116,7 @@ Persistency Safety Analysis .. feat_saf_fmea:: Persistency :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - :id: feat_saf_FMEA__persistency__err_handl + :id: feat_saf_fmea__persistency__err_handl :violation_id: EX_01_04 :violation_cause: loss of execution. :mitigates: aou_req__persistency__error_handling @@ -127,10 +127,10 @@ Persistency Safety Analysis .. feat_saf_fmea:: Persistency :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - :id: feat_saf_FMEA__persistency__arbitrary + :id: feat_saf_fmea__persistency__arbitrary :violation_id: EX_01_05 :violation_cause: processing changes to arbitrary process. - :mitigates: + :mitigates: aou_req__persistency__error_handling :sufficient: yes :status: valid @@ -138,7 +138,7 @@ Persistency Safety Analysis .. feat_saf_fmea:: Persistency :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - :id: feat_saf_FMEA__persistency__infinite + :id: feat_saf_fmea__persistency__infinite :violation_id: EX_01_06 :violation_cause: processing is not complete (infinite loop). :mitigates: aou_req__persistency__error_handling From 5c790ee7bee818c5185fe87b60130c6f5c9d7562 Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Sat, 26 Jul 2025 00:06:21 +0200 Subject: [PATCH 037/109] delete missing link index --- docs/index.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index 2d0c18b49f..585089ecb0 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -132,7 +132,6 @@ Project structure and processes introduction/index requirements/index features/index - modules/index contribute/index Releases <score_releases/index.rst> Tools <score_tools/index.rst> From 1ce1f367993b3afb58ce3b2fd1393a7b74d75d20 Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Sat, 26 Jul 2025 00:06:21 +0200 Subject: [PATCH 038/109] correct linkage persistency --- .../features/persistency/kvs/architecture/index.rst | 2 +- .../persistency/docs/release/release_note.rst | 2 +- .../docs/safety_mgt/module_safety_package_fdr.rst | 2 +- .../docs/safety_mgt/module_safety_plan.rst | 13 +------------ .../docs/safety_mgt/module_safety_plan_fdr.rst | 2 +- .../verification/module_verification_report.rst | 2 +- .../json/docs/component_classification.rst | 2 +- .../modules/persistency/json/docs/index.rst | 2 +- .../persistency/kvs/docs/architecture/index.rst | 2 +- .../modules/persistency/kvs/docs/index.rst | 2 +- .../persistency/kvs/docs/requirements/index.rst | 2 +- .../persistency/kvs/docs/safety_analysis/dfa.rst | 2 +- .../persistency/kvs/docs/safety_analysis/fmea.rst | 2 +- 13 files changed, 13 insertions(+), 24 deletions(-) diff --git a/docs/features/persistency/kvs/architecture/index.rst b/docs/features/persistency/kvs/architecture/index.rst index 7520234734..ef1b9703fd 100644 --- a/docs/features/persistency/kvs/architecture/index.rst +++ b/docs/features/persistency/kvs/architecture/index.rst @@ -21,7 +21,7 @@ Architecture :id: doc__persistency_kvs_feat_arch :status: valid :safety: ASIL_B - :realizes: wp__feature_arch + :realizes: PROCESS_wp__feature_arch Overview -------- diff --git a/docs/features/persistency/modules/persistency/docs/release/release_note.rst b/docs/features/persistency/modules/persistency/docs/release/release_note.rst index 9ea8894c0c..934148e2cf 100644 --- a/docs/features/persistency/modules/persistency/docs/release/release_note.rst +++ b/docs/features/persistency/modules/persistency/docs/release/release_note.rst @@ -19,7 +19,7 @@ Release Note :id: doc__persistency_release_note :status: draft :safety: ASIL_B - :realizes: wp__module_sw_release_note + :realizes: PROCESS_wp__module_sw_release_note :tags: persistency | Module Name: Persistency diff --git a/docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_package_fdr.rst b/docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_package_fdr.rst index b91d7c4ce1..ec6149ac07 100644 --- a/docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_package_fdr.rst +++ b/docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_package_fdr.rst @@ -19,7 +19,7 @@ Safety Package Formal Review Report :id: doc__persistency_safety_package_fdr :status: valid :safety: ASIL_B - :realizes: wp__fdr_reports + :realizes: PROCESS_wp__fdr_reports :tags: persistency **1. Purpose** diff --git a/docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_plan.rst b/docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_plan.rst index 8259a68303..df3177606e 100644 --- a/docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_plan.rst +++ b/docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_plan.rst @@ -19,7 +19,7 @@ Module Safety Plan :id: doc__persistency_safety_plan :status: valid :safety: ASIL_B - :realizes: wp__module_safety_plan + :realizes: PROCESS_wp__module_safety_plan :tags: persistency Functional Safety Management Context @@ -165,13 +165,6 @@ Component <name> Workproducts List - :need:`doc__persistency_kvs_mod_req` - :ndf:`copy('status', need_id='doc__persistency_kvs_mod_req')` & WP below - * - :need:`PROCESS_wp__hsi` - - <Link to process> - - <automated> - - <Link to issue> - - <Link to WP> - - <automated> - * - :need:`PROCESS_wp__requirements__inspect` - :need:`PROCESS_gd_chklst__req__inspection` - :ndf:`copy('status', need_id='PROCESS_gd_chklst__req__inspection')` @@ -269,10 +262,6 @@ If the OSS element is classified as a - 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:`PROCESS_wp__hsi` - - n/a - - OSS needing special HW is an extreme exception. - * - :need:`PROCESS_wp__requirements__inspect` - n/a - Checklist used in Pull Request Review diff --git a/docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_plan_fdr.rst b/docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_plan_fdr.rst index 198e9489ef..56c8a9130f 100644 --- a/docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_plan_fdr.rst +++ b/docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_plan_fdr.rst @@ -19,7 +19,7 @@ Safety Plan Formal Review Report :id: doc__persistency_safety_plan_fdr :status: valid :safety: ASIL_B - :realizes: wp__fdr_reports + :realizes: PROCESS_wp__fdr_reports :tags: persistency **1. Purpose** diff --git a/docs/features/persistency/modules/persistency/docs/verification/module_verification_report.rst b/docs/features/persistency/modules/persistency/docs/verification/module_verification_report.rst index d7f7a21637..276cb12454 100644 --- a/docs/features/persistency/modules/persistency/docs/verification/module_verification_report.rst +++ b/docs/features/persistency/modules/persistency/docs/verification/module_verification_report.rst @@ -19,7 +19,7 @@ Verification Report :id: doc__persistency_verification_report :status: draft :safety: ASIL_B - :realizes: wp__verification__module_ver_report + :realizes: PROCESS_wp__verification__module_ver_report :tags: persistency diff --git a/docs/features/persistency/modules/persistency/json/docs/component_classification.rst b/docs/features/persistency/modules/persistency/json/docs/component_classification.rst index 98c20ecebd..f5ef186051 100644 --- a/docs/features/persistency/modules/persistency/json/docs/component_classification.rst +++ b/docs/features/persistency/modules/persistency/json/docs/component_classification.rst @@ -19,7 +19,7 @@ Component Classification :id: doc__persistency_component_classification :status: valid :safety: ASIL_B - :realizes: wp__sw_component_class + :realizes: PROCESS_wp__sw_component_class :tags: feature_persistency | Classification of Tiny JSON diff --git a/docs/features/persistency/modules/persistency/json/docs/index.rst b/docs/features/persistency/modules/persistency/json/docs/index.rst index 6477c794a9..64f5b47e5b 100644 --- a/docs/features/persistency/modules/persistency/json/docs/index.rst +++ b/docs/features/persistency/modules/persistency/json/docs/index.rst @@ -26,7 +26,7 @@ Tiny JSON :id: doc__persistencyjson :status: draft :safety: ASIL_B - :realizes: wp__cmpt_request + :realizes: PROCESS_wp__cmpt_request :tags: template diff --git a/docs/features/persistency/modules/persistency/kvs/docs/architecture/index.rst b/docs/features/persistency/modules/persistency/kvs/docs/architecture/index.rst index c43988e87c..0b44db85dd 100644 --- a/docs/features/persistency/modules/persistency/kvs/docs/architecture/index.rst +++ b/docs/features/persistency/modules/persistency/kvs/docs/architecture/index.rst @@ -21,7 +21,7 @@ Architecture :id: doc__persistency_kvs_mod_arch :status: draft :safety: ASIL_B - :realizes: wp__component_arch + :realizes: PROCESS_wp__component_arch Overview -------- diff --git a/docs/features/persistency/modules/persistency/kvs/docs/index.rst b/docs/features/persistency/modules/persistency/kvs/docs/index.rst index 5774c051e5..2ec3e716c1 100644 --- a/docs/features/persistency/modules/persistency/kvs/docs/index.rst +++ b/docs/features/persistency/modules/persistency/kvs/docs/index.rst @@ -21,7 +21,7 @@ KVS (Key Value Store) :id: doc__persistencykvs :status: draft :safety: ASIL_B - :realizes: wp__cmpt_request + :realizes: PROCESS_wp__cmpt_request :tags: Persistency KVS Abstract diff --git a/docs/features/persistency/modules/persistency/kvs/docs/requirements/index.rst b/docs/features/persistency/modules/persistency/kvs/docs/requirements/index.rst index 370bff3fd5..272f77ec77 100644 --- a/docs/features/persistency/modules/persistency/kvs/docs/requirements/index.rst +++ b/docs/features/persistency/modules/persistency/kvs/docs/requirements/index.rst @@ -19,7 +19,7 @@ Requirements :id: doc__persistency_kvs_mod_req :status: valid :safety: ASIL_B - :realizes: wp__component_req + :realizes: PROCESS_wp__requirements__comp .. comp_req:: Key Naming :id: comp_req__persistency__key_naming diff --git a/docs/features/persistency/modules/persistency/kvs/docs/safety_analysis/dfa.rst b/docs/features/persistency/modules/persistency/kvs/docs/safety_analysis/dfa.rst index 9331abfdc0..b84a58c0a0 100644 --- a/docs/features/persistency/modules/persistency/kvs/docs/safety_analysis/dfa.rst +++ b/docs/features/persistency/modules/persistency/kvs/docs/safety_analysis/dfa.rst @@ -20,7 +20,7 @@ Dependent Failure Analysis :id: doc__kvs_dfa :status: valid :safety: ASIL_B - :realizes: wp__sw_component_dfa + :realizes: PROCESS_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/features/persistency/modules/persistency/kvs/docs/safety_analysis/fmea.rst b/docs/features/persistency/modules/persistency/kvs/docs/safety_analysis/fmea.rst index cd3c070fe5..aa4073533a 100644 --- a/docs/features/persistency/modules/persistency/kvs/docs/safety_analysis/fmea.rst +++ b/docs/features/persistency/modules/persistency/kvs/docs/safety_analysis/fmea.rst @@ -20,7 +20,7 @@ Safety Analysis : FMEA :id: doc__kvs_fmea :status: valid :safety: ASIL_B - :realizes: wp__sw_component_safety_analysis + :realizes: PROCESS_wp__sw_component_safety_analysis :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_safety_analysis`. From 33eb0ac640f1179e69d97b5e32daec8e08344fcc Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Sat, 26 Jul 2025 00:07:38 +0200 Subject: [PATCH 039/109] fix filter safety plans --- docs/features/persistency/kvs/safety_planning/index.rst | 4 +++- .../persistency/docs/safety_mgt/module_safety_plan.rst | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/features/persistency/kvs/safety_planning/index.rst b/docs/features/persistency/kvs/safety_planning/index.rst index fba7464743..daa1f26710 100644 --- a/docs/features/persistency/kvs/safety_planning/index.rst +++ b/docs/features/persistency/kvs/safety_planning/index.rst @@ -95,6 +95,7 @@ Feature Requirements Status --------------------------- .. needtable:: + :filter: "persistency" in docname and "requirements" in docname and docname is not None :style: table :types: feat_req :tags: persistency @@ -106,6 +107,7 @@ Feature AoU Status ------------------ .. needtable:: + :filter: "persistency" in docname and "requirements" in docname and docname is not None :style: table :types: aou_req :tags: persistency @@ -117,10 +119,10 @@ Feature Architecture Status --------------------------- .. needtable:: + :filter: "persistency" in docname and "requirements" in docname and docname is not None :style: table :types: feat_arc_sta; feat_arc_dyn :tags: persistency :columns: id;status :colwidths: 25,25 :sort: title - diff --git a/docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_plan.rst b/docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_plan.rst index df3177606e..45095ddf17 100644 --- a/docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_plan.rst +++ b/docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_plan.rst @@ -305,6 +305,7 @@ Component Requirements Status ----------------------------- .. needtable:: + :filter: "persistency" in docname and "requirements" in docname and docname is not None :style: table :types: comp_req :tags: persistencykvs @@ -316,6 +317,7 @@ Component AoU Status -------------------- .. needtable:: + :filter: "persistency" in docname and "requirements" in docname and docname is not None :style: table :types: aou_req :tags: persistencykvs @@ -327,6 +329,7 @@ Component Architecture Status ----------------------------- .. needtable:: + :filter: "persistency" in docname and "requirements" in docname and docname is not None :style: table :types: comp_arc_sta; comp_arc_dyn :tags: persistencykvs From 35bb450a28636d7e013c3f0cf15f801500a9788e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Volker=20H=C3=A4ussler?= <volker.haeussler@qorix.ai> Date: Sat, 26 Jul 2025 00:07:39 +0200 Subject: [PATCH 040/109] Update fmea.rst MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Volker Häussler <volker.haeussler@qorix.ai> --- .../persistency/kvs/safety_analysis/fmea.rst | 112 +++++------------- 1 file changed, 31 insertions(+), 81 deletions(-) diff --git a/docs/features/persistency/kvs/safety_analysis/fmea.rst b/docs/features/persistency/kvs/safety_analysis/fmea.rst index b872eb7cb3..c08b9b8763 100644 --- a/docs/features/persistency/kvs/safety_analysis/fmea.rst +++ b/docs/features/persistency/kvs/safety_analysis/fmea.rst @@ -12,30 +12,44 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -Persistency Safety Analysis -########################### +Persistency FMEA +################ -.. document:: Safety Analysis - :id: doc__persistency_safety_analysis +.. document:: FMEA + :id: doc__persistency_fmea :status: draft :safety: ASIL_B :tags: feature_persistency - The FMEA is done by applying the fault model list. If a fault model doesn't apply, it is not listed here. - Persistency is developed in a full deterministic way. A failure will lead to a specified reaction of the persistency feature. - These failures must be handled by the application. Also failures that will lead to a unspecified usage of the feature - like signals were corrupted or messages are not sent. + For the FMEA analysis where the fault models :need:`gd_guidl__fault_models` are used. + The following fault models doesn't apply to the persistency feature: + + Fault models + ^^^^^^^^^^^^^ + - MF_01_03: Message received too early: Failure initiator not applicable at persistency, so no mitigation is needed. + - MF_01_04: message not received correctly by all recipients (different messages or messages partly lost): Failure initiator not applicable at persistency, so no mitigation is needed. + - MF_01_07: Message is unintended sent: Failure initiator not applicable at persistency. Feature developed fully deterministic, so no unintended messages are expected. + - CO_01_01: Minimum constraint boundary is violated: Failure initiator not applicable at persistency, so no mitigation is needed. + - CO_01_02: Maximum constraint boundary is violated: Failure initiator not applicable at persistency, so no mitigation is needed. + - EX_01_01: Process calculates wrong result(s): Failure initiator not applicable at persistency, so no mitigation is needed. The feature is developed fully deterministic, so no wrong results are expected caused by persistency + - EX_01_02: Processing too slow: Failure initiator not applicable at persistency. The feature is developed fully deterministic, so no processing too slow is expected caused by persistency. + - EX_01_03: Processing too fast: Failure initiator not applicable at persistency, so no mitigation is needed. The feature is developed fully deterministic, so no processing too fast is expected caused by persistency. + - EX_01_04: Loss of execution: Failure initiator not applicable at persistency, so no mitigation is needed. The feature is developed fully deterministic, so no loss of execution is expected caused by persistency. + - EX_01_05: Processing changes to arbitrary process: Failure initiator not applicable at persistency, so no mitigation is needed. + - EX_01_06: Processing is not complete (infinite loop): Failure initiator not applicable at persistency, so no mitigation is needed. The feature is developed fully deterministic, so no infinite loop is expected caused by persistency. + .. feat_saf_fmea:: Persistency :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore :id: feat_saf_fmea__persistency__message_nreived :violation_id: MF_01_01 - :violation_cause: Message is not received. + :violation_cause: Message is not received so the feature persistency is not available. :mitigates: aou_req__persistency__error_handling :sufficient: yes :status: valid - User is not able to use the feature. Middleware cant be used. + User is not able to use the feature. Middleware cant be used. User is not able to use the feature. Middleware cant be used. Loss of execution can only be caused by the application, not by the persistency feature itself. + Failure handling is addressed to the application by the aou_req__persistency__error_handling. .. feat_saf_fmea:: Persistency :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore @@ -46,13 +60,13 @@ Persistency Safety Analysis :sufficient: yes :status: valid - User is not able to use the feature. Middleware cant be used. + Subset of MF_01_01 if the delay is to long. .. feat_saf_fmea:: Persistency :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore :id: feat_saf_fmea__persistency__corrupted_message :violation_id: MF_01_05 - :violation_cause: message is corrupted. + :violation_cause: message is corrupted so the feature persistency is not available. :mitigates: aou_req__persistency__error_handling :sufficient: yes :status: valid @@ -63,86 +77,22 @@ Persistency Safety Analysis :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore :id: feat_saf_fmea__persistency__not_sent :violation_id: MF_01_06 - :violation_cause: message is not sent. - :mitigates: aou_req__persistency__error_handling - :sufficient: yes - :status: valid - - Covered by MF_01_01 - -.. feat_saf_fmea:: Persistency - :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - :id: feat_saf_fmea__persistency__unintendend - :violation_id: MF_01_07 - :violation_cause: message is unintended sent. + :violation_cause: message is not sent so the feature persistency is not available. :mitigates: aou_req__persistency__error_handling :sufficient: yes :status: valid - Covered by MF_01_01 - -.. feat_saf_fmea:: Persistency - :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - :id: feat_saf_fmea__persistency__calc_wrong - :violation_id: EX_01_01 - :violation_cause: Process calculates wrong result(s). - :mitigates: aou_req__persistency__error_handling - :sufficient: yes - :status: valid - - User is not able to use the feature. Middleware cant be used. - -.. feat_saf_fmea:: Persistency - :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - :id: feat_saf_fmea__persistency__too_slow - :violation_id: EX_01_02 - :violation_cause: processing too slow. - :mitigates: aou_req__persistency__error_handling - :sufficient: yes - :status: valid - - User is not able to use the feature. Middleware cant be used. - -.. feat_saf_fmea:: Persistency - :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - :id: feat_saf_fmea__persistency__too_fast - :violation_id: EX_01_03 - :violation_cause: processing too fast. - :mitigates: aou_req__persistency__error_handling - :sufficient: yes - :status: valid - - User is not able to use the feature. Middleware cant be used. + Covered by MF_01_01 because the violation cause is the same. .. feat_saf_fmea:: Persistency :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore :id: feat_saf_fmea__persistency__err_handl :violation_id: EX_01_04 - :violation_cause: loss of execution. - :mitigates: aou_req__persistency__error_handling - :sufficient: yes - :status: valid - - User is not able to use the feature. Middleware cant be used. - -.. feat_saf_fmea:: Persistency - :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - :id: feat_saf_fmea__persistency__arbitrary - :violation_id: EX_01_05 - :violation_cause: processing changes to arbitrary process. + :violation_cause: loss of execution will lead to an unavailability of the persistency feature. :mitigates: aou_req__persistency__error_handling :sufficient: yes :status: valid - User is not able to use the feature. Middleware cant be used. - -.. feat_saf_fmea:: Persistency - :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore - :id: feat_saf_fmea__persistency__infinite - :violation_id: EX_01_06 - :violation_cause: processing is not complete (infinite loop). - :mitigates: aou_req__persistency__error_handling - :sufficient: yes - :status: valid + User is not able to use the feature. Middleware cant be used. Loss of execution can only be caused by the application, not by the persistency feature itself. + Failure handling is addressed to the application by the aou_req__persistency__error_handling. - User is not able to use the feature. Middleware cant be used. From 47361325a701a24fc8db7c2fef3b8c0ed6ac55cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Volker=20H=C3=A4ussler?= <volker.haeussler@qorix.ai> Date: Sat, 26 Jul 2025 00:07:39 +0200 Subject: [PATCH 041/109] Update dfa.rst MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Volker Häussler <volker.haeussler@qorix.ai> add index.rst to modules update links solve documentation build errors update fmea template fix index file git index fix index update formate dfa and fmea --- docs/features/persistency/kvs/index.rst | 2 +- .../persistency/kvs/safety_analysis/dfa.rst | 456 +++--------------- .../persistency/kvs/safety_analysis/fmea.rst | 44 +- .../persistency/kvs/safety_planning/index.rst | 4 +- docs/features/persistency/modules/index.rst | 8 +- .../docs/safety_mgt/module_safety_plan.rst | 6 +- .../modules/persistency/kvs/docs/index.rst | 2 +- .../kvs/docs/safety_analysis/fmea.rst | 4 +- docs/index.rst | 1 + docs/modules/index.rst | 34 ++ 10 files changed, 130 insertions(+), 431 deletions(-) create mode 100644 docs/modules/index.rst diff --git a/docs/features/persistency/kvs/index.rst b/docs/features/persistency/kvs/index.rst index 7db04583aa..c4b5fe3baf 100644 --- a/docs/features/persistency/kvs/index.rst +++ b/docs/features/persistency/kvs/index.rst @@ -119,7 +119,7 @@ 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_safety_analysis` +: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 diff --git a/docs/features/persistency/kvs/safety_analysis/dfa.rst b/docs/features/persistency/kvs/safety_analysis/dfa.rst index 0e6ca4f7ae..f8d9fef4be 100644 --- a/docs/features/persistency/kvs/safety_analysis/dfa.rst +++ b/docs/features/persistency/kvs/safety_analysis/dfa.rst @@ -21,398 +21,64 @@ Persistency DFA :safety: ASIL_B :tags: feature_persistency - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SR_01_01 - | :violation_id: SR_01_01 - | :violation_cause: Reused software module - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: There are no reused software modules, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SR_01_02 - | :violation_id: SR_01_02 - | :violation_cause: Library fs - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: The file system fs is a library. No mitigation for persistency is needed, because is an elementary library without the functionalites of S-CORE are not availabe. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SR_01_02 - | :violation_id: SR_01_02 - | :violation_cause: Library json - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: JSON is a library. A mitigation might be needed but it will not be considered at persistency. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SR_01_04 - | :violation_id: SR_01_04 - | :violation_cause: Basic software - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: There are no basic software within persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SR_01_05 - | :violation_id: SR_01_05 - | :violation_cause: Operating system including scheduler - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Will be considered at feature platform DFA. Mitigation can't be handled at middleware. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SR_01_06 - | :violation_id: SR_01_06 - | :violation_cause: Any service stack, e.g. communication stack - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: There is no service stack at persistency used, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SR_01_07 - | :violation_id: SR_01_07 - | :violation_cause: Configuration data. Return values might be falsified. - | :mitigation: Integritry check feat_req__persistency__integrity_check - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Integrity check will fail, so the failure will be detected. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SR_01_09 - | :violation_id: SR_01_09 - | :violation_cause: Execution time. - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: There is timing impact at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SR_01_10 - | :violation_id: SR_01_10 - | :violation_cause: Allocated memory. - | :mitigation: < NONE|ID from Feature Requirement> - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: Acutally discussed in feature community. JSON can do it, but it should not be allowed. - | :status: <valid|invalid> - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__CO_01_01 - | :violation_id: CO_01_01 - | :violation_cause: Information passed via argument through a function call, or via writing/reading a variable being global to the two software functions (data flow) - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__CO_01_02 - | :violation_id: CO_01_02 - | :violation_cause: Data or message corruption / repetition / loss / delay / masquerading or incorrect addressing of information. - | :mitigation: < NONE|ID from Feature Requirement> feat_req__persistency__integrity_check? Maybe mitigation is needed. Persistency will be not available or be falsified executed. - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__CO_01_03 - | :violation_id: CO_01_03 - | :violation_cause: Insertion / sequence of information - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Subset of feat_saf_DFA__persistency__static CO_01_02 - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__CO_01_04 - | :violation_id: CO_01_04 - | :violation_cause: Corruption of information, inconsistent data - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Subset of feat_saf_DFA__persistency__static CO_01_02 - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__CO_01_05 - | :violation_id: CO_01_05 - | :violation_cause: Asymmetric information sent from a sender to multiple receivers, so that not all defined receivers have the same informations - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__CO_01_06 - | :violation_id: CO_01_06 - | :violation_cause: Information from a sender received by only a subset of the receivers. - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__CO_01_07 - | :violation_id: CO_01_07 - | :violation_cause: Blocking access to a communication channel - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SI_01_02 - | :violation_id: SI_01_02 - | :violation_cause: Configuration data. - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SI_01_03 - | :violation_id: SI_01_03 - | :violation_cause: Constants, or variables, being global to the two software functions. - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SI_01_04 - | :violation_id: SI_01_04 - | :violation_cause: Basic software passes data (read from hardware register and converted into logical information) to two applications software functions. - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SI_01_05 - | :violation_id: SI_01_05 - | :violation_cause: Data / function parameter arguments / messages delivered by software function to more than one other function. - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__UI_01_01 - | :violation_id: UI_01_01 - | :violation_cause: Memory miss-allocation and leaks. - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Will be considered at feature platform DFA. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__UI_01_02 - | :violation_id: UI_01_02 - | :violation_cause: Read/Write access to memory allocated to another software element. - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Will be considered at feature platform DFA. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__UI_01_03 - | :violation_id: UI_01_03 - | :violation_cause: Stack/Buffer under-/overflow. Might happens but very unlikely in RUST. Recursive functions could be the violation cause. - | :mitigation: < NONE|ID from Feature Requirement> Compilerüberwachung / AoU - | :mitigation_issue: <ID from Issue Tracker| None if no issue needed> - | :sufficient: <yes|no> - | :argument: <text to argument why mitigation is sufficient> - | :status: <valid|invalid> - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__UI_01_04 - | :violation_id: UI_01_04 - | :violation_cause: Deadlocks. - | :mitigation: aou_req__persistency__appl_design - | :mitigation_issue: None - | :sufficient: yes - | :argument: Deadlocks are not caused by the KVS, but by the application. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__UI_01_05 - | :violation_id: UI_01_05 - | :violation_cause: Livelocks - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Same consideration as done in feat_saf_DFA__persistency__static UI_01_04 - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__UI_01_06 - | :violation_id: UI_01_06 - | :violation_cause: Blocking of execution. - | :mitigation: aou_req__persistency__appl_exec - | :mitigation_issue: None - | :sufficient: yes - | :argument: Execution blocking will make persistency not available. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__UI_01_07 - | :violation_id: UI_01_07 - | :violation_cause: Incorrect allocation of execution time. - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__UI_01_08 - | :violation_id: UI_01_08 - | :violation_cause: Incorrect execution flow - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__UI_01_09 - | :violation_id: UI_01_09 - | :violation_cause: Incorrect synchronization between software elements - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__UI_01_10 - | :violation_id: UI_01_10 - | :violation_cause: CPU time depletion - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__UI_01_11 - | :violation_id: UI_01_11 - | :violation_cause: Memory depletion - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__UI_01_12 - | :violation_id: UI_01_12 - | :violation_cause: Other HW unavailability - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Failure initiator not applicable at persistency, so no mitigation is needed. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SC_01_02 - | :violation_id: SC_01_02 - | :violation_cause: Same development approaches (e.g. IDE, programming and/or modelling language) - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Will be considered at feature platform DFA. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SC_01_03 - | :violation_id: SC_01_03 - | :violation_cause: Same personal - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Will be considered at feature platform DFA. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SC_01_04 - | :violation_id: SC_01_04 - | :violation_cause: Same social-cultural context (even if different personnel). Only applicable if diverse development is needed. - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Will be considered at feature platform DFA. - | :status: valid - - | .. feat_saf_dfa:: Persistency - | :verifies: feat_arc_sta__persistency__static - | :id: feat_saf_DFA__persistency__SC_01_05 - | :violation_id: SC_01_05 - | :violation_cause: Development fault (e.g. human error, insufficient qualification, insufficient methods). Only applicable if diverse development is needed. - | :mitigation: NONE - | :mitigation_issue: NONE - | :sufficient: yes - | :argument: Will be considered at feature platform DFA. - | :status: valid + For the DFA analysis where the failure initiators :need:`PROCESS_gd_guidl__dfa_failure_initiators` are used. The analysis is done before the platform DFA is done. + Safety mechanisms that are used by many features are not considered here, but at the platform DFA. The analysis is only done for the needs of the persistency feature. + The components KVS and JSON will also be considered at the platform DFA. No additional violations within the persistency feature are expected. + + The following failure initiators doesn't apply to the persistency feature: + + Shared resources + - SR_01_01: Reused software module: No reused software modules are used. + - SR_01_02: Library: The file system fs is a library. It will be considered at the platform DFA. Same argument is used for the JSON library. + - SR_01_04: Basic software: No basic software is used. + - SR_01_05: Operating system including scheduler: Might be considered at the platform DFA or is out of scope. + - SR_01_06: Any service stack, e.g. communication stack: No service stack is used. + - SR_01_09: Execution time: There is no timing impact at persistency, so no mitigation is needed. + - SR_01_10: Allocated memory: Will be considered at the platform DFA. JSON can effect it, but it should not be allowed. + + Communication between the two elements + - CO_01_01: Information passed via argument through a function call, or via writing/reading a variable being global to the two software functions (data flow): Failure initiator not applicable at persistency, so no mitigation is needed. + - CO_01_02: Data or message corruption / repetition / loss / delay / masquerading or incorrect addressing of information: Persistency is developed fully deterministic. So no corruption, repetition, loss, delay, masquerading or incorrect addressing of information is expected. + - CO_01_03: Insertion / sequence of information: Subset of CO_01_02. + - CO_01_04: Corruption of information, inconsistent data: Subset of CO_01_02. + - CO_01_05: Asymmetric information sent from a sender to multiple receivers, so that not all defined receivers have the same informations: Failure initiator not applicable at persistency, so no mitigation is needed. + - CO_01_06: Information from a sender received by only a subset of the receivers: Failure initiator not applicable at persistency, so no mitigation is needed. + - CO_01_07: Blocking access to a communication channel: Failure initiator not applicable at persistency, so no mitigation is needed. + + Shared information inputs + - SI_01_02: Configuration data: Failure initiator not applicable at persistency, so no mitigation is needed. + - SI_01_03: Constants, or variables, being global to the two software functions: Failure initiator not applicable at persistency, so no mitigation is needed. + - SI_01_04: Basic software passes data (read from hardware register and converted into logical information) to two applications software functions: Failure initiator not applicable at persistency, so no mitigation is needed. + - SI_01_05: Data / function parameter arguments / messages delivered by software function to more than one other function: Failure initiator not applicable at persistency, so no mitigation is needed. + + Unintended impact + - UI_01_01: Memory miss-allocation and leaks: Will be considered at the platform DFA. + - UI_01_02: Read/Write access to memory allocated to another software element: Will be considered at the platform DFA. + - UI_01_03: Stack/Buffer under-/overflow: Might happens but very unlikely in RUST. Will be considered at the platform DFA. + - UI_01_04: Deadlocks: Deadlocks are not caused by the KVS, but by the application. + - UI_01_05: Livelocks: Same consideration as done in UI_01_04. + - UI_01_07: Incorrect allocation of execution time: Failure initiator not applicable at persistency, so no mitigation is needed. + - UI_01_08: Incorrect execution flow: Failure initiator not applicable at persistency, so no mitigation is needed. + - UI_01_09: Incorrect synchronization between software elements: Failure initiator not applicable at persistency, so no mitigation is needed. + - UI_01_10: CPU time depletion: Failure initiator not applicable at persistency, so no mitigation is needed. Will be anylysed at the platform DFA. + - UI_01_11: Memory depletion: Failure initiator not applicable at persistency, so no mitigation is needed. Will be anylysed at the platform DFA. + - UI_01_12: Other HW unavailability: Failure initiator not applicable at persistency, so no mitigation is needed. + + Development failure initiators + - SC_01_02: Same development approaches (e.g. IDE, programming and/or modelling language): Will be considered at feature platform DFA. + - SC_01_03: Same personal: Will be considered at feature platform DFA. + - SC_01_04: Same social-cultural context (even if different personnel): Will be considered at feature platform DFA. + - SC_01_05: Development fault (e.g. human error, insufficient qualification, insufficient methods): Will be considered at feature platform DFA. + + +.. feat_saf_dfa:: Persistency execution blocking + :violates: feat_arc_sta__persistency__static + :id: feat_saf_dfa__persistency__execution_blocking + :failure_id: UI_01_06 + :failure_effect: Blocking of execution. This will lead to a unavailability of the persistency feature. + :mitigated_by: aou_req__persistency__appl_exec + :mitigation_issue: + :sufficient: yes + :status: valid + + Execution blocking will make persistency not available. diff --git a/docs/features/persistency/kvs/safety_analysis/fmea.rst b/docs/features/persistency/kvs/safety_analysis/fmea.rst index c08b9b8763..66f62ef87e 100644 --- a/docs/features/persistency/kvs/safety_analysis/fmea.rst +++ b/docs/features/persistency/kvs/safety_analysis/fmea.rst @@ -21,11 +21,10 @@ Persistency FMEA :safety: ASIL_B :tags: feature_persistency - For the FMEA analysis where the fault models :need:`gd_guidl__fault_models` are used. + For the FMEA analysis where the fault models :need:`PROCESS_gd_guidl__fault_models` are used. The following fault models doesn't apply to the persistency feature: Fault models - ^^^^^^^^^^^^^ - MF_01_03: Message received too early: Failure initiator not applicable at persistency, so no mitigation is needed. - MF_01_04: message not received correctly by all recipients (different messages or messages partly lost): Failure initiator not applicable at persistency, so no mitigation is needed. - MF_01_07: Message is unintended sent: Failure initiator not applicable at persistency. Feature developed fully deterministic, so no unintended messages are expected. @@ -40,11 +39,11 @@ Persistency FMEA .. feat_saf_fmea:: Persistency - :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + :violates: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore :id: feat_saf_fmea__persistency__message_nreived - :violation_id: MF_01_01 - :violation_cause: Message is not received so the feature persistency is not available. - :mitigates: aou_req__persistency__error_handling + :fault_id: MF_01_01 + :failure_effect: Message is not received so the feature persistency is not available. + :mitigated_by: aou_req__persistency__error_handling :sufficient: yes :status: valid @@ -52,47 +51,46 @@ Persistency FMEA Failure handling is addressed to the application by the aou_req__persistency__error_handling. .. feat_saf_fmea:: Persistency - :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + :violates: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore :id: feat_saf_fmea__persistency__late_message - :violation_id: MF_01_02 - :violation_cause: message received too late. - :mitigates: aou_req__persistency__error_handling + :fault_id: MF_01_02 + :failure_effect: message received too late. + :mitigated_by: aou_req__persistency__error_handling :sufficient: yes :status: valid Subset of MF_01_01 if the delay is to long. .. feat_saf_fmea:: Persistency - :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + :violates: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore :id: feat_saf_fmea__persistency__corrupted_message - :violation_id: MF_01_05 - :violation_cause: message is corrupted so the feature persistency is not available. - :mitigates: aou_req__persistency__error_handling + :fault_id: MF_01_05 + :failure_effect: message is corrupted so the feature persistency is not available. + :mitigated_by: aou_req__persistency__error_handling :sufficient: yes :status: valid Covered by MF_01_01 .. feat_saf_fmea:: Persistency - :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + :violates: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore :id: feat_saf_fmea__persistency__not_sent - :violation_id: MF_01_06 - :violation_cause: message is not sent so the feature persistency is not available. - :mitigates: aou_req__persistency__error_handling + :fault_id: MF_01_06 + :failure_effect: message is not sent so the feature persistency is not available. + :mitigated_by: aou_req__persistency__error_handling :sufficient: yes :status: valid Covered by MF_01_01 because the violation cause is the same. .. feat_saf_fmea:: Persistency - :verifies: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore + :violates: feat_arc_dyn__persistency__check_key_default, feat_arc_dyn__persistency__delete_key, feat_arc_dyn__persistency__flush, feat_arc_dyn__persistency__read_key, feat_arc_dyn__persistency__read_from_storage, feat_arc_dyn__persistency__write_key, feat_arc_dyn__persistency__snapshot_restore :id: feat_saf_fmea__persistency__err_handl - :violation_id: EX_01_04 - :violation_cause: loss of execution will lead to an unavailability of the persistency feature. - :mitigates: aou_req__persistency__error_handling + :fault_id: EX_01_04 + :failure_effect: loss of execution will lead to an unavailability of the persistency feature. + :mitigated_by: aou_req__persistency__error_handling :sufficient: yes :status: valid User is not able to use the feature. Middleware cant be used. Loss of execution can only be caused by the application, not by the persistency feature itself. Failure handling is addressed to the application by the aou_req__persistency__error_handling. - diff --git a/docs/features/persistency/kvs/safety_planning/index.rst b/docs/features/persistency/kvs/safety_planning/index.rst index daa1f26710..92e5a2a9cf 100644 --- a/docs/features/persistency/kvs/safety_planning/index.rst +++ b/docs/features/persistency/kvs/safety_planning/index.rst @@ -55,11 +55,11 @@ Feature Safety Planning - :ref:`feature_architecture_PersistencyKvs` - valid - * - :need:`PROCESS_wp__feature_safety_analysis` + * - :need:`PROCESS_wp__feature_fmea` - :need:`PROCESS_gd_guidl__safety_analysis` - :ndf:`copy('status', need_id='PROCESS_gd_guidl__safety_analysis')` - https://github.com/eclipse-score/score/issues/965 - - :need:`doc__persistency_safety_analysis` + - :need:`doc__persistency_fmea` - valid * - :need:`PROCESS_wp__feature_dfa` diff --git a/docs/features/persistency/modules/index.rst b/docs/features/persistency/modules/index.rst index 5b67d461d7..93bb12eb0a 100644 --- a/docs/features/persistency/modules/index.rst +++ b/docs/features/persistency/modules/index.rst @@ -17,9 +17,6 @@ Modules ======= -.. image:: _assets/module_architecture.drawio.svg - :alt: Module Architecture - .. note:: For now, we store the modules documentation in the modules tree, because multi-repo docs are not yet supported. @@ -30,5 +27,8 @@ Modules .. toctree:: :maxdepth: 1 :glob: + :titlesonly: - ./*/index + persistency/docs/index + persistency/json/docs/index + persistency/kvs/docs/index diff --git a/docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_plan.rst b/docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_plan.rst index 45095ddf17..96aaa0615b 100644 --- a/docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_plan.rst +++ b/docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_plan.rst @@ -186,8 +186,8 @@ Component <name> Workproducts List - Checklist used in Pull Request Review - n/a - * - :need:`PROCESS_wp__sw_component_safety_analysis` - - :need:`PROCESS_wp__sw_component_safety_analysis` + * - :need:`PROCESS_wp__sw_component_fmea` + - :need:`PROCESS_wp__sw_component_fmea` - :ndf:`copy('status', need_id='PROCESS_gd_guidl__safety_analysis')` - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C965 - :need:`doc__kvs_fmea` @@ -270,7 +270,7 @@ If the OSS element is classified as a - <Link to issue> - <Reasoning for tailoring, needed for example in case of deficits in process Id 3&4 and complexity Ids 1&4> - * - :need:`PROCESS_wp__sw_component_safety_analysis` + * - :need:`PROCESS_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> diff --git a/docs/features/persistency/modules/persistency/kvs/docs/index.rst b/docs/features/persistency/modules/persistency/kvs/docs/index.rst index 2ec3e716c1..4cae409b04 100644 --- a/docs/features/persistency/modules/persistency/kvs/docs/index.rst +++ b/docs/features/persistency/modules/persistency/kvs/docs/index.rst @@ -108,7 +108,7 @@ 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_safety_analysis` +: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 diff --git a/docs/features/persistency/modules/persistency/kvs/docs/safety_analysis/fmea.rst b/docs/features/persistency/modules/persistency/kvs/docs/safety_analysis/fmea.rst index aa4073533a..7da762350f 100644 --- a/docs/features/persistency/modules/persistency/kvs/docs/safety_analysis/fmea.rst +++ b/docs/features/persistency/modules/persistency/kvs/docs/safety_analysis/fmea.rst @@ -20,7 +20,7 @@ Safety Analysis : FMEA :id: doc__kvs_fmea :status: valid :safety: ASIL_B - :realizes: PROCESS_wp__sw_component_safety_analysis + :realizes: PROCESS_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_safety_analysis`. +Because there is no sub-components in KVS, the results of the FMEA are the same as on feature level :need:`doc__persistency_fmea`. diff --git a/docs/index.rst b/docs/index.rst index 585089ecb0..2d0c18b49f 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -132,6 +132,7 @@ Project structure and processes introduction/index requirements/index features/index + modules/index contribute/index Releases <score_releases/index.rst> Tools <score_tools/index.rst> diff --git a/docs/modules/index.rst b/docs/modules/index.rst new file mode 100644 index 0000000000..5b67d461d7 --- /dev/null +++ b/docs/modules/index.rst @@ -0,0 +1,34 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +.. _modules: + +Modules +======= + +.. image:: _assets/module_architecture.drawio.svg + :alt: Module Architecture + + +.. note:: + For now, we store the modules documentation in the modules tree, because multi-repo docs are not yet supported. + Once this support becomes available it will be moved to the right repo. + + + +.. toctree:: + :maxdepth: 1 + :glob: + + ./*/index From 68bd3c3c9bae2e3352705e5ceaedc785c7651fda Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Sat, 26 Jul 2025 04:05:03 +0200 Subject: [PATCH 042/109] move modules under modules folder --- docs/features/persistency/modules/index.rst | 34 ------------------- .../modules/persistency/docs/index.rst | 0 .../modules/persistency/docs/manual/index.rst | 0 .../persistency/docs/manual/safety_manual.rst | 0 .../persistency/docs/release/release_note.rst | 0 .../persistency/docs/safety_mgt/index.rst | 0 .../safety_mgt/module_safety_package_fdr.rst | 0 .../docs/safety_mgt/module_safety_plan.rst | 0 .../safety_mgt/module_safety_plan_fdr.rst | 0 .../module_verification_report.rst | 0 .../json/docs/component_classification.rst | 0 .../modules/persistency/json/docs/index.rst | 0 .../kvs/docs/architecture/index.rst | 0 .../modules/persistency/kvs/docs/index.rst | 0 .../kvs/docs/requirements/index.rst | 0 .../kvs/docs/safety_analysis/dfa.rst | 0 .../kvs/docs/safety_analysis/fmea.rst | 0 17 files changed, 34 deletions(-) delete mode 100644 docs/features/persistency/modules/index.rst rename docs/{features/persistency => }/modules/persistency/docs/index.rst (100%) rename docs/{features/persistency => }/modules/persistency/docs/manual/index.rst (100%) rename docs/{features/persistency => }/modules/persistency/docs/manual/safety_manual.rst (100%) rename docs/{features/persistency => }/modules/persistency/docs/release/release_note.rst (100%) rename docs/{features/persistency => }/modules/persistency/docs/safety_mgt/index.rst (100%) rename docs/{features/persistency => }/modules/persistency/docs/safety_mgt/module_safety_package_fdr.rst (100%) rename docs/{features/persistency => }/modules/persistency/docs/safety_mgt/module_safety_plan.rst (100%) rename docs/{features/persistency => }/modules/persistency/docs/safety_mgt/module_safety_plan_fdr.rst (100%) rename docs/{features/persistency => }/modules/persistency/docs/verification/module_verification_report.rst (100%) rename docs/{features/persistency => }/modules/persistency/json/docs/component_classification.rst (100%) rename docs/{features/persistency => }/modules/persistency/json/docs/index.rst (100%) rename docs/{features/persistency => }/modules/persistency/kvs/docs/architecture/index.rst (100%) rename docs/{features/persistency => }/modules/persistency/kvs/docs/index.rst (100%) rename docs/{features/persistency => }/modules/persistency/kvs/docs/requirements/index.rst (100%) rename docs/{features/persistency => }/modules/persistency/kvs/docs/safety_analysis/dfa.rst (100%) rename docs/{features/persistency => }/modules/persistency/kvs/docs/safety_analysis/fmea.rst (100%) diff --git a/docs/features/persistency/modules/index.rst b/docs/features/persistency/modules/index.rst deleted file mode 100644 index 93bb12eb0a..0000000000 --- a/docs/features/persistency/modules/index.rst +++ /dev/null @@ -1,34 +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 - # ******************************************************************************* - -.. _modules: - -Modules -======= - - -.. note:: - For now, we store the modules documentation in the modules tree, because multi-repo docs are not yet supported. - Once this support becomes available it will be moved to the right repo. - - - -.. toctree:: - :maxdepth: 1 - :glob: - :titlesonly: - - persistency/docs/index - persistency/json/docs/index - persistency/kvs/docs/index diff --git a/docs/features/persistency/modules/persistency/docs/index.rst b/docs/modules/persistency/docs/index.rst similarity index 100% rename from docs/features/persistency/modules/persistency/docs/index.rst rename to docs/modules/persistency/docs/index.rst diff --git a/docs/features/persistency/modules/persistency/docs/manual/index.rst b/docs/modules/persistency/docs/manual/index.rst similarity index 100% rename from docs/features/persistency/modules/persistency/docs/manual/index.rst rename to docs/modules/persistency/docs/manual/index.rst diff --git a/docs/features/persistency/modules/persistency/docs/manual/safety_manual.rst b/docs/modules/persistency/docs/manual/safety_manual.rst similarity index 100% rename from docs/features/persistency/modules/persistency/docs/manual/safety_manual.rst rename to docs/modules/persistency/docs/manual/safety_manual.rst diff --git a/docs/features/persistency/modules/persistency/docs/release/release_note.rst b/docs/modules/persistency/docs/release/release_note.rst similarity index 100% rename from docs/features/persistency/modules/persistency/docs/release/release_note.rst rename to docs/modules/persistency/docs/release/release_note.rst diff --git a/docs/features/persistency/modules/persistency/docs/safety_mgt/index.rst b/docs/modules/persistency/docs/safety_mgt/index.rst similarity index 100% rename from docs/features/persistency/modules/persistency/docs/safety_mgt/index.rst rename to docs/modules/persistency/docs/safety_mgt/index.rst diff --git a/docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_package_fdr.rst b/docs/modules/persistency/docs/safety_mgt/module_safety_package_fdr.rst similarity index 100% rename from docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_package_fdr.rst rename to docs/modules/persistency/docs/safety_mgt/module_safety_package_fdr.rst diff --git a/docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_plan.rst b/docs/modules/persistency/docs/safety_mgt/module_safety_plan.rst similarity index 100% rename from docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_plan.rst rename to docs/modules/persistency/docs/safety_mgt/module_safety_plan.rst diff --git a/docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_plan_fdr.rst b/docs/modules/persistency/docs/safety_mgt/module_safety_plan_fdr.rst similarity index 100% rename from docs/features/persistency/modules/persistency/docs/safety_mgt/module_safety_plan_fdr.rst rename to docs/modules/persistency/docs/safety_mgt/module_safety_plan_fdr.rst diff --git a/docs/features/persistency/modules/persistency/docs/verification/module_verification_report.rst b/docs/modules/persistency/docs/verification/module_verification_report.rst similarity index 100% rename from docs/features/persistency/modules/persistency/docs/verification/module_verification_report.rst rename to docs/modules/persistency/docs/verification/module_verification_report.rst diff --git a/docs/features/persistency/modules/persistency/json/docs/component_classification.rst b/docs/modules/persistency/json/docs/component_classification.rst similarity index 100% rename from docs/features/persistency/modules/persistency/json/docs/component_classification.rst rename to docs/modules/persistency/json/docs/component_classification.rst diff --git a/docs/features/persistency/modules/persistency/json/docs/index.rst b/docs/modules/persistency/json/docs/index.rst similarity index 100% rename from docs/features/persistency/modules/persistency/json/docs/index.rst rename to docs/modules/persistency/json/docs/index.rst diff --git a/docs/features/persistency/modules/persistency/kvs/docs/architecture/index.rst b/docs/modules/persistency/kvs/docs/architecture/index.rst similarity index 100% rename from docs/features/persistency/modules/persistency/kvs/docs/architecture/index.rst rename to docs/modules/persistency/kvs/docs/architecture/index.rst diff --git a/docs/features/persistency/modules/persistency/kvs/docs/index.rst b/docs/modules/persistency/kvs/docs/index.rst similarity index 100% rename from docs/features/persistency/modules/persistency/kvs/docs/index.rst rename to docs/modules/persistency/kvs/docs/index.rst diff --git a/docs/features/persistency/modules/persistency/kvs/docs/requirements/index.rst b/docs/modules/persistency/kvs/docs/requirements/index.rst similarity index 100% rename from docs/features/persistency/modules/persistency/kvs/docs/requirements/index.rst rename to docs/modules/persistency/kvs/docs/requirements/index.rst diff --git a/docs/features/persistency/modules/persistency/kvs/docs/safety_analysis/dfa.rst b/docs/modules/persistency/kvs/docs/safety_analysis/dfa.rst similarity index 100% rename from docs/features/persistency/modules/persistency/kvs/docs/safety_analysis/dfa.rst rename to docs/modules/persistency/kvs/docs/safety_analysis/dfa.rst diff --git a/docs/features/persistency/modules/persistency/kvs/docs/safety_analysis/fmea.rst b/docs/modules/persistency/kvs/docs/safety_analysis/fmea.rst similarity index 100% rename from docs/features/persistency/modules/persistency/kvs/docs/safety_analysis/fmea.rst rename to docs/modules/persistency/kvs/docs/safety_analysis/fmea.rst From 79837a8ed1f82a5930daee95ed304eec268f7c3b Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Sat, 26 Jul 2025 04:21:11 +0200 Subject: [PATCH 043/109] enlarge toctree --- docs/modules/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/modules/index.rst b/docs/modules/index.rst index 5b67d461d7..f2453eff24 100644 --- a/docs/modules/index.rst +++ b/docs/modules/index.rst @@ -32,3 +32,4 @@ Modules :glob: ./*/index + ./*/*/index From 78b9cde5555925ad13ae85261e39f9422916b36f Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Sat, 26 Jul 2025 04:26:02 +0200 Subject: [PATCH 044/109] include json and kvs in toctree --- docs/modules/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/modules/index.rst b/docs/modules/index.rst index f2453eff24..e1f58b9dea 100644 --- a/docs/modules/index.rst +++ b/docs/modules/index.rst @@ -33,3 +33,4 @@ Modules ./*/index ./*/*/index + ./*/*/*/index From 0ae1523605e86bd6f7da61b7992a577d79aaac89 Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Sat, 26 Jul 2025 05:14:29 +0200 Subject: [PATCH 045/109] fix structure module folder --- docs/modules/index.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/modules/index.rst b/docs/modules/index.rst index e1f58b9dea..21b9b537f6 100644 --- a/docs/modules/index.rst +++ b/docs/modules/index.rst @@ -32,5 +32,4 @@ Modules :glob: ./*/index - ./*/*/index - ./*/*/*/index + persitency/*/index From 2db7ed877f54c7ee3834e4c9c0711ef3dd0b3b73 Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Sat, 26 Jul 2025 05:18:54 +0200 Subject: [PATCH 046/109] correct typo --- docs/modules/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/index.rst b/docs/modules/index.rst index 21b9b537f6..6e869faa16 100644 --- a/docs/modules/index.rst +++ b/docs/modules/index.rst @@ -32,4 +32,4 @@ Modules :glob: ./*/index - persitency/*/index + persistency/*/index From 9562264826d619a206e908d6b344b8104e1e893b Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Sat, 26 Jul 2025 05:23:28 +0200 Subject: [PATCH 047/109] add json and kvs to toctree --- docs/modules/index.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/modules/index.rst b/docs/modules/index.rst index 6e869faa16..b0f0e7ea42 100644 --- a/docs/modules/index.rst +++ b/docs/modules/index.rst @@ -33,3 +33,5 @@ Modules ./*/index persistency/*/index + persistency/json/*/index + persistency/kvs/*/index From f06bc33be617ab8a1d8bb10c83397b89cdd54dda Mon Sep 17 00:00:00 2001 From: pandaedo <volker.haeussler@qorix.ai> Date: Sat, 26 Jul 2025 05:34:17 +0200 Subject: [PATCH 048/109] change module structure --- docs/modules/index.rst | 3 --- docs/modules/persistency/index.rst | 32 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 docs/modules/persistency/index.rst diff --git a/docs/modules/index.rst b/docs/modules/index.rst index b0f0e7ea42..5b67d461d7 100644 --- a/docs/modules/index.rst +++ b/docs/modules/index.rst @@ -32,6 +32,3 @@ Modules :glob: ./*/index - persistency/*/index - persistency/json/*/index - persistency/kvs/*/index diff --git a/docs/modules/persistency/index.rst b/docs/modules/persistency/index.rst new file mode 100644 index 0000000000..be2a2bf678 --- /dev/null +++ b/docs/modules/persistency/index.rst @@ -0,0 +1,32 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +KVS Module +########## + +.. toctree:: + :titlesonly: + :maxdepth: 2 + + ./docs/index + +Components +========== + +.. toctree:: + :titlesonly: + :maxdepth: 1 + :glob: + + ./*/docs/index From 422c7525337b7293a3d312ef27ebbba31eb3e076 Mon Sep 17 00:00:00 2001 From: Alexandru Iulian <iulian.alexandru@continental-corporation.com> Date: Fri, 1 Aug 2025 12:00:12 +0300 Subject: [PATCH 049/109] json-lib: Rephrase comp_req__json__type_compatibility Co-authored-by: Ulrich Huber <ulrich@huberulrich.de> Signed-off-by: Alexandru Iulian <iulian.alexandru@continental-corporation.com> --- docs/modules/baselibs/json/docs/requirements/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/baselibs/json/docs/requirements/index.rst b/docs/modules/baselibs/json/docs/requirements/index.rst index 4aa1851fec..06544f68ff 100644 --- a/docs/modules/baselibs/json/docs/requirements/index.rst +++ b/docs/modules/baselibs/json/docs/requirements/index.rst @@ -85,7 +85,7 @@ User friendly API for information exchange :status: valid 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 of the stored JSON data. + validate that the requested return type is compatible with the type and value of the stored JSON data. Note: This includes checking if the stored value exceeds the range of the expected type. From a1ad69d9ed7b8d9a4d838d740471c6e87f1acc3d Mon Sep 17 00:00:00 2001 From: Alexandru Iulian <iulian.alexandru@continental-corporation.com> Date: Fri, 1 Aug 2025 12:22:15 +0300 Subject: [PATCH 050/109] json-lib: Add AOU requirements and small fixes Signed-off-by: Alexandru Iulian <iulian.alexandru@continental-corporation.com> --- docs/modules/baselibs/json/docs/index.rst | 5 +--- .../baselibs/json/docs/requirements/index.rst | 24 +++++++++++++++++-- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/docs/modules/baselibs/json/docs/index.rst b/docs/modules/baselibs/json/docs/index.rst index f3c84ec587..6aedbcab56 100644 --- a/docs/modules/baselibs/json/docs/index.rst +++ b/docs/modules/baselibs/json/docs/index.rst @@ -106,10 +106,7 @@ As there is currently no previous solution in S-CORE, no backwards compatibility Security Impact =============== -Assumptions of Use ----------------------------------------- -For access control and manipulation prevention (e.g. dm-verity) the hosting process and system configuration are responsible. -The integrity of input JSON data shall be ensured by the user. +[How could a malicious user take advantage of this new/modified component?] Safety Impact ============= diff --git a/docs/modules/baselibs/json/docs/requirements/index.rst b/docs/modules/baselibs/json/docs/requirements/index.rst index 06544f68ff..bd2b187d8b 100644 --- a/docs/modules/baselibs/json/docs/requirements/index.rst +++ b/docs/modules/baselibs/json/docs/requirements/index.rst @@ -78,7 +78,7 @@ User friendly API for information exchange .. comp_req:: Enforce strict type compatibility :id: comp_req__json__type_compatibility - :reqtype: Non-Functional + :reqtype: Functional :security: NO :safety: ASIL_B :satisfies: feat_req__baselibs__json_library @@ -110,9 +110,29 @@ Safety Impact .. comp_req:: JSON library ASIL level :id: comp_req__json__asil :reqtype: Functional - :security: YES + :security: NO :safety: ASIL_B :satisfies: feat_req__baselibs__json_library, feat_req__baselibs__safety :status: valid The JSON library shall be ASIL-B compliant. + +AoU Requirements +================= +.. aou_req:: JSON data integrity + :id: aou_req__json__data_integrity + :reqtype: Non-Functional + :security: NO + :safety: ASIL_B + :status: valid + + The integrity of input JSON data shall be ensured by the user. + +.. aou_req:: Access control + :id: aou_req__json__access_control + :reqtype: Non-Functional + :security: NO + :safety: ASIL_B + :status: valid + + Access control and manipulation prevention (e.g. dm-verity) shall be ensured by the hosting process and system configuration. \ No newline at end of file From 3f18d6596e1efc33c33183c84099ace7c30f9f49 Mon Sep 17 00:00:00 2001 From: aschemmel-git <alexander.schemmel@bmw.de> Date: Wed, 23 Jul 2025 14:55:05 +0200 Subject: [PATCH 051/109] Establish the CODEOWNER file for score repo --- .github/CODEOWNERS | 96 +++++++++++++++++------------- docs/contribute/general/folder.rst | 76 +++++++++++------------ 2 files changed, 90 insertions(+), 82 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index abd87424e5..c11690f647 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,46 +1,62 @@ -# Comment out as not in score yet -# * @eclipse-score/infrastructure-tooling-community -# .* @eclipse-score/infrastructure-tooling-community -# .github/CODEOWNERS @eclipse-score/technical-lead +# GitHub CODEOWNERS file is a simple way to automate review system on github, +# by automatically assigning owners to a pull request based on which files +# were modified. All directories should have a proper codeowner +# Syntax: https://help.github.com/articles/about-codeowners/ -# /docs @eclipse-score/process-community -# /docs/concepts @eclipse-score/automotive-score-committers -# /docs/glossary @eclipse-score/automotive-score-committers -# /docs/features @eclipse-score/technical-lead -# /docs/features/*/architecture @eclipse-score/automotive-score-committers -# /docs/features/*/requirements @eclipse-score/technical-lead -# /docs/features/*/safety_analysis @eclipse-score/safety-manager -# /docs/features/*/safety_planning @eclipse-score/safety-manager @eclipse-score/technical-lead -# /docs/features/*/verification @eclipse-score/quality-manager @eclipse-score/safety-manager -# /docs/manual @eclipse-score/automotive-score-committers -# /docs/overview @eclipse-score/project-lead -# /docs/pmp @eclipse-score/technical-lead @eclipse-score/process-community -# /docs/pmp/quality_management @eclipse-score/quality-manager -# /docs/pmp/safety_management @eclipse-score/safety-manager -# /docs/pmp/security_management @eclipse-score/security-manager -# /docs/requirements/stakeholder @eclipse-score/technical-lead -# /docs/requirements/tool @eclipse-score/infrastructure-tooling-community @eclipse-score/process-community -# /docs/release @eclipse-score/quality-manager @eclipse-score/technical-lead -# /docs/safety @eclipse-score/safety-manager @eclipse-score/technical-lead -# /docs/security @eclipse-score/security-manager @eclipse-score/technical-lead -# /docs/tutorials @eclipse-score/automotive-score-committers +# Interim solution, commented out is future solution +# * @eclipse-score/infrastructure-maintainers +* @AlexanderLanin @MaximilianSoerenPollak @dcalavrezo-qorix +# .* @eclipse-score/infrastructure-maintainers +.* @AlexanderLanin @MaximilianSoerenPollak @dcalavrezo-qorix +# .github/CODEOWNERS @eclipse-score/automotive-score-technical-leads +.github/CODEOWNERS @antonkri @FScholPer @qor-lb @johannes-esr @markert-r -# /examples @eclipse-score/automotive-score-committers -# /integration_tests @eclipse-score/automotive-score-committers -# /tools @eclipse-score/infrastructure-tooling-community +# /docs/ @eclipse-score/community-process +/docs/ @pahmann @PhilipPartsch @masc2023 @aschemmel-tech +/docs/contribute/ @eclipse-score/automotive-score-committers +# /docs/features/ @eclipse-score/automotive-score-technical-leads +/docs/features/ @antonkri @FScholPer @qor-lb @johannes-esr @markert-r +_assets/ @eclipse-score/automotive-score-committers +architecture/ @eclipse-score/automotive-score-committers +# requirements/ @eclipse-score/automotive-score-technical-leads +requirements/ @antonkri @FScholPer @qor-lb @johannes-esr @markert-r +# safety_analysis/ @eclipse-score/safety-managers +safety_analysis/ @aschemmel-tech @PhilipPartsch @masc2023 +# safety_planning/ @eclipse-score/automotive-score-technical-leads +safety_planning/ @antonkri @FScholPer @qor-lb @johannes-esr @markert-r +verification/ @eclipse-score/automotive-score-committers +/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/automotive-score-technical-leads +/docs/platform_management_plan/ @antonkri @FScholPer @qor-lb @johannes-esr @markert-r +# /docs/requirements/stakeholder/ @eclipse-score/automotive-score-technical-leads +/docs/requirements/stakeholder/ @antonkri @FScholPer @qor-lb @johannes-esr @markert-r +# /docs/requirements/tool/ @eclipse-score/community-process +/docs/requirements/tool/ @pahmann @PhilipPartsch @masc2023 @aschemmel-tech +# /docs/safety/ @eclipse-score/safety-managers +/docs/safety/ @aschemmel-tech @PhilipPartsch @masc2023 +# /docs/score_releases/ @eclipse-score/automotive-score-project-leads +/docs/score_releases/ @thilo-schmitt @HartmannNico @skappel29 @grandyholger +/docs/score_tools/ @eclipse-score/automotive-score-committers +# /docs/security/ @eclipse-score/security-managers +/docs/security/ @masc2023 +# /docs/verification_report @eclipse-score/automotive-score-technical-leads +/docs/verification_report @antonkri @FScholPer @qor-lb @johannes-esr @markert-r -# in separate process_description repository: -# -# /process @eclipse-score/process-community +/platform_integration_tests/ @eclipse-score/automotive-score-committers +# /tools/ @eclipse-score/infrastructure-maintainers +/tools/ @AlexanderLanin @MaximilianSoerenPollak @dcalavrezo-qorix # in separate <module_name> repositories: # -# /docs @eclipse-score/process-community -# /docs/manual @eclipse-score/<module_name>/safety-manager -# /docs/release @eclipse-score/<module_name>/quality-manager @eclipse-score/<module_name>/module-lead -# /docs/safety_plan @eclipse-score/<module_name>/safety-manager @eclipse-score/<module_name>/module-lead -# /docs/safety_analysis @eclipse-score/<module_name>/safety-manager -# /docs/verification @eclipse-score/<module_name>/quality-manager @eclipse-score/<module_name>/safety-manager -# /components @eclipse-score/<module_name>/technical-lead -# /components/*/ @eclipse-score/<module_name>/automotive-score-committers - +# * @eclipse-score/cft-<teamname> +# .* @eclipse-score/cft-<teamname> +# /docs @eclipse-score/community-process +# /docs/manual/safety_manual @eclipse-score/safety-managers +# /docs/release @eclipse-score/automotive-score-technical-leads +# /docs/safety_mgt @eclipse-score/safety-managers +# /docs/safety_mgt/module_safety_plan @eclipse-score/automotive-score-technical-leads +# /docs/verification_report @eclipse-score/automotive-score-technical-leads +# safety_analysis/ @eclipse-score/safety-managers diff --git a/docs/contribute/general/folder.rst b/docs/contribute/general/folder.rst index 1ae185c984..58545ad868 100644 --- a/docs/contribute/general/folder.rst +++ b/docs/contribute/general/folder.rst @@ -27,39 +27,35 @@ The following shows the folder structure of the platform repository (ordered alp docs/ -> Global documentation of the platform contribute/ -> Description on how to contribute features/ -> All features of the platform - <feature_name>/ -> Features including sub-folders and feature (change) request - docs/ -> Documentation of the feature - architecture/ -> Feature architecture [:need:`PROCESS_wp__feature_arch`] - requirements/ -> Feature requirements [:need:`PROCESS_wp__requirements__feat`] - safety_analysis/ -> Safety analysis on feature level [:need:`PROCESS_wp__feature_fmea`, :need:`PROCESS_wp__feature_dfa`, :need:`PROCESS_wp__platform_dfa`] - safety_planning/ -> Feature specific safety workproducts planning - verification/ -> Feature verification report (reporting all feature verifications) - [:need:`PROCESS_wp__verification__platform_ver_report`] - tests/ -> Feature tests, consisting of - integration-tests/ -> Integration tests [:need:`PROCESS_wp__verification__feat_int_test`] + <feature_name>/ -> Features including sub-folders and feature (change) request [:need:`PROCESS_wp__feat_request`] + architecture/ -> Feature architecture [:need:`PROCESS_wp__feature_arch`] + requirements/ -> Feature requirements [:need:`PROCESS_wp__requirements__feat`] + safety_analysis/ -> Safety analysis on feature level [:need:`PROCESS_wp__feature_fmea`], [:need:`PROCESS_wp__feature_dfa`] + safety_planning/ -> Feature specific safety workproducts planning + verification/ -> Feature verification, consisting of Architecture review [:need:`PROCESS_wp__sw_arch_verification`], + integration_tests/ -> Feature Integration tests [:need:`PROCESS_wp__verification__feat_int_test`] - toolchain/ -> Definition of toolchain glossary/ -> Glossary of abbreviations used in the platform context - manuals/ -> user and integration manual(s) - overview/ -> Introduction and high-level description - of the platform features. + introduction/ -> Background, scope and high-level architecture of the platform features + manuals/ -> User and integration manual(s) + modules/ -> Modules of the SW platform. platform_management_plan/ -> Overall Platform Management Plan [:need:`PROCESS_wp__platform_mgmt`] - score_releases/ -> [:need:`PROCESS_wp__platform_sw_release_note`] - safety/ -> safety documentation on platform level (SEooC): - [:need:`PROCESS_wp__feature_dfa`], [:need:`PROCESS_wp__platform_safety_manual`], + requirements/ -> Requirements on platform level + stakeholder/ -> Stakeholder requirements [:need:`PROCESS_wp__requirements__stkh`] + tool/ -> Tool requirements (not covered in tool repositories) + safety/ -> Safety documentation on platform level (SEooC): + [:need:`PROCESS_wp__platform_feature_dfa`], [:need:`PROCESS_wp__platform_safety_manual`], [:need:`PROCESS_wp__platform_safety_package`], [:need:`PROCESS_wp__fdr_reports`], [:need:`PROCESS_wp__audit_report`] - security/ -> security documentation on platform level - requirements/ -> requirements on platform level - stakeholder/ -> Stakeholder requirements [:need:`PROCESS_wp__requirements__stkh`] - - modules/ -> Modules of the SW platform. - platform_integration_tests/ -> Integration tests on reference hardware verifying stakeholder requirements. - - process/ -> process definition including workflows, workproducts, - roles, guidance [:need:`PROCESS_wp__process_definition`] + score_releases/ -> [:need:`PROCESS_wp__platform_sw_release_note`] + score_tools/ -> Tool list and [:need:`PROCESS_wp__tool_verification_report`] + security/ -> Security documentation on platform level: + [:need:`PROCESS_wp__platform_security_manual`], [:need:`PROCESS_wp__platform_security_package`], [:need:`PROCESS_wp__sw_platform_sbom`] + verification_report/ -> Platform verification report (reporting all platform feature's verifications) + [:need:`PROCESS_wp__verification__platform_ver_report`] - registry/ -> infrastructure configuration + platform_integration_tests/ -> Integration tests on reference hardware verifying stakeholder requirements. [:need:`PROCESS_wp__verification__platform_test`] + tools/ -> Platform tools (not covered in tool repositories) README.md -> Entrypoint of the repository @@ -78,14 +74,12 @@ The modules and components shall follow the folder structure which was presented safety manual [:need:`PROCESS_wp__requirements__comp_aou`], [:need:`PROCESS_wp__module_safety_manual`]. release/ -> Module release note [:need:`PROCESS_wp__module_sw_release_note`], - safety assessment [:need:`PROCESS_wp__audit_report`] - safety_plan/ -> Module safety plan [:need:`PROCESS_wp__module_safety_plan`], - module safety case [:need:`PROCESS_wp__module_safety_package`], - conformance reviews [:need:`PROCESS_wp__fdr_reports`] - safety_analysis/ -> Safety analysis on module level [:need:`PROCESS_wp__sw_component_dfa`] - verification/ -> Module verification report + safety_mgt/ -> Module safety plan [:need:`PROCESS_wp__module_safety_plan`], + module safety package [:need:`PROCESS_wp__module_safety_package`], + formal documents reviews [:need:`PROCESS_wp__fdr_reports`] + verification_report/ -> Module verification report components verifications [:need:`PROCESS_wp__verification__module_ver_report`], - safety analysis conformance reviews [:need:`PROCESS_wp__fdr_reports`] + safety analysis formal reviews [:need:`PROCESS_wp__fdr_reports`] <component_name>/ -> Components of the module. Folder containing all artifacts corresponding to one component. @@ -93,19 +87,17 @@ The modules and components shall follow the folder structure which was presented src/ -> Source files of the component consisting of Include files Source Files - Detailed Design [:need:`PROCESS_wp__sw_implementation`] Unit tests [:need:`PROCESS_wp__verification__sw_unit_test`] <lower_level_comp>/ -> lower level component following <component_name> folder structure docs/ -> Documentation of the component architecture/ -> Component architecture (only if lower level components exist) [:need:`PROCESS_wp__component_arch`]. + detailed_design/ -> Detailed Design [:need:`PROCESS_wp__sw_implementation`] requirements/ -> Component requirements [:need:`PROCESS_wp__requirements__comp`] - safety_analysis/ -> Safety analysis on component level - [:need:`PROCESS_wp__sw_component_fmea`, :need:`PROCESS_wp__sw_component_dfa` ] - verification/ -> Architecture review [:need:`PROCESS_wp__sw_arch_verification`], - code inspection [:need:`PROCESS_wp__sw_implementation_inspection`] + safety_analysis/ -> Safety analysis on component level (only if component architecture exists) + [:need:`PROCESS_wp__sw_component_fmea`], [:need:`PROCESS_wp__sw_component_dfa`] + verification/ -> Component verification, consisting of Architecture review [:need:`PROCESS_wp__sw_arch_verification`], + code inspection [:need:`PROCESS_wp__sw_implementation_inspection`], + integration_tests/ -> Component integration tests [:need:`PROCESS_wp__verification__comp_int_test`] <lower_level_comp>/ -> Lower level component following <component_name> folder structure - - tests/ -> Feature level tests, consisting of - integration tests [:need:`PROCESS_wp__verification__comp_int_test`] From 7255fab42ce5943ac5f9496665870f4a9bd0e361 Mon Sep 17 00:00:00 2001 From: aschemmel-git <alexander.schemmel@bmw.de> Date: Mon, 28 Jul 2025 08:59:47 +0200 Subject: [PATCH 052/109] Establish CODEOWNERS score repo - fixes --- .github/CODEOWNERS | 8 +++++--- docs/contribute/general/folder.rst | 14 ++++++++++++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index c11690f647..c9476b711c 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -13,10 +13,10 @@ # /docs/ @eclipse-score/community-process /docs/ @pahmann @PhilipPartsch @masc2023 @aschemmel-tech +/docs/conf.py @AlexanderLanin @MaximilianSoerenPollak @dcalavrezo-qorix /docs/contribute/ @eclipse-score/automotive-score-committers # /docs/features/ @eclipse-score/automotive-score-technical-leads /docs/features/ @antonkri @FScholPer @qor-lb @johannes-esr @markert-r -_assets/ @eclipse-score/automotive-score-committers architecture/ @eclipse-score/automotive-score-committers # requirements/ @eclipse-score/automotive-score-technical-leads requirements/ @antonkri @FScholPer @qor-lb @johannes-esr @markert-r @@ -31,6 +31,8 @@ verification/ @eclipse-score/automotive-score-committers /docs/modules/ @eclipse-score/automotive-score-committers # /docs/platform_management_plan/ @eclipse-score/automotive-score-technical-leads /docs/platform_management_plan/ @antonkri @FScholPer @qor-lb @johannes-esr @markert-r +# /docs/quality/ @eclipse-score/quality-managers +/docs/quality/ @masc2023 @pahmann # /docs/requirements/stakeholder/ @eclipse-score/automotive-score-technical-leads /docs/requirements/stakeholder/ @antonkri @FScholPer @qor-lb @johannes-esr @markert-r # /docs/requirements/tool/ @eclipse-score/community-process @@ -51,8 +53,8 @@ verification/ @eclipse-score/automotive-score-committers # in separate <module_name> repositories: # -# * @eclipse-score/cft-<teamname> -# .* @eclipse-score/cft-<teamname> +# * @eclipse-score/ft-<teamname> +# .* @eclipse-score/ft-<teamname> # /docs @eclipse-score/community-process # /docs/manual/safety_manual @eclipse-score/safety-managers # /docs/release @eclipse-score/automotive-score-technical-leads diff --git a/docs/contribute/general/folder.rst b/docs/contribute/general/folder.rst index 58545ad868..3a9d037a01 100644 --- a/docs/contribute/general/folder.rst +++ b/docs/contribute/general/folder.rst @@ -32,6 +32,7 @@ The following shows the folder structure of the platform repository (ordered alp requirements/ -> Feature requirements [:need:`PROCESS_wp__requirements__feat`] safety_analysis/ -> Safety analysis on feature level [:need:`PROCESS_wp__feature_fmea`], [:need:`PROCESS_wp__feature_dfa`] safety_planning/ -> Feature specific safety workproducts planning + security_analysis/ -> Security analysis on feature level [:need:`PROCESS_wp__feature_security_analysis`] verification/ -> Feature verification, consisting of Architecture review [:need:`PROCESS_wp__sw_arch_verification`], integration_tests/ -> Feature Integration tests [:need:`PROCESS_wp__verification__feat_int_test`] @@ -40,11 +41,13 @@ The following shows the folder structure of the platform repository (ordered alp manuals/ -> User and integration manual(s) modules/ -> Modules of the SW platform. platform_management_plan/ -> Overall Platform Management Plan [:need:`PROCESS_wp__platform_mgmt`] + quality/ -> Quality documentation on platform level: + [:need:`PROCESS_wp__qms_report`] requirements/ -> Requirements on platform level stakeholder/ -> Stakeholder requirements [:need:`PROCESS_wp__requirements__stkh`] tool/ -> Tool requirements (not covered in tool repositories) safety/ -> Safety documentation on platform level (SEooC): - [:need:`PROCESS_wp__platform_feature_dfa`], [:need:`PROCESS_wp__platform_safety_manual`], + [:need:`PROCESS_wp__platform_dfa`], [:need:`PROCESS_wp__platform_safety_manual`], [:need:`PROCESS_wp__platform_safety_package`], [:need:`PROCESS_wp__fdr_reports`], [:need:`PROCESS_wp__audit_report`] score_releases/ -> [:need:`PROCESS_wp__platform_sw_release_note`] @@ -72,11 +75,16 @@ The modules and components shall follow the folder structure which was presented docs/ -> Documentation of the module manual/ -> Module manual, e.g. integration manual, assumptions of use, safety manual [:need:`PROCESS_wp__requirements__comp_aou`], - [:need:`PROCESS_wp__module_safety_manual`]. + [:need:`PROCESS_wp__module_safety_manual`], + security_manual [:need:`PROCESS_wp__module_security_manual`]. release/ -> Module release note [:need:`PROCESS_wp__module_sw_release_note`], safety_mgt/ -> Module safety plan [:need:`PROCESS_wp__module_safety_plan`], module safety package [:need:`PROCESS_wp__module_safety_package`], formal documents reviews [:need:`PROCESS_wp__fdr_reports`] + security_mgt/ -> Module security plan [:need:`PROCESS_wp__module_security_plan`], + module securty package [:need:`PROCESS_wp__module_security_package`], + formal documents reviews [:need:`PROCESS_wp__fdr_reports_security`], + module SW bill of material [:need:`PROCESS_wp__sw_module_sbom`] verification_report/ -> Module verification report components verifications [:need:`PROCESS_wp__verification__module_ver_report`], safety analysis formal reviews [:need:`PROCESS_wp__fdr_reports`] @@ -97,6 +105,8 @@ The modules and components shall follow the folder structure which was presented requirements/ -> Component requirements [:need:`PROCESS_wp__requirements__comp`] safety_analysis/ -> Safety analysis on component level (only if component architecture exists) [:need:`PROCESS_wp__sw_component_fmea`], [:need:`PROCESS_wp__sw_component_dfa`] + security_analysis/ -> Security analysis on component level (only if component architecture exists) + [:need:`PROCESS_wp__sw_component_security_analysis`] verification/ -> Component verification, consisting of Architecture review [:need:`PROCESS_wp__sw_arch_verification`], code inspection [:need:`PROCESS_wp__sw_implementation_inspection`], integration_tests/ -> Component integration tests [:need:`PROCESS_wp__verification__comp_int_test`] From a8a14fb15c5f713803e71f7e98c4a015ed1257cb Mon Sep 17 00:00:00 2001 From: Nicolae Dicu <nicolae.dicu.ext@qorix.ai> Date: Tue, 5 Aug 2025 16:11:25 +0300 Subject: [PATCH 053/109] docs: Fix persistency tags Persistency tags to be added only to needs from persistency/kvs/requirements. Signed-off-by: Nicolae Dicu <nicolae.dicu.ext@qorix.ai> --- docs/features/persistency/kvs/requirements/index.rst | 2 +- docs/modules/persistency/kvs/docs/requirements/index.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/features/persistency/kvs/requirements/index.rst b/docs/features/persistency/kvs/requirements/index.rst index 75e90c8d21..774a2fd640 100644 --- a/docs/features/persistency/kvs/requirements/index.rst +++ b/docs/features/persistency/kvs/requirements/index.rst @@ -301,7 +301,7 @@ Requirements The Key-Value-Storage shall support concurrent intra-process data access. -.. needextend:: docname is not None +.. needextend:: docname is not None and "persistency/kvs/requirements" in docname :+tags: persistency AoU Requirements diff --git a/docs/modules/persistency/kvs/docs/requirements/index.rst b/docs/modules/persistency/kvs/docs/requirements/index.rst index 272f77ec77..9bd40a6846 100644 --- a/docs/modules/persistency/kvs/docs/requirements/index.rst +++ b/docs/modules/persistency/kvs/docs/requirements/index.rst @@ -389,5 +389,5 @@ Requirements The component shall provide an API for registering callbacks that are triggered by data change events. -.. needextend:: docname is not None +.. needextend:: docname is not None and "persistency/kvs/requirements" in docname :+tags: persistencykvs From 96b083c0708ea5e568e1b03c126fee86bbdc1319 Mon Sep 17 00:00:00 2001 From: Alexandru Iulian <iulian.alexandru@continental-corporation.com> Date: Thu, 7 Aug 2025 15:40:17 +0300 Subject: [PATCH 054/109] json-lib: Add optional future extensions. Signed-off-by: Alexandru Iulian <iulian.alexandru@continental-corporation.com> --- docs/modules/baselibs/json/docs/index.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/modules/baselibs/json/docs/index.rst b/docs/modules/baselibs/json/docs/index.rst index 6aedbcab56..b3b4d00d04 100644 --- a/docs/modules/baselibs/json/docs/index.rst +++ b/docs/modules/baselibs/json/docs/index.rst @@ -44,6 +44,10 @@ Future Extensions ---------------------- The component shall support a future extension for serializing from user format into JSON data. +Optional extensions which may be added if required: + +* JSON schema validation. +* Compile-time parsing (used for test purposes to ensure that a component with errors cannot exist even in the absence of a pipeline). Motivation ========== From 06964a02c797ff0540fcbd3c1aa9dee907b86b5c Mon Sep 17 00:00:00 2001 From: Andrey Babanin <andrey.babanin@bmw.de> Date: Tue, 22 Jul 2025 16:56:18 +0200 Subject: [PATCH 055/109] docs: add Result Library requirements --- .../baselibs/docs/requirements/index.rst | 10 ++ docs/modules/baselibs/result/docs/index.rst | 21 +++ .../baselibs/result/docs/requirements.rst | 128 ++++++++++++++++++ 3 files changed, 159 insertions(+) create mode 100644 docs/modules/baselibs/result/docs/index.rst create mode 100644 docs/modules/baselibs/result/docs/requirements.rst diff --git a/docs/features/baselibs/docs/requirements/index.rst b/docs/features/baselibs/docs/requirements/index.rst index 581c47e83d..3363993a88 100644 --- a/docs/features/baselibs/docs/requirements/index.rst +++ b/docs/features/baselibs/docs/requirements/index.rst @@ -84,3 +84,13 @@ Requirements :status: valid The base libraries shall provide a JSON-Library with parsing functionality. + +.. feat_req:: Exception-Free Development Support + :id: feat_req__baselibs__result_library + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__functional_req__base_libraries + :status: valid + + The base libraries shall provide error handling mechanisms that enable development without relying on C++ exceptions. diff --git a/docs/modules/baselibs/result/docs/index.rst b/docs/modules/baselibs/result/docs/index.rst new file mode 100644 index 0000000000..d3999ea949 --- /dev/null +++ b/docs/modules/baselibs/result/docs/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 + # ******************************************************************************* + +result +###### + +.. toctree:: + :hidden: + + requirements diff --git a/docs/modules/baselibs/result/docs/requirements.rst b/docs/modules/baselibs/result/docs/requirements.rst new file mode 100644 index 0000000000..5736c332ee --- /dev/null +++ b/docs/modules/baselibs/result/docs/requirements.rst @@ -0,0 +1,128 @@ +.. + # ******************************************************************************* + # 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:: Result Library Requirements + :id: doc__result_lib_requirements + :status: draft + :safety: ASIL_B + :realizes: PROCESS_wp__requirements__comp + :tags: requirements, result_library + +Functional Requirements +======================= + +.. comp_req:: Result-Based Error Handling + :id: comp_req__result__error_handling + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__result_library, feat_req__baselibs__safety + :status: valid + + The Result library shall provide an error handling mechanism that enables functions to return either successful values or error information without using C++ exceptions. + +.. comp_req:: Domain-Specific Error Information + :id: comp_req__result__domain_error_information + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__result_library, feat_req__baselibs__safety + :status: valid + + The Result library shall support user-defined error domains and error codes. + +.. comp_req:: Type-Safe Error Handling + :id: comp_req__result__type_safety + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__consistent_apis, feat_req__baselibs__safety + :status: valid + + The Result library shall enforce compile-time type safety for error handling operations. + +.. comp_req:: Standard Library Integration + :id: comp_req__result__std_integration + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__consistent_apis, feat_req__baselibs__safety + :status: valid + + The Result library shall provide conversion utilities to transform Result objects into standard library optional type, with enforced error handling. + +Non-Functional Requirements +=========================== + +.. comp_req:: Deterministic Behavior + :id: comp_req__result__deterministic_behavior + :reqtype: Non-Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__safety + :status: valid + + The Result library shall provide deterministic behavior with no dynamic memory allocation. + +.. comp_req:: Exception-Free Operation + :id: comp_req__result__exception_free_operation + :reqtype: Non-Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__core_utilities, feat_req__baselibs__safety + :status: valid + + The Result library shall operate without throwing C++ exceptions. + +Assumptions of Use (AoU) +======================== + +.. aou_req:: Error Domain Implementation + :id: aou_req__result__error_domain_implementation + :reqtype: Functional + :security: NO + :safety: ASIL_B + :status: valid + + The user shall implement error domain classes and error code enumerations according to the library's interface specification. + +.. aou_req:: Result Value Handling + :id: aou_req__result__value_handling + :reqtype: Functional + :security: NO + :safety: ASIL_B + :status: valid + + The user shall check and handle both successful and error states of Result objects before accessing contained values to prevent undefined behavior. + +.. aou_req:: Thread Safety + :id: aou_req__result__thread_safety + :reqtype: Non-Functional + :security: NO + :safety: ASIL_B + :status: valid + + The user shall ensure appropriate synchronization mechanisms when using Result objects in multi-threaded environments, as the library provides no internal thread safety guarantees. + +.. aou_req:: Resource Lifetime + :id: aou_req__result__resource_lifetime + :reqtype: Non-Functional + :security: NO + :safety: ASIL_B + :status: valid + + The user shall ensure that error domain objects and referenced resources remain valid throughout the entire lifetime of any dependent Result or Error objects. From 8e25ae3653b8b231098708abc02f25140ad312c3 Mon Sep 17 00:00:00 2001 From: Arvid Sievert <arvid.sievert@etas.com> Date: Mon, 11 Aug 2025 15:17:50 +0200 Subject: [PATCH 056/109] modules: update modul overview for logging components (#1608) - update Logging API Block for Rust. It shows that we use a facade - update color of logging datarouter to show that is implemented in C++ --- docs/modules/_assets/module_architecture.drawio.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/_assets/module_architecture.drawio.svg b/docs/modules/_assets/module_architecture.drawio.svg index cb0263989e..9a04c5b5e9 100644 --- a/docs/modules/_assets/module_architecture.drawio.svg +++ b/docs/modules/_assets/module_architecture.drawio.svg @@ -1,4 +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: transparent; background-color: transparent; color-scheme: light dark;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="2191px" height="1361px" viewBox="-0.5 -0.5 2191 1361" content="<mxfile host="Electron" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/26.2.15 Chrome/134.0.6998.205 Electron/35.2.1 Safari/537.36" version="26.2.15" pages="2"> <diagram name="1.0 Module Architecture" id="kHHpjcKEgZkgKQ2km6BW"> <mxGraphModel dx="3130" dy="1522" grid="0" 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="X8Ibqyh2nUvShLqAq-5g-0" /> <mxCell id="X8Ibqyh2nUvShLqAq-5g-1" parent="X8Ibqyh2nUvShLqAq-5g-0" /> <object label="baselibs" score-type="module" id="X8Ibqyh2nUvShLqAq-5g-2"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1200" y="850" width="630" height="230" as="geometry" /> </mxCell> </object> <object label="baselibs" score-type="module" id="X8Ibqyh2nUvShLqAq-5g-3"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="20" y="850" width="1160" height="230" as="geometry" /> </mxCell> </object> <object label="logging" score-type="module" id="X8Ibqyh2nUvShLqAq-5g-7"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="740" y="566.25" width="330" height="260" as="geometry" /> </mxCell> </object> <object label="feo" score-type="module" id="X8Ibqyh2nUvShLqAq-5g-9"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="15" y="267.81" width="450" height="267.5" as="geometry" /> </mxCell> </object> <mxCell id="X8Ibqyh2nUvShLqAq-5g-10" value="component" style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="50" y="1150" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="X8Ibqyh2nUvShLqAq-5g-11" value="bazel module/&lt;div&gt;repository&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="190" y="1150" width="130" height="60" as="geometry" /> </mxCell> <object label="feo-time" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-12"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="305" y="308.44" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="feo-com" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-13"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="45" y="378.44" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="feo-log" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-15"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="175" y="378.44" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="communication" score-type="module" id="X8Ibqyh2nUvShLqAq-5g-21"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="20" y="566.25" width="460" height="250" as="geometry" /> </mxCell> </object> <object label="feo-tracing" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-22"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;dashed=1;dashPattern=8 8;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="305" y="378.44" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="feo" score-type="component" placeholders="null" id="X8Ibqyh2nUvShLqAq-5g-23"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="45" y="308.44" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="mw::com Frontend" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-24"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#d6b656;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=20;fontColor=default;fillColor=#ccd6ff;gradientColor=#FFF2CC;gradientDirection=north;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="45" y="627.19" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="Logging API" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-25"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="774" y="616.25" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="feo-cpp" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-27"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#ccd6ff;strokeColor=#d6b656;gradientColor=#FFF2CC;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="175" y="308.44" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="ipc-binding (LoLa)" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-28"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="45" y="717.19" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="mw::com Frontend" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-29"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="185" y="627.19" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="Mock binding" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-30"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="185" y="717.19" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="lola- configuration" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-31"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="320" y="717.19" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="memory" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-32"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="40" y="890" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="message passing" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-33"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="180" y="890" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="json" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-34"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="320" y="890" width="120" height="60" as="geometry" /> </mxCell> </object> <mxCell id="X8Ibqyh2nUvShLqAq-5g-35" value="C++&lt;div&gt;component&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="50" y="1220" width="120" height="60" as="geometry" /> </mxCell> <object label="osal" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-36"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="460" y="890" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="Logging API" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-37"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#d6b656;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=20;fillColor=#fff2cc;gradientDirection=north;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="909" y="616.25" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="Filesystem" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-38"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="600" y="890" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="persistency" score-type="module" id="X8Ibqyh2nUvShLqAq-5g-45"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1090" y="566.25" width="170" height="263.75" as="geometry" /> </mxCell> </object> <object label="kvs" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-46"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#d6b656;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=20;fillColor=#fff2cc;gradientDirection=north;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1110" y="616.25" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="kvs" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-47"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#6c8ebf;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=20;fillColor=#dae8fc;gradientDirection=north;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1110" y="700" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="filesystem" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-48"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;dashed=1;dashPattern=8 8;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1380" y="890" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="json" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-49"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;dashed=1;dashPattern=8 8;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1220" y="890" width="145" height="60" as="geometry" /> </mxCell> </object> <object label="Result" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-50"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="735" y="890" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="orchestration" score-type="module" id="X8Ibqyh2nUvShLqAq-5g-55"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1280" y="566.25" width="300" height="263.75" as="geometry" /> </mxCell> </object> <object label="runtime" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-56"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#d6b656;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=20;fillColor=#fff2cc;gradientDirection=north;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1300" y="676.25" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="orchestration" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-57"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#d6b656;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=20;fillColor=#fff2cc;gradientDirection=north;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1300" y="596.25" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="std replacement" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-58"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#d6b656;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=20;fillColor=#fff2cc;gradientDirection=north;dashed=1;dashPattern=8 8;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1515" y="890" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="orchestration cpp" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-59"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#d6b656;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=20;fillColor=#ccd6ff;gradientDirection=south;fontColor=default;gradientColor=#FFF2CC;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1440" y="596.25" width="120" height="60" as="geometry" /> </mxCell> </object> <mxCell id="X8Ibqyh2nUvShLqAq-5g-60" value="Rust&amp;nbsp;&lt;div&gt;component&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="45" y="1290" width="125" height="60" as="geometry" /> </mxCell> <object label="futurecpp" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-61"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="40" y="980" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="bitmanipulation" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-62"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="170" y="980" width="140" height="60" as="geometry" /> </mxCell> </object> <object label="concurrency" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-63"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="319" y="980" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="containers" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-64"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="459" y="980" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="safecpp" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-65"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="599" y="980" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="utils" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-66"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="739" y="980" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="static_reflection_&lt;br&gt;with_serialization" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-67"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="990" y="980" width="176" height="60" as="geometry" /> </mxCell> </object> <object label="daal?" score-type="component" id="cyVkqPuj_zZxdIbUwScy-0"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="305" y="448.44" width="120" height="60" as="geometry" /> </mxCell> </object> <mxCell id="cyVkqPuj_zZxdIbUwScy-2" value="" style="endArrow=none;dashed=1;html=1;rounded=0;strokeWidth=3;" parent="X8Ibqyh2nUvShLqAq-5g-1" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint y="1080.952380952381" as="sourcePoint" /> <mxPoint y="240" as="targetPoint" /> </mxGeometry> </mxCell> <object label="security" score-type="module" id="cyVkqPuj_zZxdIbUwScy-3"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="490" y="271.56" width="460" height="267.5" as="geometry" /> </mxCell> </object> <mxCell id="cyVkqPuj_zZxdIbUwScy-4" value="crypto_libs" style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="510" y="311.56" width="190" height="50" as="geometry" /> </mxCell> <mxCell id="cyVkqPuj_zZxdIbUwScy-5" value="crypto_libs" style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="520" y="321.56" width="190" height="50" as="geometry" /> </mxCell> <object label="crypto_libs" score-type="component" id="cyVkqPuj_zZxdIbUwScy-6"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="530" y="331.56" width="190" height="50" as="geometry" /> </mxCell> </object> <object label="keystore&lt;div&gt;(HSM abstraction)&lt;/div&gt;" score-type="component" id="cyVkqPuj_zZxdIbUwScy-7"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="520" y="391.56" width="190" height="50" as="geometry" /> </mxCell> </object> <object label="sign_verify" score-type="component" id="cyVkqPuj_zZxdIbUwScy-8"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="520" y="451.56" width="190" height="50" as="geometry" /> </mxCell> </object> <object label="keymgmt" score-type="component" id="cyVkqPuj_zZxdIbUwScy-9"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="740" y="321.56" width="190" height="50" as="geometry" /> </mxCell> </object> <object label="access_mgmt" score-type="component" id="cyVkqPuj_zZxdIbUwScy-10"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="740" y="391.56" width="190" height="50" as="geometry" /> </mxCell> </object> <object label="lifecycle" score-type="module" id="cyVkqPuj_zZxdIbUwScy-12"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="490" y="566.25" width="240" height="253.75" as="geometry" /> </mxCell> </object> <object label="launchmanager" score-type="component" id="cyVkqPuj_zZxdIbUwScy-13"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="510" y="616.25" width="190" height="50" as="geometry" /> </mxCell> </object> <object label="healthmonitor" score-type="component" id="cyVkqPuj_zZxdIbUwScy-14"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="510" y="686.25" width="190" height="50" as="geometry" /> </mxCell> </object> <object label="time" score-type="module" id="cyVkqPuj_zZxdIbUwScy-20"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="980" y="271.56" width="280" height="273.75" as="geometry" /> </mxCell> </object> <object label="gptp_client" score-type="component" id="cyVkqPuj_zZxdIbUwScy-21"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1000" y="311.56" width="110" height="60" as="geometry" /> </mxCell> </object> <object label="time_base_&lt;div&gt;provider&lt;/div&gt;" score-type="component" id="cyVkqPuj_zZxdIbUwScy-22"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1000" y="384.06" width="110" height="60" as="geometry" /> </mxCell> </object> <object label="clock::&lt;br&gt;sync" score-type="component" id="cyVkqPuj_zZxdIbUwScy-23"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1120" y="311.56" width="130" height="60" as="geometry" /> </mxCell> </object> <object label="clock::&lt;br&gt;authentic" score-type="component" id="cyVkqPuj_zZxdIbUwScy-24"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1120" y="384.06" width="130" height="60" as="geometry" /> </mxCell> </object> <object label="time" score-type="component" id="cyVkqPuj_zZxdIbUwScy-26"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1000" y="452.81" width="110" height="60" as="geometry" /> </mxCell> </object> <object label="time" score-type="component" id="cyVkqPuj_zZxdIbUwScy-27"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="870" y="980" width="110" height="60" as="geometry" /> </mxCell> </object> <object label="config" score-type="module" id="cyVkqPuj_zZxdIbUwScy-28"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1280" y="265.31" width="330" height="286.25" as="geometry" /> </mxCell> </object> <object label="config_daemon" score-type="component" id="cyVkqPuj_zZxdIbUwScy-29"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1300" y="307.81" width="130" height="60" as="geometry" /> </mxCell> </object> <object label="config_provider" score-type="component" id="cyVkqPuj_zZxdIbUwScy-30"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1300" y="384.06" width="130" height="60" as="geometry" /> </mxCell> </object> <mxCell id="cyVkqPuj_zZxdIbUwScy-31" value="config_plugins" style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1300" y="452.81" width="130" height="60" as="geometry" /> </mxCell> <mxCell id="cyVkqPuj_zZxdIbUwScy-32" value="config_plugins" style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1310" y="462.81" width="130" height="60" as="geometry" /> </mxCell> <object label="config_plugins" score-type="component" id="cyVkqPuj_zZxdIbUwScy-33"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1320" y="472.81" width="130" height="60" as="geometry" /> </mxCell> </object> <object label="calibration_&lt;div&gt;interface&lt;/div&gt;" score-type="component" id="cyVkqPuj_zZxdIbUwScy-34"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1450" y="307.81" width="130" height="60" as="geometry" /> </mxCell> </object> <object label="faultmanagement" score-type="module" id="cyVkqPuj_zZxdIbUwScy-35"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1610" y="566.25" width="220" height="253.75" as="geometry" /> </mxCell> </object> <object label="opensovd" score-type="external-module" id="cyVkqPuj_zZxdIbUwScy-37"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="-360" y="266.25" width="340" height="423.12" as="geometry" /> </mxCell> </object> <object label="fauit_library" score-type="component" score-language="-" id="cyVkqPuj_zZxdIbUwScy-38"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="-340" y="303.12" width="130" height="60" as="geometry" /> </mxCell> </object> <object label="diagnostic_&lt;div&gt;fault_manager&lt;/div&gt;" score-type="component" id="cyVkqPuj_zZxdIbUwScy-39"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="-340" y="371.56000000000006" width="130" height="60" as="geometry" /> </mxCell> </object> <object label="diagnostic_&lt;div&gt;database&lt;/div&gt;" score-type="component" id="cyVkqPuj_zZxdIbUwScy-40"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="-340" y="443.12" width="130" height="60" as="geometry" /> </mxCell> </object> <object label="sovd_server" score-type="component" id="cyVkqPuj_zZxdIbUwScy-41"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="-195" y="303.12" width="165" height="60" as="geometry" /> </mxCell> </object> <object label="sovd_gateway" score-type="component" id="cyVkqPuj_zZxdIbUwScy-42"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="-195" y="371.56" width="165" height="60" as="geometry" /> </mxCell> </object> <object label="classic_diagnostic&lt;div&gt;_adapter&lt;/div&gt;" score-type="component" id="cyVkqPuj_zZxdIbUwScy-43"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="-195" y="443.12" width="165" height="60" as="geometry" /> </mxCell> </object> <object label="sovd_client" score-type="component" id="cyVkqPuj_zZxdIbUwScy-44"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="-340" y="589.37" width="130" height="60" as="geometry" /> </mxCell> </object> <mxCell id="cyVkqPuj_zZxdIbUwScy-45" value="uds2sovd_&lt;div&gt;proxy&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="-340" y="515.62" width="130" height="60" as="geometry" /> </mxCell> <object label="diagnostic_&lt;div&gt;service_app&lt;/div&gt;" score-type="component" id="cyVkqPuj_zZxdIbUwScy-46"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="-195" y="515.62" width="165" height="60" as="geometry" /> </mxCell> </object> <object label="someip" score-type="external-module" id="cyVkqPuj_zZxdIbUwScy-48"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="-360" y="730" width="340" height="250" as="geometry" /> </mxCell> </object> <object label="score_someip_&lt;div&gt;gateway&lt;/div&gt;" score-type="component" id="zOfhbxZQrp5VTqdj2Vb1-4"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="-340" y="780" width="150" height="60" as="geometry" /> </mxCell> </object> <object label="someip_&lt;div&gt;protocol&lt;/div&gt;" score-type="component" id="zOfhbxZQrp5VTqdj2Vb1-5"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="-340" y="851.56" width="150" height="60" as="geometry" /> </mxCell> </object> <object label="abi-compatible-datatypes" score-type="component" id="zOfhbxZQrp5VTqdj2Vb1-7"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="870" y="890" width="160" height="60" as="geometry" /> </mxCell> </object> <object label="abi-compatible-datatypes" score-type="component" id="zOfhbxZQrp5VTqdj2Vb1-8"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1220" y="970" width="145" height="60" as="geometry" /> </mxCell> </object> <object label="ai-platform" score-type="module" id="zOfhbxZQrp5VTqdj2Vb1-9"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1630" y="269.69" width="200" height="275.62" as="geometry" /> </mxCell> </object> <object label="inference_&lt;div&gt;adapter&lt;/div&gt;" score-type="component" id="zOfhbxZQrp5VTqdj2Vb1-10"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1660" y="311.56" width="130" height="60" as="geometry" /> </mxCell> </object> <object label="onnx_runtime" score-type="component" id="zOfhbxZQrp5VTqdj2Vb1-15"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1660" y="384.06" width="130" height="60" as="geometry" /> </mxCell> </object> <mxCell id="zOfhbxZQrp5VTqdj2Vb1-17" value="ext module/&lt;div&gt;repository&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="190" y="1230" width="130" height="60" as="geometry" /> </mxCell> <object label="datarouter" score-type="component" id="lLnuWv548SjsVmpskmR--0"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="774" y="700" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="record/&lt;div&gt;replay&lt;/div&gt;" score-type="component" id="lLnuWv548SjsVmpskmR--4"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="175" y="448.44" width="120" height="60" as="geometry" /> </mxCell> </object> <mxCell id="H0D6Iy5TQXu2IpcHdf1l-1" value="language to be defined" style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="45" y="1360" width="125" height="60" as="geometry" /> </mxCell> <mxCell id="H0D6Iy5TQXu2IpcHdf1l-3" value="Modules and Components of S-CORE 1.0" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=60;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="20" y="60" width="1220" height="100" as="geometry" /> </mxCell> </root> </mxGraphModel> </diagram> <diagram id="E6MF477lCpV7keu6hLqp" name="Fallback QNX 8"> <mxGraphModel dx="2335" dy="823" 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="1k3IXSwx12tV7RTQSR1Z-2" value="Baselibs" style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1"> <mxGeometry x="40" y="850" width="850" height="230" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;jumpStyle=arc;" parent="1" source="1k3IXSwx12tV7RTQSR1Z-6" target="1k3IXSwx12tV7RTQSR1Z-35" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="805" y="810" /> <mxPoint x="540" y="810" /> </Array> </mxGeometry> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.406;exitY=0.994;exitDx=0;exitDy=0;exitPerimeter=0;jumpStyle=arc;" parent="1" source="1k3IXSwx12tV7RTQSR1Z-6" target="1k3IXSwx12tV7RTQSR1Z-33" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="805" y="768" /> <mxPoint x="805" y="810" /> <mxPoint x="400" y="810" /> </Array> </mxGeometry> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="1k3IXSwx12tV7RTQSR1Z-6" target="1k3IXSwx12tV7RTQSR1Z-37" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="805" y="810" /> <mxPoint x="680" y="810" /> </Array> </mxGeometry> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-6" value="Logging" style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1"> <mxGeometry x="640" y="510" width="330" height="260" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-9" value="Component" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="730" y="50" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-10" value="Module" style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1"> <mxGeometry x="910" y="30" width="130" height="70" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="1k3IXSwx12tV7RTQSR1Z-20" target="1k3IXSwx12tV7RTQSR1Z-24" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;jumpStyle=arc;" parent="1" source="1k3IXSwx12tV7RTQSR1Z-20" target="1k3IXSwx12tV7RTQSR1Z-33" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="260" y="840" /> <mxPoint x="400" y="840" /> </Array> </mxGeometry> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;jumpStyle=arc;" parent="1" source="1k3IXSwx12tV7RTQSR1Z-20" target="1k3IXSwx12tV7RTQSR1Z-34" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="-120" y="700" /> </Array> </mxGeometry> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;jumpStyle=arc;" parent="1" source="1k3IXSwx12tV7RTQSR1Z-20" target="1k3IXSwx12tV7RTQSR1Z-32" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;jumpStyle=arc;" parent="1" source="1k3IXSwx12tV7RTQSR1Z-20" target="1k3IXSwx12tV7RTQSR1Z-31" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="260" y="840" /> <mxPoint x="120" y="840" /> </Array> </mxGeometry> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-20" value="Communication" style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1"> <mxGeometry x="30" y="510" width="460" height="250" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-24" value="Logging API" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="674" y="560" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-27" value="IPC binding (LoLa)" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="70" y="660" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-28" value="mw::com Frontend" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="210" y="570" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-29" value="Mock binding" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="210" y="660" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-30" value="LoLa Configuration" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="350" y="660" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-31" value="memory" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="60" y="890" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-32" value="Message Passing" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="200" y="890" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-33" value="JSON&amp;nbsp;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="340" y="890" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-34" value="&amp;nbsp;tracing (frontend)" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;dashed=1;dashPattern=8 8;" parent="1" vertex="1"> <mxGeometry x="-200" y="680" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-35" value="&quot;OSAL&quot;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="480" y="890" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-37" value="Filesystem" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="620" y="890" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-38" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;jumpStyle=arc;" parent="1" source="1k3IXSwx12tV7RTQSR1Z-44" target="1k3IXSwx12tV7RTQSR1Z-37" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="1170" y="820" /> <mxPoint x="680" y="820" /> </Array> </mxGeometry> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-41" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;jumpStyle=arc;" parent="1" source="1k3IXSwx12tV7RTQSR1Z-44" target="1k3IXSwx12tV7RTQSR1Z-33" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="1170" y="820" /> <mxPoint x="400" y="820" /> </Array> </mxGeometry> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-42" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.25;entryDx=0;entryDy=0;" parent="1" source="1k3IXSwx12tV7RTQSR1Z-44" target="1k3IXSwx12tV7RTQSR1Z-6" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-43" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;jumpStyle=arc;" parent="1" source="1k3IXSwx12tV7RTQSR1Z-44" target="1k3IXSwx12tV7RTQSR1Z-49" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="1170" y="820" /> <mxPoint x="830" y="820" /> </Array> </mxGeometry> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-44" value="Persistency" style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1"> <mxGeometry x="1020" y="510" width="300" height="140" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-46" value="kvs" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#6c8ebf;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=12;fillColor=#dae8fc;gradientDirection=north;" parent="1" vertex="1"> <mxGeometry x="1170" y="560" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-49" value="Result" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="760" y="890" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-60" value="futurecpp" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="60" y="980" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-61" value="bitmanipulation" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="190" y="980" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-62" value="concurrency" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="330" y="980" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-63" value="containers" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="460" y="980" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-64" value="safecpp" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="590" y="980" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-65" value="utils" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="720" y="980" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-66" value="static_reflection_&lt;br&gt;with_serialization" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="674" y="650" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-67" value="Third-party?" style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;dashed=1;dashPattern=8 8;" parent="1" vertex="1"> <mxGeometry x="544" y="1280" width="650" height="150" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-68" value="nlohman json" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="570" y="1310" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-69" value="tiny-json" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1"> <mxGeometry x="700" y="1310" width="120" height="60" as="geometry" /> </mxCell> </root> </mxGraphModel> </diagram> </mxfile> "><defs><linearGradient x1="0%" y1="100%" x2="0%" y2="0%" id="drawio-svg-dOODWABOc8lKBWiuNx1C-gradient-_fff2cc-1-_ccd6ff-1-s-0"><stop offset="0%" stop-color="#ccd6ff" stop-opacity="1" style="stop-color: rgb(204, 214, 255); stop-opacity: 1;"/><stop offset="100%" stop-color="#FFF2CC" stop-opacity="1" style="stop-color: rgb(255, 242, 204); stop-opacity: 1;"/></linearGradient><linearGradient x1="0%" y1="0%" x2="0%" y2="100%" id="drawio-svg-dOODWABOc8lKBWiuNx1C-gradient-_ccd6ff-1-_fff2cc-1-s-0"><stop offset="0%" stop-color="#ccd6ff" stop-opacity="1" style="stop-color: rgb(204, 214, 255); stop-opacity: 1;"/><stop offset="100%" stop-color="#FFF2CC" stop-opacity="1" style="stop-color: rgb(255, 242, 204); stop-opacity: 1;"/></linearGradient></defs><g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-0"><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-1"><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-2"><g id="cell-X8Ibqyh2nUvShLqAq-5g-2" content="<object label="baselibs" score-type="module"/>" data-label="baselibs" data-score-type="module"><g><rect x="1560" y="790" width="630" height="230" rx="34.5" ry="34.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));"/></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: 628px; height: 1px; padding-top: 797px; margin-left: 1561px;"><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; white-space: normal; word-wrap: normal; ">baselibs</div></div></div></foreignObject><text x="1875" y="817" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">baselibs</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-3"><g id="cell-X8Ibqyh2nUvShLqAq-5g-3" content="<object label="baselibs" score-type="module"/>" data-label="baselibs" data-score-type="module"><g><rect x="380" y="790" width="1160" height="230" rx="34.5" ry="34.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));"/></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: 1158px; height: 1px; padding-top: 797px; margin-left: 381px;"><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; white-space: normal; word-wrap: normal; ">baselibs</div></div></div></foreignObject><text x="960" y="817" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">baselibs</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-7"><g id="cell-X8Ibqyh2nUvShLqAq-5g-7" content="<object label="logging" score-type="module"/>" data-label="logging" data-score-type="module"><g><rect x="1100" y="506.25" width="330" height="260" rx="39" ry="39" 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: 328px; height: 1px; padding-top: 513px; margin-left: 1101px;"><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; white-space: normal; word-wrap: normal; ">logging</div></div></div></foreignObject><text x="1265" y="533" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">logging</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-9"><g id="cell-X8Ibqyh2nUvShLqAq-5g-9" content="<object label="feo" score-type="module"/>" data-label="feo" data-score-type="module"><g><rect x="375" y="207.81" width="450" height="267.5" rx="40.13" ry="40.13" 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: 448px; height: 1px; padding-top: 215px; margin-left: 376px;"><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; white-space: normal; word-wrap: normal; ">feo</div></div></div></foreignObject><text x="600" y="235" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">feo</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-10"><g id="cell-X8Ibqyh2nUvShLqAq-5g-10"><g><rect x="410" y="1090" 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 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: 1120px; margin-left: 411px;"><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; white-space: normal; word-wrap: normal; ">component</div></div></div></foreignObject><text x="470" y="1126" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">component</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-11"><g id="cell-X8Ibqyh2nUvShLqAq-5g-11"><g><rect x="550" y="1090" width="130" height="60" rx="9" ry="9" 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: 128px; height: 1px; padding-top: 1097px; margin-left: 551px;"><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; white-space: normal; word-wrap: normal; ">bazel module/<div>repository</div></div></div></div></foreignObject><text x="615" y="1117" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">bazel module/...</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-12"><g id="cell-X8Ibqyh2nUvShLqAq-5g-12" content="<object label="feo-time" score-type="component"/>" data-label="feo-time" data-score-type="component"><g><rect x="665" y="248.44" width="120" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 278px; margin-left: 666px;"><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; white-space: normal; word-wrap: normal; ">feo-time</div></div></div></foreignObject><text x="725" y="284" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">feo-time</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-13"><g id="cell-X8Ibqyh2nUvShLqAq-5g-13" content="<object label="feo-com" score-type="component"/>" data-label="feo-com" data-score-type="component"><g><rect x="405" y="318.44" width="120" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 348px; margin-left: 406px;"><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; white-space: normal; word-wrap: normal; ">feo-com</div></div></div></foreignObject><text x="465" y="354" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">feo-com</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-15"><g id="cell-X8Ibqyh2nUvShLqAq-5g-15" content="<object label="feo-log" score-type="component"/>" data-label="feo-log" data-score-type="component"><g><rect x="535" y="318.44" width="120" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 348px; margin-left: 536px;"><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; white-space: normal; word-wrap: normal; ">feo-log</div></div></div></foreignObject><text x="595" y="354" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">feo-log</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-21"><g id="cell-X8Ibqyh2nUvShLqAq-5g-21" content="<object label="communication" score-type="module"/>" data-label="communication" data-score-type="module"><g><rect x="380" y="506.25" width="460" height="250" rx="37.5" ry="37.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));"/></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: 458px; height: 1px; padding-top: 513px; margin-left: 381px;"><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; white-space: normal; word-wrap: normal; ">communication</div></div></div></foreignObject><text x="610" y="533" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">communication</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-22"><g id="cell-X8Ibqyh2nUvShLqAq-5g-22" content="<object label="feo-tracing" score-type="component"/>" data-label="feo-tracing" data-score-type="component"><g><rect x="665" y="318.44" width="120" height="60" fill="#fff2cc" stroke="#d6b656" stroke-dasharray="8 8" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 348px; margin-left: 666px;"><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; white-space: normal; word-wrap: normal; ">feo-tracing</div></div></div></foreignObject><text x="725" y="354" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">feo-tracing</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-23"><g id="cell-X8Ibqyh2nUvShLqAq-5g-23" content="<object label="feo" score-type="component" placeholders="null"/>" data-label="feo" data-score-type="component" data-placeholders="null"><g><rect x="405" y="248.44" width="120" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 278px; margin-left: 406px;"><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; white-space: normal; word-wrap: normal; ">feo</div></div></div></foreignObject><text x="465" y="284" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">feo</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-24"><g id="cell-X8Ibqyh2nUvShLqAq-5g-24" content="<object label="mw::com Frontend" score-type="component"/>" data-label="mw::com Frontend" data-score-type="component"><g><rect x="405" y="567.19" width="120" height="60" fill="url(#drawio-svg-dOODWABOc8lKBWiuNx1C-gradient-_fff2cc-1-_ccd6ff-1-s-0)" stroke="#d6b656" pointer-events="all" style="fill: url("#drawio-svg-dOODWABOc8lKBWiuNx1C-gradient-_fff2cc-1-_ccd6ff-1-s-0"); stroke: rgb(214, 182, 86);"/></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: 597px; margin-left: 406px;"><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; white-space: normal; word-wrap: normal; ">mw::com Frontend</div></div></div></foreignObject><text x="465" y="603" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">mw::com Fron...</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-25"><g id="cell-X8Ibqyh2nUvShLqAq-5g-25" content="<object label="Logging API" score-type="component"/>" data-label="Logging API" data-score-type="component"><g><rect x="1134" y="556.25" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 586px; margin-left: 1135px;"><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; white-space: normal; word-wrap: normal; ">Logging API</div></div></div></foreignObject><text x="1194" y="592" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">Logging API</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-27"><g id="cell-X8Ibqyh2nUvShLqAq-5g-27" content="<object label="feo-cpp" score-type="component"/>" data-label="feo-cpp" data-score-type="component"><g><rect x="535" y="248.44" width="120" height="60" fill="url(#drawio-svg-dOODWABOc8lKBWiuNx1C-gradient-_ccd6ff-1-_fff2cc-1-s-0)" stroke="#d6b656" pointer-events="all" style="fill: url("#drawio-svg-dOODWABOc8lKBWiuNx1C-gradient-_ccd6ff-1-_fff2cc-1-s-0"); stroke: rgb(214, 182, 86);"/></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: 278px; margin-left: 536px;"><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; white-space: normal; word-wrap: normal; ">feo-cpp</div></div></div></foreignObject><text x="595" y="284" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">feo-cpp</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-28"><g id="cell-X8Ibqyh2nUvShLqAq-5g-28" content="<object label="ipc-binding (LoLa)" score-type="component"/>" data-label="ipc-binding (LoLa)" data-score-type="component"><g><rect x="405" y="657.19" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 687px; margin-left: 406px;"><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; white-space: normal; word-wrap: normal; ">ipc-binding (LoLa)</div></div></div></foreignObject><text x="465" y="693" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">ipc-binding...</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-29"><g id="cell-X8Ibqyh2nUvShLqAq-5g-29" content="<object label="mw::com Frontend" score-type="component"/>" data-label="mw::com Frontend" data-score-type="component"><g><rect x="545" y="567.19" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 597px; margin-left: 546px;"><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; white-space: normal; word-wrap: normal; ">mw::com Frontend</div></div></div></foreignObject><text x="605" y="603" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">mw::com Fron...</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-30"><g id="cell-X8Ibqyh2nUvShLqAq-5g-30" content="<object label="Mock binding" score-type="component"/>" data-label="Mock binding" data-score-type="component"><g><rect x="545" y="657.19" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 687px; margin-left: 546px;"><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; white-space: normal; word-wrap: normal; ">Mock binding</div></div></div></foreignObject><text x="605" y="693" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">Mock binding</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-31"><g id="cell-X8Ibqyh2nUvShLqAq-5g-31" content="<object label="lola- configuration" score-type="component"/>" data-label="lola- configuration" data-score-type="component"><g><rect x="680" y="657.19" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 687px; margin-left: 681px;"><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; white-space: normal; word-wrap: normal; ">lola- configuration</div></div></div></foreignObject><text x="740" y="693" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">lola- config...</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-32"><g id="cell-X8Ibqyh2nUvShLqAq-5g-32" content="<object label="memory" score-type="component"/>" data-label="memory" data-score-type="component"><g><rect x="400" y="830" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 860px; margin-left: 401px;"><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; white-space: normal; word-wrap: normal; ">memory</div></div></div></foreignObject><text x="460" y="866" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">memory</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-33"><g id="cell-X8Ibqyh2nUvShLqAq-5g-33" content="<object label="message passing" score-type="component"/>" data-label="message passing" data-score-type="component"><g><rect x="540" y="830" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 860px; margin-left: 541px;"><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; white-space: normal; word-wrap: normal; ">message passing</div></div></div></foreignObject><text x="600" y="866" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">message pass...</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-34"><g id="cell-X8Ibqyh2nUvShLqAq-5g-34" content="<object label="json" score-type="component"/>" data-label="json" data-score-type="component"><g><rect x="680" y="830" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 860px; margin-left: 681px;"><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; white-space: normal; word-wrap: normal; ">json</div></div></div></foreignObject><text x="740" y="866" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">json</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-35"><g id="cell-X8Ibqyh2nUvShLqAq-5g-35"><g><rect x="410" y="1160" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 1190px; margin-left: 411px;"><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; white-space: normal; word-wrap: normal; ">C++<div>component</div></div></div></div></foreignObject><text x="470" y="1196" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">C++...</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-36"><g id="cell-X8Ibqyh2nUvShLqAq-5g-36" content="<object label="osal" score-type="component"/>" data-label="osal" data-score-type="component"><g><rect x="820" y="830" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 860px; margin-left: 821px;"><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; white-space: normal; word-wrap: normal; ">osal</div></div></div></foreignObject><text x="880" y="866" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">osal</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-37"><g id="cell-X8Ibqyh2nUvShLqAq-5g-37" content="<object label="Logging API" score-type="component"/>" data-label="Logging API" data-score-type="component"><g><rect x="1269" y="556.25" width="120" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 586px; margin-left: 1270px;"><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; white-space: normal; word-wrap: normal; ">Logging API</div></div></div></foreignObject><text x="1329" y="592" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">Logging API</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-38"><g id="cell-X8Ibqyh2nUvShLqAq-5g-38" content="<object label="Filesystem" score-type="component"/>" data-label="Filesystem" data-score-type="component"><g><rect x="960" y="830" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 860px; margin-left: 961px;"><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; white-space: normal; word-wrap: normal; ">Filesystem</div></div></div></foreignObject><text x="1020" y="866" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">Filesystem</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-45"><g id="cell-X8Ibqyh2nUvShLqAq-5g-45" content="<object label="persistency" score-type="module"/>" data-label="persistency" data-score-type="module"><g><rect x="1450" y="506.25" width="170" height="263.75" rx="25.5" ry="25.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));"/></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: 168px; height: 1px; padding-top: 513px; margin-left: 1451px;"><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; white-space: normal; word-wrap: normal; ">persistency</div></div></div></foreignObject><text x="1535" y="533" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">persistency</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-46"><g id="cell-X8Ibqyh2nUvShLqAq-5g-46" content="<object label="kvs" score-type="component"/>" data-label="kvs" data-score-type="component"><g><rect x="1470" y="556.25" width="120" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 586px; margin-left: 1471px;"><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; white-space: normal; word-wrap: normal; ">kvs</div></div></div></foreignObject><text x="1530" y="592" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">kvs</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-47"><g id="cell-X8Ibqyh2nUvShLqAq-5g-47" content="<object label="kvs" score-type="component"/>" data-label="kvs" data-score-type="component"><g><rect x="1470" y="640" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 670px; margin-left: 1471px;"><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; white-space: normal; word-wrap: normal; ">kvs</div></div></div></foreignObject><text x="1530" y="676" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">kvs</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-48"><g id="cell-X8Ibqyh2nUvShLqAq-5g-48" content="<object label="filesystem" score-type="component"/>" data-label="filesystem" data-score-type="component"><g><rect x="1740" y="830" width="120" height="60" fill="#fff2cc" stroke="#d6b656" stroke-dasharray="8 8" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 860px; margin-left: 1741px;"><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; white-space: normal; word-wrap: normal; ">filesystem</div></div></div></foreignObject><text x="1800" y="866" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">filesystem</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-49"><g id="cell-X8Ibqyh2nUvShLqAq-5g-49" content="<object label="json" score-type="component"/>" data-label="json" data-score-type="component"><g><rect x="1580" y="830" width="145" height="60" fill="#fff2cc" stroke="#d6b656" stroke-dasharray="8 8" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 860px; margin-left: 1581px;"><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; white-space: normal; word-wrap: normal; ">json</div></div></div></foreignObject><text x="1653" y="866" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">json</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-50"><g id="cell-X8Ibqyh2nUvShLqAq-5g-50" content="<object label="Result" score-type="component"/>" data-label="Result" data-score-type="component"><g><rect x="1095" y="830" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 860px; margin-left: 1096px;"><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; white-space: normal; word-wrap: normal; ">Result</div></div></div></foreignObject><text x="1155" y="866" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">Result</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-55"><g id="cell-X8Ibqyh2nUvShLqAq-5g-55" content="<object label="orchestration" score-type="module"/>" data-label="orchestration" data-score-type="module"><g><rect x="1640" y="506.25" width="300" height="263.75" rx="39.56" ry="39.56" 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: 298px; height: 1px; padding-top: 513px; margin-left: 1641px;"><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; white-space: normal; word-wrap: normal; ">orchestration</div></div></div></foreignObject><text x="1790" y="533" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">orchestration</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-56"><g id="cell-X8Ibqyh2nUvShLqAq-5g-56" content="<object label="runtime" score-type="component"/>" data-label="runtime" data-score-type="component"><g><rect x="1660" y="616.25" width="120" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 646px; margin-left: 1661px;"><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; white-space: normal; word-wrap: normal; ">runtime</div></div></div></foreignObject><text x="1720" y="652" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">runtime</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-57"><g id="cell-X8Ibqyh2nUvShLqAq-5g-57" content="<object label="orchestration" score-type="component"/>" data-label="orchestration" data-score-type="component"><g><rect x="1660" y="536.25" width="120" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 566px; margin-left: 1661px;"><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; white-space: normal; word-wrap: normal; ">orchestration</div></div></div></foreignObject><text x="1720" y="572" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">orchestration</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-58"><g id="cell-X8Ibqyh2nUvShLqAq-5g-58" content="<object label="std replacement" score-type="component"/>" data-label="std replacement" data-score-type="component"><g><rect x="1875" y="830" width="120" height="60" fill="#fff2cc" stroke="#d6b656" stroke-dasharray="8 8" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 860px; margin-left: 1876px;"><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; white-space: normal; word-wrap: normal; ">std replacement</div></div></div></foreignObject><text x="1935" y="866" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">std replacem...</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-59"><g id="cell-X8Ibqyh2nUvShLqAq-5g-59" content="<object label="orchestration cpp" score-type="component"/>" data-label="orchestration cpp" data-score-type="component"><g><rect x="1800" y="536.25" width="120" height="60" fill="url(#drawio-svg-dOODWABOc8lKBWiuNx1C-gradient-_ccd6ff-1-_fff2cc-1-s-0)" stroke="#d6b656" pointer-events="all" style="fill: url("#drawio-svg-dOODWABOc8lKBWiuNx1C-gradient-_ccd6ff-1-_fff2cc-1-s-0"); stroke: rgb(214, 182, 86);"/></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: 566px; margin-left: 1801px;"><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; white-space: normal; word-wrap: normal; ">orchestration cpp</div></div></div></foreignObject><text x="1860" y="572" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">orchestratio...</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-60"><g id="cell-X8Ibqyh2nUvShLqAq-5g-60"><g><rect x="405" y="1230" width="125" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 123px; height: 1px; padding-top: 1260px; margin-left: 406px;"><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; white-space: normal; word-wrap: normal; ">Rust <div>component</div></div></div></div></foreignObject><text x="468" y="1266" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">Rust...</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-61"><g id="cell-X8Ibqyh2nUvShLqAq-5g-61" content="<object label="futurecpp" score-type="component"/>" data-label="futurecpp" data-score-type="component"><g><rect x="400" y="920" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 950px; margin-left: 401px;"><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; white-space: normal; word-wrap: normal; ">futurecpp</div></div></div></foreignObject><text x="460" y="956" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">futurecpp</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-62"><g id="cell-X8Ibqyh2nUvShLqAq-5g-62" content="<object label="bitmanipulation" score-type="component"/>" data-label="bitmanipulation" data-score-type="component"><g><rect x="530" y="920" width="140" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 950px; margin-left: 531px;"><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; white-space: normal; word-wrap: normal; ">bitmanipulation</div></div></div></foreignObject><text x="600" y="956" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">bitmanipulation</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-63"><g id="cell-X8Ibqyh2nUvShLqAq-5g-63" content="<object label="concurrency" score-type="component"/>" data-label="concurrency" data-score-type="component"><g><rect x="679" y="920" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 950px; margin-left: 680px;"><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; white-space: normal; word-wrap: normal; ">concurrency</div></div></div></foreignObject><text x="739" y="956" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">concurrency</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-64"><g id="cell-X8Ibqyh2nUvShLqAq-5g-64" content="<object label="containers" score-type="component"/>" data-label="containers" data-score-type="component"><g><rect x="819" y="920" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 950px; margin-left: 820px;"><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; white-space: normal; word-wrap: normal; ">containers</div></div></div></foreignObject><text x="879" y="956" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">containers</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-65"><g id="cell-X8Ibqyh2nUvShLqAq-5g-65" content="<object label="safecpp" score-type="component"/>" data-label="safecpp" data-score-type="component"><g><rect x="959" y="920" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 950px; margin-left: 960px;"><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; white-space: normal; word-wrap: normal; ">safecpp</div></div></div></foreignObject><text x="1019" y="956" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">safecpp</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-66"><g id="cell-X8Ibqyh2nUvShLqAq-5g-66" content="<object label="utils" score-type="component"/>" data-label="utils" data-score-type="component"><g><rect x="1099" y="920" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 950px; margin-left: 1100px;"><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; white-space: normal; word-wrap: normal; ">utils</div></div></div></foreignObject><text x="1159" y="956" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">utils</text></switch></g></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-67"><g id="cell-X8Ibqyh2nUvShLqAq-5g-67" content="<object label="static_reflection_&lt;br&gt;with_serialization" score-type="component"/>" data-label="static_reflection_<br>with_serialization" data-score-type="component"><g><rect x="1350" y="920" width="176" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 174px; height: 1px; padding-top: 950px; margin-left: 1351px;"><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; white-space: normal; word-wrap: normal; ">static_reflection_<br />with_serialization</div></div></div></foreignObject><text x="1438" y="956" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">static_reflection_...</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-0"><g id="cell-cyVkqPuj_zZxdIbUwScy-0" content="<object label="daal?" score-type="component"/>" data-label="daal?" data-score-type="component"><g><rect x="665" y="388.44" width="120" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 418px; margin-left: 666px;"><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; white-space: normal; word-wrap: normal; ">daal?</div></div></div></foreignObject><text x="725" y="424" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">daal?</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-2"><g id="cell-cyVkqPuj_zZxdIbUwScy-2"><g><path d="M 360 1020.95 L 360 180" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-3"><g id="cell-cyVkqPuj_zZxdIbUwScy-3" content="<object label="security" score-type="module"/>" data-label="security" data-score-type="module"><g><rect x="850" y="211.56" width="460" height="267.5" rx="40.13" ry="40.13" 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: 458px; height: 1px; padding-top: 219px; margin-left: 851px;"><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; white-space: normal; word-wrap: normal; ">security</div></div></div></foreignObject><text x="1080" y="239" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">security</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-4"><g id="cell-cyVkqPuj_zZxdIbUwScy-4"><g><rect x="870" y="251.56" width="190" height="50" 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: 188px; height: 1px; padding-top: 277px; margin-left: 871px;"><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; white-space: normal; word-wrap: normal; ">crypto_libs</div></div></div></foreignObject><text x="965" y="283" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">crypto_libs</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-5"><g id="cell-cyVkqPuj_zZxdIbUwScy-5"><g><rect x="880" y="261.56" width="190" height="50" 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: 188px; height: 1px; padding-top: 287px; margin-left: 881px;"><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; white-space: normal; word-wrap: normal; ">crypto_libs</div></div></div></foreignObject><text x="975" y="293" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">crypto_libs</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-6"><g id="cell-cyVkqPuj_zZxdIbUwScy-6" content="<object label="crypto_libs" score-type="component"/>" data-label="crypto_libs" data-score-type="component"><g><rect x="890" y="271.56" width="190" height="50" 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: 188px; height: 1px; padding-top: 297px; margin-left: 891px;"><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; white-space: normal; word-wrap: normal; ">crypto_libs</div></div></div></foreignObject><text x="985" y="303" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">crypto_libs</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-7"><g id="cell-cyVkqPuj_zZxdIbUwScy-7" content="<object label="keystore&lt;div&gt;(HSM abstraction)&lt;/div&gt;" score-type="component"/>" data-label="keystore<div>(HSM abstraction)</div>" data-score-type="component"><g><rect x="880" y="331.56" width="190" height="50" 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: 188px; height: 1px; padding-top: 357px; margin-left: 881px;"><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; white-space: normal; word-wrap: normal; ">keystore<div>(HSM abstraction)</div></div></div></div></foreignObject><text x="975" y="363" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">keystore...</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-8"><g id="cell-cyVkqPuj_zZxdIbUwScy-8" content="<object label="sign_verify" score-type="component"/>" data-label="sign_verify" data-score-type="component"><g><rect x="880" y="391.56" width="190" height="50" 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: 188px; height: 1px; padding-top: 417px; margin-left: 881px;"><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; white-space: normal; word-wrap: normal; ">sign_verify</div></div></div></foreignObject><text x="975" y="423" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">sign_verify</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-9"><g id="cell-cyVkqPuj_zZxdIbUwScy-9" content="<object label="keymgmt" score-type="component"/>" data-label="keymgmt" data-score-type="component"><g><rect x="1100" y="261.56" width="190" height="50" 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: 188px; height: 1px; padding-top: 287px; margin-left: 1101px;"><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; white-space: normal; word-wrap: normal; ">keymgmt</div></div></div></foreignObject><text x="1195" y="293" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">keymgmt</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-10"><g id="cell-cyVkqPuj_zZxdIbUwScy-10" content="<object label="access_mgmt" score-type="component"/>" data-label="access_mgmt" data-score-type="component"><g><rect x="1100" y="331.56" width="190" height="50" 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: 188px; height: 1px; padding-top: 357px; margin-left: 1101px;"><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; white-space: normal; word-wrap: normal; ">access_mgmt</div></div></div></foreignObject><text x="1195" y="363" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">access_mgmt</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-12"><g id="cell-cyVkqPuj_zZxdIbUwScy-12" content="<object label="lifecycle" score-type="module"/>" data-label="lifecycle" data-score-type="module"><g><rect x="850" y="506.25" width="240" height="253.75" rx="36" ry="36" 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: 238px; height: 1px; padding-top: 513px; margin-left: 851px;"><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; white-space: normal; word-wrap: normal; ">lifecycle</div></div></div></foreignObject><text x="970" y="533" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">lifecycle</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-13"><g id="cell-cyVkqPuj_zZxdIbUwScy-13" content="<object label="launchmanager" score-type="component"/>" data-label="launchmanager" data-score-type="component"><g><rect x="870" y="556.25" width="190" height="50" 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: 188px; height: 1px; padding-top: 581px; margin-left: 871px;"><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; white-space: normal; word-wrap: normal; ">launchmanager</div></div></div></foreignObject><text x="965" y="587" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">launchmanager</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-14"><g id="cell-cyVkqPuj_zZxdIbUwScy-14" content="<object label="healthmonitor" score-type="component"/>" data-label="healthmonitor" data-score-type="component"><g><rect x="870" y="626.25" width="190" height="50" 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: 188px; height: 1px; padding-top: 651px; margin-left: 871px;"><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; white-space: normal; word-wrap: normal; ">healthmonitor</div></div></div></foreignObject><text x="965" y="657" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">healthmonitor</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-20"><g id="cell-cyVkqPuj_zZxdIbUwScy-20" content="<object label="time" score-type="module"/>" data-label="time" data-score-type="module"><g><rect x="1340" y="211.56" width="280" height="273.75" rx="41.06" ry="41.06" 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: 278px; height: 1px; padding-top: 219px; margin-left: 1341px;"><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; white-space: normal; word-wrap: normal; ">time</div></div></div></foreignObject><text x="1480" y="239" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">time</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-21"><g id="cell-cyVkqPuj_zZxdIbUwScy-21" content="<object label="gptp_client" score-type="component"/>" data-label="gptp_client" data-score-type="component"><g><rect x="1360" y="251.56" width="110" 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: 108px; height: 1px; padding-top: 282px; margin-left: 1361px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">gptp_client</div></div></div></foreignObject><text x="1415" y="287" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="19px" text-anchor="middle">gptp_client</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-22"><g id="cell-cyVkqPuj_zZxdIbUwScy-22" content="<object label="time_base_&lt;div&gt;provider&lt;/div&gt;" score-type="component"/>" data-label="time_base_<div>provider</div>" data-score-type="component"><g><rect x="1360" y="324.06" width="110" 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: 108px; height: 1px; padding-top: 354px; margin-left: 1361px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">time_base_<div>provider</div></div></div></div></foreignObject><text x="1415" y="360" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="19px" text-anchor="middle">time_base_...</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-23"><g id="cell-cyVkqPuj_zZxdIbUwScy-23" content="<object label="clock::&lt;br&gt;sync" score-type="component"/>" data-label="clock::<br>sync" data-score-type="component"><g><rect x="1480" y="251.56" width="130" 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: 128px; height: 1px; padding-top: 282px; margin-left: 1481px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">clock::<br />sync</div></div></div></foreignObject><text x="1545" y="287" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="19px" text-anchor="middle">clock::...</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-24"><g id="cell-cyVkqPuj_zZxdIbUwScy-24" content="<object label="clock::&lt;br&gt;authentic" score-type="component"/>" data-label="clock::<br>authentic" data-score-type="component"><g><rect x="1480" y="324.06" width="130" 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: 128px; height: 1px; padding-top: 354px; margin-left: 1481px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">clock::<br />authentic</div></div></div></foreignObject><text x="1545" y="360" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="19px" text-anchor="middle">clock::...</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-26"><g id="cell-cyVkqPuj_zZxdIbUwScy-26" content="<object label="time" score-type="component"/>" data-label="time" data-score-type="component"><g><rect x="1360" y="392.81" width="110" 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: 108px; height: 1px; padding-top: 423px; margin-left: 1361px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">time</div></div></div></foreignObject><text x="1415" y="429" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="19px" text-anchor="middle">time</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-27"><g id="cell-cyVkqPuj_zZxdIbUwScy-27" content="<object label="time" score-type="component"/>" data-label="time" data-score-type="component"><g><rect x="1230" y="920" width="110" 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: 108px; height: 1px; padding-top: 950px; margin-left: 1231px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">time</div></div></div></foreignObject><text x="1285" y="956" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="19px" text-anchor="middle">time</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-28"><g id="cell-cyVkqPuj_zZxdIbUwScy-28" content="<object label="config" score-type="module"/>" data-label="config" data-score-type="module"><g><rect x="1640" y="205.31" width="330" height="286.25" rx="42.94" ry="42.94" 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: 328px; height: 1px; padding-top: 212px; margin-left: 1641px;"><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; white-space: normal; word-wrap: normal; ">config</div></div></div></foreignObject><text x="1805" y="232" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">config</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-29"><g id="cell-cyVkqPuj_zZxdIbUwScy-29" content="<object label="config_daemon" score-type="component"/>" data-label="config_daemon" data-score-type="component"><g><rect x="1660" y="247.81" width="130" 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: 128px; height: 1px; padding-top: 278px; margin-left: 1661px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">config_daemon</div></div></div></foreignObject><text x="1725" y="284" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="19px" text-anchor="middle">config_daemon</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-30"><g id="cell-cyVkqPuj_zZxdIbUwScy-30" content="<object label="config_provider" score-type="component"/>" data-label="config_provider" data-score-type="component"><g><rect x="1660" y="324.06" width="130" 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: 128px; height: 1px; padding-top: 354px; margin-left: 1661px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">config_provider</div></div></div></foreignObject><text x="1725" y="360" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="19px" text-anchor="middle">config_provider</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-31"><g id="cell-cyVkqPuj_zZxdIbUwScy-31"><g><rect x="1660" y="392.81" width="130" 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: 128px; height: 1px; padding-top: 423px; margin-left: 1661px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">config_plugins</div></div></div></foreignObject><text x="1725" y="429" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="19px" text-anchor="middle">config_plugins</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-32"><g id="cell-cyVkqPuj_zZxdIbUwScy-32"><g><rect x="1670" y="402.81" width="130" 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: 128px; height: 1px; padding-top: 433px; margin-left: 1671px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">config_plugins</div></div></div></foreignObject><text x="1735" y="439" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="19px" text-anchor="middle">config_plugins</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-33"><g id="cell-cyVkqPuj_zZxdIbUwScy-33" content="<object label="config_plugins" score-type="component"/>" data-label="config_plugins" data-score-type="component"><g><rect x="1680" y="412.81" width="130" 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: 128px; height: 1px; padding-top: 443px; margin-left: 1681px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">config_plugins</div></div></div></foreignObject><text x="1745" y="449" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="19px" text-anchor="middle">config_plugins</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-34"><g id="cell-cyVkqPuj_zZxdIbUwScy-34" content="<object label="calibration_&lt;div&gt;interface&lt;/div&gt;" score-type="component"/>" data-label="calibration_<div>interface</div>" data-score-type="component"><g><rect x="1810" y="247.81" width="130" 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: 128px; height: 1px; padding-top: 278px; margin-left: 1811px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">calibration_<div>interface</div></div></div></div></foreignObject><text x="1875" y="284" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="19px" text-anchor="middle">calibration_...</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-35"><g id="cell-cyVkqPuj_zZxdIbUwScy-35" content="<object label="faultmanagement" score-type="module"/>" data-label="faultmanagement" data-score-type="module"><g><rect x="1970" y="506.25" width="220" height="253.75" rx="33" ry="33" 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: 218px; height: 1px; padding-top: 513px; margin-left: 1971px;"><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; white-space: normal; word-wrap: normal; ">faultmanagement</div></div></div></foreignObject><text x="2080" y="533" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">faultmanagement</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-37"><g id="cell-cyVkqPuj_zZxdIbUwScy-37" content="<object label="opensovd" score-type="external-module"/>" data-label="opensovd" data-score-type="external-module"><g><rect x="0" y="206.25" width="340" height="423.12" rx="51" ry="51" fill="#f5f5f5" stroke="#666666" pointer-events="all" style="fill: rgb(245, 245, 245); stroke: rgb(102, 102, 102);"/></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: 338px; height: 1px; padding-top: 213px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #333333; "><div style="display: inline-block; font-size: 20px; font-family: "Helvetica"; color: #333333; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">opensovd</div></div></div></foreignObject><text x="170" y="233" fill="#333333" font-family=""Helvetica"" font-size="20px" text-anchor="middle">opensovd</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-38"><g id="cell-cyVkqPuj_zZxdIbUwScy-38" content="<object label="fauit_library" score-type="component" score-language="-"/>" data-label="fauit_library" data-score-type="component" data-score-language="-"><g><rect x="20" y="243.12" width="130" 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: 128px; height: 1px; padding-top: 273px; margin-left: 21px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">fauit_library</div></div></div></foreignObject><text x="85" y="279" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="19px" text-anchor="middle">fauit_library</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-39"><g id="cell-cyVkqPuj_zZxdIbUwScy-39" content="<object label="diagnostic_&lt;div&gt;fault_manager&lt;/div&gt;" score-type="component"/>" data-label="diagnostic_<div>fault_manager</div>" data-score-type="component"><g><rect x="20" y="311.56" width="130" 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: 128px; height: 1px; padding-top: 342px; margin-left: 21px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">diagnostic_<div>fault_manager</div></div></div></div></foreignObject><text x="85" y="347" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="19px" text-anchor="middle">diagnostic_...</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-40"><g id="cell-cyVkqPuj_zZxdIbUwScy-40" content="<object label="diagnostic_&lt;div&gt;database&lt;/div&gt;" score-type="component"/>" data-label="diagnostic_<div>database</div>" data-score-type="component"><g><rect x="20" y="383.12" width="130" 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: 128px; height: 1px; padding-top: 413px; margin-left: 21px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">diagnostic_<div>database</div></div></div></div></foreignObject><text x="85" y="419" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="19px" text-anchor="middle">diagnostic_...</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-41"><g id="cell-cyVkqPuj_zZxdIbUwScy-41" content="<object label="sovd_server" score-type="component"/>" data-label="sovd_server" data-score-type="component"><g><rect x="165" y="243.12" width="165" 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: 163px; height: 1px; padding-top: 273px; margin-left: 166px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">sovd_server</div></div></div></foreignObject><text x="248" y="279" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="19px" text-anchor="middle">sovd_server</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-42"><g id="cell-cyVkqPuj_zZxdIbUwScy-42" content="<object label="sovd_gateway" score-type="component"/>" data-label="sovd_gateway" data-score-type="component"><g><rect x="165" y="311.56" width="165" 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: 163px; height: 1px; padding-top: 342px; margin-left: 166px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">sovd_gateway</div></div></div></foreignObject><text x="248" y="347" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="19px" text-anchor="middle">sovd_gateway</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-43"><g id="cell-cyVkqPuj_zZxdIbUwScy-43" content="<object label="classic_diagnostic&lt;div&gt;_adapter&lt;/div&gt;" score-type="component"/>" data-label="classic_diagnostic<div>_adapter</div>" data-score-type="component"><g><rect x="165" y="383.12" width="165" 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: 163px; height: 1px; padding-top: 413px; margin-left: 166px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">classic_diagnostic<div>_adapter</div></div></div></div></foreignObject><text x="248" y="419" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="19px" text-anchor="middle">classic_diagnosti...</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-44"><g id="cell-cyVkqPuj_zZxdIbUwScy-44" content="<object label="sovd_client" score-type="component"/>" data-label="sovd_client" data-score-type="component"><g><rect x="20" y="529.37" width="130" 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: 128px; height: 1px; padding-top: 559px; margin-left: 21px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">sovd_client</div></div></div></foreignObject><text x="85" y="565" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="19px" text-anchor="middle">sovd_client</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-45"><g id="cell-cyVkqPuj_zZxdIbUwScy-45"><g><rect x="20" y="455.62" width="130" 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: 128px; height: 1px; padding-top: 486px; margin-left: 21px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">uds2sovd_<div>proxy</div></div></div></div></foreignObject><text x="85" y="491" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="19px" text-anchor="middle">uds2sovd_...</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-46"><g id="cell-cyVkqPuj_zZxdIbUwScy-46" content="<object label="diagnostic_&lt;div&gt;service_app&lt;/div&gt;" score-type="component"/>" data-label="diagnostic_<div>service_app</div>" data-score-type="component"><g><rect x="165" y="455.62" width="165" 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: 163px; height: 1px; padding-top: 486px; margin-left: 166px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">diagnostic_<div>service_app</div></div></div></div></foreignObject><text x="248" y="491" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="19px" text-anchor="middle">diagnostic_...</text></switch></g></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-48"><g id="cell-cyVkqPuj_zZxdIbUwScy-48" content="<object label="someip" score-type="external-module"/>" data-label="someip" data-score-type="external-module"><g><rect x="0" y="670" width="340" height="250" rx="37.5" ry="37.5" fill="#f5f5f5" stroke="#666666" pointer-events="all" style="fill: rgb(245, 245, 245); stroke: rgb(102, 102, 102);"/></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: 338px; height: 1px; padding-top: 677px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #333333; "><div style="display: inline-block; font-size: 20px; font-family: "Helvetica"; color: #333333; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">someip</div></div></div></foreignObject><text x="170" y="697" fill="#333333" font-family=""Helvetica"" font-size="20px" text-anchor="middle">someip</text></switch></g></g></g></g><g data-cell-id="zOfhbxZQrp5VTqdj2Vb1-4"><g id="cell-zOfhbxZQrp5VTqdj2Vb1-4" content="<object label="score_someip_&lt;div&gt;gateway&lt;/div&gt;" score-type="component"/>" data-label="score_someip_<div>gateway</div>" data-score-type="component"><g><rect x="20" y="720" width="150" 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: 148px; height: 1px; padding-top: 750px; margin-left: 21px;"><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; white-space: normal; word-wrap: normal; ">score_someip_<div>gateway</div></div></div></div></foreignObject><text x="95" y="756" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">score_someip_...</text></switch></g></g></g></g><g data-cell-id="zOfhbxZQrp5VTqdj2Vb1-5"><g id="cell-zOfhbxZQrp5VTqdj2Vb1-5" content="<object label="someip_&lt;div&gt;protocol&lt;/div&gt;" score-type="component"/>" data-label="someip_<div>protocol</div>" data-score-type="component"><g><rect x="20" y="791.56" width="150" height="60" fill="#f5f5f5" stroke="#666666" pointer-events="all" style="fill: rgb(245, 245, 245); stroke: rgb(102, 102, 102);"/></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: 822px; margin-left: 21px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #333333; "><div style="display: inline-block; font-size: 20px; font-family: "Helvetica"; color: #333333; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">someip_<div>protocol</div></div></div></div></foreignObject><text x="95" y="828" fill="#333333" font-family=""Helvetica"" font-size="20px" text-anchor="middle">someip_...</text></switch></g></g></g></g><g data-cell-id="zOfhbxZQrp5VTqdj2Vb1-7"><g id="cell-zOfhbxZQrp5VTqdj2Vb1-7" content="<object label="abi-compatible-datatypes" score-type="component"/>" data-label="abi-compatible-datatypes" data-score-type="component"><g><rect x="1230" y="830" width="160" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 158px; height: 1px; padding-top: 860px; margin-left: 1231px;"><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; white-space: normal; word-wrap: normal; ">abi-compatible-datatypes</div></div></div></foreignObject><text x="1310" y="866" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">abi-compatible-d...</text></switch></g></g></g></g><g data-cell-id="zOfhbxZQrp5VTqdj2Vb1-8"><g id="cell-zOfhbxZQrp5VTqdj2Vb1-8" content="<object label="abi-compatible-datatypes" score-type="component"/>" data-label="abi-compatible-datatypes" data-score-type="component"><g><rect x="1580" y="910" width="145" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 940px; margin-left: 1581px;"><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; white-space: normal; word-wrap: normal; ">abi-compatible-datatypes</div></div></div></foreignObject><text x="1653" y="946" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">abi-compatible-...</text></switch></g></g></g></g><g data-cell-id="zOfhbxZQrp5VTqdj2Vb1-9"><g id="cell-zOfhbxZQrp5VTqdj2Vb1-9" content="<object label="ai-platform" score-type="module"/>" data-label="ai-platform" data-score-type="module"><g><rect x="1990" y="209.69" width="200" height="275.62" rx="30" ry="30" 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: 198px; height: 1px; padding-top: 217px; margin-left: 1991px;"><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; white-space: normal; word-wrap: normal; ">ai-platform</div></div></div></foreignObject><text x="2090" y="237" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">ai-platform</text></switch></g></g></g></g><g data-cell-id="zOfhbxZQrp5VTqdj2Vb1-10"><g id="cell-zOfhbxZQrp5VTqdj2Vb1-10" content="<object label="inference_&lt;div&gt;adapter&lt;/div&gt;" score-type="component"/>" data-label="inference_<div>adapter</div>" data-score-type="component"><g><rect x="2020" y="251.56" width="130" 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: 128px; height: 1px; padding-top: 282px; margin-left: 2021px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">inference_<div>adapter</div></div></div></div></foreignObject><text x="2085" y="287" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="19px" text-anchor="middle">inference_...</text></switch></g></g></g></g><g data-cell-id="zOfhbxZQrp5VTqdj2Vb1-15"><g id="cell-zOfhbxZQrp5VTqdj2Vb1-15" content="<object label="onnx_runtime" score-type="component"/>" data-label="onnx_runtime" data-score-type="component"><g><rect x="2020" y="324.06" width="130" height="60" fill="#f5f5f5" stroke="#666666" pointer-events="all" style="fill: rgb(245, 245, 245); stroke: rgb(102, 102, 102);"/></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: 128px; height: 1px; padding-top: 354px; margin-left: 2021px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #333333; "><div style="display: inline-block; font-size: 19px; font-family: "Helvetica"; color: #333333; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">onnx_runtime</div></div></div></foreignObject><text x="2085" y="360" fill="#333333" font-family=""Helvetica"" font-size="19px" text-anchor="middle">onnx_runtime</text></switch></g></g></g></g><g data-cell-id="zOfhbxZQrp5VTqdj2Vb1-17"><g id="cell-zOfhbxZQrp5VTqdj2Vb1-17"><g><rect x="550" y="1170" width="130" height="60" rx="9" ry="9" fill="#f5f5f5" stroke="#666666" pointer-events="all" style="fill: rgb(245, 245, 245); stroke: rgb(102, 102, 102);"/></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: 128px; height: 1px; padding-top: 1177px; margin-left: 551px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #333333; "><div style="display: inline-block; font-size: 20px; font-family: "Helvetica"; color: #333333; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">ext module/<div>repository</div></div></div></div></foreignObject><text x="615" y="1197" fill="#333333" font-family=""Helvetica"" font-size="20px" text-anchor="middle">ext module/...</text></switch></g></g></g></g><g data-cell-id="lLnuWv548SjsVmpskmR--0"><g id="cell-lLnuWv548SjsVmpskmR--0" content="<object label="datarouter" score-type="component"/>" data-label="datarouter" data-score-type="component"><g><rect x="1134" y="640" 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 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: 670px; margin-left: 1135px;"><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; white-space: normal; word-wrap: normal; ">datarouter</div></div></div></foreignObject><text x="1194" y="676" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">datarouter</text></switch></g></g></g></g><g data-cell-id="lLnuWv548SjsVmpskmR--4"><g id="cell-lLnuWv548SjsVmpskmR--4" content="<object label="record/&lt;div&gt;replay&lt;/div&gt;" score-type="component"/>" data-label="record/<div>replay</div>" data-score-type="component"><g><rect x="535" y="388.44" width="120" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 418px; margin-left: 536px;"><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; white-space: normal; word-wrap: normal; ">record/<div>replay</div></div></div></div></foreignObject><text x="595" y="424" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">record/...</text></switch></g></g></g></g><g data-cell-id="H0D6Iy5TQXu2IpcHdf1l-1"><g id="cell-H0D6Iy5TQXu2IpcHdf1l-1"><g><rect x="405" y="1300" width="125" 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: 123px; height: 1px; padding-top: 1330px; margin-left: 406px;"><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; white-space: normal; word-wrap: normal; ">language to be defined</div></div></div></foreignObject><text x="468" y="1336" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="20px" text-anchor="middle">language to b...</text></switch></g></g></g></g><g data-cell-id="H0D6Iy5TQXu2IpcHdf1l-3"><g id="cell-H0D6Iy5TQXu2IpcHdf1l-3"><g><rect x="380" y="0" width="1220" height="100" 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-start; width: 1218px; height: 1px; padding-top: 50px; margin-left: 382px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #000000; "><div style="display: inline-block; font-size: 60px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Modules and Components of S-CORE 1.0</div></div></div></foreignObject><text x="382" y="68" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="60px">Modules and Components of S-CORE 1.0</text></switch></g></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 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="2191px" height="1361px" viewBox="-0.5 -0.5 2191 1361" content="<mxfile host="Electron" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/28.0.6 Chrome/138.0.7204.100 Electron/37.2.3 Safari/537.36" version="28.0.6" pages="2"> <diagram name="1.0 Module Architecture" id="kHHpjcKEgZkgKQ2km6BW"> <mxGraphModel dx="2916" dy="1209" grid="0" 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="X8Ibqyh2nUvShLqAq-5g-0" /> <mxCell id="X8Ibqyh2nUvShLqAq-5g-1" parent="X8Ibqyh2nUvShLqAq-5g-0" /> <object label="baselibs" score-type="module" id="X8Ibqyh2nUvShLqAq-5g-2"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1200" y="850" width="630" height="230" as="geometry" /> </mxCell> </object> <object label="baselibs" score-type="module" id="X8Ibqyh2nUvShLqAq-5g-3"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="20" y="850" width="1160" height="230" as="geometry" /> </mxCell> </object> <object label="logging" score-type="module" id="X8Ibqyh2nUvShLqAq-5g-7"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="740" y="566.25" width="330" height="260" as="geometry" /> </mxCell> </object> <object label="feo" score-type="module" id="X8Ibqyh2nUvShLqAq-5g-9"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="15" y="267.81" width="450" height="267.5" as="geometry" /> </mxCell> </object> <mxCell id="X8Ibqyh2nUvShLqAq-5g-10" value="component" style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="50" y="1150" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="X8Ibqyh2nUvShLqAq-5g-11" value="bazel module/&lt;div&gt;repository&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="190" y="1150" width="130" height="60" as="geometry" /> </mxCell> <object label="feo-time" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-12"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="305" y="308.44" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="feo-com" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-13"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="45" y="378.44" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="feo-log" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-15"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="175" y="378.44" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="communication" score-type="module" id="X8Ibqyh2nUvShLqAq-5g-21"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="20" y="566.25" width="460" height="250" as="geometry" /> </mxCell> </object> <object label="feo-tracing" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-22"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;dashed=1;dashPattern=8 8;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="305" y="378.44" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="feo" score-type="component" placeholders="null" id="X8Ibqyh2nUvShLqAq-5g-23"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="45" y="308.44" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="mw::com Frontend" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-24"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#d6b656;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=20;fontColor=default;fillColor=#ccd6ff;gradientColor=#FFF2CC;gradientDirection=north;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="45" y="627.19" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="Logging API" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-25"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="774" y="616.25" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="feo-cpp" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-27"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#ccd6ff;strokeColor=#d6b656;gradientColor=#FFF2CC;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="175" y="308.44" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="ipc-binding (LoLa)" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-28"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="45" y="717.19" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="mw::com Frontend" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-29"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="185" y="627.19" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="Mock binding" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-30"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="185" y="717.19" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="lola- configuration" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-31"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="320" y="717.19" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="memory" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-32"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="40" y="890" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="message passing" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-33"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="180" y="890" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="json" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-34"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="320" y="890" width="120" height="60" as="geometry" /> </mxCell> </object> <mxCell id="X8Ibqyh2nUvShLqAq-5g-35" value="C++&lt;div&gt;component&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="50" y="1220" width="120" height="60" as="geometry" /> </mxCell> <object label="osal" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-36"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="460" y="890" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="Filesystem" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-38"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="600" y="890" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="persistency" score-type="module" id="X8Ibqyh2nUvShLqAq-5g-45"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1090" y="566.25" width="170" height="263.75" as="geometry" /> </mxCell> </object> <object label="kvs" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-46"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#d6b656;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=20;fillColor=#fff2cc;gradientDirection=north;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1110" y="616.25" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="kvs" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-47"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#6c8ebf;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=20;fillColor=#dae8fc;gradientDirection=north;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1110" y="700" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="filesystem" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-48"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;dashed=1;dashPattern=8 8;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1380" y="890" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="json" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-49"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;dashed=1;dashPattern=8 8;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1220" y="890" width="145" height="60" as="geometry" /> </mxCell> </object> <object label="Result" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-50"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="735" y="890" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="orchestration" score-type="module" id="X8Ibqyh2nUvShLqAq-5g-55"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1280" y="566.25" width="300" height="263.75" as="geometry" /> </mxCell> </object> <object label="runtime" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-56"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#d6b656;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=20;fillColor=#fff2cc;gradientDirection=north;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1300" y="676.25" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="orchestration" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-57"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#d6b656;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=20;fillColor=#fff2cc;gradientDirection=north;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1300" y="596.25" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="std replacement" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-58"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#d6b656;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=20;fillColor=#fff2cc;gradientDirection=north;dashed=1;dashPattern=8 8;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1515" y="890" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="orchestration cpp" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-59"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#d6b656;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=20;fillColor=#ccd6ff;gradientDirection=south;fontColor=default;gradientColor=#FFF2CC;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1440" y="596.25" width="120" height="60" as="geometry" /> </mxCell> </object> <mxCell id="X8Ibqyh2nUvShLqAq-5g-60" value="Rust&amp;nbsp;&lt;div&gt;component&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="45" y="1290" width="125" height="60" as="geometry" /> </mxCell> <object label="futurecpp" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-61"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="40" y="980" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="bitmanipulation" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-62"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="170" y="980" width="140" height="60" as="geometry" /> </mxCell> </object> <object label="concurrency" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-63"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="319" y="980" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="containers" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-64"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="459" y="980" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="safecpp" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-65"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="599" y="980" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="utils" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-66"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="739" y="980" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="static_reflection_&lt;br&gt;with_serialization" score-type="component" id="X8Ibqyh2nUvShLqAq-5g-67"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="990" y="980" width="176" height="60" as="geometry" /> </mxCell> </object> <object label="daal?" score-type="component" id="cyVkqPuj_zZxdIbUwScy-0"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="305" y="448.44" width="120" height="60" as="geometry" /> </mxCell> </object> <mxCell id="cyVkqPuj_zZxdIbUwScy-2" value="" style="endArrow=none;dashed=1;html=1;rounded=0;strokeWidth=3;" parent="X8Ibqyh2nUvShLqAq-5g-1" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint y="1080.952380952381" as="sourcePoint" /> <mxPoint y="240" as="targetPoint" /> </mxGeometry> </mxCell> <object label="security" score-type="module" id="cyVkqPuj_zZxdIbUwScy-3"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="490" y="271.56" width="460" height="267.5" as="geometry" /> </mxCell> </object> <mxCell id="cyVkqPuj_zZxdIbUwScy-4" value="crypto_libs" style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="510" y="311.56" width="190" height="50" as="geometry" /> </mxCell> <mxCell id="cyVkqPuj_zZxdIbUwScy-5" value="crypto_libs" style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="520" y="321.56" width="190" height="50" as="geometry" /> </mxCell> <object label="crypto_libs" score-type="component" id="cyVkqPuj_zZxdIbUwScy-6"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="530" y="331.56" width="190" height="50" as="geometry" /> </mxCell> </object> <object label="keystore&lt;div&gt;(HSM abstraction)&lt;/div&gt;" score-type="component" id="cyVkqPuj_zZxdIbUwScy-7"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="520" y="391.56" width="190" height="50" as="geometry" /> </mxCell> </object> <object label="sign_verify" score-type="component" id="cyVkqPuj_zZxdIbUwScy-8"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="520" y="451.56" width="190" height="50" as="geometry" /> </mxCell> </object> <object label="keymgmt" score-type="component" id="cyVkqPuj_zZxdIbUwScy-9"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="740" y="321.56" width="190" height="50" as="geometry" /> </mxCell> </object> <object label="access_mgmt" score-type="component" id="cyVkqPuj_zZxdIbUwScy-10"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="740" y="391.56" width="190" height="50" as="geometry" /> </mxCell> </object> <object label="lifecycle" score-type="module" id="cyVkqPuj_zZxdIbUwScy-12"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="490" y="566.25" width="240" height="253.75" as="geometry" /> </mxCell> </object> <object label="launchmanager" score-type="component" id="cyVkqPuj_zZxdIbUwScy-13"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="510" y="616.25" width="190" height="50" as="geometry" /> </mxCell> </object> <object label="healthmonitor" score-type="component" id="cyVkqPuj_zZxdIbUwScy-14"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="510" y="686.25" width="190" height="50" as="geometry" /> </mxCell> </object> <object label="time" score-type="module" id="cyVkqPuj_zZxdIbUwScy-20"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="980" y="271.56" width="280" height="273.75" as="geometry" /> </mxCell> </object> <object label="gptp_client" score-type="component" id="cyVkqPuj_zZxdIbUwScy-21"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1000" y="311.56" width="110" height="60" as="geometry" /> </mxCell> </object> <object label="time_base_&lt;div&gt;provider&lt;/div&gt;" score-type="component" id="cyVkqPuj_zZxdIbUwScy-22"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1000" y="384.06" width="110" height="60" as="geometry" /> </mxCell> </object> <object label="clock::&lt;br&gt;sync" score-type="component" id="cyVkqPuj_zZxdIbUwScy-23"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1120" y="311.56" width="130" height="60" as="geometry" /> </mxCell> </object> <object label="clock::&lt;br&gt;authentic" score-type="component" id="cyVkqPuj_zZxdIbUwScy-24"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1120" y="384.06" width="130" height="60" as="geometry" /> </mxCell> </object> <object label="time" score-type="component" id="cyVkqPuj_zZxdIbUwScy-26"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1000" y="452.81" width="110" height="60" as="geometry" /> </mxCell> </object> <object label="time" score-type="component" id="cyVkqPuj_zZxdIbUwScy-27"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="870" y="980" width="110" height="60" as="geometry" /> </mxCell> </object> <object label="config" score-type="module" id="cyVkqPuj_zZxdIbUwScy-28"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1280" y="265.31" width="330" height="286.25" as="geometry" /> </mxCell> </object> <object label="config_daemon" score-type="component" id="cyVkqPuj_zZxdIbUwScy-29"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1300" y="307.81" width="130" height="60" as="geometry" /> </mxCell> </object> <object label="config_provider" score-type="component" id="cyVkqPuj_zZxdIbUwScy-30"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1300" y="384.06" width="130" height="60" as="geometry" /> </mxCell> </object> <mxCell id="cyVkqPuj_zZxdIbUwScy-31" value="config_plugins" style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1300" y="452.81" width="130" height="60" as="geometry" /> </mxCell> <mxCell id="cyVkqPuj_zZxdIbUwScy-32" value="config_plugins" style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1310" y="462.81" width="130" height="60" as="geometry" /> </mxCell> <object label="config_plugins" score-type="component" id="cyVkqPuj_zZxdIbUwScy-33"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1320" y="472.81" width="130" height="60" as="geometry" /> </mxCell> </object> <object label="calibration_&lt;div&gt;interface&lt;/div&gt;" score-type="component" id="cyVkqPuj_zZxdIbUwScy-34"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1450" y="307.81" width="130" height="60" as="geometry" /> </mxCell> </object> <object label="faultmanagement" score-type="module" id="cyVkqPuj_zZxdIbUwScy-35"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1610" y="566.25" width="220" height="253.75" as="geometry" /> </mxCell> </object> <object label="opensovd" score-type="external-module" id="cyVkqPuj_zZxdIbUwScy-37"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="-360" y="266.25" width="340" height="423.12" as="geometry" /> </mxCell> </object> <object label="fauit_library" score-type="component" score-language="-" id="cyVkqPuj_zZxdIbUwScy-38"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="-340" y="303.12" width="130" height="60" as="geometry" /> </mxCell> </object> <object label="diagnostic_&lt;div&gt;fault_manager&lt;/div&gt;" score-type="component" id="cyVkqPuj_zZxdIbUwScy-39"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="-340" y="371.56000000000006" width="130" height="60" as="geometry" /> </mxCell> </object> <object label="diagnostic_&lt;div&gt;database&lt;/div&gt;" score-type="component" id="cyVkqPuj_zZxdIbUwScy-40"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="-340" y="443.12" width="130" height="60" as="geometry" /> </mxCell> </object> <object label="sovd_server" score-type="component" id="cyVkqPuj_zZxdIbUwScy-41"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="-195" y="303.12" width="165" height="60" as="geometry" /> </mxCell> </object> <object label="sovd_gateway" score-type="component" id="cyVkqPuj_zZxdIbUwScy-42"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="-195" y="371.56" width="165" height="60" as="geometry" /> </mxCell> </object> <object label="classic_diagnostic&lt;div&gt;_adapter&lt;/div&gt;" score-type="component" id="cyVkqPuj_zZxdIbUwScy-43"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="-195" y="443.12" width="165" height="60" as="geometry" /> </mxCell> </object> <object label="sovd_client" score-type="component" id="cyVkqPuj_zZxdIbUwScy-44"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="-340" y="589.37" width="130" height="60" as="geometry" /> </mxCell> </object> <mxCell id="cyVkqPuj_zZxdIbUwScy-45" value="uds2sovd_&lt;div&gt;proxy&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="-340" y="515.62" width="130" height="60" as="geometry" /> </mxCell> <object label="diagnostic_&lt;div&gt;service_app&lt;/div&gt;" score-type="component" id="cyVkqPuj_zZxdIbUwScy-46"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="-195" y="515.62" width="165" height="60" as="geometry" /> </mxCell> </object> <object label="someip" score-type="external-module" id="cyVkqPuj_zZxdIbUwScy-48"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="-360" y="730" width="340" height="250" as="geometry" /> </mxCell> </object> <object label="score_someip_&lt;div&gt;gateway&lt;/div&gt;" score-type="component" id="zOfhbxZQrp5VTqdj2Vb1-4"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="-340" y="780" width="150" height="60" as="geometry" /> </mxCell> </object> <object label="someip_&lt;div&gt;protocol&lt;/div&gt;" score-type="component" id="zOfhbxZQrp5VTqdj2Vb1-5"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="-340" y="851.56" width="150" height="60" as="geometry" /> </mxCell> </object> <object label="abi-compatible-datatypes" score-type="component" id="zOfhbxZQrp5VTqdj2Vb1-7"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="870" y="890" width="160" height="60" as="geometry" /> </mxCell> </object> <object label="abi-compatible-datatypes" score-type="component" id="zOfhbxZQrp5VTqdj2Vb1-8"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1220" y="970" width="145" height="60" as="geometry" /> </mxCell> </object> <object label="ai-platform" score-type="module" id="zOfhbxZQrp5VTqdj2Vb1-9"> <mxCell style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1630" y="269.69" width="200" height="275.62" as="geometry" /> </mxCell> </object> <object label="inference_&lt;div&gt;adapter&lt;/div&gt;" score-type="component" id="zOfhbxZQrp5VTqdj2Vb1-10"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1660" y="311.56" width="130" height="60" as="geometry" /> </mxCell> </object> <object label="onnx_runtime" score-type="component" id="zOfhbxZQrp5VTqdj2Vb1-15"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=19;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="1660" y="384.06" width="130" height="60" as="geometry" /> </mxCell> </object> <mxCell id="zOfhbxZQrp5VTqdj2Vb1-17" value="ext module/&lt;div&gt;repository&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontSize=20;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="190" y="1230" width="130" height="60" as="geometry" /> </mxCell> <object label="datarouter" score-type="component" id="lLnuWv548SjsVmpskmR--0"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="774" y="700" width="120" height="60" as="geometry" /> </mxCell> </object> <object label="record/&lt;div&gt;replay&lt;/div&gt;" score-type="component" id="lLnuWv548SjsVmpskmR--4"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="175" y="448.44" width="120" height="60" as="geometry" /> </mxCell> </object> <mxCell id="H0D6Iy5TQXu2IpcHdf1l-1" value="language to be defined" style="rounded=0;whiteSpace=wrap;html=1;fontSize=20;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="45" y="1360" width="125" height="60" as="geometry" /> </mxCell> <mxCell id="H0D6Iy5TQXu2IpcHdf1l-3" value="Modules and Components of S-CORE 1.0" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=60;" parent="X8Ibqyh2nUvShLqAq-5g-1" vertex="1"> <mxGeometry x="20" y="60" width="1220" height="100" as="geometry" /> </mxCell> <object label="Logging API" score-type="component" id="pnE1acWjGvAhNX2O8zET-2"> <mxCell style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#d6b656;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=20;fontColor=default;fillColor=#ccd6ff;gradientColor=#FFF2CC;gradientDirection=north;" vertex="1" parent="X8Ibqyh2nUvShLqAq-5g-1"> <mxGeometry x="909" y="616" width="120" height="60" as="geometry" /> </mxCell> </object> </root> </mxGraphModel> </diagram> <diagram id="E6MF477lCpV7keu6hLqp" name="Fallback QNX 8"> <mxGraphModel dx="2335" dy="823" 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="1k3IXSwx12tV7RTQSR1Z-2" value="Baselibs" style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1"> <mxGeometry x="40" y="850" width="850" height="230" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;jumpStyle=arc;" parent="1" source="1k3IXSwx12tV7RTQSR1Z-6" target="1k3IXSwx12tV7RTQSR1Z-35" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="805" y="810" /> <mxPoint x="540" y="810" /> </Array> </mxGeometry> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.406;exitY=0.994;exitDx=0;exitDy=0;exitPerimeter=0;jumpStyle=arc;" parent="1" source="1k3IXSwx12tV7RTQSR1Z-6" target="1k3IXSwx12tV7RTQSR1Z-33" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="805" y="768" /> <mxPoint x="805" y="810" /> <mxPoint x="400" y="810" /> </Array> </mxGeometry> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="1k3IXSwx12tV7RTQSR1Z-6" target="1k3IXSwx12tV7RTQSR1Z-37" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="805" y="810" /> <mxPoint x="680" y="810" /> </Array> </mxGeometry> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-6" value="Logging" style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1"> <mxGeometry x="640" y="510" width="330" height="260" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-9" value="Component" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="730" y="50" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-10" value="Module" style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1"> <mxGeometry x="910" y="30" width="130" height="70" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="1k3IXSwx12tV7RTQSR1Z-20" target="1k3IXSwx12tV7RTQSR1Z-24" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;jumpStyle=arc;" parent="1" source="1k3IXSwx12tV7RTQSR1Z-20" target="1k3IXSwx12tV7RTQSR1Z-33" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="260" y="840" /> <mxPoint x="400" y="840" /> </Array> </mxGeometry> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;jumpStyle=arc;" parent="1" source="1k3IXSwx12tV7RTQSR1Z-20" target="1k3IXSwx12tV7RTQSR1Z-34" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="-120" y="700" /> </Array> </mxGeometry> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;jumpStyle=arc;" parent="1" source="1k3IXSwx12tV7RTQSR1Z-20" target="1k3IXSwx12tV7RTQSR1Z-32" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;jumpStyle=arc;" parent="1" source="1k3IXSwx12tV7RTQSR1Z-20" target="1k3IXSwx12tV7RTQSR1Z-31" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="260" y="840" /> <mxPoint x="120" y="840" /> </Array> </mxGeometry> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-20" value="Communication" style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1"> <mxGeometry x="30" y="510" width="460" height="250" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-24" value="Logging API" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="674" y="560" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-27" value="IPC binding (LoLa)" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="70" y="660" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-28" value="mw::com Frontend" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="210" y="570" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-29" value="Mock binding" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="210" y="660" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-30" value="LoLa Configuration" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="350" y="660" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-31" value="memory" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="60" y="890" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-32" value="Message Passing" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="200" y="890" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-33" value="JSON&amp;nbsp;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="340" y="890" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-34" value="&amp;nbsp;tracing (frontend)" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;dashed=1;dashPattern=8 8;" parent="1" vertex="1"> <mxGeometry x="-200" y="680" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-35" value="&quot;OSAL&quot;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="480" y="890" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-37" value="Filesystem" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="620" y="890" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-38" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;jumpStyle=arc;" parent="1" source="1k3IXSwx12tV7RTQSR1Z-44" target="1k3IXSwx12tV7RTQSR1Z-37" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="1170" y="820" /> <mxPoint x="680" y="820" /> </Array> </mxGeometry> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-41" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;jumpStyle=arc;" parent="1" source="1k3IXSwx12tV7RTQSR1Z-44" target="1k3IXSwx12tV7RTQSR1Z-33" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="1170" y="820" /> <mxPoint x="400" y="820" /> </Array> </mxGeometry> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-42" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.25;entryDx=0;entryDy=0;" parent="1" source="1k3IXSwx12tV7RTQSR1Z-44" target="1k3IXSwx12tV7RTQSR1Z-6" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-43" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;jumpStyle=arc;" parent="1" source="1k3IXSwx12tV7RTQSR1Z-44" target="1k3IXSwx12tV7RTQSR1Z-49" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="1170" y="820" /> <mxPoint x="830" y="820" /> </Array> </mxGeometry> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-44" value="Persistency" style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1"> <mxGeometry x="1020" y="510" width="300" height="140" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-46" value="kvs" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#6c8ebf;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=12;fillColor=#dae8fc;gradientDirection=north;" parent="1" vertex="1"> <mxGeometry x="1170" y="560" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-49" value="Result" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="760" y="890" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-60" value="futurecpp" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="60" y="980" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-61" value="bitmanipulation" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="190" y="980" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-62" value="concurrency" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="330" y="980" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-63" value="containers" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="460" y="980" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-64" value="safecpp" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="590" y="980" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-65" value="utils" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="720" y="980" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-66" value="static_reflection_&lt;br&gt;with_serialization" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="674" y="650" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-67" value="Third-party?" style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;dashed=1;dashPattern=8 8;" parent="1" vertex="1"> <mxGeometry x="544" y="1280" width="650" height="150" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-68" value="nlohman json" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="570" y="1310" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="1k3IXSwx12tV7RTQSR1Z-69" value="tiny-json" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1"> <mxGeometry x="700" y="1310" width="120" height="60" as="geometry" /> </mxCell> </root> </mxGraphModel> </diagram> </mxfile> "><defs><linearGradient x1="0%" y1="100%" x2="0%" y2="0%" id="drawio-svg-LustfRzaYNr8wBXzq-cO-gradient-_fff2cc-1-_ccd6ff-1-s-0"><stop offset="0%" stop-color="#ccd6ff" stop-opacity="1" style="stop-color: rgb(204, 214, 255); stop-opacity: 1;"/><stop offset="100%" stop-color="#FFF2CC" stop-opacity="1" style="stop-color: rgb(255, 242, 204); stop-opacity: 1;"/></linearGradient><linearGradient x1="0%" y1="0%" x2="0%" y2="100%" id="drawio-svg-LustfRzaYNr8wBXzq-cO-gradient-_ccd6ff-1-_fff2cc-1-s-0"><stop offset="0%" stop-color="#ccd6ff" stop-opacity="1" style="stop-color: rgb(204, 214, 255); stop-opacity: 1;"/><stop offset="100%" stop-color="#FFF2CC" stop-opacity="1" style="stop-color: rgb(255, 242, 204); stop-opacity: 1;"/></linearGradient></defs><g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-0"><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-1"><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-2"><g><rect x="1560" y="790" width="630" height="230" rx="34.5" ry="34.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));"/></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: 628px; height: 1px; padding-top: 797px; margin-left: 1561px;"><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; white-space: normal; word-wrap: normal; ">baselibs</div></div></div></foreignObject><text x="1875" y="817" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">baselibs</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-3"><g><rect x="380" y="790" width="1160" height="230" rx="34.5" ry="34.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));"/></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: 1158px; height: 1px; padding-top: 797px; margin-left: 381px;"><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; white-space: normal; word-wrap: normal; ">baselibs</div></div></div></foreignObject><text x="960" y="817" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">baselibs</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-7"><g><rect x="1100" y="506.25" width="330" height="260" rx="39" ry="39" 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: 328px; height: 1px; padding-top: 513px; margin-left: 1101px;"><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; white-space: normal; word-wrap: normal; ">logging</div></div></div></foreignObject><text x="1265" y="533" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">logging</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-9"><g><rect x="375" y="207.81" width="450" height="267.5" rx="40.13" ry="40.13" 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: 448px; height: 1px; padding-top: 215px; margin-left: 376px;"><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; white-space: normal; word-wrap: normal; ">feo</div></div></div></foreignObject><text x="600" y="235" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">feo</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-10"><g><rect x="410" y="1090" 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: 1120px; margin-left: 411px;"><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; white-space: normal; word-wrap: normal; ">component</div></div></div></foreignObject><text x="470" y="1126" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">component</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-11"><g><rect x="550" y="1090" width="130" height="60" rx="9" ry="9" 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: 128px; height: 1px; padding-top: 1097px; margin-left: 551px;"><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; white-space: normal; word-wrap: normal; ">bazel module/<div>repository</div></div></div></div></foreignObject><text x="615" y="1117" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">bazel module/...</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-12"><g><rect x="665" y="248.44" width="120" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 278px; margin-left: 666px;"><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; white-space: normal; word-wrap: normal; ">feo-time</div></div></div></foreignObject><text x="725" y="284" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">feo-time</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-13"><g><rect x="405" y="318.44" width="120" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 348px; margin-left: 406px;"><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; white-space: normal; word-wrap: normal; ">feo-com</div></div></div></foreignObject><text x="465" y="354" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">feo-com</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-15"><g><rect x="535" y="318.44" width="120" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 348px; margin-left: 536px;"><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; white-space: normal; word-wrap: normal; ">feo-log</div></div></div></foreignObject><text x="595" y="354" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">feo-log</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-21"><g><rect x="380" y="506.25" width="460" height="250" rx="37.5" ry="37.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));"/></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: 458px; height: 1px; padding-top: 513px; margin-left: 381px;"><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; white-space: normal; word-wrap: normal; ">communication</div></div></div></foreignObject><text x="610" y="533" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">communication</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-22"><g><rect x="665" y="318.44" width="120" height="60" fill="#fff2cc" stroke="#d6b656" stroke-dasharray="8 8" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 348px; margin-left: 666px;"><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; white-space: normal; word-wrap: normal; ">feo-tracing</div></div></div></foreignObject><text x="725" y="354" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">feo-tracing</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-23"><g><rect x="405" y="248.44" width="120" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 278px; margin-left: 406px;"><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; white-space: normal; word-wrap: normal; ">feo</div></div></div></foreignObject><text x="465" y="284" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">feo</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-24"><g><rect x="405" y="567.19" width="120" height="60" fill="url(#drawio-svg-LustfRzaYNr8wBXzq-cO-gradient-_fff2cc-1-_ccd6ff-1-s-0)" stroke="#d6b656" pointer-events="all" style="fill: url("#drawio-svg-LustfRzaYNr8wBXzq-cO-gradient-_fff2cc-1-_ccd6ff-1-s-0"); stroke: rgb(214, 182, 86);"/></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: 597px; margin-left: 406px;"><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; white-space: normal; word-wrap: normal; ">mw::com Frontend</div></div></div></foreignObject><text x="465" y="603" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">mw::com Fron...</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-25"><g><rect x="1134" y="556.25" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 586px; margin-left: 1135px;"><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; white-space: normal; word-wrap: normal; ">Logging API</div></div></div></foreignObject><text x="1194" y="592" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">Logging API</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-27"><g><rect x="535" y="248.44" width="120" height="60" fill="url(#drawio-svg-LustfRzaYNr8wBXzq-cO-gradient-_ccd6ff-1-_fff2cc-1-s-0)" stroke="#d6b656" pointer-events="all" style="fill: url("#drawio-svg-LustfRzaYNr8wBXzq-cO-gradient-_ccd6ff-1-_fff2cc-1-s-0"); stroke: rgb(214, 182, 86);"/></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: 278px; margin-left: 536px;"><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; white-space: normal; word-wrap: normal; ">feo-cpp</div></div></div></foreignObject><text x="595" y="284" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">feo-cpp</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-28"><g><rect x="405" y="657.19" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 687px; margin-left: 406px;"><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; white-space: normal; word-wrap: normal; ">ipc-binding (LoLa)</div></div></div></foreignObject><text x="465" y="693" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">ipc-binding...</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-29"><g><rect x="545" y="567.19" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 597px; margin-left: 546px;"><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; white-space: normal; word-wrap: normal; ">mw::com Frontend</div></div></div></foreignObject><text x="605" y="603" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">mw::com Fron...</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-30"><g><rect x="545" y="657.19" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 687px; margin-left: 546px;"><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; white-space: normal; word-wrap: normal; ">Mock binding</div></div></div></foreignObject><text x="605" y="693" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">Mock binding</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-31"><g><rect x="680" y="657.19" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 687px; margin-left: 681px;"><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; white-space: normal; word-wrap: normal; ">lola- configuration</div></div></div></foreignObject><text x="740" y="693" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">lola- config...</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-32"><g><rect x="400" y="830" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 860px; margin-left: 401px;"><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; white-space: normal; word-wrap: normal; ">memory</div></div></div></foreignObject><text x="460" y="866" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">memory</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-33"><g><rect x="540" y="830" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 860px; margin-left: 541px;"><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; white-space: normal; word-wrap: normal; ">message passing</div></div></div></foreignObject><text x="600" y="866" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">message pass...</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-34"><g><rect x="680" y="830" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 860px; margin-left: 681px;"><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; white-space: normal; word-wrap: normal; ">json</div></div></div></foreignObject><text x="740" y="866" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">json</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-35"><g><rect x="410" y="1160" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 1190px; margin-left: 411px;"><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; white-space: normal; word-wrap: normal; ">C++<div>component</div></div></div></div></foreignObject><text x="470" y="1196" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">C++...</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-36"><g><rect x="820" y="830" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 860px; margin-left: 821px;"><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; white-space: normal; word-wrap: normal; ">osal</div></div></div></foreignObject><text x="880" y="866" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">osal</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-38"><g><rect x="960" y="830" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 860px; margin-left: 961px;"><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; white-space: normal; word-wrap: normal; ">Filesystem</div></div></div></foreignObject><text x="1020" y="866" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">Filesystem</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-45"><g><rect x="1450" y="506.25" width="170" height="263.75" rx="25.5" ry="25.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));"/></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: 168px; height: 1px; padding-top: 513px; margin-left: 1451px;"><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; white-space: normal; word-wrap: normal; ">persistency</div></div></div></foreignObject><text x="1535" y="533" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">persistency</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-46"><g><rect x="1470" y="556.25" width="120" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 586px; margin-left: 1471px;"><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; white-space: normal; word-wrap: normal; ">kvs</div></div></div></foreignObject><text x="1530" y="592" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">kvs</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-47"><g><rect x="1470" y="640" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 670px; margin-left: 1471px;"><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; white-space: normal; word-wrap: normal; ">kvs</div></div></div></foreignObject><text x="1530" y="676" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">kvs</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-48"><g><rect x="1740" y="830" width="120" height="60" fill="#fff2cc" stroke="#d6b656" stroke-dasharray="8 8" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 860px; margin-left: 1741px;"><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; white-space: normal; word-wrap: normal; ">filesystem</div></div></div></foreignObject><text x="1800" y="866" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">filesystem</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-49"><g><rect x="1580" y="830" width="145" height="60" fill="#fff2cc" stroke="#d6b656" stroke-dasharray="8 8" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 143px; height: 1px; padding-top: 860px; margin-left: 1581px;"><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; white-space: normal; word-wrap: normal; ">json</div></div></div></foreignObject><text x="1653" y="866" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">json</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-50"><g><rect x="1095" y="830" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 860px; margin-left: 1096px;"><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; white-space: normal; word-wrap: normal; ">Result</div></div></div></foreignObject><text x="1155" y="866" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">Result</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-55"><g><rect x="1640" y="506.25" width="300" height="263.75" rx="39.56" ry="39.56" 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: 298px; height: 1px; padding-top: 513px; margin-left: 1641px;"><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; white-space: normal; word-wrap: normal; ">orchestration</div></div></div></foreignObject><text x="1790" y="533" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">orchestration</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-56"><g><rect x="1660" y="616.25" width="120" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 646px; margin-left: 1661px;"><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; white-space: normal; word-wrap: normal; ">runtime</div></div></div></foreignObject><text x="1720" y="652" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">runtime</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-57"><g><rect x="1660" y="536.25" width="120" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 566px; margin-left: 1661px;"><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; white-space: normal; word-wrap: normal; ">orchestration</div></div></div></foreignObject><text x="1720" y="572" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">orchestration</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-58"><g><rect x="1875" y="830" width="120" height="60" fill="#fff2cc" stroke="#d6b656" stroke-dasharray="8 8" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 860px; margin-left: 1876px;"><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; white-space: normal; word-wrap: normal; ">std replacement</div></div></div></foreignObject><text x="1935" y="866" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">std replacem...</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-59"><g><rect x="1800" y="536.25" width="120" height="60" fill="url(#drawio-svg-LustfRzaYNr8wBXzq-cO-gradient-_ccd6ff-1-_fff2cc-1-s-0)" stroke="#d6b656" pointer-events="all" style="fill: url("#drawio-svg-LustfRzaYNr8wBXzq-cO-gradient-_ccd6ff-1-_fff2cc-1-s-0"); stroke: rgb(214, 182, 86);"/></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: 566px; margin-left: 1801px;"><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; white-space: normal; word-wrap: normal; ">orchestration cpp</div></div></div></foreignObject><text x="1860" y="572" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">orchestratio...</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-60"><g><rect x="405" y="1230" width="125" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 123px; height: 1px; padding-top: 1260px; margin-left: 406px;"><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; white-space: normal; word-wrap: normal; ">Rust <div>component</div></div></div></div></foreignObject><text x="468" y="1266" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">Rust...</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-61"><g><rect x="400" y="920" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 950px; margin-left: 401px;"><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; white-space: normal; word-wrap: normal; ">futurecpp</div></div></div></foreignObject><text x="460" y="956" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">futurecpp</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-62"><g><rect x="530" y="920" width="140" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 950px; margin-left: 531px;"><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; white-space: normal; word-wrap: normal; ">bitmanipulation</div></div></div></foreignObject><text x="600" y="956" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">bitmanipulation</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-63"><g><rect x="679" y="920" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 950px; margin-left: 680px;"><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; white-space: normal; word-wrap: normal; ">concurrency</div></div></div></foreignObject><text x="739" y="956" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">concurrency</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-64"><g><rect x="819" y="920" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 950px; margin-left: 820px;"><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; white-space: normal; word-wrap: normal; ">containers</div></div></div></foreignObject><text x="879" y="956" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">containers</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-65"><g><rect x="959" y="920" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 950px; margin-left: 960px;"><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; white-space: normal; word-wrap: normal; ">safecpp</div></div></div></foreignObject><text x="1019" y="956" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">safecpp</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-66"><g><rect x="1099" y="920" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 950px; margin-left: 1100px;"><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; white-space: normal; word-wrap: normal; ">utils</div></div></div></foreignObject><text x="1159" y="956" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">utils</text></switch></g></g></g><g data-cell-id="X8Ibqyh2nUvShLqAq-5g-67"><g><rect x="1350" y="920" width="176" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 174px; height: 1px; padding-top: 950px; margin-left: 1351px;"><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; white-space: normal; word-wrap: normal; ">static_reflection_<br />with_serialization</div></div></div></foreignObject><text x="1438" y="956" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">static_reflection_...</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-0"><g><rect x="665" y="388.44" width="120" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 418px; margin-left: 666px;"><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; white-space: normal; word-wrap: normal; ">daal?</div></div></div></foreignObject><text x="725" y="424" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">daal?</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-2"><g><path d="M 360 1020.95 L 360 180" fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-3"><g><rect x="850" y="211.56" width="460" height="267.5" rx="40.13" ry="40.13" 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: 458px; height: 1px; padding-top: 219px; margin-left: 851px;"><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; white-space: normal; word-wrap: normal; ">security</div></div></div></foreignObject><text x="1080" y="239" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">security</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-4"><g><rect x="870" y="251.56" width="190" height="50" 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: 188px; height: 1px; padding-top: 277px; margin-left: 871px;"><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; white-space: normal; word-wrap: normal; ">crypto_libs</div></div></div></foreignObject><text x="965" y="283" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">crypto_libs</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-5"><g><rect x="880" y="261.56" width="190" height="50" 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: 188px; height: 1px; padding-top: 287px; margin-left: 881px;"><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; white-space: normal; word-wrap: normal; ">crypto_libs</div></div></div></foreignObject><text x="975" y="293" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">crypto_libs</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-6"><g><rect x="890" y="271.56" width="190" height="50" 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: 188px; height: 1px; padding-top: 297px; margin-left: 891px;"><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; white-space: normal; word-wrap: normal; ">crypto_libs</div></div></div></foreignObject><text x="985" y="303" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">crypto_libs</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-7"><g><rect x="880" y="331.56" width="190" height="50" 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: 188px; height: 1px; padding-top: 357px; margin-left: 881px;"><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; white-space: normal; word-wrap: normal; ">keystore<div>(HSM abstraction)</div></div></div></div></foreignObject><text x="975" y="363" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">keystore...</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-8"><g><rect x="880" y="391.56" width="190" height="50" 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: 188px; height: 1px; padding-top: 417px; margin-left: 881px;"><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; white-space: normal; word-wrap: normal; ">sign_verify</div></div></div></foreignObject><text x="975" y="423" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">sign_verify</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-9"><g><rect x="1100" y="261.56" width="190" height="50" 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: 188px; height: 1px; padding-top: 287px; margin-left: 1101px;"><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; white-space: normal; word-wrap: normal; ">keymgmt</div></div></div></foreignObject><text x="1195" y="293" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">keymgmt</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-10"><g><rect x="1100" y="331.56" width="190" height="50" 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: 188px; height: 1px; padding-top: 357px; margin-left: 1101px;"><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; white-space: normal; word-wrap: normal; ">access_mgmt</div></div></div></foreignObject><text x="1195" y="363" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">access_mgmt</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-12"><g><rect x="850" y="506.25" width="240" height="253.75" rx="36" ry="36" 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: 238px; height: 1px; padding-top: 513px; margin-left: 851px;"><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; white-space: normal; word-wrap: normal; ">lifecycle</div></div></div></foreignObject><text x="970" y="533" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">lifecycle</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-13"><g><rect x="870" y="556.25" width="190" height="50" 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: 188px; height: 1px; padding-top: 581px; margin-left: 871px;"><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; white-space: normal; word-wrap: normal; ">launchmanager</div></div></div></foreignObject><text x="965" y="587" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">launchmanager</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-14"><g><rect x="870" y="626.25" width="190" height="50" 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: 188px; height: 1px; padding-top: 651px; margin-left: 871px;"><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; white-space: normal; word-wrap: normal; ">healthmonitor</div></div></div></foreignObject><text x="965" y="657" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">healthmonitor</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-20"><g><rect x="1340" y="211.56" width="280" height="273.75" rx="41.06" ry="41.06" 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: 278px; height: 1px; padding-top: 219px; margin-left: 1341px;"><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; white-space: normal; word-wrap: normal; ">time</div></div></div></foreignObject><text x="1480" y="239" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">time</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-21"><g><rect x="1360" y="251.56" width="110" 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: 108px; height: 1px; padding-top: 282px; margin-left: 1361px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">gptp_client</div></div></div></foreignObject><text x="1415" y="287" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="19px" text-anchor="middle">gptp_client</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-22"><g><rect x="1360" y="324.06" width="110" 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: 108px; height: 1px; padding-top: 354px; margin-left: 1361px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">time_base_<div>provider</div></div></div></div></foreignObject><text x="1415" y="360" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="19px" text-anchor="middle">time_base_...</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-23"><g><rect x="1480" y="251.56" width="130" 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: 128px; height: 1px; padding-top: 282px; margin-left: 1481px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">clock::<br />sync</div></div></div></foreignObject><text x="1545" y="287" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="19px" text-anchor="middle">clock::...</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-24"><g><rect x="1480" y="324.06" width="130" 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: 128px; height: 1px; padding-top: 354px; margin-left: 1481px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">clock::<br />authentic</div></div></div></foreignObject><text x="1545" y="360" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="19px" text-anchor="middle">clock::...</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-26"><g><rect x="1360" y="392.81" width="110" 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: 108px; height: 1px; padding-top: 423px; margin-left: 1361px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">time</div></div></div></foreignObject><text x="1415" y="429" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="19px" text-anchor="middle">time</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-27"><g><rect x="1230" y="920" width="110" 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: 108px; height: 1px; padding-top: 950px; margin-left: 1231px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">time</div></div></div></foreignObject><text x="1285" y="956" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="19px" text-anchor="middle">time</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-28"><g><rect x="1640" y="205.31" width="330" height="286.25" rx="42.94" ry="42.94" 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: 328px; height: 1px; padding-top: 212px; margin-left: 1641px;"><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; white-space: normal; word-wrap: normal; ">config</div></div></div></foreignObject><text x="1805" y="232" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">config</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-29"><g><rect x="1660" y="247.81" width="130" 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: 128px; height: 1px; padding-top: 278px; margin-left: 1661px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">config_daemon</div></div></div></foreignObject><text x="1725" y="284" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="19px" text-anchor="middle">config_daemon</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-30"><g><rect x="1660" y="324.06" width="130" 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: 128px; height: 1px; padding-top: 354px; margin-left: 1661px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">config_provider</div></div></div></foreignObject><text x="1725" y="360" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="19px" text-anchor="middle">config_provider</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-31"><g><rect x="1660" y="392.81" width="130" 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: 128px; height: 1px; padding-top: 423px; margin-left: 1661px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">config_plugins</div></div></div></foreignObject><text x="1725" y="429" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="19px" text-anchor="middle">config_plugins</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-32"><g><rect x="1670" y="402.81" width="130" 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: 128px; height: 1px; padding-top: 433px; margin-left: 1671px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">config_plugins</div></div></div></foreignObject><text x="1735" y="439" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="19px" text-anchor="middle">config_plugins</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-33"><g><rect x="1680" y="412.81" width="130" 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: 128px; height: 1px; padding-top: 443px; margin-left: 1681px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">config_plugins</div></div></div></foreignObject><text x="1745" y="449" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="19px" text-anchor="middle">config_plugins</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-34"><g><rect x="1810" y="247.81" width="130" 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: 128px; height: 1px; padding-top: 278px; margin-left: 1811px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">calibration_<div>interface</div></div></div></div></foreignObject><text x="1875" y="284" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="19px" text-anchor="middle">calibration_...</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-35"><g><rect x="1970" y="506.25" width="220" height="253.75" rx="33" ry="33" 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: 218px; height: 1px; padding-top: 513px; margin-left: 1971px;"><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; white-space: normal; word-wrap: normal; ">faultmanagement</div></div></div></foreignObject><text x="2080" y="533" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">faultmanagement</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-37"><g><rect x="0" y="206.25" width="340" height="423.12" rx="51" ry="51" fill="#f5f5f5" stroke="#666666" pointer-events="all" style="fill: rgb(245, 245, 245); stroke: rgb(102, 102, 102);"/></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: 338px; height: 1px; padding-top: 213px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #333333; "><div style="display: inline-block; font-size: 20px; font-family: Helvetica; color: #333333; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">opensovd</div></div></div></foreignObject><text x="170" y="233" fill="#333333" font-family="Helvetica" font-size="20px" text-anchor="middle">opensovd</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-38"><g><rect x="20" y="243.12" width="130" 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: 128px; height: 1px; padding-top: 273px; margin-left: 21px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">fauit_library</div></div></div></foreignObject><text x="85" y="279" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="19px" text-anchor="middle">fauit_library</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-39"><g><rect x="20" y="311.56" width="130" 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: 128px; height: 1px; padding-top: 342px; margin-left: 21px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">diagnostic_<div>fault_manager</div></div></div></div></foreignObject><text x="85" y="347" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="19px" text-anchor="middle">diagnostic_...</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-40"><g><rect x="20" y="383.12" width="130" 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: 128px; height: 1px; padding-top: 413px; margin-left: 21px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">diagnostic_<div>database</div></div></div></div></foreignObject><text x="85" y="419" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="19px" text-anchor="middle">diagnostic_...</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-41"><g><rect x="165" y="243.12" width="165" 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: 163px; height: 1px; padding-top: 273px; margin-left: 166px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">sovd_server</div></div></div></foreignObject><text x="248" y="279" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="19px" text-anchor="middle">sovd_server</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-42"><g><rect x="165" y="311.56" width="165" 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: 163px; height: 1px; padding-top: 342px; margin-left: 166px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">sovd_gateway</div></div></div></foreignObject><text x="248" y="347" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="19px" text-anchor="middle">sovd_gateway</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-43"><g><rect x="165" y="383.12" width="165" 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: 163px; height: 1px; padding-top: 413px; margin-left: 166px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">classic_diagnostic<div>_adapter</div></div></div></div></foreignObject><text x="248" y="419" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="19px" text-anchor="middle">classic_diagnosti...</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-44"><g><rect x="20" y="529.37" width="130" 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: 128px; height: 1px; padding-top: 559px; margin-left: 21px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">sovd_client</div></div></div></foreignObject><text x="85" y="565" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="19px" text-anchor="middle">sovd_client</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-45"><g><rect x="20" y="455.62" width="130" 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: 128px; height: 1px; padding-top: 486px; margin-left: 21px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">uds2sovd_<div>proxy</div></div></div></div></foreignObject><text x="85" y="491" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="19px" text-anchor="middle">uds2sovd_...</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-46"><g><rect x="165" y="455.62" width="165" 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: 163px; height: 1px; padding-top: 486px; margin-left: 166px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">diagnostic_<div>service_app</div></div></div></div></foreignObject><text x="248" y="491" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="19px" text-anchor="middle">diagnostic_...</text></switch></g></g></g><g data-cell-id="cyVkqPuj_zZxdIbUwScy-48"><g><rect x="0" y="670" width="340" height="250" rx="37.5" ry="37.5" fill="#f5f5f5" stroke="#666666" pointer-events="all" style="fill: rgb(245, 245, 245); stroke: rgb(102, 102, 102);"/></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: 338px; height: 1px; padding-top: 677px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #333333; "><div style="display: inline-block; font-size: 20px; font-family: Helvetica; color: #333333; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">someip</div></div></div></foreignObject><text x="170" y="697" fill="#333333" font-family="Helvetica" font-size="20px" text-anchor="middle">someip</text></switch></g></g></g><g data-cell-id="zOfhbxZQrp5VTqdj2Vb1-4"><g><rect x="20" y="720" width="150" 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: 148px; height: 1px; padding-top: 750px; margin-left: 21px;"><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; white-space: normal; word-wrap: normal; ">score_someip_<div>gateway</div></div></div></div></foreignObject><text x="95" y="756" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">score_someip_...</text></switch></g></g></g><g data-cell-id="zOfhbxZQrp5VTqdj2Vb1-5"><g><rect x="20" y="791.56" width="150" height="60" fill="#f5f5f5" stroke="#666666" pointer-events="all" style="fill: rgb(245, 245, 245); stroke: rgb(102, 102, 102);"/></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: 822px; margin-left: 21px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #333333; "><div style="display: inline-block; font-size: 20px; font-family: Helvetica; color: #333333; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">someip_<div>protocol</div></div></div></div></foreignObject><text x="95" y="828" fill="#333333" font-family="Helvetica" font-size="20px" text-anchor="middle">someip_...</text></switch></g></g></g><g data-cell-id="zOfhbxZQrp5VTqdj2Vb1-7"><g><rect x="1230" y="830" width="160" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 158px; height: 1px; padding-top: 860px; margin-left: 1231px;"><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; white-space: normal; word-wrap: normal; ">abi-compatible-datatypes</div></div></div></foreignObject><text x="1310" y="866" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">abi-compatible-d...</text></switch></g></g></g><g data-cell-id="zOfhbxZQrp5VTqdj2Vb1-8"><g><rect x="1580" y="910" width="145" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 143px; height: 1px; padding-top: 940px; margin-left: 1581px;"><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; white-space: normal; word-wrap: normal; ">abi-compatible-datatypes</div></div></div></foreignObject><text x="1653" y="946" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">abi-compatible-...</text></switch></g></g></g><g data-cell-id="zOfhbxZQrp5VTqdj2Vb1-9"><g><rect x="1990" y="209.69" width="200" height="275.62" rx="30" ry="30" 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: 198px; height: 1px; padding-top: 217px; margin-left: 1991px;"><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; white-space: normal; word-wrap: normal; ">ai-platform</div></div></div></foreignObject><text x="2090" y="237" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">ai-platform</text></switch></g></g></g><g data-cell-id="zOfhbxZQrp5VTqdj2Vb1-10"><g><rect x="2020" y="251.56" width="130" 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: 128px; height: 1px; padding-top: 282px; margin-left: 2021px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 19px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">inference_<div>adapter</div></div></div></div></foreignObject><text x="2085" y="287" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="19px" text-anchor="middle">inference_...</text></switch></g></g></g><g data-cell-id="zOfhbxZQrp5VTqdj2Vb1-15"><g><rect x="2020" y="324.06" width="130" height="60" fill="#f5f5f5" stroke="#666666" pointer-events="all" style="fill: rgb(245, 245, 245); stroke: rgb(102, 102, 102);"/></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: 128px; height: 1px; padding-top: 354px; margin-left: 2021px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #333333; "><div style="display: inline-block; font-size: 19px; font-family: Helvetica; color: #333333; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">onnx_runtime</div></div></div></foreignObject><text x="2085" y="360" fill="#333333" font-family="Helvetica" font-size="19px" text-anchor="middle">onnx_runtime</text></switch></g></g></g><g data-cell-id="zOfhbxZQrp5VTqdj2Vb1-17"><g><rect x="550" y="1170" width="130" height="60" rx="9" ry="9" fill="#f5f5f5" stroke="#666666" pointer-events="all" style="fill: rgb(245, 245, 245); stroke: rgb(102, 102, 102);"/></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: 128px; height: 1px; padding-top: 1177px; margin-left: 551px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #333333; "><div style="display: inline-block; font-size: 20px; font-family: Helvetica; color: #333333; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">ext module/<div>repository</div></div></div></div></foreignObject><text x="615" y="1197" fill="#333333" font-family="Helvetica" font-size="20px" text-anchor="middle">ext module/...</text></switch></g></g></g><g data-cell-id="lLnuWv548SjsVmpskmR--0"><g><rect x="1134" y="640" width="120" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all" style="fill: rgb(218, 232, 252); stroke: rgb(108, 142, 191);"/></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: 670px; margin-left: 1135px;"><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; white-space: normal; word-wrap: normal; ">datarouter</div></div></div></foreignObject><text x="1194" y="676" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">datarouter</text></switch></g></g></g><g data-cell-id="lLnuWv548SjsVmpskmR--4"><g><rect x="535" y="388.44" width="120" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all" style="fill: rgb(255, 242, 204); stroke: rgb(214, 182, 86);"/></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: 418px; margin-left: 536px;"><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; white-space: normal; word-wrap: normal; ">record/<div>replay</div></div></div></div></foreignObject><text x="595" y="424" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">record/...</text></switch></g></g></g><g data-cell-id="H0D6Iy5TQXu2IpcHdf1l-1"><g><rect x="405" y="1300" width="125" 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: 123px; height: 1px; padding-top: 1330px; margin-left: 406px;"><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; white-space: normal; word-wrap: normal; ">language to be defined</div></div></div></foreignObject><text x="468" y="1336" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">language to b...</text></switch></g></g></g><g data-cell-id="H0D6Iy5TQXu2IpcHdf1l-3"><g><rect x="380" y="0" width="1220" height="100" 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: 1218px; height: 1px; padding-top: 50px; margin-left: 382px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #000000; "><div style="display: inline-block; font-size: 60px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Modules and Components of S-CORE 1.0</div></div></div></foreignObject><text x="382" y="68" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="60px">Modules and Components of S-CORE 1.0</text></switch></g></g></g><g data-cell-id="pnE1acWjGvAhNX2O8zET-2"><g><rect x="1269" y="556" width="120" height="60" fill="url(#drawio-svg-LustfRzaYNr8wBXzq-cO-gradient-_fff2cc-1-_ccd6ff-1-s-0)" stroke="#d6b656" pointer-events="all" style="fill: url("#drawio-svg-LustfRzaYNr8wBXzq-cO-gradient-_fff2cc-1-_ccd6ff-1-s-0"); stroke: rgb(214, 182, 86);"/></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: 586px; margin-left: 1270px;"><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; white-space: normal; word-wrap: normal; ">Logging API</div></div></div></foreignObject><text x="1329" y="592" fill="light-dark(#000000, #ffffff)" font-family="Helvetica" font-size="20px" text-anchor="middle">Logging API</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 From d1c4b56194a7648ad5fa05493bb6b0a7a6106098 Mon Sep 17 00:00:00 2001 From: lurtz <727209+lurtz@users.noreply.github.com> Date: Thu, 14 Aug 2025 12:44:58 +0200 Subject: [PATCH 057/109] Use devcontainer of the S-CORE organization (#1517) Co-authored-by: Oliver Pajonk <oliver.pajonk@elektrobit.com> --- .devcontainer/Dockerfile | 5 ----- .devcontainer/README.md | 16 -------------- .../devcontainer.json | 5 +++++ .devcontainer/devcontainer.json | 21 +++---------------- .../development/development_environment.rst | 8 ++++--- docs/contribute/development/ide/vscode.rst | 11 ++++------ 6 files changed, 17 insertions(+), 49 deletions(-) delete mode 100644 .devcontainer/Dockerfile delete mode 100644 .devcontainer/README.md create mode 100644 .devcontainer/alt_container_docker_on_windows/devcontainer.json diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile deleted file mode 100644 index 7324291be9..0000000000 --- a/.devcontainer/Dockerfile +++ /dev/null @@ -1,5 +0,0 @@ -# Use the official Python DevContainer image as base -FROM mcr.microsoft.com/devcontainers/python:1.2-3.12 - -# Install system dependencies -RUN apt update && apt install -y graphviz && rm -rf /var/lib/apt/lists/* diff --git a/.devcontainer/README.md b/.devcontainer/README.md deleted file mode 100644 index 6eb9dbf8b6..0000000000 --- a/.devcontainer/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# One devcontainer? -In the main repository eclipse-score/score the focus is on documentation, therefore the devcontainer -is specifically tailored to that purpose. To simplify the setup, only one devcontainer is used, -for both documentation and development of documentation tooling. - -In other eclipse-score repositories, the situation is different and either a combined devcontainer -or multiple devcontainers is more appropriate. - -# Why is Python included? -Unfortunately multiple python related bazel targets rely on the system python installation. - -`py_library` and `py_binary` targets are prominent examples, however they can trivially -be fixed by using `aspect_rules_py` instead of `rules_python`. Bug-report: https://github.com/bazelbuild/rules_python/issues/691 - - -Others are not as easy to work around, e.g. `format.fix`. diff --git a/.devcontainer/alt_container_docker_on_windows/devcontainer.json b/.devcontainer/alt_container_docker_on_windows/devcontainer.json new file mode 100644 index 0000000000..452fe2227e --- /dev/null +++ b/.devcontainer/alt_container_docker_on_windows/devcontainer.json @@ -0,0 +1,5 @@ +{ + "name": "eclipse-s-core-docker-on-windows", + "image": "ghcr.io/eclipse-score/devcontainer:latest", + "initializeCommand": "IF not exist ${localEnv:HOME}\\.cache\\bazel ( mkdir ${localEnv:HOME}\\.cache\\bazel )" +} diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index e57608ef27..3a0ec07d33 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,20 +1,5 @@ { - "build": { - "dockerfile": "Dockerfile" - }, - "features": { - "ghcr.io/devcontainers-community/features/bazel:1": {} - }, - "customizations": { - "vscode": { - "extensions": [ - "ms-python.python", - "usernamehw.errorlens", - "hediet.vscode-drawio", - "swyddfa.esbonio", - "lextudio.restructuredtext", - "charliermarsh.ruff" - ] - } - } + "name": "eclipse-s-core", + "image": "ghcr.io/eclipse-score/devcontainer:latest", + "initializeCommand": "mkdir -p ${localEnv:HOME}/.cache/bazel" } diff --git a/docs/contribute/development/development_environment.rst b/docs/contribute/development/development_environment.rst index 6ca017d515..ed43ec5091 100644 --- a/docs/contribute/development/development_environment.rst +++ b/docs/contribute/development/development_environment.rst @@ -47,8 +47,10 @@ To use the devcontainer: This approach simplifies the setup process and ensures a consistent development environment. -Note: buildifier and autocompletion are not yet provided via the devcontainer or via bazel, so you -will need to set them up manually. See below. +**No** manual setup needs to be done when using the devcontainer. + +.. note:: + If you are using Docker on Windows **without WSL2** in between, you have to select the alternative container `eclipse-s-core-docker-on-windows`. Manual Setup ============ @@ -64,7 +66,7 @@ General Setup * Python 3.x * Graphviz/Dot (for generating diagrams) - Check `Dockerfile <https://github.com/eclipse-score/score/blob/main/.devcontainer/Dockerfile>`_ for + Check `Dockerfile <https://github.com/eclipse-score/devcontainer/tree/main/src/s-core-devcontainer/.devcontainer>`_ for an accurate list and exemplary instructions. * Clone the score repository to your hard drive. diff --git a/docs/contribute/development/ide/vscode.rst b/docs/contribute/development/ide/vscode.rst index 9331b0dd4e..53fdb3f57a 100644 --- a/docs/contribute/development/ide/vscode.rst +++ b/docs/contribute/development/ide/vscode.rst @@ -31,14 +31,11 @@ change rather frequently. At the time of writing, the following settings are rec "github.copilot.nextEditSuggestions.enabled": true, -Starlark -======== - -For *Starlark* currently no solution is integrated in VScode. - -C++ -=== +Starlark / Python / C++ / Rust +============================== +The devcontainer has Starlark, Python, C++ and Rust support. +How to setup code completion for C++ and Rust is described at `eclipse-score/devcontainer <https://github.com/eclipse-score/devcontainer/tree/main?tab=readme-ov-file#inside-the-container>`_. Python ====== From 567432e116edd25ee4e012f169435b963ffe1b35 Mon Sep 17 00:00:00 2001 From: lurtz <727209+lurtz@users.noreply.github.com> Date: Tue, 19 Aug 2025 11:40:11 +0200 Subject: [PATCH 058/109] unify devcontainers (#1622) Linux and Windows are handled via the same json file --- .../alt_container_docker_on_windows/devcontainer.json | 5 ----- .devcontainer/devcontainer.json | 6 +++++- .devcontainer/initialize_command | 6 ++++++ .devcontainer/initialize_command.cmd | 4 ++++ docs/contribute/development/development_environment.rst | 3 --- 5 files changed, 15 insertions(+), 9 deletions(-) delete mode 100644 .devcontainer/alt_container_docker_on_windows/devcontainer.json create mode 100755 .devcontainer/initialize_command create mode 100644 .devcontainer/initialize_command.cmd diff --git a/.devcontainer/alt_container_docker_on_windows/devcontainer.json b/.devcontainer/alt_container_docker_on_windows/devcontainer.json deleted file mode 100644 index 452fe2227e..0000000000 --- a/.devcontainer/alt_container_docker_on_windows/devcontainer.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "eclipse-s-core-docker-on-windows", - "image": "ghcr.io/eclipse-score/devcontainer:latest", - "initializeCommand": "IF not exist ${localEnv:HOME}\\.cache\\bazel ( mkdir ${localEnv:HOME}\\.cache\\bazel )" -} diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 3a0ec07d33..23becd7115 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,5 +1,9 @@ { "name": "eclipse-s-core", "image": "ghcr.io/eclipse-score/devcontainer:latest", - "initializeCommand": "mkdir -p ${localEnv:HOME}/.cache/bazel" + // This will run on Linux `initialize_command` and on Windows `initialize_command.bat` + "initializeCommand": [ + ".devcontainer/initialize_command", + "${localEnv:HOME}" + ] } diff --git a/.devcontainer/initialize_command b/.devcontainer/initialize_command new file mode 100755 index 0000000000..3b4e30a36d --- /dev/null +++ b/.devcontainer/initialize_command @@ -0,0 +1,6 @@ +#!/bin/sh +set -eu + +# Create Bazel cache directory if it doesn't exist +home="$1" +mkdir -p "$home/.cache/bazel" diff --git a/.devcontainer/initialize_command.cmd b/.devcontainer/initialize_command.cmd new file mode 100644 index 0000000000..414006deaf --- /dev/null +++ b/.devcontainer/initialize_command.cmd @@ -0,0 +1,4 @@ +REM Create Bazel cache directory if it doesn't exist + +set home="%1" +IF not exist "%home%\\.cache\\bazel" ( mkdir "%home%\\.cache\\bazel" ) diff --git a/docs/contribute/development/development_environment.rst b/docs/contribute/development/development_environment.rst index ed43ec5091..514a370c56 100644 --- a/docs/contribute/development/development_environment.rst +++ b/docs/contribute/development/development_environment.rst @@ -49,9 +49,6 @@ This approach simplifies the setup process and ensures a consistent development **No** manual setup needs to be done when using the devcontainer. -.. note:: - If you are using Docker on Windows **without WSL2** in between, you have to select the alternative container `eclipse-s-core-docker-on-windows`. - Manual Setup ============ From b266cb2e9d0198068d27313be3932d97d227b1c2 Mon Sep 17 00:00:00 2001 From: Benjamin Lippelt <41742117+bl81hi@users.noreply.github.com> Date: Wed, 20 Aug 2025 12:28:28 +0200 Subject: [PATCH 059/109] add WSL2 settings recommendation (#1628) --- .../contribute/development/development_environment.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/contribute/development/development_environment.rst b/docs/contribute/development/development_environment.rst index 514a370c56..ad25898e5f 100644 --- a/docs/contribute/development/development_environment.rst +++ b/docs/contribute/development/development_environment.rst @@ -148,3 +148,13 @@ IDE Guides ide/vscode ide/clion + +WSL2 Settings +============= +If you encounter memory issues on WSL2, the following minimal settings in your .wslconfig file are recommended: + +.. code-block:: shell + + [wsl2] + swap=8GB + memory=16GB From 0df09350be09625edf2ff12b2e921804c55f4524 Mon Sep 17 00:00:00 2001 From: Tim Kliefoth <tim.kliefoth@mercedes-benz.com> Date: Fri, 22 Aug 2025 11:55:01 +0200 Subject: [PATCH 060/109] Feature Request: AI Platform (#1258) * first draft AIP FR added core features and scope added diagrams added initial structure * added GenAI chapter detailed components for GenAI subsystem * safety and security chapter formatting fixes * filled missing chapters added rational, motivation, rejections, teaching * updated architecture updated architecture to be more clear updated text to match architecture * minor formating updates added background to svg, minor clarifications * added requirements added feature and stakeholder requirements updated directory structure * api: split requirements split requirements from ai platform and genai * split aip fr split AI platform feature request into AIP and GenAI * fix typo --------- Signed-off-by: Tim Kliefoth <tim.kliefoth@mercedes-benz.com> --- .../_assets/score-aip-abstraction.drawio.svg | 431 ++++++++++++++ .../_assets/score-aip-linux.drawio.svg | 315 +++++++++++ .../_assets/score-aip-qnx.drawio.svg | 228 ++++++++ .../gen_ai/_assets/score-aip-genai.drawio.svg | 525 ++++++++++++++++++ docs/features/ai_platform/gen_ai/index.rst | 316 +++++++++++ .../ai_platform/gen_ai/requirements/index.rst | 58 ++ docs/features/ai_platform/index.rst | 377 +++++++++++++ .../ai_platform/requirements/index.rst | 78 +++ docs/requirements/stakeholder/index.rst | 114 ++++ 9 files changed, 2442 insertions(+) create mode 100644 docs/features/ai_platform/_assets/score-aip-abstraction.drawio.svg create mode 100644 docs/features/ai_platform/_assets/score-aip-linux.drawio.svg create mode 100644 docs/features/ai_platform/_assets/score-aip-qnx.drawio.svg create mode 100644 docs/features/ai_platform/gen_ai/_assets/score-aip-genai.drawio.svg create mode 100644 docs/features/ai_platform/gen_ai/index.rst create mode 100644 docs/features/ai_platform/gen_ai/requirements/index.rst create mode 100644 docs/features/ai_platform/index.rst create mode 100644 docs/features/ai_platform/requirements/index.rst diff --git a/docs/features/ai_platform/_assets/score-aip-abstraction.drawio.svg b/docs/features/ai_platform/_assets/score-aip-abstraction.drawio.svg new file mode 100644 index 0000000000..8257d2787b --- /dev/null +++ b/docs/features/ai_platform/_assets/score-aip-abstraction.drawio.svg @@ -0,0 +1,431 @@ +<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="562px" height="401px" viewBox="-0.5 -0.5 562 401" content="<mxfile scale="1" border="5"><diagram id="gi_-aIyZbUjtFDQ8gIIb" name="Page-1">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</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 126 95 L 239.63 95" 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 244.88 95 L 237.88 98.5 L 239.63 95 L 237.88 91.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="6" y="75" width="120" height="80" fill="#f5f5f5" stroke="#666666" 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 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: 115px; margin-left: 7px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; 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; "> + pre + <div> + processing + </div> + <div> + node + </div> + </div> + </div> + </div> + </foreignObject> + <text x="66" y="119" fill="#333333" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + pre... + </text> + </switch> + </g> + </g> + <g> + <rect x="246" y="75" width="160" height="80" fill="#f5f5f5" stroke="#666666" 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 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: 158px; height: 1px; padding-top: 115px; margin-left: 247px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; 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; "> + model + <div> + node + </div> + </div> + </div> + </div> + </foreignObject> + <text x="326" y="119" fill="#333333" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + model... + </text> + </switch> + </g> + </g> + <g> + <rect x="246" y="235" width="160" 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 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: 158px; height: 1px; padding-top: 255px; margin-left: 247px;"> + <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; "> + AIP:BackendAdpt + </div> + </div> + </div> + </foreignObject> + <text x="326" y="259" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + AIP:BackendAdpt + </text> + </switch> + </g> + </g> + <g> + <rect x="106" y="125" width="160" height="20" 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: 158px; height: 1px; padding-top: 135px; margin-left: 107px;"> + <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; "> + AIP:datapipe + </div> + </div> + </div> + </foreignObject> + <text x="186" y="139" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + AIP:datapipe + </text> + </switch> + </g> + </g> + <g> + <rect x="6" y="365" width="70" height="30" fill="#f5f5f5" stroke="#666666" 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 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: 380px; margin-left: 7px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; 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; "> + FEO activity + </div> + </div> + </div> + </foreignObject> + <text x="41" y="384" fill="#333333" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + FEO activity + </text> + </switch> + </g> + </g> + <g> + <rect x="246" y="355" width="160" 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 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: 158px; height: 1px; padding-top: 375px; margin-left: 247px;"> + <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; "> + Vendor Inference Engine + <div> + (e.g. TensorRT, QNN, ONNX) + </div> + </div> + </div> + </div> + </foreignObject> + <text x="326" y="379" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Vendor Inference Engine... + </text> + </switch> + </g> + </g> + <g> + <rect x="106" y="105" width="160" height="20" 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: 158px; height: 1px; padding-top: 115px; margin-left: 107px;"> + <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; "> + COM::IPC + </div> + </div> + </div> + </foreignObject> + <text x="186" y="119" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + COM::IPC + </text> + </switch> + </g> + </g> + <g> + <path d="M 286 155 L 286 228.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 286 233.88 L 282.5 226.88 L 286 228.63 L 289.5 226.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> + <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: 195px; margin-left: 286px;"> + <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; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; "> + loadModel + </div> + </div> + </div> + </foreignObject> + <text x="286" y="198" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle"> + loadModel + </text> + </switch> + </g> + </g> + <g> + <path d="M 326 155 L 326 228.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 326 233.88 L 322.5 226.88 L 326 228.63 L 329.5 226.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> + <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: 193px; margin-left: 327px;"> + <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; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; "> + infer + </div> + </div> + </div> + </foreignObject> + <text x="327" y="196" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle"> + infer + </text> + </switch> + </g> + </g> + <g> + <path d="M 366 235 L 366 161.37" 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 366 156.12 L 369.5 163.12 L 366 161.37 L 362.5 163.12 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> + <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: 199px; margin-left: 367px;"> + <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; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; "> + result + </div> + </div> + </div> + </foreignObject> + <text x="367" y="202" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle"> + result + </text> + </switch> + </g> + </g> + <g> + <path d="M 286 275 L 286 348.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 286 353.88 L 282.5 346.88 L 286 348.63 L 289.5 346.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> + <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: 315px; margin-left: 286px;"> + <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; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; "> + loadModel + </div> + </div> + </div> + </foreignObject> + <text x="286" y="318" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle"> + loadModel + </text> + </switch> + </g> + </g> + <g> + <path d="M 326 275 L 326 348.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 326 353.88 L 322.5 346.88 L 326 348.63 L 329.5 346.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> + <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: 313px; margin-left: 327px;"> + <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; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; "> + infer + </div> + </div> + </div> + </foreignObject> + <text x="327" y="316" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle"> + infer + </text> + </switch> + </g> + </g> + <g> + <path d="M 366 355 L 366 281.37" 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 366 276.12 L 369.5 283.12 L 366 281.37 L 362.5 283.12 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> + <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: 319px; margin-left: 367px;"> + <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; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; "> + result + </div> + </div> + </div> + </foreignObject> + <text x="367" y="322" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle"> + result + </text> + </switch> + </g> + </g> + <g> + <path d="M 6 185 L 96 185 L 116 205 L 116 245 L 6 245 L 6 185 Z" fill="#fff2cc" stroke="#d6b656" stroke-width="2" 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 96 185 L 96 205 L 116 205" fill="none" stroke="#d6b656" stroke-width="2" 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 center; width: 108px; height: 1px; padding-top: 215px; margin-left: 7px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #666600; "> + <div style="display: inline-block; font-size: 14px; font-family: "Helvetica"; color: light-dark(#666600, #a2a24a); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <font style="font-size: 10px;"> + Com between two nodes via COM::IPC or GPU SHM + </font> + </div> + </div> + </div> + </foreignObject> + <text x="61" y="219" fill="#666600" font-family=""Helvetica"" font-size="14px" text-anchor="middle"> + Com between two... + </text> + </switch> + </g> + </g> + <g> + <path d="M 106 195 L 146 145" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="2 6" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <path d="M 446 215 L 536 215 L 556 235 L 556 275 L 446 275 L 446 215 Z" fill="#fff2cc" stroke="#d6b656" stroke-width="2" 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 536 215 L 536 235 L 556 235" fill="none" stroke="#d6b656" stroke-width="2" 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 center; width: 108px; height: 1px; padding-top: 245px; margin-left: 447px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #666600; "> + <div style="display: inline-block; font-size: 14px; font-family: "Helvetica"; color: light-dark(#666600, #a2a24a); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <span style="font-size: 10px;"> + Abstract set of most common API calls to start with + </span> + </div> + </div> + </div> + </foreignObject> + <text x="501" y="249" fill="#666600" font-family=""Helvetica"" font-size="14px" text-anchor="middle"> + Abstract set of... + </text> + </switch> + </g> + </g> + <g> + <path d="M 446 245 L 406 255" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="2 6" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <rect x="116" y="355" width="110" 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 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: 375px; margin-left: 117px;"> + <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; "> + Vendor Libs + </div> + </div> + </div> + </foreignObject> + <text x="171" y="379" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Vendor Libs + </text> + </switch> + </g> + </g> + <g> + <path d="M 172.72 143.94 L 171.05 348.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 171.01 353.88 L 167.57 346.85 L 171.05 348.63 L 174.57 346.91 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> + <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: 248px; margin-left: 171px;"> + <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; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; "> + GPU mem obj + </div> + </div> + </div> + </foreignObject> + <text x="171" y="252" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle"> + GPU mem obj + </text> + </switch> + </g> + </g> + <g> + <rect x="106" y="5" width="230" 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: 228px; height: 1px; padding-top: 20px; margin-left: 107px;"> + <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> + <font style="font-size: 18px;"> + AIP Abstraction Concept + </font> + </b> + </div> + </div> + </div> + </foreignObject> + <text x="221" y="24" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + AIP Abstraction Concept + </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/ai_platform/_assets/score-aip-linux.drawio.svg b/docs/features/ai_platform/_assets/score-aip-linux.drawio.svg new file mode 100644 index 0000000000..9f6ce027f0 --- /dev/null +++ b/docs/features/ai_platform/_assets/score-aip-linux.drawio.svg @@ -0,0 +1,315 @@ +<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="791px" height="351px" viewBox="-0.5 -0.5 791 351" content="<mxfile scale="1" border="5"><diagram id="gi_-aIyZbUjtFDQ8gIIb" name="Page-1">zZjfc6IwEMf/Gmbah3ZCUtA+Kv11M6f2zt71XiOkkDkgXIzV3l9/CwkKBqc+6HCOg+GbxE0+u24WHRJkm0dJi2QiIpY6GEUbh9w5GA89H66l8KEFb0C0EEseacndCXP+lxkRGXXFI7ZsDVRCpIoXbTEUec5C1dKolGLdHvYm0rbVgsbMEuYhTW31lUcqqbeFdvoT43FSW3aR6VnQ8HcsxSo39hxM3qqX7s5o/V1m/DKhkVg3JHLvkEAKoXQr2wQsLdHW2PS8hwO923VLlqtjJtzqCe80XZmtf+X5amMWpz5qINWWWDkJOWS8Trhi84KGZe8aIgC0RGUp3LnQtBdh1vXOpGKbhmQW9chExpT8gCGmt+Zj4ocQc7/eeWMwNFrS8IRvNGoCIN5+8w4CNAyHAxCRBWU2nf7qn8lNG8p2sw0o20A8ORTXgvLC8qWQ31/6B9MnF2xx+Tad9o7EJX0yIRaT+VUw+w6DR/AefXnWDQf7KZgdLwuat3D5f1ZlAhyHIhWyGohkvLiApYFtVH9cVqjqsdCKy88xZGCWR6OIForJ2gQsWVvRg3r3z17Iure2ewg+l3tuPnVP33jcwR4fbPPxybn4eMeF7x1V9JkXLOU5650Y8T+PKNc7FzH/OGKToP/Q8vYzY0dpsQ2/Jih8ClCD40AFIoftqP8OVldU4S5Y5BSwhodgYTR5hctFIDJ9Fjzcz3TjjtP4snds+9m9I3u5Z8tedkn/E85DOEcxenz+Adf506R3QvvpqrM+OVe6qt3RQpTwEGAAHR7nNF32TsjKUx2EOn96JyFkV/t1JbXY1VBaeINc1Vm9lR1Xy+rZvqzg3GGx6azYqoIDmedONANE75ytG5WbttC2CvLiYDVX5c6WQ2gKboV2CA6BqpCMS0dweOAfmY6MR1E5vdOzbd+fIvyR13Ku1+Fb90xpFdtPLNfX173H+8D9/Fy+Pc2xDLe7f1iqvsa/WOT+Hw==</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> + <rect x="5" y="285" width="780" 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: 778px; height: 1px; padding-top: 315px; margin-left: 6px;"> + <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; "> + Linux + </div> + </div> + </div> + </foreignObject> + <text x="395" y="319" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Linux + </text> + </switch> + </g> + </g> + <g> + <rect x="225" y="215" width="100" 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: 98px; height: 1px; padding-top: 245px; margin-left: 226px;"> + <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; "> + ONNX + </div> + </div> + </div> + </foreignObject> + <text x="275" y="249" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + ONNX + </text> + </switch> + </g> + </g> + <g> + <rect x="5" y="215" width="100" 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: 98px; height: 1px; padding-top: 245px; margin-left: 6px;"> + <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; "> + TensorRT + </div> + </div> + </div> + </foreignObject> + <text x="55" y="249" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + TensorRT + </text> + </switch> + </g> + </g> + <g> + <rect x="115" y="215" width="100" 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: 98px; height: 1px; padding-top: 245px; margin-left: 116px;"> + <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; "> + QNN + </div> + </div> + </div> + </foreignObject> + <text x="165" y="249" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + QNN + </text> + </switch> + </g> + </g> + <g> + <rect x="5" y="145" width="320" 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: 318px; height: 1px; padding-top: 175px; margin-left: 6px;"> + <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; "> + S-CORE::AIP:: + <span style="color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"> + BackendAdapter + </span> + </div> + </div> + </div> + </foreignObject> + <text x="165" y="179" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + S-CORE::AIP::BackendAdapter + </text> + </switch> + </g> + </g> + <g> + <rect x="155" y="75" width="630" 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: 628px; height: 1px; padding-top: 105px; margin-left: 156px;"> + <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; "> + S-CORE::AIP + </div> + </div> + </div> + </foreignObject> + <text x="470" y="109" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + S-CORE::AIP + </text> + </switch> + </g> + </g> + <g> + <rect x="345" y="145" width="150" 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: 148px; height: 1px; padding-top: 175px; 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; "> + S-CORE::AIP::DataPipeline + </div> + </div> + </div> + </foreignObject> + <text x="420" y="179" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + S-CORE::AIP::DataPipeline + </text> + </switch> + </g> + </g> + <g> + <rect x="515" y="185" width="170" height="20" 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: 168px; height: 1px; padding-top: 195px; margin-left: 516px;"> + <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; "> + S-CORE::AIP::MCP + </div> + </div> + </div> + </foreignObject> + <text x="600" y="199" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + S-CORE::AIP::MCP + </text> + </switch> + </g> + </g> + <g> + <rect x="515" y="145" width="270" height="30" 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: 268px; height: 1px; padding-top: 160px; margin-left: 516px;"> + <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; "> + S-CORE::AIP::Context + </div> + </div> + </div> + </foreignObject> + <text x="650" y="164" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + S-CORE::AIP::Context + </text> + </switch> + </g> + </g> + <g> + <rect x="5" y="75" width="130" 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: 128px; height: 1px; padding-top: 105px; margin-left: 6px;"> + <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; "> + S-CORE MW (Com, FEO, Diag) + </div> + </div> + </div> + </foreignObject> + <text x="70" y="109" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + S-CORE MW (Com, FEO,... + </text> + </switch> + </g> + </g> + <g> + <rect x="345" y="215" width="150" 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: 148px; height: 1px; padding-top: 245px; 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; "> + Vendor GPU SHM + </div> + </div> + </div> + </foreignObject> + <text x="420" y="249" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Vendor GPU SHM + </text> + </switch> + </g> + </g> + <g> + <rect x="515" y="215" width="270" 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: 268px; height: 1px; padding-top: 245px; margin-left: 516px;"> + <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; "> + Vehicle Signals + </div> + </div> + </div> + </foreignObject> + <text x="650" y="249" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Vehicle Signals + </text> + </switch> + </g> + </g> + <g> + <rect x="290" y="5" width="210" 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: 208px; height: 1px; padding-top: 20px; margin-left: 291px;"> + <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> + <font style="font-size: 18px;"> + AIP Linux Overview + </font> + </b> + </div> + </div> + </div> + </foreignObject> + <text x="395" y="24" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + AIP Linux Overview + </text> + </switch> + </g> + </g> + <g> + <rect x="695" y="185" width="90" height="20" 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: 195px; margin-left: 696px;"> + <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> + </div> + </div> + </foreignObject> + <text x="740" y="199" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + ... + </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/ai_platform/_assets/score-aip-qnx.drawio.svg b/docs/features/ai_platform/_assets/score-aip-qnx.drawio.svg new file mode 100644 index 0000000000..bf286aa7c8 --- /dev/null +++ b/docs/features/ai_platform/_assets/score-aip-qnx.drawio.svg @@ -0,0 +1,228 @@ +<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="501px" height="351px" viewBox="-0.5 -0.5 501 351" content="<mxfile scale="1" border="5"><diagram id="gi_-aIyZbUjtFDQ8gIIb" name="Page-1">zZfbjpswEIafBqm92ArwksNlQrLZXuTQzbbbWy84YBUwdZyQ9Ok7YDuBdaKmUikbRWj4x4fxN2MjW8hPDzOO83jOQpJYrh0eLDSxXHfg9eBZCkcpeH0khYjTUErOWVjTX0SJtlJ3NCTbRkPBWCJo3hQDlmUkEA0Nc86KZrMNS5qz5jgihrAOcGKqLzQUsV6WfdYfCY1iPbNjK88rDn5EnO0yNZ/lok31k+4U67FU+22MQ1bUJDS1kM8ZE9JKDz5JSrQam+z3cMV7ipuTTNzSYSg77HGyU0tf3/nLpylo8xd4fPBZark+WA/TpTQmFEcfVfTiqIlVayblqLaFxkVMBVnnOCi9BZQIaLFIE3hzwDSjVIHvCRfkUJNU1DPCUiL4EZpob3/wyZOdVI05mmlxzpiDlBbXstVTGlZFEp0GP4MCQ7G6Ato2wC0Xi++dY0HDt1hOy61jsdvC4hhYnkm2ZfzpuXM0ZsX8XzSugebLYtE5FXfQLRV0gUr328isFYRMKvfDtqjcXzuW0Qj+o88raYzha0OycBTiXBD+Dqk5Q5Mactui5v2RWteEkHPLVwt5bRHq3VZXEyzwiuYkoRnpnJlnMrtQVU5rzPoGs2+w5xhsN3u2+grP9eP8HUK6eIy3BmlgQLLcXgIzjF/BiES1SilsGKyyDqv3c8e0425b3QVG0MAZ5AfZTfn1QNVGtqvPhL0ERHtKCj04BCrHb84Jci2ON7kCxKKZEJzQKAM7gITAuYrGZSIoXA9GypHSMCy7X8xsM/f/4tTQZ4S+TZmZde2+mVn095mF1/Plo/LVLnho+hs=</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> + <rect x="5.5" y="75" width="130" 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: 128px; height: 1px; padding-top: 105px; margin-left: 7px;"> + <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; "> + S-CORE MW (Com, FEO, Diag) + </div> + </div> + </div> + </foreignObject> + <text x="71" y="109" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + S-CORE MW (Com, FEO,... + </text> + </switch> + </g> + </g> + <g> + <rect x="225.5" y="215" width="100" 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: 98px; height: 1px; padding-top: 245px; margin-left: 227px;"> + <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; "> + ONNX + </div> + </div> + </div> + </foreignObject> + <text x="276" y="249" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + ONNX + </text> + </switch> + </g> + </g> + <g> + <rect x="5.5" y="215" width="100" 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: 98px; height: 1px; padding-top: 245px; margin-left: 7px;"> + <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; "> + TensorRT + </div> + </div> + </div> + </foreignObject> + <text x="56" y="249" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + TensorRT + </text> + </switch> + </g> + </g> + <g> + <rect x="115.5" y="215" width="100" 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: 98px; height: 1px; padding-top: 245px; margin-left: 117px;"> + <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; "> + QNN + </div> + </div> + </div> + </foreignObject> + <text x="166" y="249" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + QNN + </text> + </switch> + </g> + </g> + <g> + <rect x="5.5" y="285" width="490" 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: 488px; height: 1px; padding-top: 315px; margin-left: 7px;"> + <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; "> + QNX + </div> + </div> + </div> + </foreignObject> + <text x="251" y="319" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + QNX + </text> + </switch> + </g> + </g> + <g> + <rect x="5.5" y="145" width="320" 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: 318px; height: 1px; padding-top: 175px; margin-left: 7px;"> + <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; "> + S-CORE::AIP::BackendAdapter + </div> + </div> + </div> + </foreignObject> + <text x="166" y="179" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + S-CORE::AIP::BackendAdapter + </text> + </switch> + </g> + </g> + <g> + <rect x="145.5" y="75" width="350" 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: 348px; height: 1px; padding-top: 105px; margin-left: 147px;"> + <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; "> + S-CORE::AIP + </div> + </div> + </div> + </foreignObject> + <text x="321" y="109" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + S-CORE::AIP + </text> + </switch> + </g> + </g> + <g> + <rect x="345.5" y="145" width="150" 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: 148px; height: 1px; padding-top: 175px; margin-left: 347px;"> + <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; "> + S-CORE::AIP::DataPipeline + </div> + </div> + </div> + </foreignObject> + <text x="421" y="179" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + S-CORE::AIP::DataPipeline + </text> + </switch> + </g> + </g> + <g> + <rect x="345.5" y="215" width="150" 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: 148px; height: 1px; padding-top: 245px; margin-left: 347px;"> + <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; "> + Vendor GPU SHM + </div> + </div> + </div> + </foreignObject> + <text x="421" y="249" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Vendor GPU SHM + </text> + </switch> + </g> + </g> + <g> + <rect x="147" y="5" width="207" 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: 205px; height: 1px; padding-top: 20px; margin-left: 148px;"> + <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> + <font style="font-size: 18px;"> + AIP QNX Overview + </font> + </b> + </div> + </div> + </div> + </foreignObject> + <text x="251" y="24" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + AIP QNX Overview + </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/ai_platform/gen_ai/_assets/score-aip-genai.drawio.svg b/docs/features/ai_platform/gen_ai/_assets/score-aip-genai.drawio.svg new file mode 100644 index 0000000000..7726f928e4 --- /dev/null +++ b/docs/features/ai_platform/gen_ai/_assets/score-aip-genai.drawio.svg @@ -0,0 +1,525 @@ +<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="791px" height="651px" viewBox="-0.5 -0.5 791 651" content="<mxfile scale="1" border="5"><diagram id="gi_-aIyZbUjtFDQ8gIIb" name="Page-1">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</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> + <rect x="287" y="5" width="207" 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: 205px; height: 1px; padding-top: 20px; margin-left: 288px;"> + <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> + <font style="font-size: 18px;"> + AIP GenAI Overview + </font> + </b> + </div> + </div> + </div> + </foreignObject> + <text x="391" y="24" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + AIP GenAI Overview + </text> + </switch> + </g> + </g> + <g> + <path d="M 5 78 L 5 55 L 785 55 L 785 78" 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 5 78 L 5 495 L 785 495 L 785 78" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 5 78 L 785 78" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none" 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 center; width: 778px; height: 1px; padding-top: 67px; margin-left: 6px;"> + <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; "> + AIP GenAI Subsystem + </div> + </div> + </div> + </foreignObject> + <text x="395" y="70" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle" font-weight="bold"> + AIP GenAI Subsystem + </text> + </switch> + </g> + </g> + <g> + <path d="M 501.63 415 L 191.37 415" 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 506.88 415 L 499.88 418.5 L 501.63 415 L 499.88 411.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));"/> + <path d="M 186.12 415 L 193.12 411.5 L 191.37 415 L 193.12 418.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> + <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: 417px; margin-left: 302px;"> + <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; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; "> + State, Action + </div> + </div> + </div> + </foreignObject> + <text x="302" y="420" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle"> + State, Action + </text> + </switch> + </g> + </g> + <g> + <path d="M 135 188.63 L 135 181.82 Q 135 175 145 175 L 505 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 135 193.88 L 131.5 186.88 L 135 188.63 L 138.5 186.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> + <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: 176px; margin-left: 320px;"> + <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; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; "> + Context + </div> + </div> + </div> + </foreignObject> + <text x="320" y="179" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle"> + Context + </text> + </switch> + </g> + </g> + <g> + <ellipse cx="70" cy="110" rx="11" ry="11" fill="#000000" stroke="#ff0000" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(237, 237, 237)); stroke: light-dark(rgb(255, 0, 0), rgb(255, 144, 144));"/> + </g> + <g> + <path d="M 35 158 L 35 135 L 235 135 L 235 158" 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 35 158 L 35 475 L 235 475 L 235 158" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 35 158 L 235 158" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none" 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 center; width: 198px; height: 1px; padding-top: 147px; margin-left: 36px;"> + <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; "> + Main App + </div> + </div> + </div> + </foreignObject> + <text x="135" y="150" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle" font-weight="bold"> + Main App + </text> + </switch> + </g> + </g> + <g> + <rect x="85" y="195" width="100" 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: 98px; height: 1px; padding-top: 225px; margin-left: 86px;"> + <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; "> + Prompting Interface (templates, context, chaining) + </div> + </div> + </div> + </foreignObject> + <text x="135" y="229" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Prompting Interf... + </text> + </switch> + </g> + </g> + <g> + <rect x="85" y="385" width="100" 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: 98px; height: 1px; padding-top: 415px; margin-left: 86px;"> + <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; "> + MCP Client + <br/> + <span style="color: light-dark(rgb(63, 63, 63), rgb(183, 183, 183));"> + (Vehicle Context) + </span> + </div> + </div> + </div> + </foreignObject> + <text x="135" y="419" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + MCP Client... + </text> + </switch> + </g> + </g> + <g> + <path d="M 135 378.63 L 135 261.37" 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 135 383.88 L 131.5 376.88 L 135 378.63 L 138.5 376.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));"/> + <path d="M 135 256.12 L 138.5 263.12 L 135 261.37 L 131.5 263.12 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> + <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: 326px; margin-left: 136px;"> + <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; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; "> + State, Action + </div> + </div> + </div> + </foreignObject> + <text x="136" y="329" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle"> + State, Action + </text> + </switch> + </g> + </g> + <g> + <path d="M 70 125 L 70 215 Q 70 225 76.38 225 L 82.76 225" fill="none" stroke="#ff0000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(255, 0, 0), rgb(255, 144, 144));"/> + <path d="M 74.88 229.5 L 83.88 225 L 74.88 220.5" fill="none" stroke="#ff0000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(255, 0, 0), rgb(255, 144, 144));"/> + </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: 176px; margin-left: 71px;"> + <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; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; "> + Start + </div> + </div> + </div> + </foreignObject> + <text x="71" y="179" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle"> + Start + </text> + </switch> + </g> + </g> + <g> + <path d="M 495 118 L 495 95 L 765 95 L 765 118" 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 495 118 L 495 235 L 765 235 L 765 118" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 495 118 L 765 118" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none" 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 center; width: 268px; height: 1px; padding-top: 107px; margin-left: 496px;"> + <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; "> + Context + </div> + </div> + </div> + </foreignObject> + <text x="630" y="110" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle" font-weight="bold"> + Context + </text> + </switch> + </g> + </g> + <g> + <rect x="505" y="145" width="100" 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: 98px; height: 1px; padding-top: 175px; margin-left: 506px;"> + <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; "> + Context API + <br/> + (session context, + <span style="background-color: transparent;"> + task memory) + </span> + </div> + </div> + </div> + </foreignObject> + <text x="555" y="179" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Context API... + </text> + </switch> + </g> + </g> + <g> + <path d="M 675 153 C 675 142.33 735 142.33 735 153 L 735 197 C 735 207.67 675 207.67 675 197 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 675 153 C 675 161 735 161 735 153 M 675 157 C 675 165 735 165 735 157 M 675 161 C 675 169 735 169 735 161" 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 center; width: 58px; height: 1px; padding-top: 185px; margin-left: 676px;"> + <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; "> + User Data + </div> + </div> + </div> + </foreignObject> + <text x="705" y="189" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + User Data + </text> + </switch> + </g> + </g> + <g> + <path d="M 611.37 175 L 675 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 606.12 175 L 613.12 171.5 L 611.37 175 L 613.12 178.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> + <path d="M 295 218 L 295 195 L 465 195 L 465 218" 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 295 218 L 295 390 L 465 390 L 465 218" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 295 218 L 465 218" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none" 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 center; width: 168px; height: 1px; padding-top: 207px; margin-left: 296px;"> + <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; "> + Model + </div> + </div> + </div> + </foreignObject> + <text x="380" y="210" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle" font-weight="bold"> + Model + </text> + </switch> + </g> + </g> + <g> + <rect x="330" y="230" width="100" 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: 98px; height: 1px; padding-top: 260px; margin-left: 331px;"> + <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; "> + LLM Runtime + <br/> + (e.g. llama.cpp) + </div> + </div> + </div> + </foreignObject> + <text x="380" y="264" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + LLM Runtime... + </text> + </switch> + </g> + </g> + <g> + <rect x="330" y="320" width="100" 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: 98px; height: 1px; padding-top: 350px; margin-left: 331px;"> + <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; "> + LLM Model + </div> + </div> + </div> + </foreignObject> + <text x="380" y="354" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + LLM Model + </text> + </switch> + </g> + </g> + <g> + <path d="M 380 313.63 L 380 296.37" 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 380 318.88 L 376.5 311.88 L 380 313.63 L 383.5 311.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));"/> + <path d="M 380 291.12 L 383.5 298.12 L 380 296.37 L 376.5 298.12 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 323.63 260 L 275 260 Q 265 260 265 250 L 265 235 Q 265 225 255 225 L 191.37 225" 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 328.88 260 L 321.88 263.5 L 323.63 260 L 321.88 256.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));"/> + <path d="M 186.12 225 L 193.12 221.5 L 191.37 225 L 193.12 228.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> + <path d="M 495 348 L 495 325 L 765 325 L 765 348" 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 495 348 L 495 475 L 765 475 L 765 348" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 495 348 L 765 348" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none" 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 center; width: 268px; height: 1px; padding-top: 337px; margin-left: 496px;"> + <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; "> + MCP Server + </div> + </div> + </div> + </foreignObject> + <text x="630" y="340" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle" font-weight="bold"> + MCP Server + </text> + </switch> + </g> + </g> + <g> + <rect x="508" y="385" width="100" 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: 98px; height: 1px; padding-top: 415px; margin-left: 509px;"> + <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; "> + MCP Server + <div> + (Vehicle Context) + </div> + </div> + </div> + </div> + </foreignObject> + <text x="558" y="419" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + MCP Server... + </text> + </switch> + </g> + </g> + <g> + <path d="M 608 415 L 665.76 415" 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));"/> + <path d="M 653.88 421.5 L 666.88 415 L 653.88 408.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 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: 415px; margin-left: 638px;"> + <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; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; "> + Use + </div> + </div> + </div> + </foreignObject> + <text x="638" y="418" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle"> + Use + </text> + </switch> + </g> + </g> + <g> + <rect x="668" y="390" width="80" height="50" 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: 82px; height: 50px; padding-top: 390px; margin-left: 667px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; width: 80px; height: 50px; 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; width: 100%; height: 100%; white-space: normal; word-wrap: normal; "> + <p style="margin:5px;"> + <b> + <i> + Action Validator + <br/> + </i> + </b> + (rules) + <br/> + {abstract} + </p> + </div> + </div> + </div> + </foreignObject> + <text x="708" y="419" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Action Validat... + </text> + </switch> + </g> + </g> + <g> + <path d="M 260 548 L 260 525 L 520 525 L 520 548" 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 260 548 L 260 645 L 520 645 L 520 548" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <path d="M 260 548 L 520 548" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none" 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 center; width: 258px; height: 1px; padding-top: 537px; margin-left: 261px;"> + <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; "> + Rest of Vehicle + </div> + </div> + </div> + </foreignObject> + <text x="390" y="540" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle" font-weight="bold"> + Rest of Vehicle + </text> + </switch> + </g> + </g> + <g> + <rect x="330" y="570" width="130" 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: 128px; height: 1px; padding-top: 600px; margin-left: 331px;"> + <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; "> + Vehicle API + </div> + </div> + </div> + </foreignObject> + <text x="395" y="604" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Vehicle API + </text> + </switch> + </g> + </g> + <g> + <path d="M 558 451.37 L 558 590 Q 558 600 548 600 L 466.37 600" 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 558 446.12 L 561.5 453.12 L 558 451.37 L 554.5 453.12 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));"/> + <path d="M 461.12 600 L 468.12 596.5 L 466.37 600 L 468.12 603.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> + <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/ai_platform/gen_ai/index.rst b/docs/features/ai_platform/gen_ai/index.rst new file mode 100644 index 0000000000..9fac34af4d --- /dev/null +++ b/docs/features/ai_platform/gen_ai/index.rst @@ -0,0 +1,316 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +.. _gen_ai_feature: + +Gen AI +###### + +.. document:: Gen-AI + :id: doc__gen_ai + :status: draft + :safety: QM + :tags: feature_request + +.. toctree:: + :maxdepth: 1 + :glob: + :titlesonly: + :hidden: + + */index + +Feature flag +============ + +To activate this feature, use the following feature flag: + +``experimental_gen_ai`` + + +Abstract +======== + +This document is an extension to the feature request :doc:`../index`. + +This feature request outlines the foundational requirements for integrating AI workloads into the S-CORE automotive platform, +with a particular emphasis on enabling GenAI on Linux operating systems. +Generative AI (GenAI) workloads are a core part of the platform scope on Linux, +enabling on-device LLM inference for intelligent in-vehicle interactions. +The document proposes extending S-CORE components (e.g., FEO, Communication, Error Handling) +to support AI models natively, avoiding duplicate logic across software domains. + + +Motivation +========== + +The AI Platform is needed to support the industry's transition from traditional rule-based systems and fixed-function ECUs to +software-defined and increasingly AI-defined vehicles. +As automotive platforms evolve, intelligent systems must be able to process perception, planning and driver interaction using machine-learned behavior. +The AI Platform enables modular, safety-aligned integration of ML and GenAI components +and provides the foundation for moving from a Software-Defined Vehicle (SDV) architecture to an AI-Defined Vehicle (AIDV). + + +Rationale +========= + +This approach in this Feature Request was selected to support deployment of GenAI models on the vehicle for advanced AI-defined vehicle concepts. + + +Specification +============= + +This section defines the platform's support for Generative AI (GenAI), with a focus on enabling on-device inference +using small and large language models (SLM/LLMs) for interactions in the vehicle context. + +In addition to standard prompt-response interaction, the scope includes support for agentic capabilities — enabling +LLM-based agents that operate with situational awareness, memory, goal orientation, and structured communication with vehicle systems. + +GenAI model execution should be integrated into existing S-CORE components — not implemented as a standalone subsystem. +The same constraints apply as outlined in the parent feature request :doc:`../index`. + +QNX is out of scope because widely used runtimes like llama.cpp are only available on Linux. +Additionally, GenAI use-cases are treated as QM, enabling the use of Linux. + + +Scope Overview +-------------- + +The platform shall support Generative AI inference on Linux targets for non-safety-critical use cases, +enabling contextual in-vehicle assistance and edge-based small and large language model (SLM/LLM) execution. +The focus is on enabling model execution, streamlined integration with in-vehicle communication systems and flexible data injection via APIs. + +*Note: SLM/LLMs need function calling capability for the whole scope of this proposal to be accessible.* + +Key Goals: + +- Enable on-device SLM/LLM inference using runtimes such as llama.cpp +- Support inference on multiple models at the same time +- Define a Context API that allows the injection of relevant task context, session memory, driver preferences, and environmental factors into the LLM +- Provide an MCP Server that exposes vehicle states and control interfaces to the SLM/LLM in a structured, machine-readable format, enabling real-time interaction with in-vehicle systems + +The table below gives a brief overview of considered components and their respective function. + ++---------------------------+----------------------------------------------------------------------------+ +| **Component** | **Description** | ++===========================+============================================================================+ +| Runtime | Runtime support for lightweight LLMs (e.g. llama.cpp) | ++---------------------------+----------------------------------------------------------------------------+ +| Prompting Interface | Manages prompt templates, roles, chaining, and streaming I/O | ++---------------------------+----------------------------------------------------------------------------+ +| Context API | Interface to manage agent memory, goals, session | ++---------------------------+----------------------------------------------------------------------------+ +| MCP Server | Provides structured vehicle context and tools | ++---------------------------+----------------------------------------------------------------------------+ +| Action Validator | Safety layer to validate LLM-generated actions before execution | ++---------------------------+----------------------------------------------------------------------------+ + + +The figure below outlines the core data and control flow connections between components in the GenAI Subsystem. + +.. image:: _assets/score-aip-genai.drawio.svg + :alt: AI Platform GenAI Subsystem + +Basic data/control flow explanation: + +- The Prompting Interface sends a fully constructed prompt — containing system messages, user input, and injected context — to the LLM for inference. This serves as the main entry point for user interaction and model execution. +- The Prompting Interface also monitors the token stream returned by the LLM, buffering output for speech or display and detecting structured outputs such as function calls or action proposals. When an action is detected, it is passed to the Action Validator for policy enforcement. +- The Prompting Interface retrieves relevant context from the Context API. This includes session memory, task goals, and personalization data that shape how prompts are built and responses are interpreted. In addition, it queries live vehicle state and resource availability via the MCP Client. +- The Context API manages user preferences, goals, and session memory. +- The MCP Server acts as a proxy between the GenAI subsystem and the vehicle platform. It reads sensor and state data from the Vehicle API and exposes tools (i.e., callable functions) for executing commands like HVAC control. +- When the Action Validator approves a proposed action, the MCP Server sends the command to the Vehicle API for execution by the vehicle systems. + + +Runtime +------- + +The platform shall support model runtimes like llama.cpp [#s2]_ for model execution. +It is **not** a goal to provide a proprietary runtime. + + +Prompting Interface +---------------------- + +The Prompting Interface is the central orchestration layer that governs how LLMs receive inputs, structure responses, and interact with other system components. +While the underlying runtime performs raw text generation one token at a time, the Prompting Interface manages everything around it — +ensuring that prompts are context-aware, structured, and suitable for interactive, real-time use. +Additionally, it is hosted in the same process as the MCP Client which allows it to retrieve context and tools from a domain like the vehicle. + +The prompting interface includes following features: + +- Prompt Templating + - Supports distinct roles (system, user) and injects them as structured tokens + - The roles enable a differentiation between user and non-user interactions + - Ensures prompts are predictable, reusable, and structured across tasks + - Encourages consistent tone and framing +- Dynamic Context Injection + - Pulls real-time and personalized data from other sources (e.g., MCP server, Context API) + - Injects variables such as ``current_speed``, ``destination``, ``driver_name``, ``external_temperature`` + - Allows LLMs to tailor responses based on driving situation, weather, or personal preferences +- Prompt Chaining + - Splits complex queries or tasks into smaller subtasks and manages their sequencing + - Useful for multi-turn workflows (e.g. POI search + voice confirmation) + - May involve internal reasoning steps that remain hidden from the user +- Streaming Output Decoding + - Handles incremental output from the model, token by token + - Enables responsive voice assistants and progressive rendering of long responses + - Manages buffering, line completion, and fallback behavior (e.g. timeouts, retries) + - Passes actions to MCP Client for invokation + +Together, these features elevate the SLM/LLM from a raw text generator to a well-structured, interactive agent. +The Prompting Interface is essential for ensuring that GenAI systems behave predictably, contextually, and safely in embedded, real-time environments. + + +Context API +----------- + +The Context API is a conceptual interface for managing task-level memory, dialogue state, and user preferences during LLM-based interactions. +It provides structured access to: + +- Short-term context: Current goal, location, dialogue state +- Long-term context: Driver preferences, history, personalization + +This modular separation allows LLMs/agents to reason over abstract context without being tightly coupled to hardware interfaces. +This modular separation allows LLMs and agents to reason over abstract context — such as goals, preferences, and session state — +without direct coupling to low-level system interfaces like the file system or persistent storage. + +The Context API will also allow updates to long-term user context. + +Model Context Protocol (MCP) Client/Server +------------------------------------------ + +MCP [#s2]_ provides structured data to the LLM in a machine-readable format. For example: + +- ``vehicle.speed``: Current vehicle speed +- ``nav.destination``: Active navigation goal +- ``climate.status``: A/C on/off, temperature + +It also maps safe commands that may be executed. For example: + +.. code-block:: json + + { + "action": "set_temperature", + "params": { "zone": "driver", "value": 22 } + } + +This ensures LLM/agent outputs can be transformed into machine-executable commands through explicit contracts. + +Due to the MCP specification enforcing a 1:1 client-server connection, the MCP Client is hosted within the Main Application. +This architectural choice ensures that only a single authoritative interface manages communication with the MCP Server. +Consequently, the Context API does not interface with the MCP Server directly. +Instead, the Prompting Interface (PI) retrieves live vehicle context data via the MCP Client, +combining it with internal session and user state managed by the Context API. + +Action Validator +---------------- + +To ensure safety and traceability, all GenAI-generated commands should be validated by an Action Validator before being executed. +This component should be designed as an abstract base class and extended for the final use case by the user. + +Implementations examples include: + +- Rule-based filters (e.g. prohibit certain actions at high speed) +- Context-aware rejection (e.g. don't open windows in rain) + +This mechanism ensures that LLMs remain advisory and non-authoritative in mixed-criticality systems. +Upon approval by the Action Validator, the MCP Server executes the command of the respective MCP tool. + +Advantages of using the Action Validator in the MCP Server (rather than in the Prompting Interface) include: + +- Action validation is close to the domain and can follow same domain specific non-functional requirements +- MCP Server already has access to state data which simplifies rule checking +- Easy to extend for new or existing MCP tools - only one component is affected by change + + +Requirements +____________ + +The related requirements can be found in :doc:`requirements/index`. + + +Backwards Compatibility +======================= + +Backwards compatibility to current systems is ensured by supporting established frameworks and only providing light weight abstractions and support-components around it. + + +Security Impact +=============== + +The GenAI Platform introduces several new attack surfaces that require security consideration. +Therefore, the overall security architecture must be revisited in detail to assess and mitigate potential risks. + +The following non-complete list highlights a few security considerations per component. + +- GenAI (LLM) Execution + - Prompt inputs must be validated and rate-limited to protect against injection attacks or malformed sequences + - The action validator must enforce whitelisting of executable commands to prevent unsafe or unintended vehicle operations +- MCP and Context APIs + - All communication with the MCP Server must be authenticated and authorized + - Write operations to the Context API (e.g. preference updates) must be explicitly scoped and validated + + +Safety Impact +============= + +The GenAI Platform is designed to support QM use cases with a related components that do have an impact on safety. +Specifically the action validator and vehicle interface must be developed according to the respective safety standards (probably ASIL-B). +For example LLM-driven actions must not bypass safety monitoring or certified control paths. + +An in-depth safety analysis must be conducted in the future. + + +License Impact +============== + +The GenAI Platform is expected to be implemented primarily using Free and Open Source Software (FOSS), in alignment with the Eclipse Foundation’s licensing principles. + +- All new components developed under this feature shall be licensed under the Apache 2.0 License +- Third-party runtime dependencies such as llama.cpp are also licensed under permissive FOSS licenses (MIT, Apache 2.0), making them compatible with the overall platform license +- Any optional use of proprietary or closed-source AI runtimes (e.g. vendor-specific libraries) must be isolated and excluded from the FOSS-licensed deliverables + +No additional licensing constraints are introduced by this feature request beyond those already adopted in S-CORE. + +How to Teach This +================= + +The following sources are recommended for onboarding: + +- llama.cpp GitHub Repo [#s1]_ +- MCP Servers GitHub Repo [#s2]_ + +And of course: Udemy, Youtube, Google, etc. + + +Rejected Ideas +============== + +QNX was not chosen as a target platform to enable GenAI deployment due to the existing ecosystem on Linux and +the targeted safety level of QM. The effort to support QNX would not stand in relation to the provided benefits. + + +Open Issues +=========== + +- Agentic support evaluation +- Decide on GenAI runtime (e.g. llama.cpp) +- Select language per components (cpp vs rust), e.g. rust for MCP Server + + +Footnotes +========= + +.. [#s1] "llama.cpp repo", GitHub ggml-org, https://github.com/ggml-org/llama.cpp. +.. [#s2] "MCP Servers repo", GitHub modelcontextprotocol, https://github.com/modelcontextprotocol/servers. diff --git a/docs/features/ai_platform/gen_ai/requirements/index.rst b/docs/features/ai_platform/gen_ai/requirements/index.rst new file mode 100644 index 0000000000..d3ec312c3c --- /dev/null +++ b/docs/features/ai_platform/gen_ai/requirements/index.rst @@ -0,0 +1,58 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +.. _gen_ai_requirements: + +Requirements +============ + +.. feat_req:: GenAI Execution + :id: feat_req__gen_ai__workloads_execution + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__gen_ai__enablement + :status: valid + + The platform shall support the execution of Generative AI models (e.g., LLMs) on embedded automotive hardware. + +.. feat_req:: GenAI Interaction Layer + :id: feat_req__gen_ai__ui + :reqtype: Functional + :security: YES + :safety: QM + :satisfies: stkh_req__gen_ai__interaction + :status: valid + + The platform shall provide a Prompting Interface for GenAI-based agents, enabling structured prompts, streaming output, and context-aware user interaction. + +.. feat_req:: GenAI Action Validation + :id: feat_req__gen_ai__validator + :reqtype: Functional + :security: YES + :safety: ASIL_B + :satisfies: stkh_req__gen_ai__safety_filter + :status: valid + + The platform shall validate all LLM-generated actions via domain-specific policies before they are executed. + +.. feat_req:: Structured Vehicle Interface + :id: feat_req__gen_ai__structured_vapi + :reqtype: Functional + :security: YES + :safety: ASIL_B + :satisfies: stkh_req__gen_ai__vehicle_com + :status: valid + + The platform shall provide structured APIs (e.g., via MCP) to access vehicle state and invoke safe vehicle commands. diff --git a/docs/features/ai_platform/index.rst b/docs/features/ai_platform/index.rst new file mode 100644 index 0000000000..fa74d91645 --- /dev/null +++ b/docs/features/ai_platform/index.rst @@ -0,0 +1,377 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +.. _ai_platform_feature: + +AI Platform +########### + +.. document:: AI-Platform + :id: doc__ai_platform + :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_ai_platform`` + + +Abstract +======== + +This feature request outlines the foundational requirements for integrating AI workloads into the S-CORE automotive platform, +with a particular emphasis on enabling inference capabilities across both QNX and Linux operating systems. +The primary goal is to provide support for ASIL-B compliant use cases on QNX through a thin, +vendor-agnostic abstraction layer for AI backends such as TensorRT or QNN. +For non-safety-critical applications, a standardized inference backend—such as ONNX Runtime—should be supported, +despite its current lack of compatibility with QNX. +Generative AI (GenAI) workloads are part of the platform scope on Linux, +enabling on-device LLM inference for intelligent in-vehicle interactions. +The platform's support for GenAI is outlined in a seperate feature request :doc:`./gen_ai/index`. + +The document proposes extending S-CORE components (e.g., FEO, Communication, Error Handling) +to support AI models natively, avoiding duplicate logic across software domains. +Furthermore, it introduces a scoped investigation into GPU shared memory (SHM) and +data pipelining mechanisms to abstract communication of GPU-resident objects. + + +Motivation +========== + +The AI Platform is needed to support the industry's transition from traditional rule-based systems and fixed-function ECUs to +software-defined and increasingly AI-defined vehicles. +As automotive platforms evolve, intelligent systems must be able to process perception, planning and driver interaction using machine-learned behavior. +The AI Platform enables modular, safety-aligned integration of ML and GenAI components +and provides the foundation for moving from a Software-Defined Vehicle (SDV) architecture to an AI-Defined Vehicle (AIDV). + + +Rationale +========= + +This approach in this Feature Request was selected to ensure a modular, certifiable, and platform-agnostic AI integration layer for automotive applications. +By abstracting inference backends and structuring data flow through standardized interfaces, the architecture enables safety certification (ASIL-B), +supports reuse across Linux and QNX, and allows for flexibility in deploying both ML and GenAI models. +It balances the need for runtime efficiency, safety alignment, and support for future AI-defined vehicle concepts. + + +Specification +============= + +This feature request aims to extend the S-CORE platform to support AI workloads across both QNX and Linux environments, +enabling safe and efficient execution of models for both safety-critical and non-critical automotive functions. +The architectural concept focuses on a modular inference pipeline, supporting a unified abstraction for AI model execution, +backend integration, and GPU-based communication. + +Operating System Support and ASIL Alignment +___________________________________________ + +The platform must support both Linux and QNX, with differing priorities and use-case profiles. +QNX is prioritized (Priority 1) due to its relevance in safety applications. +Linux support (Priority 2) primarily targets non-safety-critical applications. +Safety use-cases will adhere to the constraints imposed by functional safety requirements, +whereas Linux allows for more flexible development. +All features available on QNX will also be available on Linux. + + +QNX +--- + +The figure below shows the high level scope for the QNX platform with a target of ASIL-B. +The two main components are the **Vendor Abstraction** (Backend Adapter) and the **Data Pipeline**. + +.. image:: _assets/score-aip-qnx.drawio.svg + :alt: AI Platform Architecture Overview QNX + + +Linux +----- + +The next figure shows the scope of the Linux-based platform. +All components running on QNX shall also run on Linux - but not the other way around. +In addition to the QNX scope, GenAI related components like **MCP Server** a **Context API** included. + +.. image:: _assets/score-aip-linux.drawio.svg + :alt: AI Platform Architecture Overview Linux + + +Inference Backend Integration and Abstraction Layer +___________________________________________________ + +The idea of this component is to provide a lightweight and certifiable abstraction layer that decouples applications from vendor specific APIs. + +To provide model execution capability, the system must support inference backends via a thin abstraction layer. +This layer will expose a unified interface to the upper layers of the stack while delegating execution to optimized +vendor runtimes underneath — such as TensorRT for NVIDIA, or QNN for Qualcomm-based systems. +For non-safety use cases, a standardized backend like ONNX Runtime [#s1]_ should be supported to ensure portability and developer accessibility. +However, ONNX Runtime currently lacks QNX support - which will further be investigated. + + +Concept +------- + +The diagram below illustrates the architecture of the AIP Abstraction Layer - here called ModelAPI. +It highlights how a unified Adapter Interface allows seamless integration with different hardware-dependent inference backends +(e.g. ONNX Runtime, TensorRT), as well as a mock backend for testing. +The IOUtils module handles preprocessing and input preparation. +Keeping IOUtils as a separate library helps isolate input handling logic from inference logic, +making it easier to test, reuse, and extend preprocessing across different models and backends. +This structure allows isolating and certifying components independently, which is essential for scalable safety certification. + + +.. uml:: + + @startuml + ' Define components + component "Main Application" as A + component "ModelAPI" as B + component "Adapter Interface" as C + component "ONNXAdapter\nONNX Runtime" as D1 + component "TRTAdapter\nTensorRT" as D2 + component "MockAdapter\nfor testing" as D3 + component "IOUtils / Preprocessor" as E + component "Normalize" as F1 + component "Load .pb\nTest Data" as F2 + component "ONNX Runtime Lib" as G1 + component "TensorRT Engine" as G2 + component "Dummy Backend" as G3 + + ' Define relationships + A --> B + B --> C + C --> D1 + C --> D2 + C --> D3 + + B --> E + E --> F1 + E --> F2 + + D1 --> G1 + D2 --> G2 + D3 ..> G3 : dummy + @enduml + + +Key benefits of this concept include: + +- Static backend selection at compile time ensures deterministic behavior and reduces runtime complexity +- Clear separation of responsibilities (e.g., IOUtils vs inference adapters) supports modular safety analysis +- MockAdapter enables early testing and CI validation without requiring hardware targets +- Minimal and auditable abstractions make the system easier to verify and validate, especially when wrapping certified inference engines (when used as a Safety Element out of Context, SEooC) + + +Adapter Class +------------- + +The class diagram below shows the object-oriented structure of the Adapter system. +All backend adapters inherit from a shared abstract interface, ensuring consistent model loading and inference APIs across implementations. +One of the main challenges of this approach is to find the common set of features between all backend APIs to be abstracted. +Finding the right balance between abstraction and feature set may be challenging. + + +.. uml:: + + @startuml + abstract class AdapterInterface { + +loadModel(path): bool + +infer(input, output): bool + } + + class ONNXAdapter { + +loadModel(path): bool + +infer(input, output): bool + } + + class TRTAdapter { + +loadModel(path): bool + +infer(input, output): bool + } + + class MockAdapter { + +loadModel(path): bool + +infer(input, output): bool + } + + AdapterInterface <|-- ONNXAdapter + AdapterInterface <|-- TRTAdapter + AdapterInterface <|-- MockAdapter + @enduml + + +Backend Selection Mechanism +--------------------------- + +The following diagram shows how the backend implementation is selected at compile time via CMake flags. +Depending on the configuration, either the ONNX Runtime, TensorRT, or a mock adapter is compiled into the application. +The static backend selection at compile time ensures deterministic behavior and reduces runtime complexity which simplifies certification. + + +.. uml:: + + @startuml + object "CMake Configuration" as A + object "USE_ONNX / USE_MOCK_TRT / USE_TRT" as B + object "ONNXAdapter enabled" as C + object "MockAdapter enabled" as D + object "TRTAdapter enabled" as E + + A --> B + B --> C : USE_ONNX + B --> D : USE_MOCK_TRT + B --> E : USE_TRT + @enduml + + +Data Pipelining and GPU Communication Abstraction +_________________________________________________ + +Many models — especially vision-based ones — depend on high-throughput data exchange in GPU memory. +To support efficient data flow, the architecture should provide a data pipelining layer that abstracts objects in the GPU memory space. + +This may include: + +- Shared memory buffers between producer (e.g. camera driver) and consumer (e.g. model preprocessing) +- Zero-copy mechanisms to minimize CPU-GPU transfers and reduce latency +- Standardized data contracts for tensor formats and metadata + +A key challenge here is observability: current S-CORE recording may not capture GPU-to-GPU data flows. +A second challenge is the tight coupling of GPU memory object to vendor specific libraries. +Therefore, the exact scope and feasibilty of this component and its respective gaps must be investigated in-depth by a future feature request. + +The figure below shows the high level concept of a data pipeline and backend adapter. + +.. image:: _assets/score-aip-abstraction.drawio.svg + :alt: AI Platform Abstraction + + +S-CORE Integration: FEO, Communication, and Fault Management +____________________________________________________________ + +AI model execution should be integrated into existing S-CORE components — not implemented as a standalone subsystem. + +This includes: + +- FEO: Integration allows AI tasks to be scheduled and monitored like any other activity +- Communication: Model inputs and outputs must seamlessly fit into the existing communication model +- Error Handling: Faults and anomalies during inference (e.g., invalid input tensors, timeout, memory access issues) must be reported and handled using S-CORE's diagnostic framework +- Recording: Data between AI/ML nodes with GPU memory object should be recordable in the same manner as regular IPC communication + +This unified approach avoids fragmentation and ensures that AI models are treated as first-class citizens within the system. + + +GenAI +_____ + +The platform's support for Generative AI (GenAI) is outlined in a seperate feature request :doc:`./gen_ai/index`. + + +Requirements +____________ + +The related requirements can be found in :doc:`requirements/index`. + + +Backwards Compatibility +======================= + +Backwards compatibility to current systems is ensured by supporting established frameworks and only providing light weight abstractions and support-components around it. + + +Security Impact +=============== + +The AI Platform introduces several new attack surfaces that require security considerationss. +Therefore, the overall security architecture must be revisited in detail to assess and mitigate potential risks. + +The following non-complete list highlights a few security considerations per component. + +- Inference Backends + - Ensure that model binaries are verified, authenticated, and integrity-checked before execution + - Restrict model file loading to trusted paths and signed artifacts to prevent tampering or malicious injection + + +Safety Impact +============= + +The AI Platform is designed to support both QM and ASIL-B use cases, with a clear separation between safety-relevant and non-safety-relevant functionality. + +The following list gives an idea of safety considerations and is not complete. An in-depth safety analysis must be conducted in the future. + +- Inference Backends + - For safety-related features (e.g. perception), inference backends must be certified + - The backend abstraction layer must be minimal and deterministic to allow safety analysis and independent certification - it must achieve at least the same ASIL-level as the backends +- Data Pipelines + - GPU-based data flows used in safety functions must ensure determinism, bounded latency, and isolation from non-safety components + - Zero-copy paths must ensure safe memory access patterns and partitioning + + +License Impact +============== + + +The AI Platform is expected to be implemented primarily using Free and Open Source Software (FOSS), in alignment with the Eclipse Foundation’s licensing principles. + +- All new components (e.g. abstraction layers, adapters, GenAI interfaces) developed under this feature shall be licensed under the Apache 2.0 License +- Third-party runtime dependencies such as ONNX Runtime or llama.cpp are also licensed under permissive FOSS licenses (MIT, Apache 2.0), making them compatible with the overall platform license +- Any optional use of proprietary or closed-source AI runtimes (e.g. vendor-specific TensorRT libraries) must be isolated behind the backend abstraction and excluded from the FOSS-licensed deliverables + +No additional licensing constraints are introduced by this feature request beyond those already adopted in S-CORE. + + +How to Teach This +================= + +The following sources are recommended for onboarding: + +- ONNX Runtime GitHub Repo [#s1]_ + +And of course: Udemy, Youtube, Google, etc. + + +Rejected Ideas +============== + +Dynamic runtime backend selection was rejected to ensure deterministic behavior and reduce runtime complexity, particularly for ASIL-B use cases. +Static backend selection at build time enables better certification and minimizes safety risks. + +Direct integration of inference logic into applications without a common abstraction layer was rejected to avoid code duplication, maintain modularity and enable cross-platform backend support. +The adapter-based architecture allows better testability and reuse across QNX and Linux as well has HW platforms. + + +Open Issues +=========== + +- GPU shared memory data pipeline and tight coupling of GPU memory object to vendor specific libraries +- ONNX support on QNX +- S-CORE recording may not capture GPU-to-GPU data flows +- Decide on inference engine for QNX (e.g. ONNX, LiteRT, ExecuTorch) + + +Footnotes +========= + +.. [#s1] "ONNX Runtime repo", GitHub Microsoft, https://github.com/microsoft/onnxruntime. diff --git a/docs/features/ai_platform/requirements/index.rst b/docs/features/ai_platform/requirements/index.rst new file mode 100644 index 0000000000..ac5fc704f7 --- /dev/null +++ b/docs/features/ai_platform/requirements/index.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 + # ******************************************************************************* + +.. _ai_platform_requirements: + +Requirements +============ + +.. feat_req:: ML Execution + :id: feat_req__ai_platform__workloads_execution + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__ai_platform__enablement + :status: valid + + The platform shall support the execution of traditional ML models on embedded automotive hardware. + +.. feat_req:: ASIL-B ML Inference + :id: feat_req__ai_platform__safety_backends + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__ai_platform__safety_critical + :status: valid + + The platform shall support deployment of safety-certified inference backends and abstraction layers for ASIL-B use cases. + +.. feat_req:: Efficient Embedded Runtime + :id: feat_req__ai_platform__embedded_efficiency + :reqtype: Non-Functional + :security: NO + :safety: QM + :satisfies: stkh_req__ai_platform__runtime_efficiency + :status: valid + + The platform shall optimize runtime performance and memory usage to meet the constraints of automotive edge hardware. + +.. feat_req:: Cross-OS Portability + :id: feat_req__ai_platform__qnx_linux_support + :reqtype: Non-Functional + :security: NO + :safety: QM + :satisfies: stkh_req__ai_platform__platform_portability + :status: valid + + The platform shall support portable AI components that run on both QNX (ASIL-B) and Linux environments. + +.. feat_req:: Verified Model Execution + :id: feat_req__ai_platform__model_verification + :reqtype: Functional + :security: YES + :safety: QM + :satisfies: stkh_req__ai_platform__model_security + :status: valid + + The platform shall ensure model artifacts are verified via cryptographic signatures before execution, and model loading is restricted to trusted paths. + +.. feat_req:: Static Backend Selection + :id: feat_req__ai_platform__static_backend + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__ai_platform__runtime_determinism + :status: valid + + The platform shall select inference backends statically at build time to ensure deterministic runtime behavior. diff --git a/docs/requirements/stakeholder/index.rst b/docs/requirements/stakeholder/index.rst index de63a11d64..5a820f9acd 100644 --- a/docs/requirements/stakeholder/index.rst +++ b/docs/requirements/stakeholder/index.rst @@ -558,6 +558,120 @@ Communication * Diagnostic jobs +AI Platform +----------- + + +.. stkh_req:: On-board ML Workloads + :id: stkh_req__ai_platform__enablement + :reqtype: Functional + :security: NO + :safety: QM + :rationale: Modern vehicles require the integration of ML capabilities to remain competitive and support customer expectations. + :status: valid + + The platform shall support the execution of traditional ML workloads on-board. + + +.. stkh_req:: Support for Safety-Critical ML + :id: stkh_req__ai_platform__safety_critical + :reqtype: Functional + :security: NO + :safety: ASIL_B + :rationale: Some ML-based functionality is required to be certified up to ASIL-B. + :status: valid + + The platform shall support safety-compliant (ASIL-B) deployment of AI/ML components, including inference backends and pipelines. + + +.. stkh_req:: Runtime Efficiency for Edge Devices + :id: stkh_req__ai_platform__runtime_efficiency + :reqtype: Non-Functional + :security: NO + :safety: QM + :rationale: Automotive platforms have limited compute and thermal budgets. + :status: valid + + The AI platform shall be optimized for runtime performance and memory footprint on embedded hardware targets. + + +.. stkh_req:: Platform Portability (QNX + Linux) + :id: stkh_req__ai_platform__platform_portability + :reqtype: Non-Functional + :security: NO + :safety: QM + :rationale: AI/ML use cases span both safety and non-safety environments, requiring portability across operating systems. + :status: valid + + The platform shall support both QNX (for safety) and Linux (for GenAI and flexibility) with reusable components. + + +.. stkh_req:: Secure Model Execution + :id: stkh_req__ai_platform__model_security + :reqtype: Functional + :security: YES + :safety: QM + :rationale: AI model execution must be protected against tampering or abuse. + :status: valid + + The platform shall ensure secure, verified, and integrity-checked model execution. + + +.. stkh_req:: Deterministic Execution Paths + :id: stkh_req__ai_platform__runtime_determinism + :reqtype: Non-Functional + :security: NO + :safety: ASIL_B + :rationale: Safety certification requires predictable and bounded system behavior. + :status: valid + + The platform shall ensure deterministic behavior for AI components used in safety-relevant paths. + + +.. stkh_req:: On-board GenAI Workloads + :id: stkh_req__gen_ai__enablement + :reqtype: Functional + :security: NO + :safety: QM + :rationale: Modern vehicles require the integration of AI/ML capabilities to remain competitive and support customer expectations. + :status: valid + + The platform shall support the execution of Generative AI workloads on-board. + + +.. stkh_req:: GenAI User Interaction + :id: stkh_req__gen_ai__interaction + :reqtype: Functional + :security: YES + :safety: QM + :rationale: HMIs are expected to support intelligent, natural interaction using LLM-based assistants. + :status: valid + + The platform shall support on-device GenAI-based models with user interaction. + + +.. stkh_req:: Action Safety and Governance + :id: stkh_req__gen_ai__safety_filter + :reqtype: Functional + :security: YES + :safety: ASIL_B + :rationale: GenAI output may be unpredictable or unsafe and must be controlled before affecting vehicle behavior. + :status: valid + + The platform shall validate all actions proposed by GenAI models against safety and policy rules prior to execution. + + +.. stkh_req:: Seamless Integration with Vehicle Systems + :id: stkh_req__gen_ai__vehicle_com + :reqtype: Functional + :security: YES + :safety: ASIL_B + :rationale: AI components must interact with vehicle state and control interfaces. + :status: valid + + The platform shall expose structured APIs to access vehicle state and execute safe commands. + + Diagnostics and Fault Management -------------------------------- From 7ae148a25bba5ffd03ddc8381a619c853370803d Mon Sep 17 00:00:00 2001 From: Ulrich Huber <ulrich.uh.huber@bmw.de> Date: Mon, 11 Aug 2025 14:31:50 +0200 Subject: [PATCH 061/109] docs: Update folder structure Mentions further details of the folder structure as they came up as questions in the Architecture Round. Signed-off-by: Ulrich Huber <ulrich.uh.huber@bmw.de> --- docs/contribute/general/folder.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/contribute/general/folder.rst b/docs/contribute/general/folder.rst index 3a9d037a01..b524807e27 100644 --- a/docs/contribute/general/folder.rst +++ b/docs/contribute/general/folder.rst @@ -96,7 +96,9 @@ The modules and components shall follow the folder structure which was presented Include files Source Files Unit tests [:need:`PROCESS_wp__verification__sw_unit_test`] + Test doubles <lower_level_comp>/ -> lower level component following <component_name> folder structure + details/ -> Private implementation details of the component following <component_name> folder structure docs/ -> Documentation of the component architecture/ -> Component architecture (only if lower level components exist) From 808ff092a7782df2e38974d65465418fd06e5833 Mon Sep 17 00:00:00 2001 From: Markus Bechter <markus.bechter@bmw.de> Date: Wed, 18 Jun 2025 08:07:58 +0200 Subject: [PATCH 062/109] docs: lifecycle feature - initial version --- .../application_health_monitor_static.puml | 23 + ...application_health_monitoring_dynamic.puml | 54 + .../_assets/config_params_static.puml | 76 ++ .../control_interface_start_sequence.puml | 32 + .../_assets/control_interface_static.puml | 19 + .../control_interface_stop_sequence.puml | 37 + .../_assets/external_monitoring_sequence.puml | 93 ++ .../_assets/external_monitoring_static.puml | 14 + .../_assets/launch_manager_static.puml | 21 + .../architecture/_assets/overview_static.puml | 47 + .../application_health_monitor.rst | 94 ++ .../architecture/configuration_parameters.rst | 60 + .../architecture/control_interface.rst | 102 ++ .../architecture/external_monitoring.rst | 86 ++ .../lifecycle/architecture/launch_manager.rst | 42 + docs/features/lifecycle/index.rst | 236 ++++ .../features/lifecycle/requirements/index.rst | 1133 +++++++++++++++++ 17 files changed, 2169 insertions(+) create mode 100644 docs/features/lifecycle/architecture/_assets/application_health_monitor_static.puml create mode 100644 docs/features/lifecycle/architecture/_assets/application_health_monitoring_dynamic.puml create mode 100644 docs/features/lifecycle/architecture/_assets/config_params_static.puml create mode 100644 docs/features/lifecycle/architecture/_assets/control_interface_start_sequence.puml create mode 100644 docs/features/lifecycle/architecture/_assets/control_interface_static.puml create mode 100644 docs/features/lifecycle/architecture/_assets/control_interface_stop_sequence.puml create mode 100644 docs/features/lifecycle/architecture/_assets/external_monitoring_sequence.puml create mode 100644 docs/features/lifecycle/architecture/_assets/external_monitoring_static.puml create mode 100644 docs/features/lifecycle/architecture/_assets/launch_manager_static.puml create mode 100644 docs/features/lifecycle/architecture/_assets/overview_static.puml create mode 100644 docs/features/lifecycle/architecture/application_health_monitor.rst create mode 100644 docs/features/lifecycle/architecture/configuration_parameters.rst create mode 100644 docs/features/lifecycle/architecture/control_interface.rst create mode 100644 docs/features/lifecycle/architecture/external_monitoring.rst create mode 100644 docs/features/lifecycle/architecture/launch_manager.rst create mode 100644 docs/features/lifecycle/index.rst create mode 100644 docs/features/lifecycle/requirements/index.rst diff --git a/docs/features/lifecycle/architecture/_assets/application_health_monitor_static.puml b/docs/features/lifecycle/architecture/_assets/application_health_monitor_static.puml new file mode 100644 index 0000000000..bc565f6b38 --- /dev/null +++ b/docs/features/lifecycle/architecture/_assets/application_health_monitor_static.puml @@ -0,0 +1,23 @@ +@startuml +title Component Architecture Diagram + +package "<<executable>> Launch Manager" { + [Launch Manager] as LM + interface AliveMonitoring + + LM --|> AliveMonitoring : offers +} + +package "<<executable>> Monitored Application (MA)" { + [Application logic] as MA + [Health Monitor (HM)] as HM + + interface HealthMonitorAPI + + HM --|> HealthMonitorAPI : implements + HM --> AliveMonitoring : connects to + MA --> HealthMonitorAPI : uses +} + + +@enduml diff --git a/docs/features/lifecycle/architecture/_assets/application_health_monitoring_dynamic.puml b/docs/features/lifecycle/architecture/_assets/application_health_monitoring_dynamic.puml new file mode 100644 index 0000000000..43bf771bd6 --- /dev/null +++ b/docs/features/lifecycle/architecture/_assets/application_health_monitoring_dynamic.puml @@ -0,0 +1,54 @@ +@startuml +autonumber "<b>[000]" + +participant "Launch Manager" as LM + + +box "Monitored Application" + participant "Application Logic" as App + participant "HealthMonitor" as HM +end box + +LM -> LM: Parse monitoring rules\nof the monitored app +LM -> LM: Start startup grace period timer + +LM -> App : Start component + +activate App +App -> HM: Register health monitoring\n(Alive/Deadline/Logical) +activate HM +HM -> HM: sleep until the next wakeup time +App -> HM: Checkpoint +HM -> HM: Wakeup and check if the\ncheckpoints have been called +HM -> LM: Alive notification + +hnote across: Use Case: Missed checkpoint + +App --x HM: Missed Checkpoint +HM -> HM: Wakeup and check if the\ncheckpoints have been called + +HM -> LM: Supervision failure notification + +HM -X LM: Stop triggering alive +LM -> LM: Error reaction\n(notify State manager) + +hnote across: Use Case: Direct error report by the Application + +App -> HM: Report error +HM -> LM: Supervision failure notification + +HM -X LM: Stop triggering alive +LM -> LM: Error reaction\n(notify State manager) + +hnote across: Use Case: Crashed Application + +App -> App: application error, crash +destroy App +destroy HM + +LM -> LM: Wakeup and check if the\ncheckpoints have been called +LM -> LM: No alive notification seen +LM -> LM: Error reaction\n(notify State manager) + + +@enduml diff --git a/docs/features/lifecycle/architecture/_assets/config_params_static.puml b/docs/features/lifecycle/architecture/_assets/config_params_static.puml new file mode 100644 index 0000000000..c385846651 --- /dev/null +++ b/docs/features/lifecycle/architecture/_assets/config_params_static.puml @@ -0,0 +1,76 @@ +@startuml + +class LaunchManager +{ + +} + +class LaunchConfiguration +{ + +} + +LaunchManager "1" -- "1" LaunchConfiguration + + +class ConfigFile +{ + +} + +LaunchConfiguration "1" -- "1..*" ConfigFile + + + +class ComponentConfig { + +} + +ConfigFile "1" -- "1..*" ComponentConfig + +class AliveMonitoring { + + alive notification interval + + Startup grace period + + failure tolerance limit +} + + +class RecoveryAction { + + recovery action type (eg. restart, stop, ignore, DSS) + + retry count (how many times to try) + + wait time (before the component can be started again) +} + + +class Dependency { + + depency type +} + +class ProcessConfig { ++ UID ++ GID ++ supplementary groups ++ runmask ++ priority ++ ability ++ security ++ cwd ++ environmental variables ++ command ++ arguments ++ stdin ++ stdout ++ stderr ++ aslr ++ rlimits ++ time between sigterm and sigkill +} + +ComponentConfig "1" -- "1" Dependency +ComponentConfig "1" -- "1" ProcessConfig +ComponentConfig "1" -- "1" AliveMonitoring +ComponentConfig "1" -- "1" RecoveryAction + +Dependency "1" --> "0..*" ComponentConfig: (reference to another component) + +@enduml \ No newline at end of file diff --git a/docs/features/lifecycle/architecture/_assets/control_interface_start_sequence.puml b/docs/features/lifecycle/architecture/_assets/control_interface_start_sequence.puml new file mode 100644 index 0000000000..b2cbf3f097 --- /dev/null +++ b/docs/features/lifecycle/architecture/_assets/control_interface_start_sequence.puml @@ -0,0 +1,32 @@ +@startuml +title Control Interface - Start components + +autonumber "<b>[00]" + + +participant "Tester" as Tester +participant "State Manager" as SM +participant "Launch Manager" as LM +participant "OS (kernel)" as kernel +participant "DemoApp1" as DemoApp1 +participant "DemoApp2" as DemoApp2 + + + +Tester -> SM: Start Group (eg. UDS) +SM -> SM: evaluate request +SM -> LM: Start group DemoApps +activate LM +LM -> kernel: spawn DemoApp1 +kernel -> DemoApp1: spawn +kernel --> LM: result of spawning of DemoApp1 +kernel -> DemoApp2: spawn +activate DemoApp2 +kernel --> LM: result of spawning of DemoApp2 + +LM -> LM: wait for DemoApp2 ready status +DemoApp2 -> DemoApp2: register device /dev/Demo2 +kernel --> LM: event /dev/Demo2 registered +LM --> SM: DemoApps started + +@enduml diff --git a/docs/features/lifecycle/architecture/_assets/control_interface_static.puml b/docs/features/lifecycle/architecture/_assets/control_interface_static.puml new file mode 100644 index 0000000000..74c2a35e94 --- /dev/null +++ b/docs/features/lifecycle/architecture/_assets/control_interface_static.puml @@ -0,0 +1,19 @@ +@startuml +title Control Interface Static Architecture + +package "Launch Manager" { + [Launch Manager (LM)] as LM + interface ControlInterface + + LM -- ControlInterface : implements +} + +package "State Manager" { + [State Manager] as SM +} + +SM -up-> ControlInterface : uses + +note right of [ControlInterface] : Start/Stop/Restart components\nQuery status\n... + +@enduml diff --git a/docs/features/lifecycle/architecture/_assets/control_interface_stop_sequence.puml b/docs/features/lifecycle/architecture/_assets/control_interface_stop_sequence.puml new file mode 100644 index 0000000000..e4a23df1b9 --- /dev/null +++ b/docs/features/lifecycle/architecture/_assets/control_interface_stop_sequence.puml @@ -0,0 +1,37 @@ +@startuml +title Control Interface - Stop components + +autonumber "<b>[00]" + + +participant "Tester" as Tester +participant "State Manager" as SM +participant "Launch Manager" as LM +participant "OS (kernel)" as kernel +participant "DemoApp1" as DemoApp1 +participant "DemoApp2" as DemoApp2 + + + +Tester -> SM: Stop Group (eg. UDS) +SM -> SM: evaluate request +SM -> LM: Stop group DemoApps +activate LM +LM -> DemoApp1: SIGTERM +activate DemoApp1 +LM -> DemoApp2: SIGTERM +activate DemoApp2 + +DemoApp1 -> DemoApp1: do shutdown actions +DemoApp2 -> DemoApp2: do shutdown actions + +destroy DemoApp1 + +LM -> LM: check if the apps terminated within\nthe termination timeout? +LM -> DemoApp2: SIGKILL +destroy DemoApp2 + + +LM --> SM: DemoApps terminated + +@enduml diff --git a/docs/features/lifecycle/architecture/_assets/external_monitoring_sequence.puml b/docs/features/lifecycle/architecture/_assets/external_monitoring_sequence.puml new file mode 100644 index 0000000000..515a5f4844 --- /dev/null +++ b/docs/features/lifecycle/architecture/_assets/external_monitoring_sequence.puml @@ -0,0 +1,93 @@ +@startuml +title External Monitoring + +autonumber "<b>[000]" + +participant "External Watchdog" as EWD +participant "Watchdog Proxy" as WDP +participant "Launch Manager" as LM + +activate LM + +LM --> LM: parse configuration +deactivate LM + +activate WDP + +alt "Proxy registers to Launch Manager" +WDP -> LM: Register for alive notifications (callback) +activate LM +LM --> WDP: Return value +else "Launch manager opens the watchdog device itself" +LM -> WDP: open watchdog device (eg. /dev/watchdog) +WDP -> LM: Return value +end +deactivate WDP + + + +note right of WDP: IPC (POSIX or OS-specific event) +activate WDP +activate LM +LM --> LM: internal health check +alt "Health OK" +LM --> WDP: alive notification (callback) +activate WDP +end +deactivate LM + + +note right of EWD: ECU specific notification.\nGPIO, UART, SPI, etc. + +WDP --> EWD: notify external watchdog +deactivate WDP +activate EWD +EWD --> EWD: Check if the notification fits the alive window\nreset the timeout timer +deactivate EWD +note right of LM: Wait until the next scheduled notification time + + +activate LM +LM --> LM: internal health check +alt "Health OK" +activate WDP +LM --> WDP: alive notification (callback) +end +deactivate LM + +activate WDP +WDP --> EWD: notify external watchdog +deactivate WDP +activate EWD +EWD --> EWD: Check if the notification fits the alive window\nreset the timeout timer +deactivate EWD + +note right of LM: Wait until the next scheduled notification time + +activate LM +LM --> LM: internal health check +alt "Health OK" +activate WDP +LM --> WDP: alive notification (callback) +end +deactivate LM + + +activate WDP +WDP --> EWD: notify external watchdog +deactivate WDP +activate EWD +EWD --> EWD: Check if the notification fits the alive window\nreset the timeout timer +deactivate EWD + +note right of LM: Wait until the next scheduled notification time +activate LM +LM --> LM: internal health check +note right of LM: status failed, don't trigger + +activate EWD +EWD --> EWD: Check if the notification fits the alive window\nreset the timeout timer +deactivate EWD +note right of EWD: alive notification missed\nTrigger error reaction + +@enduml diff --git a/docs/features/lifecycle/architecture/_assets/external_monitoring_static.puml b/docs/features/lifecycle/architecture/_assets/external_monitoring_static.puml new file mode 100644 index 0000000000..1db2415441 --- /dev/null +++ b/docs/features/lifecycle/architecture/_assets/external_monitoring_static.puml @@ -0,0 +1,14 @@ +@startuml + + +package "Monitored controller" { + [Watchdog Proxy] - Ext_IPC + HealthStatus -[Watchdog Proxy] + [Launch Manager] - HealthStatus +} + +package "External monitor" { + Ext_IPC - [Watchdog] : UART\nGPIO\netc. +} + +@enduml diff --git a/docs/features/lifecycle/architecture/_assets/launch_manager_static.puml b/docs/features/lifecycle/architecture/_assets/launch_manager_static.puml new file mode 100644 index 0000000000..9dc9164e39 --- /dev/null +++ b/docs/features/lifecycle/architecture/_assets/launch_manager_static.puml @@ -0,0 +1,21 @@ +@startuml +title Launch Manager Static Architecture + +package "Launch Manager" { + [Launch Manager] as LM + interface AliveMonitoring + interface ConfigurationFiles + interface HealthStatus + interface CommandLineArguments + interface Logging + + + LM --> AliveMonitoring : provides + LM --> ConfigurationFiles : requires + LM --> CommandLineArguments : requires + LM --> HealthStatus: offers + LM --> Logging: requires +} + + +@enduml \ No newline at end of file diff --git a/docs/features/lifecycle/architecture/_assets/overview_static.puml b/docs/features/lifecycle/architecture/_assets/overview_static.puml new file mode 100644 index 0000000000..c6db8dc2f8 --- /dev/null +++ b/docs/features/lifecycle/architecture/_assets/overview_static.puml @@ -0,0 +1,47 @@ +@startuml +title Launch Manager Static Architecture + + +package "<<executable>> Launch Manager" { + [Launch Manager] as LM #A9DCDF + interface AliveMonitoring + interface ConfigurationFiles + interface HealthStatus + interface CommandLineArguments + interface Logging + interface ControlInterface + + + LM --> AliveMonitoring : provides + LM --> ConfigurationFiles : requires + LM --> CommandLineArguments : requires + LM --> HealthStatus: provides + LM --> ControlInterface: provides + LM --> Logging: requires +} + +package "<<executable>> Monitored Application (MA)" { + [Application logic] as MA + [Health Monitor (HM)] as HM #A9DCDF + + interface HealthMonitorAPI + + HM --|> HealthMonitorAPI : implements + MA --> HealthMonitorAPI : uses +} +HM -up-> AliveMonitoring : connects to + +package "<<executable>> State Manager" { + [State Manager] as SM +} + +SM -up-> ControlInterface : uses + +note left of [SM] : Start/Stop/Restart components\nQuery status\n... + +legend right + |Color| Type | + |<#A9DCDF>| Part of feature| +endlegend + +@enduml diff --git a/docs/features/lifecycle/architecture/application_health_monitor.rst b/docs/features/lifecycle/architecture/application_health_monitor.rst new file mode 100644 index 0000000000..c8631c63d3 --- /dev/null +++ b/docs/features/lifecycle/architecture/application_health_monitor.rst @@ -0,0 +1,94 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +Application Health Monitor +########################## + + +Static Architecture +=================== + + +.. comp_arc_sta:: <<library>\nHealth Monitor + :id: comp_arc_sta__lifecycle__healthmonitor + :status: valid + :safety: ASIL_B + :implements: logic_arc_int__lifecycle__health_monitor_if + :uses: logic_arc_int__lifecycle__alive_if + :security: NO + :includes: + :fulfils: + + .. needarch:: + :scale: 50 + :align: center + + {{ draw_component(need(), needs) }} + + +.. logic_arc_int:: Health Monitor API + :id: logic_arc_int__lifecycle__health_monitor_if + :security: YES + :safety: ASIL_B + :status: valid + :fulfils: feat_req__com__interfaces + + + +Dynamic Architecture +==================== + + .. feat_arc_dyn:: Application health monitoring + :id: feat_arc_dyn__lifecycle__app_health_moni + :security: YES + :status: invalid + :safety: ASIL_B + :fulfils: feat_req__lifecycle__process_monitoring + + .. uml:: _assets/application_health_monitoring_dynamic.puml + :scale: 50 + :align: center + +The most important interactions are the following: + +.. list-table:: Sequence diagram Description + :widths: 10 90 + :header-rows: 1 + + * - Sequence number + - Description + * - 001 + - `Launch manager` configuration for the alive monitoring of the `Monitored application` is parsed. This contains for example, what is the expected interval of alive notifications, + how long grace period is given before failing to a missed (never received) alive notification etc. + * - 002 + - Start the startup grace period timer to allow the application to startup, before timing out to a missed alive notification + * - 003 + - The `Monitored application` is started. (To simplify, no startup checks drawn here) + * - 004 + - The `Monitored application` instantiate and configure the HealthMonitor + * - 006 + - Cyclic reporting aliveness to the monitor. + * - 007 + - HealthMonitor waking up and checking if the checkpoint(s) have been called + * - 008 + - Report aliveness to the LM's application specific supervision, observing the health of the HealthMonitor itself + * - 009 + - Checkpoint sent, but not on time + * - 010 + - Wake up and check if the checkpoint(s) have been triggered. In this case it was not, and thus actions 011 and 012 are triggered. + * - 011 + - Trigger a failure event to the Launch Manager. This event allows the monitor react faster than waiting for the timeout to expire. + * - 012 + - Additionally, triggering alive must be stopped + diff --git a/docs/features/lifecycle/architecture/configuration_parameters.rst b/docs/features/lifecycle/architecture/configuration_parameters.rst new file mode 100644 index 0000000000..805533977b --- /dev/null +++ b/docs/features/lifecycle/architecture/configuration_parameters.rst @@ -0,0 +1,60 @@ +.. + # ******************************************************************************* + # 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 Parameters +######################## + + +Launch Manager Configuration Parameters +======================================= + + +Component Configuration Parameters +================================== +- UID feat_req__lifecycle__lm_uid_gid +- GID feat_req__lifecycle__lm_uid_gid +- supplementary groups feat_req__lifecycle__lm_supplementary +- runmask feat_req__lifecycle__lm_runmask +- priority feat_req__lifecycle__lm_priority +- ability +- security policies +- cwd (current working directory) feat_req__lifecycle__lm_cwd +- environmental variables feat_req__lifecycle__lm_env_var +- command to be executed +- arguments feat_req__lifecycle__lm_arguments +- stdin feat_req__lifecycle__lm_std_out_in_err_redir +- stdout feat_req__lifecycle__lm_std_out_in_err_redir +- stderr feat_req__lifecycle__lm_std_out_in_err_redir +- aslr feat_req__lifecycle__lm_aslr +- rlimits feat_req__lifecycle__lm_rlimit + + +Dependency and recovery Parameters +================================== + + + + + +Requirements related to the external monitoring +=============================================== + +- :need:`feat_req__lifecycle__lm_self_health_check` +- :need:`feat_req__lifecycle__lm_ext_watchdog_notify` +- :need:`feat_req__lifecycle__lm_ext_wdg_failed_test` +- :need:`feat_req__lifecycle__lm_ext_watchdog_cfg` + + +Dynamic Architecture +==================== diff --git a/docs/features/lifecycle/architecture/control_interface.rst b/docs/features/lifecycle/architecture/control_interface.rst new file mode 100644 index 0000000000..14c72b6e9e --- /dev/null +++ b/docs/features/lifecycle/architecture/control_interface.rst @@ -0,0 +1,102 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +Control Interface +################# + + +It's foreseen ECU projects will need a custom state management to fulfill ECU-project specific requirements. THe S-Core will offer a framework to control application lifecycle, but will not specify the State Manager. + +The `Launch Manager` shall provide an interface, which allows an external State Manager application to request the `Launch Manager` to start, stop or restart applications or groups of applications, +which allows the implementation of a state management applications to support dynamic state control. + + +Static Architecture +=================== + + +.. logic_arc_int:: Control Interface + :id: logic_arc_int__lifecycle__controlif + :security: YES + :safety: ASIL_B + :status: valid + :fulfils: feat_req__com__interfaces + + + +Use cases +========= + +The following use cases are supported by the `ControlInterface` provided by the `Launch Manager`. + +Starting a component (or a group of components) +----------------------------------------------- + +When a request to start component(s) is received via the `ControlInterface`, the `Launch Manager` shall first evaluate if the conditions are correct for the launching of the component. At least the following conditions must be valid: + +- The component exists in the model +- If the component has dependencies, the dependencies must be valid + +If the pre-conditions are valid, then the components are started in the order defined in the dependency tree. (See : TODO, add link to the documentation about the dependencies). + +If all components were successfully started, the respond to the caller with a status indicating success. +If any of the components failed to start, respond to the caller with a status indicating a failure. + +Stopping a component (or a group of components) +----------------------------------------------- + + +Getting the status of a component (or a group of components) +------------------------------------------------------------ + +The `Launch Manager` shall provide an interface to requery of the status of a component or a group of components. + + +Dynamic Architecture +==================== + +.. feat_arc_dyn:: Control interface dynamic architecture start of components + :id: feat_arc_dyn__lifecycle__control_if_start + :security: YES + :status: valid + :safety: ASIL_B + :fulfils: feat_req__lifecycle__control_commands, feat_req__lifecycle__request_group_launch + :includes: + + .. uml:: _assets/control_interface_start_sequence.puml + :scale: 50 + :align: center + +.. feat_arc_dyn:: Control interface dynamic architecture stop of components + :id: feat_arc_dyn__lifecycle__control_if_stop + :security: YES + :status: valid + :safety: ASIL_B + :fulfils: feat_req__lifecycle__control_commands, feat_req__lifecycle__request_group_stop + :includes: + + .. uml:: _assets/control_interface_stop_sequence.puml + :scale: 50 + :align: center + + + +Requirements +============ + +- :need:`feat_req__lifecycle__control_commands` +- :need:`feat_req__lifecycle__query_commands` +- :need:`feat_req__lifecycle__request_group_launch` +- :need:`feat_req__lifecycle__request_group_stop` +- :need:`feat_req__lifecycle__request_group_restart` diff --git a/docs/features/lifecycle/architecture/external_monitoring.rst b/docs/features/lifecycle/architecture/external_monitoring.rst new file mode 100644 index 0000000000..8decb13bc3 --- /dev/null +++ b/docs/features/lifecycle/architecture/external_monitoring.rst @@ -0,0 +1,86 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +External Monitoring +################### + + +.. uml:: _assets/external_monitoring_static.puml + :alt: External monitoring static Architecture + +The following participants are related to the concept. + +Launch Manager +-------------- + +As the `Launch manager` is critical component for the system, it shall support alive monitoring of itself. This means it must implement internal health management, such as +a worker thread, that wakes up every N milliseconds, checks if the component is in a consistent state, and send a notification to the external monitor. + +External monitor +---------------- + +The aliveness of the `Launch Manager` shall be monitored by an `external monitor, or a watchdog <https://en.wikipedia.org/wiki/Watchdog_timer>`_, to be able to detect "hanging" of the +`Launch Manager`. The implementation of the external watchdog is out of scope in S-SCORE, as it is ECU and/or project specific. + +Watchdog Proxy +-------------- + +The component `Watchdog Proxy` is the project specific logical component, which has to implement the logical interface `HealthStatus` and translate alive events from the `Launch Manager` as +project specific messages to the `External monitor`. The channel for sending these notifications is project specific, and can be for example `GPIO`, `UART` or `SPI`. +In a hypervisor based environment, the `external monitor` could also run with the same SoC as software only solution. + +The `Watchdog Proxy` implementation is not specified in the S-CORE with high details, as the realization depends heavily on OS, `Launch Manager` or even project specific needs. +For example, in Linux and `systemd` as the `launch manager`, the interface can be `/dev/watchdog`, and `systemd` can use the interface directly. + +In QNX, one could implement a component listening to the events (or even poll) from the `Launch manager` and translate these events as hardware specific notifications. + +Requirements related to the external monitoring +=============================================== + +- :need:`feat_req__lifecycle__lm_self_health_check` +- :need:`feat_req__lifecycle__lm_ext_watchdog_notify` +- :need:`feat_req__lifecycle__lm_ext_wdg_failed_test` +- :need:`feat_req__lifecycle__lm_ext_watchdog_cfg` + + +Dynamic Architecture +==================== + +.. uml:: _assets/external_monitoring_sequence.puml + :alt: External monitoring static arch + +The most important interactions are the following: + +.. list-table:: Sequence diagram Description + :widths: 10 90 + :header-rows: 1 + + * - Sequence number + - Description + * - 001 + - The configuration. (notification interval, startup grace period, etc.) Additionally, if a watchdog interface is used, the used interface name (eg. /dev/watchdog) must be configurable. + * - 002 + - If the `Launch manager` provides a client library implementation, the library must connect and attach to the `Launch manager` + * - 006 + - Check the internal status and trigger alive notification (007) + * - 007 + - Send the alive notification to the external monitor. (UART/SPI/GPIO/etc.) + * - 009 + - Watchdog to check if the notification fits the expected window + * - 018 + - If the status check fails, do not trigger alive notification (or `Launch manager` has crashed) + * - 019 + - If there is no alive notification, trigger watchdog error reaction + + diff --git a/docs/features/lifecycle/architecture/launch_manager.rst b/docs/features/lifecycle/architecture/launch_manager.rst new file mode 100644 index 0000000000..6679491a5b --- /dev/null +++ b/docs/features/lifecycle/architecture/launch_manager.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 + # ******************************************************************************* + +Launch manager +============== + +.. logic_arc_int:: Alive Interface + :id: logic_arc_int__lifecycle__alive_if + :security: YES + :safety: ASIL_B + :status: valid + :fulfils: feat_req__com__interfaces + + +.. comp_arc_sta:: Launch Manager + :id: comp_arc_sta__lifecycle__launch_manager + :status: valid + :safety: ASIL_B + :implements: logic_arc_int__lifecycle__controlif, logic_arc_int__lifecycle__alive_if + :uses: logic_arc_int__logging__logging + :security: NO + :includes: + :fulfils: + + .. needarch:: + :scale: 50 + :align: center + + {{ draw_component(need(), needs) }} + + diff --git a/docs/features/lifecycle/index.rst b/docs/features/lifecycle/index.rst new file mode 100644 index 0000000000..32bf08549c --- /dev/null +++ b/docs/features/lifecycle/index.rst @@ -0,0 +1,236 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +.. _chm_feature_templates: + + +Lifecycle +--------- + +.. note:: Document header + +.. document:: Lifecycle + :id: doc__lifecycle + :status: draft + :safety: ASIL_B + :tags: feature_request + + +Feature flag +------------ + +To activate this feature, use the following feature flag: + +``experimental_lifecycle`` + + +Abstract +-------- + +The lifecycle feature provides a set of functionalities to manage the lifecycle of +components in the S-SCORE platform. The goal is to ensure that components can be +started, stopped, and monitored effectively, providing a robust framework for managing the state of the system. + +Motivation +---------- + +For every ecu handling of startup, shutdown, and monitoring of components is crucial to +ensure the system operates correctly and efficiently. Additionally we need do provide the +means to set the system in different operating modes, such as normal operation, engineering/debug mode, +flash mode etc. + + +Rationale +--------- + +Main task of the lifecycle system is to start and stop processes depending on the overall state the +user wants to achieve +and the functional dependencies between the processes. + +We call a state of the system an `operating mode`, which is defined via the processes running on the +system at a certain point in time. + +Examples for operating modes are `startup`, `running`, `shutdown` etc. + +Via the configuration we define a certain operting mode and add all the components, which are needed to +realize this operating mode as dependencies. + +A `lifecycle component` is a configuration unit, which describes the `executable`, which shall be executed +and the `sandbox` the platform has to provide to run this executable. +E.g. the `sandbox`` shall describe + +- environment variables, which shall be set via the lifecycle system +- secpol policies on QNX, which shall be applied to the process +- cgroup configurations on linux, which shall be applied to the process +- user and group ids under which the process shall be started. +- ... + +A second task of the lifecycle system is to supervise the aliveness of the processes, which are started +and to initiate appropriate actions in case of a failure, which might result in many cases in +a change of the operting mode. + +Specification +------------- + +.. feat_arc_sta:: Feature architecture + :id: feat_arc_sta__lifecycle__overview + :security: YES + :safety: ASIL_B + :status: valid + :fulfils: + :includes: logic_arc_int__lifecycle__controlif, logic_arc_int__lifecycle__health_monitor_if, logic_arc_int__lifecycle__alive_if + + + .. needarch:: + :scale: 50 + :align: center + + {{ draw_feature(need(), needs) }} + + +.. mod_view_sta:: Lifecycle + :id: mod_view_sta__lifecycle__1 + :includes: comp_arc_sta__lifecycle__launch_manager, comp_arc_sta__lifecycle__healthmonitor + + .. needarch:: + :scale: 50 + :align: center + + {{ draw_module(need(), needs) }} + + +The overall concept is based on 2 components: + +* Component Launch Manager: Responsible for starting and stopping components based on the defined operating modes + and alive supervision of the started components +* Component Health Monitor: Provides process local monitoring fucntionalities + such as deadline monitoring and logical program flow monitoring. + + + + +.. uml:: architecture/_assets/overview_static.puml + :scale: 50 + :align: center + +----------------------------------------------------- + +.. uml:: + :scale: 50 + :align: center + + title Dependency based lifecycle management + + state debug #lightblue + state running #lightblue + state ready_for_shutdown #lightblue + + state app1: /opt/bin/app1 + state app2: /opt/bin/app2 + state app3: /opt/bin/app3 + + state ssh: /usr/bin/ssh + state setup_filesystems: /etc/setup_filesystems.sh + state eth_driver: /bin/net-dev-eth + state filesystem: /bin/net-dev-ufs + state flash_driver: /bin/dev-emmc + + [*] --> debug + [*] -[hidden]-> running + [*] -[hidden]-> ready_for_shutdown + + + running --> app1 + app1 --> app2 + app2 --> networking + running --> app3 + app3 --> networking + + debug --> ssh + ssh --> networking + networking --> setup_filesystems + setup_filesystems --> filesystem + networking --> eth_driver + filesystem --> flash_driver + + legend right + |Color| Type | + |<#lightblue>| Operating modes provided by the ControlInterface| + endlegend + +Architecture +------------ + +.. toctree:: + :maxdepth: 1 + :glob: + + ./architecture/application_health_monitor + ./architecture/control_interface + ./architecture/external_monitoring + ./architecture/configuration_parameters + ./architecture/launch_manager + + +Requirements +------------ + +.. toctree:: + :maxdepth: 1 + :glob: + + requirements/* + +Backwards Compatibility +----------------------- + +New feature + +Security Impact +--------------- + +TBD + +Safety Impact +------------- + +TBD + + +License Impact +-------------- + +TBD + + +How to Teach This +----------------- + + + +Rejected Ideas +-------------- + + +Open Issues +----------- + + +Footnotes +--------- + +[A collection of footnotes cited in the CR, and a place to list non-inline hyperlink targets.] + + + diff --git a/docs/features/lifecycle/requirements/index.rst b/docs/features/lifecycle/requirements/index.rst new file mode 100644 index 0000000000..8c55a5c888 --- /dev/null +++ b/docs/features/lifecycle/requirements/index.rst @@ -0,0 +1,1133 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +Launch Manager +============== + +Launching Processes +------------------- + +.. feat_req:: Support for launching processes + :id: feat_req__lifecycle__launch_support + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for launching processes. + + +.. feat_req:: Process dependency handling + :id: feat_req__lifecycle__process_ordering + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for ordering the launching of processes based on the dependencies. + + +.. feat_req:: Launching processes in parallel + :id: feat_req__lifecycle__parallel_launch_support + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for launching processes in parallel. + + +.. feat_req:: Conditional waitfor launching + :id: feat_req__lifecycle__waitfor_support + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for waitfor conditions to be satisfied to launch processes. + + +.. feat_req:: Control Interface + :id: feat_req__lifecycle__custom_cond_support + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support to wait for configurable custom conditions, which can be signaled from applications via control interface. + + +.. feat_req:: Forward process information + :id: feat_req__lifecycle__process_input_output + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support to pass the output of one or multiple processes as input arguments to another process. + + +.. feat_req:: Conditionally launch of processes + :id: feat_req__lifecycle__cond_process_start + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support to conditionally start a process or process group based on the return value of a single or multiple processes executed before. + + +.. feat_req:: Support for essential processes + :id: feat_req__lifecycle__essential_processes + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall allow to mark processes as "essential" for the startup. + + +.. feat_req:: Stop further processing on failing essential process + :id: feat_req__lifecycle__essential_process_fail + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + In case a process that is marked as "essential" for the startup fails to start, the launch manager shall stop the further processing of its config and stop the startup sequence. + + +.. feat_req:: Error reaction on essential process failure + :id: feat_req__lifecycle__error_reaction_config + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall support to configure the error reaction in case an "essential" process failed to start. Possible error reactions are: + + * System halt + + * System reset + + * Execution of a specifically marked process + + +.. feat_req:: Handling process args + :id: feat_req__lifecycle__process_launch_args + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for launching a process with a given set of arguments. + + +.. feat_req:: Launching process in debug mode + :id: feat_req__lifecycle__debug_support + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for launching process with a given set of debug arguments in debug mode. + + +.. feat_req:: Launching process in HELD state + :id: feat_req__lifecycle__support_held_state + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for launching a process in a HELD state. + + +.. feat_req:: Process user, group ids support + :id: feat_req__lifecycle__uid_gid_support + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for launching a process with a given UID(/GID (/user\_name.Unique identifier)Group Identifier) + + +.. feat_req:: Conditional launch total wait time + :id: feat_req__lifecycle__total_wait_time_support + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for per condition configurable total wait time for launch conditions to be satisfied. + + +.. feat_req:: Conditional launch polling interval + :id: feat_req__lifecycle__polling_interval + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for per condition configurable polling interval for launch conditions to be checked. + + +.. feat_req:: Process priority support + :id: feat_req__lifecycle__launch_priority_support + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for launching a process with a given priority. + + +.. feat_req:: cwd support + :id: feat_req__lifecycle__cwd_support + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for launching a process with a given working directory. + + +.. feat_req:: launching terminal + :id: feat_req__lifecycle__terminal_support + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for launching a terminal or a session leader. + + +.. feat_req:: std handle redirection + :id: feat_req__lifecycle__std_handle_redir + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for stdin, stdout, stderr redirection. + + +.. feat_req:: builtin commands + :id: feat_req__lifecycle__builtin_command_support + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for builtin commands. + + +.. feat_req:: Non-root support + :id: feat_req__lifecycle__secpol_non_root + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support to be started with security policy as non-root. + + +.. feat_req:: Configurable amount of retries + :id: feat_req__lifecycle__retries_configurable + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall support a configurable amount of retries in case error occurs during startup of a component (e.g. file not available) occurs. + + +.. feat_req:: procmgr ability support + :id: feat_req__lifecycle__procmgr_support + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for launching processes with configured procmgr abilities. + + +.. feat_req:: file descriptor inheritance support + :id: feat_req__lifecycle__fd_inheritance + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for launching a process with given file descriptor inheritance restrictions. + + +.. feat_req:: security policy support + :id: feat_req__lifecycle__support_secpol_type + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for launching a process with a given security policy. + + +.. feat_req:: supplementary group support + :id: feat_req__lifecycle__supplementary_groups + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for launching a process with a given set of supplementary groups. + + +.. feat_req:: Scheduling support + :id: feat_req__lifecycle__scheduling_policy + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for launching a process with certain scheduling policy. + + +.. feat_req:: CPU runmask support + :id: feat_req__lifecycle__runmask_support + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for launching a process with a given runmask. + + +.. feat_req:: ASLR support + :id: feat_req__lifecycle__aslr_support + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for launching process with ASLR (Address Space Layout Randomization). + + +.. feat_req:: ressource limit support + :id: feat_req__lifecycle__process_rlimit_support + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for launching a process with a given set of system resource limits (rlimit). + + +.. feat_req:: process detach from parent support + :id: feat_req__lifecycle__detach_parent_process + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for launching a process to detach from parent. + + +.. feat_req:: Critical process support + :id: feat_req__lifecycle__critical_processes + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for launching a process as a critical process. + + +.. feat_req:: Process adoption + :id: feat_req__lifecycle__running_processes + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall adopt already running processes. + + +.. feat_req:: Dropping process responsibility + :id: feat_req__lifecycle__drop_supervsion + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support to dropping all surveillance and failure reaction activities of processes. + + +.. feat_req:: Multiple instance of executable + :id: feat_req__lifecycle__multi_start_support + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall permit an executable to be launched more than once. + + +.. feat_req:: Pre-start validation + :id: feat_req__lifecycle__validate_conditions + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall be able to validate the pre-start conditions of the executable using the conditions. + + +.. feat_req:: post-start validation + :id: feat_req__lifecycle__validation_conditions + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall be able to validate the start of the executable using the conditions. + + +.. feat_req:: Managing an externally started process + :id: feat_req__lifecycle__process_ownership + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall be able to own an externally started process. + + +.. feat_req:: Invalid dependency + :id: feat_req__lifecycle__consistent_dependencies + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall reject an inconsistent definition of set of executables dependencies. + + +.. feat_req:: Dangling dependency + :id: feat_req__lifecycle__stop_process_dependents + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall be able to stop a process when all it's dependents are stopped if specified in the set of executables. + + +.. feat_req:: Coordination stop dependency + :id: feat_req__lifecycle__stop_order_spec + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall permit the stop order of non-dependent processes to be specified. + + +Groups +...... + +.. feat_req:: named group + :id: feat_req__lifecycle__named_group_executables + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall permit to represent a set of executables as a named group. + + +.. feat_req:: Launching group + :id: feat_req__lifecycle__start_named_group_exe + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall be able to start a named group of executables. + + +.. feat_req:: Stopping group + :id: feat_req__lifecycle__stop_group_executables + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall be able to stop a named group of executables. + + +.. feat_req:: start group launch + :id: feat_req__lifecycle__launcher_start_group + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall be able to start a named group when the launcher is started. + + +.. feat_req:: Process state + :id: feat_req__lifecycle__process_state_comm + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall have a means for the launched processes to communicate a state, which represents the launched processes' internal state, to the launcher. + + +Terminating Processes +--------------------- + +.. feat_req:: Stop timeout + :id: feat_req__lifecycle__configurable_timeout + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for configurable timeout interval to wait for the process to be stopped. + + +.. feat_req:: Terminating process + :id: feat_req__lifecycle__process_termination + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for terminating processes. + + +.. feat_req:: Handling process dependency in termination + :id: feat_req__lifecycle__terminationn_dependency + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall terminate the processes based on the dependency order. + + +.. feat_req:: Configurable delay between SIGTERM and SIGKILL + :id: feat_req__lifecycle__time_to_wait_config + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The time to wait, before SIGKILL is sent shall be configurable. In case "0" is stated, the SIGKILL shall be sent immediatelly. + + +.. feat_req:: normal shutdown + :id: feat_req__lifecycle__launch_manager_shutdown + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall support normal shutdown by terminating all process in the dependency order. + + +.. feat_req:: slow shutdown + :id: feat_req__lifecycle__slow_shutdown_support + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall support slow shutdown by terminating the processes in the dependency order. + + +.. feat_req:: fast shutdown + :id: feat_req__lifecycle__fast_shutdown_support + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall support fast shutdown by terminating itself without affecting the started processes. + + +.. feat_req:: Launch Manager shutdown + :id: feat_req__lifecycle__launcher_exit_shutdown + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall exit after performing shutdown operation by stopping all the processes it owns in the dependency order when requested. + + +.. feat_req:: Configurable delay between SIGTERM and SIGKILL + :id: feat_req__lifecycle__shutdown_signal + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall implement a shutdown by sending a SIGTERM to the process. In case the process does not terminate itself, a SIGKILL shall be sent. + + +Control Interface +----------------- + +.. feat_req:: control commands + :id: feat_req__lifecycle__control_commands + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for commands to control component states. + + +.. feat_req:: query commands + :id: feat_req__lifecycle__query_commands + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for commands to query component states. + + +.. feat_req:: Report "started/running/degraded" + :id: feat_req__lifecycle__controlif_status + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall be able to report status on components via the control interface. + Note: + status can be "started/running/degraded" - refer to documentation for details + + +.. feat_req:: request group launch + :id: feat_req__lifecycle__request_group_launch + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall be able to start a named group respecting the dependencies when requested. + + +.. feat_req:: request group stop + :id: feat_req__lifecycle__request_group_stop + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall be able to stop a named group respecting the dependencies when requested. + + +.. feat_req:: request group restart + :id: feat_req__lifecycle__request_group_restart + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall be able to restart a named group respecting the dependencies when requested. + + +Monitoring, Notification and Recovery +------------------------------------- + +.. feat_req:: process crash monitoring + :id: feat_req__lifecycle__monitor_abnormal_term + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for monitoring abnormal termination of processes. + + +.. feat_req:: process state notification + :id: feat_req__lifecycle__ext_monitor_notify + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for external monitors to get notified on process life status. + + +.. feat_req:: recovery action + :id: feat_req__lifecycle__recovery_action_support + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall support recovery action for the abnormally terminated processes. + + +.. feat_req:: Restart of named group as recovery action + :id: feat_req__lifecycle__recover_group + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall support a restart of a named group as recovery method in case a single process out of that group terminated abnormally or lost its liveliness. + + +.. feat_req:: Monitoring and recovery: watchdog support + :id: feat_req__lifecycle__smart_watchdog_config + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall support smart watchdog, configurable per process. + + +.. feat_req:: Monitoring and recovery: recovery wait time + :id: feat_req__lifecycle__configurable_wait_time + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for configurable wait time that shall elapse before repeating recovery action. + + +.. feat_req:: Monitoring and recovery: adopted process monitoring + :id: feat_req__lifecycle__monitoring_processes + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for monitoring adopted processes. + + +.. feat_req:: process launch monitoring + :id: feat_req__lifecycle__failure_detect + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall be able to detect and react to failure of the process launch. + + +.. feat_req:: Process liveliness detection + :id: feat_req__lifecycle__liveliness_detection + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall be able to detect and react to loss of liveliness of the processes it owns. + + +.. feat_req:: process monitoring + :id: feat_req__lifecycle__process_monitoring + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall monitor the state of the processes as specified by the set of executables. + + +.. feat_req:: Recovery + :id: feat_req__lifecycle__process_failure_react + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall be able to react to a process failure by optionally performing one of relaunching the process, stopping the process, stopping the process and starting another process, or triggering QOS) Device Safe State (DSS).QNX Operating System ( + + +.. feat_req:: Multi-instance + :id: feat_req__lifecycle__multi_instance_support + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall be able to run in multiple instances with its own configurations on a system. + + +.. feat_req:: Launch manager self health check + :id: feat_req__lifecycle__lm_self_health_check + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall implement time based cyclical monitoring of itself. + +.. feat_req:: Launch manager external watchdog notification + :id: feat_req__lifecycle__lm_ext_watchdog_notify + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall trigger a notification to an external watchdog for each successful self monitoring test execution. + +.. feat_req:: Launch manager external watchdog notification - failed test + :id: feat_req__lifecycle__lm_ext_wdg_failed_test + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall not trigger an external watchdog notification if an internal health check failed. + +.. feat_req:: Launch manager external monitoring configuration + :id: feat_req__lifecycle__lm_ext_watchdog_cfg + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall support configuring the interval of the internal health check executions + +Logging +------- + +.. feat_req:: Logging slog2 and file support + :id: feat_req__lifecycle__slog2_logging + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall support slog2 and a logging file as logging destinations. + + +.. feat_req:: Logging state transitions + :id: feat_req__lifecycle__process_logging_support + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for logging process launches, processes exit/recovery, internal tasks, and interaction with external monitor. + + +.. feat_req:: Logging timestamp + :id: feat_req__lifecycle__log_timestamp + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager logs shall contain timestamp information. + + +.. feat_req:: Logging DAG + :id: feat_req__lifecycle__dag_logging_controlif + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide the possibility to log the DAG in an human readable format, triggered via control interface. + + +.. feat_req:: Configuration dependency view + :id: feat_req__lifecycle__dependency_visu + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall have the means to log the current dependencies in a format that can be visualized when requested. + +Configuration file +------------------ + +.. feat_req:: Configuration file support + :id: feat_req__lifecycle__modular_config_support + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide modular configuration file support to configure process attributes. + + +.. feat_req:: Updating configuration + :id: feat_req__lifecycle__session_extension + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support for extending already running session with additional new configuration file. + + +.. feat_req:: Module support + :id: feat_req__lifecycle__clustering_modules_supp + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide support to clustering set of components as modules. + + +.. feat_req:: global process properties + :id: feat_req__lifecycle__central_default_defines + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall be able to centrally define defaults for specific properties for the set of executables. + + +.. feat_req:: Lazy check of configured commands + :id: feat_req__lifecycle__lazy_check + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall check availability of executables in the filesystem only when the executable shall required to be executed. + + +.. feat_req:: Configuration Dependency view + :id: feat_req__lifecycle__deps_visualization + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall have the means to generate the specified dependencies in a format that can be visualized. + + +.. feat_req:: Configuration Verification tool + :id: feat_req__lifecycle__offline_config_valid + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall have a means to validate the configuration offline. + + +Condition Check +--------------- + +.. feat_req:: Launched Process status + :id: feat_req__lifecycle__launcher_status_storage + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall provide a way to store the status of the launched process. + + +.. feat_req:: Condition check based on status + :id: feat_req__lifecycle__condition_check_method + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall provide a method for condition check based on process state. + + +.. feat_req:: Configuration of action based on condition evaluation + :id: feat_req__lifecycle__config_actions_cond + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall provide a way to configure actions based on condition evaluation i.e. to be able to configure SUCCESS and FAILURE case. + + +.. feat_req:: Condition check based on path + :id: feat_req__lifecycle__path_condition_check + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall provide a method for condition check for a path. + + +.. feat_req:: Condition check based on ENV + :id: feat_req__lifecycle__env_variable_cond_check + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall provide a method for condition check for environment variable. + + +.. feat_req:: Condition check based on all dependency + :id: feat_req__lifecycle__dependency_check + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall provide a method to check if all dependency has been executed. + + +.. feat_req:: Condition check based on at least one dependency + :id: feat_req__lifecycle__check_dependency_exec + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall provide a method to check if at least one dependency has been executed. + + +.. feat_req:: Condition check for each SWC its dependencies + :id: feat_req__lifecycle__define_swc_dependencies + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall provide a way to define for each SWC), its dependencies.Software Components ( + + +.. feat_req:: Condition check for each SWC its stop sequence + :id: feat_req__lifecycle__stop_sequence + :reqtype: Functional + :security: NO + :safety: ASIL_D + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The Launch Manager shall provide a way to define the stop sequence for each Software Components (SWC). + + From 41d15d60f7bd2095fddd0ddec9a6f134ff0f0c05 Mon Sep 17 00:00:00 2001 From: FScholPer <frank.scholter_peres@mercedes-benz.com> Date: Tue, 1 Jul 2025 09:18:40 +0200 Subject: [PATCH 063/109] Added states and OCI compliance(#1270) --- .../architecture/control_interface.rst | 6 +- docs/features/lifecycle/index.rst | 60 ++--- .../features/lifecycle/requirements/index.rst | 215 ++++++++++-------- 3 files changed, 152 insertions(+), 129 deletions(-) diff --git a/docs/features/lifecycle/architecture/control_interface.rst b/docs/features/lifecycle/architecture/control_interface.rst index 14c72b6e9e..050f6766e4 100644 --- a/docs/features/lifecycle/architecture/control_interface.rst +++ b/docs/features/lifecycle/architecture/control_interface.rst @@ -16,7 +16,7 @@ Control Interface ################# -It's foreseen ECU projects will need a custom state management to fulfill ECU-project specific requirements. THe S-Core will offer a framework to control application lifecycle, but will not specify the State Manager. +It's foreseen ECU projects will need a custom state management to fulfill ECU-project specific requirements. The S-Core will offer a framework to control application lifecycle, but will not specify the State Manager. The `Launch Manager` shall provide an interface, which allows an external State Manager application to request the `Launch Manager` to start, stop or restart applications or groups of applications, which allows the implementation of a state management applications to support dynamic state control. @@ -72,7 +72,7 @@ Dynamic Architecture :status: valid :safety: ASIL_B :fulfils: feat_req__lifecycle__control_commands, feat_req__lifecycle__request_group_launch - :includes: + :includes: .. uml:: _assets/control_interface_start_sequence.puml :scale: 50 @@ -84,7 +84,7 @@ Dynamic Architecture :status: valid :safety: ASIL_B :fulfils: feat_req__lifecycle__control_commands, feat_req__lifecycle__request_group_stop - :includes: + :includes: .. uml:: _assets/control_interface_stop_sequence.puml :scale: 50 diff --git a/docs/features/lifecycle/index.rst b/docs/features/lifecycle/index.rst index 32bf08549c..aeca2bb4d4 100644 --- a/docs/features/lifecycle/index.rst +++ b/docs/features/lifecycle/index.rst @@ -24,7 +24,7 @@ Lifecycle :id: doc__lifecycle :status: draft :safety: ASIL_B - :tags: feature_request + :tags: feature_request Feature flag @@ -38,37 +38,46 @@ To activate this feature, use the following feature flag: Abstract -------- -The lifecycle feature provides a set of functionalities to manage the lifecycle of -components in the S-SCORE platform. The goal is to ensure that components can be +The lifecycle feature provides a set of functionalities to manage the lifecycle of +components in the S-SCORE platform. The goal is to ensure that components can be started, stopped, and monitored effectively, providing a robust framework for managing the state of the system. Motivation ---------- -For every ecu handling of startup, shutdown, and monitoring of components is crucial to -ensure the system operates correctly and efficiently. Additionally we need do provide the -means to set the system in different operating modes, such as normal operation, engineering/debug mode, +For every ecu handling of startup, shutdown, and monitoring of components is crucial to +ensure the system operates correctly and efficiently. Additionally we need do provide the +means to set the system in different operating modes, such as normal operation, engineering/debug mode, flash mode etc. Rationale --------- -Main task of the lifecycle system is to start and stop processes depending on the overall state the -user wants to achieve -and the functional dependencies between the processes. +Main task of the lifecycle system is to start and stop components with an `OCI` compliant runtime enviroment `<https://github.com/opencontainers/runtime-spec>`_ depending on the overall state the +user wants to achieve and the functional dependencies between the processes. -We call a state of the system an `operating mode`, which is defined via the processes running on the -system at a certain point in time. +A `container` is a lightweight, standalone executable package that includes everything needed to run a piece of software, +including the code, runtime, libraries, and system tools. +In the context of the S-SCORE platform, containers are used to encapsulate applications and their dependencies, +ensuring consistent execution across different environments. -Examples for operating modes are `startup`, `running`, `shutdown` etc. +We call a runtime-state of the system an `operating mode`, which is defined via the processes running on the +system at a certain point in time the with the `OCI` runtime. -Via the configuration we define a certain operting mode and add all the components, which are needed to -realize this operating mode as dependencies. +Coming from the OCI Specification the `operation modes` is a superset of the `OCI` states -A `lifecycle component` is a configuration unit, which describes the `executable`, which shall be executed -and the `sandbox` the platform has to provide to run this executable. -E.g. the `sandbox`` shall describe +- Creating +- Created +- Running +- Stopped + +Via the configuration we define a certain operting mode and add all the components, which are needed to +realize this operating mode as dependencies. + +A `lifecycle component` is a configuration unit, which describes the `executable`, which shall be executed +and the `sandbox` the platform has to provide to run this executable. +E.g. the `sandbox`` shall describe - environment variables, which shall be set via the lifecycle system - secpol policies on QNX, which shall be applied to the process @@ -76,9 +85,9 @@ E.g. the `sandbox`` shall describe - user and group ids under which the process shall be started. - ... -A second task of the lifecycle system is to supervise the aliveness of the processes, which are started -and to initiate appropriate actions in case of a failure, which might result in many cases in -a change of the operting mode. +A second task of the lifecycle system is to supervise the aliveness of the processes, which are started +and to initiate appropriate actions in case of a failure, which might result in many cases in +a change of the operting mode. Specification ------------- @@ -110,11 +119,11 @@ Specification {{ draw_module(need(), needs) }} -The overall concept is based on 2 components: +The overall concept is based on 2 components: * Component Launch Manager: Responsible for starting and stopping components based on the defined operating modes and alive supervision of the started components -* Component Health Monitor: Provides process local monitoring fucntionalities +* Component Health Monitor: Provides process local monitoring fucntionalities such as deadline monitoring and logical program flow monitoring. @@ -154,7 +163,7 @@ The overall concept is based on 2 components: running --> app1 app1 --> app2 app2 --> networking - running --> app3 + running --> app3 app3 --> networking debug --> ssh @@ -181,7 +190,7 @@ Architecture ./architecture/external_monitoring ./architecture/configuration_parameters ./architecture/launch_manager - + Requirements ------------ @@ -231,6 +240,3 @@ Footnotes --------- [A collection of footnotes cited in the CR, and a place to list non-inline hyperlink targets.] - - - diff --git a/docs/features/lifecycle/requirements/index.rst b/docs/features/lifecycle/requirements/index.rst index 8c55a5c888..2691e5503e 100644 --- a/docs/features/lifecycle/requirements/index.rst +++ b/docs/features/lifecycle/requirements/index.rst @@ -28,7 +28,7 @@ Launching Processes The launch manager shall provide support for launching processes. - + .. feat_req:: Process dependency handling :id: feat_req__lifecycle__process_ordering :reqtype: Functional @@ -39,7 +39,7 @@ Launching Processes The launch manager shall provide support for ordering the launching of processes based on the dependencies. - + .. feat_req:: Launching processes in parallel :id: feat_req__lifecycle__parallel_launch_support :reqtype: Functional @@ -50,7 +50,7 @@ Launching Processes The launch manager shall provide support for launching processes in parallel. - + .. feat_req:: Conditional waitfor launching :id: feat_req__lifecycle__waitfor_support :reqtype: Functional @@ -61,7 +61,7 @@ Launching Processes The launch manager shall provide support for waitfor conditions to be satisfied to launch processes. - + .. feat_req:: Control Interface :id: feat_req__lifecycle__custom_cond_support :reqtype: Functional @@ -72,7 +72,7 @@ Launching Processes The launch manager shall provide support to wait for configurable custom conditions, which can be signaled from applications via control interface. - + .. feat_req:: Forward process information :id: feat_req__lifecycle__process_input_output :reqtype: Functional @@ -83,7 +83,7 @@ Launching Processes The launch manager shall provide support to pass the output of one or multiple processes as input arguments to another process. - + .. feat_req:: Conditionally launch of processes :id: feat_req__lifecycle__cond_process_start :reqtype: Functional @@ -94,7 +94,7 @@ Launching Processes The launch manager shall provide support to conditionally start a process or process group based on the return value of a single or multiple processes executed before. - + .. feat_req:: Support for essential processes :id: feat_req__lifecycle__essential_processes :reqtype: Functional @@ -105,7 +105,7 @@ Launching Processes The launch manager shall allow to mark processes as "essential" for the startup. - + .. feat_req:: Stop further processing on failing essential process :id: feat_req__lifecycle__essential_process_fail :reqtype: Functional @@ -116,7 +116,7 @@ Launching Processes In case a process that is marked as "essential" for the startup fails to start, the launch manager shall stop the further processing of its config and stop the startup sequence. - + .. feat_req:: Error reaction on essential process failure :id: feat_req__lifecycle__error_reaction_config :reqtype: Functional @@ -126,14 +126,14 @@ Launching Processes :status: invalid The launch manager shall support to configure the error reaction in case an "essential" process failed to start. Possible error reactions are: - + * System halt - + * System reset - + * Execution of a specifically marked process - + .. feat_req:: Handling process args :id: feat_req__lifecycle__process_launch_args :reqtype: Functional @@ -144,7 +144,7 @@ Launching Processes The launch manager shall provide support for launching a process with a given set of arguments. - + .. feat_req:: Launching process in debug mode :id: feat_req__lifecycle__debug_support :reqtype: Functional @@ -155,7 +155,7 @@ Launching Processes The launch manager shall provide support for launching process with a given set of debug arguments in debug mode. - + .. feat_req:: Launching process in HELD state :id: feat_req__lifecycle__support_held_state :reqtype: Functional @@ -166,7 +166,7 @@ Launching Processes The launch manager shall provide support for launching a process in a HELD state. - + .. feat_req:: Process user, group ids support :id: feat_req__lifecycle__uid_gid_support :reqtype: Functional @@ -177,7 +177,7 @@ Launching Processes The launch manager shall provide support for launching a process with a given UID(/GID (/user\_name.Unique identifier)Group Identifier) - + .. feat_req:: Conditional launch total wait time :id: feat_req__lifecycle__total_wait_time_support :reqtype: Functional @@ -188,7 +188,7 @@ Launching Processes The launch manager shall provide support for per condition configurable total wait time for launch conditions to be satisfied. - + .. feat_req:: Conditional launch polling interval :id: feat_req__lifecycle__polling_interval :reqtype: Functional @@ -199,7 +199,7 @@ Launching Processes The launch manager shall provide support for per condition configurable polling interval for launch conditions to be checked. - + .. feat_req:: Process priority support :id: feat_req__lifecycle__launch_priority_support :reqtype: Functional @@ -210,7 +210,7 @@ Launching Processes The launch manager shall provide support for launching a process with a given priority. - + .. feat_req:: cwd support :id: feat_req__lifecycle__cwd_support :reqtype: Functional @@ -221,7 +221,7 @@ Launching Processes The launch manager shall provide support for launching a process with a given working directory. - + .. feat_req:: launching terminal :id: feat_req__lifecycle__terminal_support :reqtype: Functional @@ -232,7 +232,7 @@ Launching Processes The launch manager shall provide support for launching a terminal or a session leader. - + .. feat_req:: std handle redirection :id: feat_req__lifecycle__std_handle_redir :reqtype: Functional @@ -243,7 +243,7 @@ Launching Processes The launch manager shall provide support for stdin, stdout, stderr redirection. - + .. feat_req:: builtin commands :id: feat_req__lifecycle__builtin_command_support :reqtype: Functional @@ -254,7 +254,7 @@ Launching Processes The launch manager shall provide support for builtin commands. - + .. feat_req:: Non-root support :id: feat_req__lifecycle__secpol_non_root :reqtype: Functional @@ -265,7 +265,7 @@ Launching Processes The launch manager shall provide support to be started with security policy as non-root. - + .. feat_req:: Configurable amount of retries :id: feat_req__lifecycle__retries_configurable :reqtype: Functional @@ -276,7 +276,7 @@ Launching Processes The Launch Manager shall support a configurable amount of retries in case error occurs during startup of a component (e.g. file not available) occurs. - + .. feat_req:: procmgr ability support :id: feat_req__lifecycle__procmgr_support :reqtype: Functional @@ -287,7 +287,7 @@ Launching Processes The launch manager shall provide support for launching processes with configured procmgr abilities. - + .. feat_req:: file descriptor inheritance support :id: feat_req__lifecycle__fd_inheritance :reqtype: Functional @@ -298,7 +298,7 @@ Launching Processes The launch manager shall provide support for launching a process with given file descriptor inheritance restrictions. - + .. feat_req:: security policy support :id: feat_req__lifecycle__support_secpol_type :reqtype: Functional @@ -309,7 +309,7 @@ Launching Processes The launch manager shall provide support for launching a process with a given security policy. - + .. feat_req:: supplementary group support :id: feat_req__lifecycle__supplementary_groups :reqtype: Functional @@ -320,7 +320,7 @@ Launching Processes The launch manager shall provide support for launching a process with a given set of supplementary groups. - + .. feat_req:: Scheduling support :id: feat_req__lifecycle__scheduling_policy :reqtype: Functional @@ -331,7 +331,7 @@ Launching Processes The launch manager shall provide support for launching a process with certain scheduling policy. - + .. feat_req:: CPU runmask support :id: feat_req__lifecycle__runmask_support :reqtype: Functional @@ -342,7 +342,7 @@ Launching Processes The launch manager shall provide support for launching a process with a given runmask. - + .. feat_req:: ASLR support :id: feat_req__lifecycle__aslr_support :reqtype: Functional @@ -353,7 +353,7 @@ Launching Processes The launch manager shall provide support for launching process with ASLR (Address Space Layout Randomization). - + .. feat_req:: ressource limit support :id: feat_req__lifecycle__process_rlimit_support :reqtype: Functional @@ -364,7 +364,7 @@ Launching Processes The launch manager shall provide support for launching a process with a given set of system resource limits (rlimit). - + .. feat_req:: process detach from parent support :id: feat_req__lifecycle__detach_parent_process :reqtype: Functional @@ -375,7 +375,7 @@ Launching Processes The launch manager shall provide support for launching a process to detach from parent. - + .. feat_req:: Critical process support :id: feat_req__lifecycle__critical_processes :reqtype: Functional @@ -386,7 +386,7 @@ Launching Processes The launch manager shall provide support for launching a process as a critical process. - + .. feat_req:: Process adoption :id: feat_req__lifecycle__running_processes :reqtype: Functional @@ -397,7 +397,7 @@ Launching Processes The launch manager shall adopt already running processes. - + .. feat_req:: Dropping process responsibility :id: feat_req__lifecycle__drop_supervsion :reqtype: Functional @@ -408,7 +408,7 @@ Launching Processes The launch manager shall provide support to dropping all surveillance and failure reaction activities of processes. - + .. feat_req:: Multiple instance of executable :id: feat_req__lifecycle__multi_start_support :reqtype: Functional @@ -419,7 +419,7 @@ Launching Processes The Launch Manager shall permit an executable to be launched more than once. - + .. feat_req:: Pre-start validation :id: feat_req__lifecycle__validate_conditions :reqtype: Functional @@ -430,7 +430,7 @@ Launching Processes The Launch Manager shall be able to validate the pre-start conditions of the executable using the conditions. - + .. feat_req:: post-start validation :id: feat_req__lifecycle__validation_conditions :reqtype: Functional @@ -441,7 +441,7 @@ Launching Processes The Launch Manager shall be able to validate the start of the executable using the conditions. - + .. feat_req:: Managing an externally started process :id: feat_req__lifecycle__process_ownership :reqtype: Functional @@ -452,7 +452,7 @@ Launching Processes The Launch Manager shall be able to own an externally started process. - + .. feat_req:: Invalid dependency :id: feat_req__lifecycle__consistent_dependencies :reqtype: Functional @@ -463,7 +463,7 @@ Launching Processes The Launch Manager shall reject an inconsistent definition of set of executables dependencies. - + .. feat_req:: Dangling dependency :id: feat_req__lifecycle__stop_process_dependents :reqtype: Functional @@ -474,7 +474,7 @@ Launching Processes The Launch Manager shall be able to stop a process when all it's dependents are stopped if specified in the set of executables. - + .. feat_req:: Coordination stop dependency :id: feat_req__lifecycle__stop_order_spec :reqtype: Functional @@ -485,7 +485,16 @@ Launching Processes The Launch Manager shall permit the stop order of non-dependent processes to be specified. - +.. feat_req:: OCI ompliant + :id feat_req_oci_compliant + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__overall_goals__enable_cooperation + + The Launch Manager shall be complient to the `OCI Specfication v1.2.0 < https://github.com/opencontainers/runtime-spec/releases/tag/v1.2.0>` + + Groups ...... @@ -499,7 +508,7 @@ Groups The Launch Manager shall permit to represent a set of executables as a named group. - + .. feat_req:: Launching group :id: feat_req__lifecycle__start_named_group_exe :reqtype: Functional @@ -510,7 +519,7 @@ Groups The Launch Manager shall be able to start a named group of executables. - + .. feat_req:: Stopping group :id: feat_req__lifecycle__stop_group_executables :reqtype: Functional @@ -521,7 +530,7 @@ Groups The Launch Manager shall be able to stop a named group of executables. - + .. feat_req:: start group launch :id: feat_req__lifecycle__launcher_start_group :reqtype: Functional @@ -532,7 +541,7 @@ Groups The Launch Manager shall be able to start a named group when the launcher is started. - + .. feat_req:: Process state :id: feat_req__lifecycle__process_state_comm :reqtype: Functional @@ -543,7 +552,7 @@ Groups The Launch Manager shall have a means for the launched processes to communicate a state, which represents the launched processes' internal state, to the launcher. - + Terminating Processes --------------------- @@ -557,7 +566,7 @@ Terminating Processes The launch manager shall provide support for configurable timeout interval to wait for the process to be stopped. - + .. feat_req:: Terminating process :id: feat_req__lifecycle__process_termination :reqtype: Functional @@ -568,7 +577,7 @@ Terminating Processes The launch manager shall provide support for terminating processes. - + .. feat_req:: Handling process dependency in termination :id: feat_req__lifecycle__terminationn_dependency :reqtype: Functional @@ -579,7 +588,7 @@ Terminating Processes The launch manager shall terminate the processes based on the dependency order. - + .. feat_req:: Configurable delay between SIGTERM and SIGKILL :id: feat_req__lifecycle__time_to_wait_config :reqtype: Functional @@ -590,7 +599,7 @@ Terminating Processes The time to wait, before SIGKILL is sent shall be configurable. In case "0" is stated, the SIGKILL shall be sent immediatelly. - + .. feat_req:: normal shutdown :id: feat_req__lifecycle__launch_manager_shutdown :reqtype: Functional @@ -601,7 +610,7 @@ Terminating Processes The launch manager shall support normal shutdown by terminating all process in the dependency order. - + .. feat_req:: slow shutdown :id: feat_req__lifecycle__slow_shutdown_support :reqtype: Functional @@ -612,7 +621,7 @@ Terminating Processes The launch manager shall support slow shutdown by terminating the processes in the dependency order. - + .. feat_req:: fast shutdown :id: feat_req__lifecycle__fast_shutdown_support :reqtype: Functional @@ -623,7 +632,7 @@ Terminating Processes The launch manager shall support fast shutdown by terminating itself without affecting the started processes. - + .. feat_req:: Launch Manager shutdown :id: feat_req__lifecycle__launcher_exit_shutdown :reqtype: Functional @@ -634,7 +643,7 @@ Terminating Processes The Launch Manager shall exit after performing shutdown operation by stopping all the processes it owns in the dependency order when requested. - + .. feat_req:: Configurable delay between SIGTERM and SIGKILL :id: feat_req__lifecycle__shutdown_signal :reqtype: Functional @@ -643,9 +652,9 @@ Terminating Processes :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall implement a shutdown by sending a SIGTERM to the process. In case the process does not terminate itself, a SIGKILL shall be sent. + The launch manager shall implement a shutdown by sending a SIGTERM to the process. In case the process does not terminate itself, a SIGKILL shall be sent. + - Control Interface ----------------- @@ -659,7 +668,7 @@ Control Interface The launch manager shall provide support for commands to control component states. - + .. feat_req:: query commands :id: feat_req__lifecycle__query_commands :reqtype: Functional @@ -670,7 +679,7 @@ Control Interface The launch manager shall provide support for commands to query component states. - + .. feat_req:: Report "started/running/degraded" :id: feat_req__lifecycle__controlif_status :reqtype: Functional @@ -683,7 +692,7 @@ Control Interface Note: status can be "started/running/degraded" - refer to documentation for details - + .. feat_req:: request group launch :id: feat_req__lifecycle__request_group_launch :reqtype: Functional @@ -694,7 +703,7 @@ Control Interface The Launch Manager shall be able to start a named group respecting the dependencies when requested. - + .. feat_req:: request group stop :id: feat_req__lifecycle__request_group_stop :reqtype: Functional @@ -705,7 +714,7 @@ Control Interface The Launch Manager shall be able to stop a named group respecting the dependencies when requested. - + .. feat_req:: request group restart :id: feat_req__lifecycle__request_group_restart :reqtype: Functional @@ -716,7 +725,7 @@ Control Interface The Launch Manager shall be able to restart a named group respecting the dependencies when requested. - + Monitoring, Notification and Recovery ------------------------------------- @@ -730,7 +739,7 @@ Monitoring, Notification and Recovery The launch manager shall provide support for monitoring abnormal termination of processes. - + .. feat_req:: process state notification :id: feat_req__lifecycle__ext_monitor_notify :reqtype: Functional @@ -741,7 +750,7 @@ Monitoring, Notification and Recovery The launch manager shall provide support for external monitors to get notified on process life status. - + .. feat_req:: recovery action :id: feat_req__lifecycle__recovery_action_support :reqtype: Functional @@ -752,7 +761,7 @@ Monitoring, Notification and Recovery The launch manager shall support recovery action for the abnormally terminated processes. - + .. feat_req:: Restart of named group as recovery action :id: feat_req__lifecycle__recover_group :reqtype: Functional @@ -763,7 +772,7 @@ Monitoring, Notification and Recovery The launch manager shall support a restart of a named group as recovery method in case a single process out of that group terminated abnormally or lost its liveliness. - + .. feat_req:: Monitoring and recovery: watchdog support :id: feat_req__lifecycle__smart_watchdog_config :reqtype: Functional @@ -774,7 +783,7 @@ Monitoring, Notification and Recovery The launch manager shall support smart watchdog, configurable per process. - + .. feat_req:: Monitoring and recovery: recovery wait time :id: feat_req__lifecycle__configurable_wait_time :reqtype: Functional @@ -785,7 +794,7 @@ Monitoring, Notification and Recovery The launch manager shall provide support for configurable wait time that shall elapse before repeating recovery action. - + .. feat_req:: Monitoring and recovery: adopted process monitoring :id: feat_req__lifecycle__monitoring_processes :reqtype: Functional @@ -796,7 +805,7 @@ Monitoring, Notification and Recovery The launch manager shall provide support for monitoring adopted processes. - + .. feat_req:: process launch monitoring :id: feat_req__lifecycle__failure_detect :reqtype: Functional @@ -807,7 +816,7 @@ Monitoring, Notification and Recovery The Launch Manager shall be able to detect and react to failure of the process launch. - + .. feat_req:: Process liveliness detection :id: feat_req__lifecycle__liveliness_detection :reqtype: Functional @@ -818,7 +827,7 @@ Monitoring, Notification and Recovery The Launch Manager shall be able to detect and react to loss of liveliness of the processes it owns. - + .. feat_req:: process monitoring :id: feat_req__lifecycle__process_monitoring :reqtype: Functional @@ -829,7 +838,7 @@ Monitoring, Notification and Recovery The Launch Manager shall monitor the state of the processes as specified by the set of executables. - + .. feat_req:: Recovery :id: feat_req__lifecycle__process_failure_react :reqtype: Functional @@ -840,7 +849,7 @@ Monitoring, Notification and Recovery The Launch Manager shall be able to react to a process failure by optionally performing one of relaunching the process, stopping the process, stopping the process and starting another process, or triggering QOS) Device Safe State (DSS).QNX Operating System ( - + .. feat_req:: Multi-instance :id: feat_req__lifecycle__multi_instance_support :reqtype: Functional @@ -861,7 +870,7 @@ Monitoring, Notification and Recovery :status: invalid The launch manager shall implement time based cyclical monitoring of itself. - + .. feat_req:: Launch manager external watchdog notification :id: feat_req__lifecycle__lm_ext_watchdog_notify :reqtype: Functional @@ -905,7 +914,7 @@ Logging The launch manager shall support slog2 and a logging file as logging destinations. - + .. feat_req:: Logging state transitions :id: feat_req__lifecycle__process_logging_support :reqtype: Functional @@ -916,7 +925,7 @@ Logging The launch manager shall provide support for logging process launches, processes exit/recovery, internal tasks, and interaction with external monitor. - + .. feat_req:: Logging timestamp :id: feat_req__lifecycle__log_timestamp :reqtype: Functional @@ -927,7 +936,7 @@ Logging The launch manager logs shall contain timestamp information. - + .. feat_req:: Logging DAG :id: feat_req__lifecycle__dag_logging_controlif :reqtype: Functional @@ -938,7 +947,7 @@ Logging The launch manager shall provide the possibility to log the DAG in an human readable format, triggered via control interface. - + .. feat_req:: Configuration dependency view :id: feat_req__lifecycle__dependency_visu :reqtype: Functional @@ -962,7 +971,17 @@ Configuration file The launch manager shall provide modular configuration file support to configure process attributes. - +.. feat_req:: Runtime configuration compliance + :id: feat_req__lifecycle__modular_config_support + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__execution_model__processes + :status: invalid + + The launch manager shall provide modular configuration files support for configurations coming from `OCI runtime configuration<https://github.com/opencontainers/runtime-spec/blob/v1.2.0/config.md>`. + + .. feat_req:: Updating configuration :id: feat_req__lifecycle__session_extension :reqtype: Functional @@ -973,7 +992,7 @@ Configuration file The launch manager shall provide support for extending already running session with additional new configuration file. - + .. feat_req:: Module support :id: feat_req__lifecycle__clustering_modules_supp :reqtype: Functional @@ -984,7 +1003,7 @@ Configuration file The launch manager shall provide support to clustering set of components as modules. - + .. feat_req:: global process properties :id: feat_req__lifecycle__central_default_defines :reqtype: Functional @@ -995,7 +1014,7 @@ Configuration file The Launch Manager shall be able to centrally define defaults for specific properties for the set of executables. - + .. feat_req:: Lazy check of configured commands :id: feat_req__lifecycle__lazy_check :reqtype: Functional @@ -1006,7 +1025,7 @@ Configuration file The Launch Manager shall check availability of executables in the filesystem only when the executable shall required to be executed. - + .. feat_req:: Configuration Dependency view :id: feat_req__lifecycle__deps_visualization :reqtype: Functional @@ -1017,7 +1036,7 @@ Configuration file The Launch Manager shall have the means to generate the specified dependencies in a format that can be visualized. - + .. feat_req:: Configuration Verification tool :id: feat_req__lifecycle__offline_config_valid :reqtype: Functional @@ -1028,7 +1047,7 @@ Configuration file The Launch Manager shall have a means to validate the configuration offline. - + Condition Check --------------- @@ -1042,7 +1061,7 @@ Condition Check The Launch Manager shall provide a way to store the status of the launched process. - + .. feat_req:: Condition check based on status :id: feat_req__lifecycle__condition_check_method :reqtype: Functional @@ -1053,7 +1072,7 @@ Condition Check The Launch Manager shall provide a method for condition check based on process state. - + .. feat_req:: Configuration of action based on condition evaluation :id: feat_req__lifecycle__config_actions_cond :reqtype: Functional @@ -1064,7 +1083,7 @@ Condition Check The Launch Manager shall provide a way to configure actions based on condition evaluation i.e. to be able to configure SUCCESS and FAILURE case. - + .. feat_req:: Condition check based on path :id: feat_req__lifecycle__path_condition_check :reqtype: Functional @@ -1075,7 +1094,7 @@ Condition Check The Launch Manager shall provide a method for condition check for a path. - + .. feat_req:: Condition check based on ENV :id: feat_req__lifecycle__env_variable_cond_check :reqtype: Functional @@ -1086,7 +1105,7 @@ Condition Check The Launch Manager shall provide a method for condition check for environment variable. - + .. feat_req:: Condition check based on all dependency :id: feat_req__lifecycle__dependency_check :reqtype: Functional @@ -1097,7 +1116,7 @@ Condition Check The Launch Manager shall provide a method to check if all dependency has been executed. - + .. feat_req:: Condition check based on at least one dependency :id: feat_req__lifecycle__check_dependency_exec :reqtype: Functional @@ -1108,7 +1127,7 @@ Condition Check The Launch Manager shall provide a method to check if at least one dependency has been executed. - + .. feat_req:: Condition check for each SWC its dependencies :id: feat_req__lifecycle__define_swc_dependencies :reqtype: Functional @@ -1119,7 +1138,7 @@ Condition Check The Launch Manager shall provide a way to define for each SWC), its dependencies.Software Components ( - + .. feat_req:: Condition check for each SWC its stop sequence :id: feat_req__lifecycle__stop_sequence :reqtype: Functional @@ -1129,5 +1148,3 @@ Condition Check :status: invalid The Launch Manager shall provide a way to define the stop sequence for each Software Components (SWC). - - From 0437f347a3d2bd89f188d50dd51aa9bb5d674474 Mon Sep 17 00:00:00 2001 From: FScholPer <frank.scholter_peres@mercedes-benz.com> Date: Tue, 1 Jul 2025 09:38:35 +0200 Subject: [PATCH 064/109] doc: fixed build issues (#1270) --- docs/features/lifecycle/requirements/index.rst | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/features/lifecycle/requirements/index.rst b/docs/features/lifecycle/requirements/index.rst index 2691e5503e..9e28cb1e6a 100644 --- a/docs/features/lifecycle/requirements/index.rst +++ b/docs/features/lifecycle/requirements/index.rst @@ -486,10 +486,11 @@ Launching Processes The Launch Manager shall permit the stop order of non-dependent processes to be specified. .. feat_req:: OCI ompliant - :id feat_req_oci_compliant + :id: feat_req_oci_compliant :reqtype: Functional :security: NO - :safety: ASIL_B + :safety: ASIL_D + :status: invalid :satisfies: stkh_req__overall_goals__enable_cooperation The Launch Manager shall be complient to the `OCI Specfication v1.2.0 < https://github.com/opencontainers/runtime-spec/releases/tag/v1.2.0>` @@ -972,10 +973,10 @@ Configuration file The launch manager shall provide modular configuration file support to configure process attributes. .. feat_req:: Runtime configuration compliance - :id: feat_req__lifecycle__modular_config_support + :id: feat_req__lifecycle__modular_config_support_oci :reqtype: Functional :security: NO - :safety: ASIL_B + :safety: ASIL_D :satisfies: stkh_req__execution_model__processes :status: invalid From ff39b5b7845646215b9fe318b3a15a17f457a785 Mon Sep 17 00:00:00 2001 From: FScholPer <frank.scholter_peres@mercedes-benz.com> Date: Tue, 1 Jul 2025 09:55:51 +0200 Subject: [PATCH 065/109] doc: fixed build issues (#1270) --- docs/features/lifecycle/requirements/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/features/lifecycle/requirements/index.rst b/docs/features/lifecycle/requirements/index.rst index 9e28cb1e6a..dfcda62af3 100644 --- a/docs/features/lifecycle/requirements/index.rst +++ b/docs/features/lifecycle/requirements/index.rst @@ -486,7 +486,7 @@ Launching Processes The Launch Manager shall permit the stop order of non-dependent processes to be specified. .. feat_req:: OCI ompliant - :id: feat_req_oci_compliant + :id: feat_req__lifecycle__oci_compliant :reqtype: Functional :security: NO :safety: ASIL_D @@ -973,7 +973,7 @@ Configuration file The launch manager shall provide modular configuration file support to configure process attributes. .. feat_req:: Runtime configuration compliance - :id: feat_req__lifecycle__modular_config_support_oci + :id: feat_req__lifecycle__config_support_oci :reqtype: Functional :security: NO :safety: ASIL_D From 17bc7cbfadee44a474024220c528d4cf49a48a2f Mon Sep 17 00:00:00 2001 From: vinod reddy gopi reddy <vinodreddy.gopireddy@qorix.ai> Date: Wed, 2 Jul 2025 08:59:11 +0200 Subject: [PATCH 066/109] arch: add interfaces in sphinx needs --- .../application_health_monitor.rst | 141 ++++++++++++++++++ 1 file changed, 141 insertions(+) diff --git a/docs/features/lifecycle/architecture/application_health_monitor.rst b/docs/features/lifecycle/architecture/application_health_monitor.rst index c8631c63d3..6124f68b03 100644 --- a/docs/features/lifecycle/architecture/application_health_monitor.rst +++ b/docs/features/lifecycle/architecture/application_health_monitor.rst @@ -45,6 +45,147 @@ Static Architecture :fulfils: feat_req__com__interfaces +.. logic_arc_int:: Deadline Monitor API + :id: logic_arc_int__lifecycle__deadline_monitor_if + :security: YES + :safety: ASIL_B + :status: valid + :fulfils: feat_req__com__interfaces + + + +.. logic_arc_int_op:: configure_minimum_time + :id: logic_arc_int_op__lifecycle__min_time + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__health_monitor_if + +.. logic_arc_int_op:: configure_maximum_time + :id: logic_arc_int_op__lifecycle__max_time + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__deadline_monitor_if + +.. logic_arc_int_op:: link_condition + :id: logic_arc_int_op__lifecycle__link_cond + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__deadline_monitor_if + +.. logic_arc_int_op:: mark_start + :id: logic_arc_int_op__lifecycle__start + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__deadline_monitor_if + +.. logic_arc_int_op:: mark_end + :id: logic_arc_int_op__lifecycle__end + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__deadline_monitor_if + +.. logic_arc_int_op:: on_timer_expiry + :id: logic_arc_int_op__lifecycle__timer_expiry + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__deadline_monitor_if + +.. logic_arc_int_op:: enable_monitoring + :id: logic_arc_int_op__lifecycle__enable_mon + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__deadline_monitor_if + +.. logic_arc_int_op:: disable_monitoring + :id: logic_arc_int_op__lifecycle__disable_mon + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__deadline_monitor_if + +.. logic_arc_int_op:: check_configuration + :id: logic_arc_int_op__lifecycle__check_cfg + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__deadline_monitor_if + + + +.. logic_arc_int:: Logical Monitor API + :id: logic_arc_int__lifecycle__logical_monitor_if + :security: YES + :safety: ASIL_B + :status: valid + :fulfils: feat_req__com__interfaces + + + +.. logic_arc_int_op:: add_entry_point + :id: logic_arc_int_op__lifecycle__entry_point + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__logical_monitor_if + +.. logic_arc_int_op:: add_exit_point + :id: logic_arc_int_op__lifecycle__exit_point + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__logical_monitor_if + +.. logic_arc_int_op:: add_allowed_transition + :id: logic_arc_int_op__lifecycle__allowed_trans + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__logical_monitor_if + +.. logic_arc_int_op:: link_condition + :id: logic_arc_int_op__lifecycle__link_cond + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__logical_monitor_if + +.. logic_arc_int_op:: record_checkpoint + :id: logic_arc_int_op__lifecycle__rec_checkpoint + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__logical_monitor_if + +.. logic_arc_int_op:: enable + :id: logic_arc_int_op__lifecycle__enable + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__logical_monitor_if + +.. logic_arc_int_op:: disable + :id: logic_arc_int_op__lifecycle__disable + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__logical_monitor_if + +.. logic_arc_int_op:: verify + :id: logic_arc_int_op__lifecycle__verify + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__logical_monitor_if + + + Dynamic Architecture ==================== From 0ae2dbc57fae7c950e3487d6f2149eef9b50a57d Mon Sep 17 00:00:00 2001 From: vinod reddy gopi reddy <vinodreddy.gopireddy@qorix.ai> Date: Mon, 14 Jul 2025 12:13:52 +0200 Subject: [PATCH 067/109] impl: rebase and fix interfaces --- .../application_health_monitor.rst | 141 ------------------ docs/features/lifecycle/index.rst | 114 +++++++++++++- 2 files changed, 111 insertions(+), 144 deletions(-) diff --git a/docs/features/lifecycle/architecture/application_health_monitor.rst b/docs/features/lifecycle/architecture/application_health_monitor.rst index 6124f68b03..c8631c63d3 100644 --- a/docs/features/lifecycle/architecture/application_health_monitor.rst +++ b/docs/features/lifecycle/architecture/application_health_monitor.rst @@ -45,147 +45,6 @@ Static Architecture :fulfils: feat_req__com__interfaces -.. logic_arc_int:: Deadline Monitor API - :id: logic_arc_int__lifecycle__deadline_monitor_if - :security: YES - :safety: ASIL_B - :status: valid - :fulfils: feat_req__com__interfaces - - - -.. logic_arc_int_op:: configure_minimum_time - :id: logic_arc_int_op__lifecycle__min_time - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__health_monitor_if - -.. logic_arc_int_op:: configure_maximum_time - :id: logic_arc_int_op__lifecycle__max_time - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__deadline_monitor_if - -.. logic_arc_int_op:: link_condition - :id: logic_arc_int_op__lifecycle__link_cond - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__deadline_monitor_if - -.. logic_arc_int_op:: mark_start - :id: logic_arc_int_op__lifecycle__start - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__deadline_monitor_if - -.. logic_arc_int_op:: mark_end - :id: logic_arc_int_op__lifecycle__end - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__deadline_monitor_if - -.. logic_arc_int_op:: on_timer_expiry - :id: logic_arc_int_op__lifecycle__timer_expiry - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__deadline_monitor_if - -.. logic_arc_int_op:: enable_monitoring - :id: logic_arc_int_op__lifecycle__enable_mon - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__deadline_monitor_if - -.. logic_arc_int_op:: disable_monitoring - :id: logic_arc_int_op__lifecycle__disable_mon - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__deadline_monitor_if - -.. logic_arc_int_op:: check_configuration - :id: logic_arc_int_op__lifecycle__check_cfg - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__deadline_monitor_if - - - -.. logic_arc_int:: Logical Monitor API - :id: logic_arc_int__lifecycle__logical_monitor_if - :security: YES - :safety: ASIL_B - :status: valid - :fulfils: feat_req__com__interfaces - - - -.. logic_arc_int_op:: add_entry_point - :id: logic_arc_int_op__lifecycle__entry_point - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__logical_monitor_if - -.. logic_arc_int_op:: add_exit_point - :id: logic_arc_int_op__lifecycle__exit_point - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__logical_monitor_if - -.. logic_arc_int_op:: add_allowed_transition - :id: logic_arc_int_op__lifecycle__allowed_trans - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__logical_monitor_if - -.. logic_arc_int_op:: link_condition - :id: logic_arc_int_op__lifecycle__link_cond - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__logical_monitor_if - -.. logic_arc_int_op:: record_checkpoint - :id: logic_arc_int_op__lifecycle__rec_checkpoint - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__logical_monitor_if - -.. logic_arc_int_op:: enable - :id: logic_arc_int_op__lifecycle__enable - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__logical_monitor_if - -.. logic_arc_int_op:: disable - :id: logic_arc_int_op__lifecycle__disable - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__logical_monitor_if - -.. logic_arc_int_op:: verify - :id: logic_arc_int_op__lifecycle__verify - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__logical_monitor_if - - - Dynamic Architecture ==================== diff --git a/docs/features/lifecycle/index.rst b/docs/features/lifecycle/index.rst index aeca2bb4d4..db99e25265 100644 --- a/docs/features/lifecycle/index.rst +++ b/docs/features/lifecycle/index.rst @@ -54,7 +54,62 @@ flash mode etc. Rationale --------- -Main task of the lifecycle system is to start and stop components with an `OCI` compliant runtime enviroment `<https://github.com/opencontainers/runtime-spec>`_ depending on the overall state the +Main task of the lifecycle system is to start and stop :term:`processes` depending on the +overall state the user wants to achieve and the functional dependencies between +the :term:`processes`. + +:term:`Lifecycle Component` can be very simple like a single process or more complex like a set of processes +which are started in a certain order and with certain dependencies between them or containers. + +We call a state of the system an :term:`Operating Mode`, which is defined via the +:term:`Lifecycle Component` running on the system at a certain point in time. +A lifecycle component is a configuration unit, which describes the executable, which shall be executed +and the :term:`sandbox` the platform has to provide to run this executable. + +E.g. the :term:`sandbox` shall describe + +- environment variables, which shall be set via the lifecycle system +- secpol policies on QNX, which shall be applied to the process +- cgroup configurations on Linux, which shall be applied to the process +- user and group IDs under which the process shall be started +- ... + + + +Via the configuration we define a certain operting mode and add all the components, which are needed to +realize this operating mode as dependencies. + + +A second task of the lifecycle system is to supervise the aliveness of the :term:`processes`, +which are started and to initiate appropriate actions in case of a failure, which +might result in many cases in a change of the :term:`Operating Mode`. + + +The Lifecycle feature addresses the following stakeholder requirements: + +• :need:`stkh_req__execution_model__processes`: Comprehensive process lifecycle management + including startup, shutdown, recovery, and cross-process synchronization of threads + +• :need:`stkh_req__functional_req__file_based`: Modular configuration file support allowing changes + without rebuilding software, enabling flexible system setup and module management + +• :need:`stkh_req__dependability__safety_features`: Implementation of monitoring safety mechanisms + +A second task of the lifecycle system is to supervise the aliveness of the processes, which are started +and to initiate appropriate actions in case of a failure, which might result in many cases in +a change of the operting mode. + +Support of containers +===================== + +A :term:`Sandbox` can e.g. realized as a container, which is a lightweight, standalone executable +package that includes everything needed to run a piece of software, +including the code, runtime, libraries, and system tools. +In the context of the S-SCORE platform, container can be used to encapsulate applications and their dependencies, +ensuring consistent execution across different environments. + +Main task of the lifecycle system is to start and stop components with an OCI compliant runtime +environment `<https://github.com/opencontainers/runtime-spec>`__ depending on the overall state the user wants to achieve and the functional dependencies between the processes. A `container` is a lightweight, standalone executable package that includes everything needed to run a piece of software, @@ -108,6 +163,55 @@ Specification {{ draw_feature(need(), needs) }} + + +The overall functionality of the feature can be split into 2 subfeatures, which are +closely coupled to each other: + +* **Lifecycle Management**: This subfeature is responsible for the management of + the lifecycle of a :term:`Lifecycle Component`, including starting and stopping :term:`processes`, + managing their dependencies, and handling different operating modes. + +* **Health Monitoring**: Provides platform functionality to monitor certain health + conditions of applications: + + * Alive Monitoring + * Deadline Monitoring + * Logical Programflow Monitoring + + + +Architecture +============ + +The concept is based on 2 major components: + +* **:term:`Launch Manager`**: Responsible for starting and stopping components based on + the defined operating modes and alive supervision of the started components + +* **:term:`Health Monitor`**: Provides process local monitoring functionalities such as + deadline monitoring and logical program flow monitoring + + + + + + + + +Requirements +============ + +.. toctree:: + :maxdepth: 1 + :glob: + + requirements/* + +Modules +======= + + .. mod_view_sta:: Lifecycle :id: mod_view_sta__lifecycle__1 :includes: comp_arc_sta__lifecycle__launch_manager, comp_arc_sta__lifecycle__healthmonitor @@ -229,11 +333,15 @@ How to Teach This Rejected Ideas --------------- +============== + +TBD Open Issues ------------ +=========== + +TBD Footnotes From 82040ee809c41a1dbffd25a897d8a926a61722fb Mon Sep 17 00:00:00 2001 From: vinod reddy gopi reddy <vinodreddy.gopireddy@qorix.ai> Date: Wed, 2 Jul 2025 08:59:11 +0200 Subject: [PATCH 068/109] arch: add interfaces in sphinx needs --- .../application_health_monitor.rst | 141 ++++++++++++++++++ 1 file changed, 141 insertions(+) diff --git a/docs/features/lifecycle/architecture/application_health_monitor.rst b/docs/features/lifecycle/architecture/application_health_monitor.rst index c8631c63d3..6124f68b03 100644 --- a/docs/features/lifecycle/architecture/application_health_monitor.rst +++ b/docs/features/lifecycle/architecture/application_health_monitor.rst @@ -45,6 +45,147 @@ Static Architecture :fulfils: feat_req__com__interfaces +.. logic_arc_int:: Deadline Monitor API + :id: logic_arc_int__lifecycle__deadline_monitor_if + :security: YES + :safety: ASIL_B + :status: valid + :fulfils: feat_req__com__interfaces + + + +.. logic_arc_int_op:: configure_minimum_time + :id: logic_arc_int_op__lifecycle__min_time + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__health_monitor_if + +.. logic_arc_int_op:: configure_maximum_time + :id: logic_arc_int_op__lifecycle__max_time + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__deadline_monitor_if + +.. logic_arc_int_op:: link_condition + :id: logic_arc_int_op__lifecycle__link_cond + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__deadline_monitor_if + +.. logic_arc_int_op:: mark_start + :id: logic_arc_int_op__lifecycle__start + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__deadline_monitor_if + +.. logic_arc_int_op:: mark_end + :id: logic_arc_int_op__lifecycle__end + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__deadline_monitor_if + +.. logic_arc_int_op:: on_timer_expiry + :id: logic_arc_int_op__lifecycle__timer_expiry + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__deadline_monitor_if + +.. logic_arc_int_op:: enable_monitoring + :id: logic_arc_int_op__lifecycle__enable_mon + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__deadline_monitor_if + +.. logic_arc_int_op:: disable_monitoring + :id: logic_arc_int_op__lifecycle__disable_mon + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__deadline_monitor_if + +.. logic_arc_int_op:: check_configuration + :id: logic_arc_int_op__lifecycle__check_cfg + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__deadline_monitor_if + + + +.. logic_arc_int:: Logical Monitor API + :id: logic_arc_int__lifecycle__logical_monitor_if + :security: YES + :safety: ASIL_B + :status: valid + :fulfils: feat_req__com__interfaces + + + +.. logic_arc_int_op:: add_entry_point + :id: logic_arc_int_op__lifecycle__entry_point + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__logical_monitor_if + +.. logic_arc_int_op:: add_exit_point + :id: logic_arc_int_op__lifecycle__exit_point + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__logical_monitor_if + +.. logic_arc_int_op:: add_allowed_transition + :id: logic_arc_int_op__lifecycle__allowed_trans + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__logical_monitor_if + +.. logic_arc_int_op:: link_condition + :id: logic_arc_int_op__lifecycle__link_cond + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__logical_monitor_if + +.. logic_arc_int_op:: record_checkpoint + :id: logic_arc_int_op__lifecycle__rec_checkpoint + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__logical_monitor_if + +.. logic_arc_int_op:: enable + :id: logic_arc_int_op__lifecycle__enable + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__logical_monitor_if + +.. logic_arc_int_op:: disable + :id: logic_arc_int_op__lifecycle__disable + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__logical_monitor_if + +.. logic_arc_int_op:: verify + :id: logic_arc_int_op__lifecycle__verify + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__logical_monitor_if + + + Dynamic Architecture ==================== From 5d76f698739f2974a42c148bbe26174b6470c581 Mon Sep 17 00:00:00 2001 From: vinod reddy gopi reddy <vinodreddy.gopireddy@qorix.ai> Date: Mon, 14 Jul 2025 12:13:52 +0200 Subject: [PATCH 069/109] impl: rebase and fix interfaces --- .../application_health_monitor.rst | 141 ------------------ 1 file changed, 141 deletions(-) diff --git a/docs/features/lifecycle/architecture/application_health_monitor.rst b/docs/features/lifecycle/architecture/application_health_monitor.rst index 6124f68b03..c8631c63d3 100644 --- a/docs/features/lifecycle/architecture/application_health_monitor.rst +++ b/docs/features/lifecycle/architecture/application_health_monitor.rst @@ -45,147 +45,6 @@ Static Architecture :fulfils: feat_req__com__interfaces -.. logic_arc_int:: Deadline Monitor API - :id: logic_arc_int__lifecycle__deadline_monitor_if - :security: YES - :safety: ASIL_B - :status: valid - :fulfils: feat_req__com__interfaces - - - -.. logic_arc_int_op:: configure_minimum_time - :id: logic_arc_int_op__lifecycle__min_time - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__health_monitor_if - -.. logic_arc_int_op:: configure_maximum_time - :id: logic_arc_int_op__lifecycle__max_time - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__deadline_monitor_if - -.. logic_arc_int_op:: link_condition - :id: logic_arc_int_op__lifecycle__link_cond - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__deadline_monitor_if - -.. logic_arc_int_op:: mark_start - :id: logic_arc_int_op__lifecycle__start - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__deadline_monitor_if - -.. logic_arc_int_op:: mark_end - :id: logic_arc_int_op__lifecycle__end - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__deadline_monitor_if - -.. logic_arc_int_op:: on_timer_expiry - :id: logic_arc_int_op__lifecycle__timer_expiry - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__deadline_monitor_if - -.. logic_arc_int_op:: enable_monitoring - :id: logic_arc_int_op__lifecycle__enable_mon - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__deadline_monitor_if - -.. logic_arc_int_op:: disable_monitoring - :id: logic_arc_int_op__lifecycle__disable_mon - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__deadline_monitor_if - -.. logic_arc_int_op:: check_configuration - :id: logic_arc_int_op__lifecycle__check_cfg - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__deadline_monitor_if - - - -.. logic_arc_int:: Logical Monitor API - :id: logic_arc_int__lifecycle__logical_monitor_if - :security: YES - :safety: ASIL_B - :status: valid - :fulfils: feat_req__com__interfaces - - - -.. logic_arc_int_op:: add_entry_point - :id: logic_arc_int_op__lifecycle__entry_point - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__logical_monitor_if - -.. logic_arc_int_op:: add_exit_point - :id: logic_arc_int_op__lifecycle__exit_point - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__logical_monitor_if - -.. logic_arc_int_op:: add_allowed_transition - :id: logic_arc_int_op__lifecycle__allowed_trans - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__logical_monitor_if - -.. logic_arc_int_op:: link_condition - :id: logic_arc_int_op__lifecycle__link_cond - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__logical_monitor_if - -.. logic_arc_int_op:: record_checkpoint - :id: logic_arc_int_op__lifecycle__rec_checkpoint - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__logical_monitor_if - -.. logic_arc_int_op:: enable - :id: logic_arc_int_op__lifecycle__enable - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__logical_monitor_if - -.. logic_arc_int_op:: disable - :id: logic_arc_int_op__lifecycle__disable - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__logical_monitor_if - -.. logic_arc_int_op:: verify - :id: logic_arc_int_op__lifecycle__verify - :security: YES - :safety: ASIL_B - :status: valid - :included_by: logic_arc_int__lifecycle__logical_monitor_if - - - Dynamic Architecture ==================== From 80489ccb09f032305daac6ec311c7dc10c1fc1c0 Mon Sep 17 00:00:00 2001 From: Markus Bechter <markus.bechter@bmw.de> Date: Fri, 1 Aug 2025 16:51:41 +0200 Subject: [PATCH 070/109] docs: feature lifecycle --- .../_assets/alive_monitoring_dynamic.puml | 32 + .../control_interface_activate_sequence.puml | 47 + .../control_interface_start_sequence.puml | 28 +- .../control_interface_switch_sequence.puml | 63 ++ .../architecture/_assets/deadline_sup.puml | 54 ++ .../_assets/launch_manager_target_tree.puml | 41 + .../_assets/lifecycle_state_machine.puml | 8 + .../architecture/_assets/logical_sup.puml | 58 ++ .../application_health_monitor.rst | 94 -- .../architecture/configuration_parameters.rst | 60 -- .../architecture/control_interface.rst | 102 --- .../architecture/external_monitoring.rst | 18 +- .../lifecycle/architecture/health_monitor.rst | 305 +++++++ .../lifecycle/architecture/launch_manager.rst | 336 ++++++- .../launch_manager_configuration.rst | 76 ++ docs/features/lifecycle/glossary.rst | 114 +++ docs/features/lifecycle/index.rst | 257 ++---- .../features/lifecycle/requirements/index.rst | 842 ++++++++---------- docs/modules/lifecycle/index.rst | 59 ++ .../os/libc/docs/architecture/index.rst | 2 +- .../docs/architecture/index.rst | 12 + 21 files changed, 1667 insertions(+), 941 deletions(-) create mode 100644 docs/features/lifecycle/architecture/_assets/alive_monitoring_dynamic.puml create mode 100644 docs/features/lifecycle/architecture/_assets/control_interface_activate_sequence.puml create mode 100644 docs/features/lifecycle/architecture/_assets/control_interface_switch_sequence.puml create mode 100644 docs/features/lifecycle/architecture/_assets/deadline_sup.puml create mode 100644 docs/features/lifecycle/architecture/_assets/launch_manager_target_tree.puml create mode 100644 docs/features/lifecycle/architecture/_assets/lifecycle_state_machine.puml create mode 100644 docs/features/lifecycle/architecture/_assets/logical_sup.puml delete mode 100644 docs/features/lifecycle/architecture/application_health_monitor.rst delete mode 100644 docs/features/lifecycle/architecture/configuration_parameters.rst delete mode 100644 docs/features/lifecycle/architecture/control_interface.rst create mode 100644 docs/features/lifecycle/architecture/health_monitor.rst create mode 100644 docs/features/lifecycle/architecture/launch_manager_configuration.rst create mode 100644 docs/features/lifecycle/glossary.rst create mode 100644 docs/modules/lifecycle/index.rst diff --git a/docs/features/lifecycle/architecture/_assets/alive_monitoring_dynamic.puml b/docs/features/lifecycle/architecture/_assets/alive_monitoring_dynamic.puml new file mode 100644 index 0000000000..9a208b0912 --- /dev/null +++ b/docs/features/lifecycle/architecture/_assets/alive_monitoring_dynamic.puml @@ -0,0 +1,32 @@ +@startuml +title Alive Monitoring + +autonumber "<b>[000]" + +participant "Launch Manager" as LM +participant "Application" as App + +activate LM + +LM --> LM: parse configuration +LM --> App: fork +activate App + +App -> LM: Register for alive notifications (callback) +LM --> App: Return value + +note over LM, App: Cyclicly report health state +loop health_status == ok + App --> LM : report_healt_status() +end + +note over LM, App: Trigger Error Reaction +alt health_status != ok + LM --> App: initiate Error Reaction +end + +App -> LM: Return value +deactivate App + +deactivate LM +@enduml diff --git a/docs/features/lifecycle/architecture/_assets/control_interface_activate_sequence.puml b/docs/features/lifecycle/architecture/_assets/control_interface_activate_sequence.puml new file mode 100644 index 0000000000..f2330127d6 --- /dev/null +++ b/docs/features/lifecycle/architecture/_assets/control_interface_activate_sequence.puml @@ -0,0 +1,47 @@ +@startuml +title Control Interface - Activate Run Target + +autonumber "<b>[00]" + +participant "Tester" as Tester +participant "State Manager" as SM +participant "Launch Manager" as LM +participant "OS (kernel)" as kernel +participant "DemoApp1" as DemoApp1 +participant "DemoApp2" as DemoApp2 +participant "NetworkApp" as NetworkApp + +note over SM, LM: Current Run Target: "BasicApps" (DemoApp1 running) +note over SM, LM: Requested Run Target: "DemoGroup" (DemoApp1, DemoApp2) + +Tester -> SM: Activate Run Target "DemoGroup" +SM -> SM: evaluate request +SM -> LM: activate_run_target("DemoGroup") +activate LM + +LM -> LM: analyze current state +note right of LM: Current: BasicApps (DemoApp1)\nTarget: DemoGroup (DemoApp1, DemoApp2)\nAction: Start DemoApp2, keep DemoApp1 + +LM -> LM: validate run target "DemoGroup" +LM -> LM: check dependencies for DemoGroup +LM -> LM: determine transition plan + +alt DemoApp2 needs to be started + LM -> kernel: spawn DemoApp2 + kernel -> DemoApp2: spawn + activate DemoApp2 + kernel --> LM: result of spawning DemoApp2 + + LM -> LM: wait for DemoApp2 ready condition + DemoApp2 -> DemoApp2: initialize and register device /dev/Demo2 + DemoApp2 -> LM: signal ready state via Lifecycle API + kernel --> LM: event /dev/Demo2 registered +end + +LM -> LM: verify all components in "DemoGroup" are running +LM -> LM: update current run target state to "DemoGroup" +LM --> SM: run target "DemoGroup" activated successfully + +note over SM, LM: New Run Target: "DemoGroup" (DemoApp1, DemoApp2 running) + +@enduml diff --git a/docs/features/lifecycle/architecture/_assets/control_interface_start_sequence.puml b/docs/features/lifecycle/architecture/_assets/control_interface_start_sequence.puml index b2cbf3f097..7f9f5d9644 100644 --- a/docs/features/lifecycle/architecture/_assets/control_interface_start_sequence.puml +++ b/docs/features/lifecycle/architecture/_assets/control_interface_start_sequence.puml @@ -1,9 +1,8 @@ @startuml -title Control Interface - Start components +title Control Interface - Activate Run Target (Legacy) autonumber "<b>[00]" - participant "Tester" as Tester participant "State Manager" as SM participant "Launch Manager" as LM @@ -11,22 +10,33 @@ participant "OS (kernel)" as kernel participant "DemoApp1" as DemoApp1 participant "DemoApp2" as DemoApp2 +note over SM, LM: Activating Run Target "DemoTarget" - -Tester -> SM: Start Group (eg. UDS) +Tester -> SM: Activate Run Target "DemoTarget" SM -> SM: evaluate request -SM -> LM: Start group DemoApps +SM -> LM: activate_run_target("DemoTarget") activate LM + +LM -> LM: validate run target exists +LM -> LM: analyze current vs target state +LM -> LM: determine components to start + LM -> kernel: spawn DemoApp1 kernel -> DemoApp1: spawn -kernel --> LM: result of spawning of DemoApp1 +activate DemoApp1 +kernel --> LM: result of spawning DemoApp1 + +LM -> kernel: spawn DemoApp2 kernel -> DemoApp2: spawn activate DemoApp2 -kernel --> LM: result of spawning of DemoApp2 +kernel --> LM: result of spawning DemoApp2 -LM -> LM: wait for DemoApp2 ready status +LM -> LM: wait for run target ready conditions DemoApp2 -> DemoApp2: register device /dev/Demo2 +DemoApp2 -> LM: signal ready via Lifecycle API kernel --> LM: event /dev/Demo2 registered -LM --> SM: DemoApps started + +LM -> LM: verify run target "DemoTarget" fully active +LM --> SM: run target "DemoTarget" activated @enduml diff --git a/docs/features/lifecycle/architecture/_assets/control_interface_switch_sequence.puml b/docs/features/lifecycle/architecture/_assets/control_interface_switch_sequence.puml new file mode 100644 index 0000000000..f12b6717d0 --- /dev/null +++ b/docs/features/lifecycle/architecture/_assets/control_interface_switch_sequence.puml @@ -0,0 +1,63 @@ +@startuml +title Control Interface - Switch Run Target Scenario + +autonumber "<b>[00]" + +participant "Tester" as Tester +participant "State Manager" as SM +participant "Launch Manager" as LM +participant "OS (kernel)" as kernel +participant "DemoApp1" as DemoApp1 +participant "DemoApp2" as DemoApp2 +participant "NetworkApp" as NetworkApp + +note over SM, LM: Current Run Target: "NetworkGroup" (NetworkApp running) +note over SM, LM: Requested Run Target: "DemoGroup" (DemoApp1, DemoApp2) + +Tester -> SM: Activate Run Target "DemoGroup" +SM -> SM: evaluate request +SM -> LM: activate_run_target("DemoGroup") +activate LM + +LM -> LM: analyze transition from "NetworkGroup" to "DemoGroup" +note right of LM: Current: NetworkGroup (NetworkApp)\nTarget: DemoGroup (DemoApp1, DemoApp2)\nAction: Stop NetworkApp, Start DemoApp1 & DemoApp2 + +LM -> LM: validate target run target "DemoGroup" +LM -> LM: check dependencies and resource conflicts +LM -> LM: create transition plan + +== Stop Current Run Target Components == +LM -> NetworkApp: send SIGTERM +NetworkApp -> NetworkApp: cleanup and shutdown +NetworkApp --> LM: shutdown complete via Lifecycle API +LM -> kernel: wait for NetworkApp termination +kernel --> LM: NetworkApp terminated + +== Start Target Run Target Components == +alt Start DemoApp1 + LM -> kernel: spawn DemoApp1 + kernel -> DemoApp1: spawn + activate DemoApp1 + kernel --> LM: spawn result for DemoApp1 + DemoApp1 -> LM: signal started via Lifecycle API +end + +alt Start DemoApp2 (depends on DemoApp1) + LM -> LM: wait for DemoApp1 ready condition + LM -> kernel: spawn DemoApp2 + kernel -> DemoApp2: spawn + activate DemoApp2 + kernel --> LM: spawn result for DemoApp2 + + DemoApp2 -> DemoApp2: initialize and register device /dev/Demo2 + DemoApp2 -> LM: signal ready via Lifecycle API + kernel --> LM: device /dev/Demo2 registered +end + +LM -> LM: verify all "DemoGroup" components are running +LM -> LM: update current run target to "DemoGroup" +LM --> SM: run target "DemoGroup" activated successfully + +note over SM, LM: New Run Target: "DemoGroup" (DemoApp1, DemoApp2 running) + +@enduml diff --git a/docs/features/lifecycle/architecture/_assets/deadline_sup.puml b/docs/features/lifecycle/architecture/_assets/deadline_sup.puml new file mode 100644 index 0000000000..4525acf802 --- /dev/null +++ b/docs/features/lifecycle/architecture/_assets/deadline_sup.puml @@ -0,0 +1,54 @@ +@startuml +actor "Client" as Client +participant "TimeConstraintMonitor" as TCM +participant "ConditionLink" as CL + +== Setup Phase == +Client -> TCM: configure_minimum_time(min_time) +activate TCM +TCM -> TCM: store min_time +deactivate TCM + +Client -> TCM: configure_maximum_time(max_time) +activate TCM +TCM -> TCM: store max_time +deactivate TCM + +Client -> TCM: link_condition(condition) +activate TCM +TCM -> CL: save reference to condition +deactivate TCM + +== Monitoring Phase == +Client -> TCM: mark_start() +activate TCM +TCM -> TCM: start internal_timer +deactivate TCM + +Client -> TCM: mark_end() +activate TCM +TCM -> TCM: stop internal_timer +deactivate TCM + +TCM -> TCM: on_timer_expiry() +activate TCM +alt Within allowed window + TCM -> TCM: set status to Success + TCM -> TCM: inform_linked_conditions() +else Outside allowed window + TCM -> TCM: set status to Failure + TCM -> TCM: inform_linked_conditions() +end +deactivate TCM + +Client -> TCM: enable_monitoring() +activate TCM +TCM -> TCM: set active +deactivate TCM + +Client -> TCM: disable_monitoring() +activate TCM +TCM -> TCM: set inactive +deactivate TCM + +@enduml diff --git a/docs/features/lifecycle/architecture/_assets/launch_manager_target_tree.puml b/docs/features/lifecycle/architecture/_assets/launch_manager_target_tree.puml new file mode 100644 index 0000000000..6a875eefb8 --- /dev/null +++ b/docs/features/lifecycle/architecture/_assets/launch_manager_target_tree.puml @@ -0,0 +1,41 @@ +@startuml + title Dependency based lifecycle management + + state debug #lightblue + state running #lightblue + state ready_for_shutdown #lightblue + + state app1: /opt/bin/app1 + state app2: /opt/bin/app2 + state app3: /opt/bin/app3 + + state ssh: /usr/bin/ssh + state setup_filesystems: /etc/setup_filesystems.sh + state eth_driver: /bin/net-dev-eth + state filesystem: /bin/net-dev-ufs + state flash_driver: /bin/dev-emmc + + [*] --> debug + [*] -[hidden]-> running + [*] -[hidden]-> ready_for_shutdown + + + running --> app1 + app1 --> app2 + app2 --> networking + running --> app3 + app3 --> networking + + debug --> ssh + ssh --> networking + networking --> setup_filesystems + setup_filesystems --> filesystem + networking --> eth_driver + filesystem --> flash_driver + + legend right + |Color| Type | + |<#lightblue>| Run States provided by the ControlInterface| + |<#WhiteSmoke>| Components | + endlegend +@enduml diff --git a/docs/features/lifecycle/architecture/_assets/lifecycle_state_machine.puml b/docs/features/lifecycle/architecture/_assets/lifecycle_state_machine.puml new file mode 100644 index 0000000000..e34fc6ffc4 --- /dev/null +++ b/docs/features/lifecycle/architecture/_assets/lifecycle_state_machine.puml @@ -0,0 +1,8 @@ +@startuml +[*] --> Created : set-up Sandbox +Created --> Terminated +Terminated --> Init : fork()/exec() +Init --> Run : report run +Run --> Terminated : exit/SIGTERM/SIGKILL +Terminated --> [*] +@enduml diff --git a/docs/features/lifecycle/architecture/_assets/logical_sup.puml b/docs/features/lifecycle/architecture/_assets/logical_sup.puml new file mode 100644 index 0000000000..36f2e393e4 --- /dev/null +++ b/docs/features/lifecycle/architecture/_assets/logical_sup.puml @@ -0,0 +1,58 @@ +@startuml +autonumber "<b>[000]" +actor "Client" as Client +participant "LogicalFlowSupervisor" as LFS +participant "Transition" as T +participant "Condition" as C + +== Initialization Phase == +Client -> LFS: add_entry_point(checkpoint_id) +activate LFS +LFS -> LFS: Add checkpoint_id to entry_points +deactivate LFS + +Client -> LFS: add_exit_point(checkpoint_id) +activate LFS +LFS -> LFS: Add checkpoint_id to exit_points +deactivate LFS + +Client -> LFS: add_allowed_transition(transition) +activate LFS +LFS -> T: get_source() +LFS -> T: get_target() +LFS -> LFS: Add edge to allowed_transitions (source -> target) +deactivate LFS + +Client -> LFS: link_condition(condition) +activate LFS +LFS -> C: Store reference to condition +LFS -> LFS: Add to linked_conditions +deactivate LFS + +== Supervision (Runtime) Phase == +Client -> LFS: record_checkpoint(checkpoint_id) +activate LFS +LFS -> LFS: Check if transition is allowed +alt Allowed transition + LFS -> LFS: Update last_checkpoint + LFS -> LFS: Update state + LFS -> LFS: Notify linked conditions +else Invalid transition + LFS -> LFS: Set status to Failure + LFS -> LFS: Notify linked conditions +end +deactivate LFS + +Client -> LFS: enable() +activate LFS +LFS -> LFS: Set enabled state +LFS -> LFS: Prepare for supervision +deactivate LFS + +Client -> LFS: disable() +activate LFS +LFS -> LFS: Set disabled state +LFS -> LFS: Cleanup +deactivate LFS + +@enduml diff --git a/docs/features/lifecycle/architecture/application_health_monitor.rst b/docs/features/lifecycle/architecture/application_health_monitor.rst deleted file mode 100644 index c8631c63d3..0000000000 --- a/docs/features/lifecycle/architecture/application_health_monitor.rst +++ /dev/null @@ -1,94 +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 - # ******************************************************************************* - -Application Health Monitor -########################## - - -Static Architecture -=================== - - -.. comp_arc_sta:: <<library>\nHealth Monitor - :id: comp_arc_sta__lifecycle__healthmonitor - :status: valid - :safety: ASIL_B - :implements: logic_arc_int__lifecycle__health_monitor_if - :uses: logic_arc_int__lifecycle__alive_if - :security: NO - :includes: - :fulfils: - - .. needarch:: - :scale: 50 - :align: center - - {{ draw_component(need(), needs) }} - - -.. logic_arc_int:: Health Monitor API - :id: logic_arc_int__lifecycle__health_monitor_if - :security: YES - :safety: ASIL_B - :status: valid - :fulfils: feat_req__com__interfaces - - - -Dynamic Architecture -==================== - - .. feat_arc_dyn:: Application health monitoring - :id: feat_arc_dyn__lifecycle__app_health_moni - :security: YES - :status: invalid - :safety: ASIL_B - :fulfils: feat_req__lifecycle__process_monitoring - - .. uml:: _assets/application_health_monitoring_dynamic.puml - :scale: 50 - :align: center - -The most important interactions are the following: - -.. list-table:: Sequence diagram Description - :widths: 10 90 - :header-rows: 1 - - * - Sequence number - - Description - * - 001 - - `Launch manager` configuration for the alive monitoring of the `Monitored application` is parsed. This contains for example, what is the expected interval of alive notifications, - how long grace period is given before failing to a missed (never received) alive notification etc. - * - 002 - - Start the startup grace period timer to allow the application to startup, before timing out to a missed alive notification - * - 003 - - The `Monitored application` is started. (To simplify, no startup checks drawn here) - * - 004 - - The `Monitored application` instantiate and configure the HealthMonitor - * - 006 - - Cyclic reporting aliveness to the monitor. - * - 007 - - HealthMonitor waking up and checking if the checkpoint(s) have been called - * - 008 - - Report aliveness to the LM's application specific supervision, observing the health of the HealthMonitor itself - * - 009 - - Checkpoint sent, but not on time - * - 010 - - Wake up and check if the checkpoint(s) have been triggered. In this case it was not, and thus actions 011 and 012 are triggered. - * - 011 - - Trigger a failure event to the Launch Manager. This event allows the monitor react faster than waiting for the timeout to expire. - * - 012 - - Additionally, triggering alive must be stopped - diff --git a/docs/features/lifecycle/architecture/configuration_parameters.rst b/docs/features/lifecycle/architecture/configuration_parameters.rst deleted file mode 100644 index 805533977b..0000000000 --- a/docs/features/lifecycle/architecture/configuration_parameters.rst +++ /dev/null @@ -1,60 +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 Parameters -######################## - - -Launch Manager Configuration Parameters -======================================= - - -Component Configuration Parameters -================================== -- UID feat_req__lifecycle__lm_uid_gid -- GID feat_req__lifecycle__lm_uid_gid -- supplementary groups feat_req__lifecycle__lm_supplementary -- runmask feat_req__lifecycle__lm_runmask -- priority feat_req__lifecycle__lm_priority -- ability -- security policies -- cwd (current working directory) feat_req__lifecycle__lm_cwd -- environmental variables feat_req__lifecycle__lm_env_var -- command to be executed -- arguments feat_req__lifecycle__lm_arguments -- stdin feat_req__lifecycle__lm_std_out_in_err_redir -- stdout feat_req__lifecycle__lm_std_out_in_err_redir -- stderr feat_req__lifecycle__lm_std_out_in_err_redir -- aslr feat_req__lifecycle__lm_aslr -- rlimits feat_req__lifecycle__lm_rlimit - - -Dependency and recovery Parameters -================================== - - - - - -Requirements related to the external monitoring -=============================================== - -- :need:`feat_req__lifecycle__lm_self_health_check` -- :need:`feat_req__lifecycle__lm_ext_watchdog_notify` -- :need:`feat_req__lifecycle__lm_ext_wdg_failed_test` -- :need:`feat_req__lifecycle__lm_ext_watchdog_cfg` - - -Dynamic Architecture -==================== diff --git a/docs/features/lifecycle/architecture/control_interface.rst b/docs/features/lifecycle/architecture/control_interface.rst deleted file mode 100644 index 050f6766e4..0000000000 --- a/docs/features/lifecycle/architecture/control_interface.rst +++ /dev/null @@ -1,102 +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 - # ******************************************************************************* - -Control Interface -################# - - -It's foreseen ECU projects will need a custom state management to fulfill ECU-project specific requirements. The S-Core will offer a framework to control application lifecycle, but will not specify the State Manager. - -The `Launch Manager` shall provide an interface, which allows an external State Manager application to request the `Launch Manager` to start, stop or restart applications or groups of applications, -which allows the implementation of a state management applications to support dynamic state control. - - -Static Architecture -=================== - - -.. logic_arc_int:: Control Interface - :id: logic_arc_int__lifecycle__controlif - :security: YES - :safety: ASIL_B - :status: valid - :fulfils: feat_req__com__interfaces - - - -Use cases -========= - -The following use cases are supported by the `ControlInterface` provided by the `Launch Manager`. - -Starting a component (or a group of components) ------------------------------------------------ - -When a request to start component(s) is received via the `ControlInterface`, the `Launch Manager` shall first evaluate if the conditions are correct for the launching of the component. At least the following conditions must be valid: - -- The component exists in the model -- If the component has dependencies, the dependencies must be valid - -If the pre-conditions are valid, then the components are started in the order defined in the dependency tree. (See : TODO, add link to the documentation about the dependencies). - -If all components were successfully started, the respond to the caller with a status indicating success. -If any of the components failed to start, respond to the caller with a status indicating a failure. - -Stopping a component (or a group of components) ------------------------------------------------ - - -Getting the status of a component (or a group of components) ------------------------------------------------------------- - -The `Launch Manager` shall provide an interface to requery of the status of a component or a group of components. - - -Dynamic Architecture -==================== - -.. feat_arc_dyn:: Control interface dynamic architecture start of components - :id: feat_arc_dyn__lifecycle__control_if_start - :security: YES - :status: valid - :safety: ASIL_B - :fulfils: feat_req__lifecycle__control_commands, feat_req__lifecycle__request_group_launch - :includes: - - .. uml:: _assets/control_interface_start_sequence.puml - :scale: 50 - :align: center - -.. feat_arc_dyn:: Control interface dynamic architecture stop of components - :id: feat_arc_dyn__lifecycle__control_if_stop - :security: YES - :status: valid - :safety: ASIL_B - :fulfils: feat_req__lifecycle__control_commands, feat_req__lifecycle__request_group_stop - :includes: - - .. uml:: _assets/control_interface_stop_sequence.puml - :scale: 50 - :align: center - - - -Requirements -============ - -- :need:`feat_req__lifecycle__control_commands` -- :need:`feat_req__lifecycle__query_commands` -- :need:`feat_req__lifecycle__request_group_launch` -- :need:`feat_req__lifecycle__request_group_stop` -- :need:`feat_req__lifecycle__request_group_restart` diff --git a/docs/features/lifecycle/architecture/external_monitoring.rst b/docs/features/lifecycle/architecture/external_monitoring.rst index 8decb13bc3..d258c9b344 100644 --- a/docs/features/lifecycle/architecture/external_monitoring.rst +++ b/docs/features/lifecycle/architecture/external_monitoring.rst @@ -24,26 +24,26 @@ The following participants are related to the concept. Launch Manager -------------- -As the `Launch manager` is critical component for the system, it shall support alive monitoring of itself. This means it must implement internal health management, such as +As the :term:`Launch Manager` is critical component for the system, it shall support alive monitoring of itself. This means it must implement internal health management, such as a worker thread, that wakes up every N milliseconds, checks if the component is in a consistent state, and send a notification to the external monitor. External monitor ---------------- -The aliveness of the `Launch Manager` shall be monitored by an `external monitor, or a watchdog <https://en.wikipedia.org/wiki/Watchdog_timer>`_, to be able to detect "hanging" of the +The aliveness of the :term:`Launch Manager` shall be monitored by an `external monitor, or a watchdog <https://en.wikipedia.org/wiki/Watchdog_timer>`_, to be able to detect "hanging" of the `Launch Manager`. The implementation of the external watchdog is out of scope in S-SCORE, as it is ECU and/or project specific. Watchdog Proxy -------------- -The component `Watchdog Proxy` is the project specific logical component, which has to implement the logical interface `HealthStatus` and translate alive events from the `Launch Manager` as +The component `Watchdog Proxy` is the project specific logical component, which has to implement the logical interface `HealthStatus` and translate alive events from the :term:`Launch Manager` as project specific messages to the `External monitor`. The channel for sending these notifications is project specific, and can be for example `GPIO`, `UART` or `SPI`. In a hypervisor based environment, the `external monitor` could also run with the same SoC as software only solution. -The `Watchdog Proxy` implementation is not specified in the S-CORE with high details, as the realization depends heavily on OS, `Launch Manager` or even project specific needs. -For example, in Linux and `systemd` as the `launch manager`, the interface can be `/dev/watchdog`, and `systemd` can use the interface directly. +The `Watchdog Proxy` implementation is not specified in the S-CORE with high details, as the realization depends heavily on OS, :term:`Launch Manager` or even project specific needs. +For example, in Linux and `systemd` as the :term:`Launch Manager`, the interface can be `/dev/watchdog`, and `systemd` can use the interface directly. -In QNX, one could implement a component listening to the events (or even poll) from the `Launch manager` and translate these events as hardware specific notifications. +In QNX, one could implement a component listening to the events (or even poll) from the :term:`Launch Manager` and translate these events as hardware specific notifications. Requirements related to the external monitoring =============================================== @@ -71,7 +71,7 @@ The most important interactions are the following: * - 001 - The configuration. (notification interval, startup grace period, etc.) Additionally, if a watchdog interface is used, the used interface name (eg. /dev/watchdog) must be configurable. * - 002 - - If the `Launch manager` provides a client library implementation, the library must connect and attach to the `Launch manager` + - If the :term:`Launch Manager` provides a client library implementation, the library must connect and attach to the :term:`Launch Manager` * - 006 - Check the internal status and trigger alive notification (007) * - 007 @@ -79,8 +79,6 @@ The most important interactions are the following: * - 009 - Watchdog to check if the notification fits the expected window * - 018 - - If the status check fails, do not trigger alive notification (or `Launch manager` has crashed) + - If the status check fails, do not trigger alive notification (or :term:`Launch Manager` has crashed) * - 019 - If there is no alive notification, trigger watchdog error reaction - - diff --git a/docs/features/lifecycle/architecture/health_monitor.rst b/docs/features/lifecycle/architecture/health_monitor.rst new file mode 100644 index 0000000000..b609feaf7a --- /dev/null +++ b/docs/features/lifecycle/architecture/health_monitor.rst @@ -0,0 +1,305 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +Health Monitor +############## + +The :term:`Health Monitor` is library, that together with the :term:`Launch Manager` provide a way to monitor +the application health in similar fashion as the AUTOSAR `Platform Health Manager` (PHM). + +The main features of the :term:`Health Monitor` are the following monitoring functions: + +- Alive supervision + - Periodic monitoring of checkpoints, which must fit the pre-configured expected number of notifications in the given interval (not too many, not too few) + - Protecting from running checks too often or too rarely +- Deadline supervision + - Timing requirement between two checkpoints. +- Logical + - Specifies in which order two or more checkpoints must be called + +The :term:`Health Monitor` itself is monitored via the :term:`Launch Manager` with via alive supervision only. + + +Overview +======== + +- Inter process communication (IPC) only needed for the alive monitoring between :term:`Health Monitor` and :term:`Launch Manager` +- Easier configuration + - The monitoring rules can be configured dynamically on demand basis + - The monitoring can be started and stopped dynamically +- Debugging of problems possibly easier + - Mapping of the events from a single process vs. the monitored application and the monitor + +Drawbacks over classical external process monitoring +---------------------------------------------------- + +- Harder safety argumentation. The following chapter describes the issues and the possible solutions. + +Safety +------ + +As the :term:`Health Monitor` is linked as part of the monitored application, it raises the following concerns +with respect to safety: + +- How can it be ensured, that the monitored application does not interfere with the monitoring functionality? +- How can it be ensured, that the :term:`Health Monitor` does not incorrectly report alive to the :term:`Launch Manager` when it has detected + a supervision error? + + +These concerns are valid, but can be addressed using the following techniques: + +- Hiding of the internal data from the user: + - For example, if the monitoring is implemented in a thread, the thread ID must not be exposed to the calling application. + - Hide the implementation for example with the pImpl-approach +- Protecting the memory of the library by using guard pages where the application memory is located, and protect it with mprotect() + - possibly with a help of a custom allocator +- Protecting the data with a checksum and possibly a sequence counter + - The internal data of the library can be checksum'ed every operation cycle, and by adding for example, a sequence + counter (or some more complex mathematical function), further checkpoints for detecting misbehavior can be implemented +- Using a safe programming language, which does not allow a raw pointer access +- Testing the application with Valgrid etc. +- Redundant monitoring, if the self monitoring with above is not sufficient, an another library in another memory location can detect sporadic corruption of the other. + + +Error Reactions +--------------- + +- When the :term:`Health Monitor` detects a failed supervision, it shall stop triggering alive notifications to the :term:`Launch Manager`. +- Additionally, when the error occurs, the :term:`Health Monitor` triggers a failure notification to the :term:`Launch Manager` to reduce the time + to react on the error. This obviously will only work if the :term:`Health Monitor` is still working and correctly scheduled. Thus the + worst case reaction time calculations must be made on the monitoring rules specified in the :term:`Launch Manager` for the monitored application. + + +Deadline Monitor API +==================== + +Static Architecture +------------------- + + +.. logic_arc_int:: Deadline Monitor API + :id: logic_arc_int__lifecycle__deadline_monitor_if + :security: YES + :safety: ASIL_B + :status: valid + :fulfils: feat_req__com__interfaces + + .. needarch:: + :scale: 50 + :align: center + + {{ draw_interface(need(), needs) }} + +.. logic_arc_int_op:: configure_minimum_time + :id: logic_arc_int_op__lifecycle__min_time + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__alive_if + +.. logic_arc_int_op:: configure_maximum_time + :id: logic_arc_int_op__lifecycle__max_time + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__deadline_monitor_if + +.. logic_arc_int_op:: link_condition + :id: logic_arc_int_op__lifecycle__link_cond_dl + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__deadline_monitor_if + +.. logic_arc_int_op:: mark_start + :id: logic_arc_int_op__lifecycle__start + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__deadline_monitor_if + +.. logic_arc_int_op:: mark_end + :id: logic_arc_int_op__lifecycle__end + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__deadline_monitor_if + +.. logic_arc_int_op:: on_timer_expiry + :id: logic_arc_int_op__lifecycle__timer_expiry + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__deadline_monitor_if + +.. logic_arc_int_op:: enable_monitoring + :id: logic_arc_int_op__lifecycle__enable_mon + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__deadline_monitor_if + +.. logic_arc_int_op:: disable_monitoring + :id: logic_arc_int_op__lifecycle__disable_mon + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__deadline_monitor_if + +.. logic_arc_int_op:: check_configuration + :id: logic_arc_int_op__lifecycle__check_cfg + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__deadline_monitor_if + + + + + +Dynamic Architecture +-------------------- + +.. feat_arc_dyn:: Application health monitoring + :id: feat_arc_dyn__lifecycle__app_health_moni + :security: YES + :status: invalid + :safety: ASIL_B + :fulfils: feat_req__lifecycle__process_monitoring + + .. uml:: _assets/application_health_monitoring_dynamic.puml + :scale: 50 + :align: center + +The most important interactions are the following: + +.. list-table:: Sequence diagram Description + :widths: 10 90 + :header-rows: 1 + + * - Sequence number + - Description + * - 001 + - :term:`Launch Manager` configuration for the alive monitoring of the `Monitored application` is parsed. This contains for example, what is the expected interval of alive notifications, + how long grace period is given before failing to a missed (never received) alive notification etc. + * - 002 + - Start the startup grace period timer to allow the application to startup, before timing out to a missed alive notification + * - 003 + - The `Monitored application` is started. (To simplify, no startup checks drawn here) + * - 004 + - The `Monitored application` instantiate and configure the HealthMonitor + * - 006 + - Cyclic reporting aliveness to the monitor. + * - 007 + - HealthMonitor waking up and checking if the checkpoint(s) have been called + * - 008 + - Report aliveness to the LM's application specific supervision, observing the health of the HealthMonitor itself + * - 009 + - Checkpoint sent, but not on time + * - 010 + - Wake up and check if the checkpoint(s) have been triggered. In this case it was not, and thus actions 011 and 012 are triggered. + * - 011 + - Trigger a failure event to the Launch Manager. This event allows the monitor react faster than waiting for the timeout to expire. + * - 012 + - Additionally, triggering alive must be stopped + + +Logical Monitor API +=================== + +Static Architecture +------------------- +.. logic_arc_int:: Logical Monitor API + :id: logic_arc_int__lifecycle__logical_monitor_if + :security: YES + :safety: ASIL_B + :status: valid + :fulfils: feat_req__com__interfaces + + .. needarch:: + :scale: 50 + :align: center + + {{ draw_interface(need(), needs) }} + +.. logic_arc_int_op:: add_entry_point + :id: logic_arc_int_op__lifecycle__entry_point + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__logical_monitor_if + +.. logic_arc_int_op:: add_exit_point + :id: logic_arc_int_op__lifecycle__exit_point + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__logical_monitor_if + +.. logic_arc_int_op:: add_allowed_transition + :id: logic_arc_int_op__lifecycle__allowed_trans + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__logical_monitor_if + +.. logic_arc_int_op:: link_condition + :id: logic_arc_int_op__lifecycle__link_cond_lg + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__logical_monitor_if + +.. logic_arc_int_op:: record_checkpoint + :id: logic_arc_int_op__lifecycle__rec_checkpoint + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__logical_monitor_if + +.. logic_arc_int_op:: enable + :id: logic_arc_int_op__lifecycle__enable + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__logical_monitor_if + +.. logic_arc_int_op:: disable + :id: logic_arc_int_op__lifecycle__disable + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__logical_monitor_if + +.. logic_arc_int_op:: verify + :id: logic_arc_int_op__lifecycle__verify + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__logical_monitor_if + + +Dynamic Architecture +-------------------- + +.. feat_arc_dyn:: Logical control flow monitoring + :id: feat_arc_dyn__lifecycle__app_ctrl_flow_moni + :security: YES + :status: invalid + :safety: ASIL_B + :fulfils: feat_req__lifecycle__process_monitoring + + .. uml:: _assets/logical_sup.puml + :scale: 50 + :align: center diff --git a/docs/features/lifecycle/architecture/launch_manager.rst b/docs/features/lifecycle/architecture/launch_manager.rst index 6679491a5b..194319b3f3 100644 --- a/docs/features/lifecycle/architecture/launch_manager.rst +++ b/docs/features/lifecycle/architecture/launch_manager.rst @@ -13,30 +13,344 @@ # ******************************************************************************* Launch manager -============== +############## -.. logic_arc_int:: Alive Interface - :id: logic_arc_int__lifecycle__alive_if +The :term:`Launch Manager` is a component that provides a framework for managing +the lifecycle of processes in the S-CORE platform. It allows for launching, +monitoring, and controlling processes based on defined configurations and +requirements. As such, it is a central part of the lifecycle management in +S-CORE and knows about the state of all processes in the system. + +It's foreseen ECU projects will need a custom state management to fulfill ECU-project specific requirements. The S-Core stack will offer a framework to control application lifecycle, but will not specify the State Manager. + +Overview +======== + +The functionality of the :term:`Launch Manager` is defined by configuration data, which spawns a directed acyclic graph (DAG) of :term:`Components <Component>` and so called :term:`Run Targets <Run Target>`. +The :term:`Run Targets <Run Target>` are virtual nodes in the DAG and represent :term:`Run States <Run State>` of the system. +The :term:`Launch Manager` is responsible for starting and stopping the processes in the correct order, based on the dependencies defined in the configuration data. + +E.g. the configuration below consists of three :term:`Run Targets <Run Target>` managing 9 components. If the user selects e.g. the :term:`Run Target` "debug" the :term:`Launch Manager` will start the components in the following order defined by the dependencies. + +1. flash driver +2. filesystem +3. setup filesystems +4. networking +5. ssh + +.. uml:: _assets/launch_manager_target_tree.puml + :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. + +Control Interface +================= + +This interface provides control functionality for activating and managing run targets.It allows users to trigger execution of configured :term:`Run targets <Run target>` through a standardized activation mechanism. + +Static architecture +------------------- + +.. logic_arc_int:: Control Interface + :id: logic_arc_int__lifecycle__controlif :security: YES :safety: ASIL_B :status: valid :fulfils: feat_req__com__interfaces +**Operations** + +.. logic_arc_int_op:: Activate Run Target + :id: logic_arc_int_op__lifecycle__activate_target + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__controlif + + +The :term:`Launch Manager` shall provide an interface, which allows an external State Manager application to request the :term:`Launch Manager` to start, stop or restart applications or groups of applications, +which allows the implementation of a state management applications to support dynamic state control. + + + +Dynamic architecture +-------------------- + +The following use cases are supported by the `ControlInterface` provided by the :term:`Launch Manager`. + +**Activating a Run Target** + +When a request to activate a run target is received via the `ControlInterface`, the :term:`Launch Manager` shall perform the following operations: + +1. **Validation**: Evaluate if the conditions are correct for activating the requested run target: + - The run target exists in the configuration + - All dependencies for the run target are resolvable + - Required resources are available + +2. **Transition Logic**: Determine the transition from the current state to the target state: + - If a different run target is active, perform a switch operation (stop current, start requested) + - If the same run target is already active, verify its state and potentially restart failed components + +3. **Execution**: Execute the transition in the correct dependency order: + - Stop components that are not part of the new run target + - Start components that are required for the new run target + - Respect dependency relationships during both stop and start operations + +4. **Response**: Return status to the caller: + - Success if all components transitioned correctly + - Failure with detailed error information if any component failed to transition + +This unified approach allows external state managers to request any run target activation without needing to know the current system state, as the :term:`Launch Manager` handles the transition logic internally. + + +.. 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 + :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 + :align: center + + + +Requirements +------------ + +- :need:`feat_req__lifecycle__control_commands` +- :need:`feat_req__lifecycle__request_run_target_start` +- :need:`feat_req__lifecycle__switch_run_targets` + + + +Lifecycle Interface +=================== + + +The :term:`Launch Manager` provides interfaces for communication with launched applications, supporting two distinct application types: + +1. **SCORE Applications**: Implement the full Lifecycle Interface for bidirectional communication with state reporting, liveliness indication, and conditional signaling +2. **Native Applications**: Controlled exclusively via POSIX signals (SIGTERM, SIGKILL, etc.) without direct API communication + +This dual approach enables the :term:`Launch Manager` to manage both legacy native applications and SCORE-aware applications within the same system. + +The Lifecycle Interface serves as the communication channel between applications and the :term:`Launch Manager`: + +**For SCORE Applications:** +- Application state reporting (started, running, stopped) +- Conditional signaling for application dependencies + +**For Native Applications:** +- Process lifecycle control via POSIX signals +- Basic process monitoring (PID-based status checking) +- Exit code evaluation for failure detection + +Static architecture +------------------- + +.. logic_arc_int:: Lifecycle Interface + :id: logic_arc_int__lifecycle__lifecycle_if + :security: YES + :safety: ASIL_B + :status: valid + :fulfils: feat_req__lifecycle__process_state_comm, feat_req__lifecycle__liveliness_detection + :includes: logic_arc_int_op__lifecycle__run, logic_arc_int_op__lifecycle__terminate, + + .. needarch:: + :scale: 50 + :align: center + + {{ draw_interface(need(), needs) }} + +.. logic_arc_int_op:: run + :id: logic_arc_int_op__lifecycle__run + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__lifecycle_if -.. comp_arc_sta:: Launch Manager - :id: comp_arc_sta__lifecycle__launch_manager +.. logic_arc_int_op:: terminate + :id: logic_arc_int_op__lifecycle__terminate + :security: YES + :safety: ASIL_B :status: valid + :included_by: logic_arc_int__lifecycle__lifecycle_if + + +The following use cases are supported by the Lifecycle Interface, with different capabilities depending on the application type. + +**SCORE Application State Communication** + +SCORE applications implementing the Lifecycle Interface can communicate their internal state to the :term:`Launch Manager`. The state information includes: + +- **Started**: Application has successfully initialized and is ready to operate +- **Running**: Application is actively executing its main functionality +- **Stopped**: Application has terminated or is in the process of shutting down + +The :term:`Launch Manager` uses this state information for: + +- Dependency resolution for other applications +- Recovery action decisions +- Status reporting to external state managers via the Control Interface + + +**SCORE Application Conditional Signaling** + +SCORE applications can signal custom conditions to the :term:`Launch Manager` via the Alive Interface. This enables: + +- Complex dependency management beyond simple process startup +- Coordination between interdependent applications + +Custom conditions can be used by other applications as launch dependencies, allowing for sophisticated startup orchestration. + +**Native Application Control** + +Native applications that do not implement the Lifecycle Interface are controlled through POSIX signals: + +- **SIGTERM**: Graceful shutdown request +- **SIGKILL**: Forced termination (after timeout) +- **SIGUSR1/SIGUSR2**: Application-specific signals (if configured) + +The :term:`Launch Manager` monitors native applications through: + +- Process ID (PID) tracking +- Exit code evaluation +- Resource usage monitoring via OS facilities +- Timeout-based failure detection + +For native applications, the :term:`Launch Manager` provides: + +- Basic lifecycle control (start/stop) +- Simple dependency management based on process existence +- Configurable startup/shutdown timeouts +- Exit code-based success/failure determination + + +Dynamic Architecture +-------------------- + +.. feat_arc_dyn:: Lifecyle Interface + :id: feat_arc_dyn__lifecycle__state_machine + :security: YES + :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 + :align: center + +Requirements +------------ + +- :need:`feat_req__lifecycle__process_state_comm` +- :need:`feat_req__lifecycle__custom_cond_support` +- :need:`feat_req__lifecycle__smart_watchdog_config` +- :need:`feat_req__lifecycle__process_monitoring` +- :need:`feat_req__lifecycle__process_termination` +- :need:`feat_req__lifecycle__shutdown_signal` +- :need:`feat_req__lifecycle__launch_support` +- :need:`feat_req__lifecycle__process_ordering` +- :need:`feat_req__lifecycle__parallel_launch_support` +- :need:`feat_req__lifecycle__waitfor_support` +- :need:`feat_req__lifecycle__process_input_output` +- :need:`feat_req__lifecycle__process_launch_args` +- :need:`feat_req__lifecycle__uid_gid_support` +- :need:`feat_req__lifecycle__total_wait_time_support` +- :need:`feat_req__lifecycle__polling_interval` +- :need:`feat_req__lifecycle__launch_priority_support` +- :need:`feat_req__lifecycle__cwd_support` +- :need:`feat_req__lifecycle__terminal_support` +- :need:`feat_req__lifecycle__std_handle_redir` +- :need:`feat_req__lifecycle__secpol_non_root` +- :need:`feat_req__lifecycle__retries_configurable` +- :need:`feat_req__lifecycle__fd_inheritance` +- :need:`feat_req__lifecycle__support_secpol_type` +- :need:`feat_req__lifecycle__supplementary_groups` +- :need:`feat_req__lifecycle__scheduling_policy` +- :need:`feat_req__lifecycle__runmask_support` +- :need:`feat_req__lifecycle__aslr_support` +- :need:`feat_req__lifecycle__process_rlimit_support` +- :need:`feat_req__lifecycle__detach_parent_process` +- :need:`feat_req__lifecycle__running_processes` +- :need:`feat_req__lifecycle__drop_supervsion` +- :need:`feat_req__lifecycle__multi_start_support` +- :need:`feat_req__lifecycle__validate_conditions` +- :need:`feat_req__lifecycle__validation_conditions` +- :need:`feat_req__lifecycle__consistent_dependencies` +- :need:`feat_req__lifecycle__stop_process_dependents` +- :need:`feat_req__lifecycle__stop_order_spec` +- :need:`feat_req__lifecycle__oci_compliant` + + + +Alive Interface +=============== +The Alive Interface provides a basic watchdog functionality interface that delivers essential monitoring capabilities for system health and responsiveness tracking. +It implements core watchdog operations including heartbeat signals to ensure reliable operation and automatic recovery from unresponsive states. + +**SCORE Application Liveliness Reporting** + +SCORE applications can periodically signal their liveliness to the :term:`Launch Manager` through the Alive Interface. This mechanism allows the :term:`Launch Manager` to: + +- Detect application failures or hangs +- Trigger recovery actions when liveliness is lost +- Maintain accurate process health status + +The liveliness mechanism includes: + +- Configurable heartbeat intervals per application +- Timeout detection and failure handling + +Static architecture +------------------- + +.. logic_arc_int:: Alive API + :id: logic_arc_int__lifecycle__alive_if + :security: YES :safety: ASIL_B - :implements: logic_arc_int__lifecycle__controlif, logic_arc_int__lifecycle__alive_if - :uses: logic_arc_int__logging__logging - :security: NO - :includes: - :fulfils: + :status: valid + :fulfils: feat_req__com__interfaces .. needarch:: :scale: 50 :align: center - {{ draw_component(need(), needs) }} + {{ draw_interface(need(), needs) }} + +**Operations** + +.. logic_arc_int_op:: report_health_status + :id: logic_arc_int_op__lifecycle__report_health + :security: YES + :safety: ASIL_B + :status: valid + :included_by: logic_arc_int__lifecycle__alive_if + +Dynamic architecture +-------------------- + +.. feat_arc_dyn:: Alive Monitoring + :id: feat_arc_dyn__lifecycle__alive_monitoring + :security: YES + :status: valid + :safety: ASIL_B + :fulfils: feat_req__lifecycle__monitoring_processes, feat_req__lifecycle__polling_interval,, feat_req__lifecycle__failure_detect + :includes: + + .. uml:: _assets/alive_monitoring_dynamic.puml + :scale: 50 + :align: center +Requirements +------------ +- :need:`feat_req__lifecycle__monitoring_processes` +- :need:`feat_req__lifecycle__polling_interval` +- :need:`feat_req__lifecycle__failure_detect` +- :need:`feat_req__lifecycle__liveliness_detection` diff --git a/docs/features/lifecycle/architecture/launch_manager_configuration.rst b/docs/features/lifecycle/architecture/launch_manager_configuration.rst new file mode 100644 index 0000000000..8f4780a50d --- /dev/null +++ b/docs/features/lifecycle/architecture/launch_manager_configuration.rst @@ -0,0 +1,76 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +Launch Manager Configuration +############################ + +The :term:`Launch Manager` supports a set of configuration parameters, which are grouped in the following categories: + +Component Configuration Parameters +================================== + +These parameters specify the arguments needed for spawning a process. + +- :need:`feat_req__lifecycle__uid_gid_support` +- :need:`feat_req__lifecycle__supplementary_groups` +- :need:`feat_req__lifecycle__runmask_support` +- :need:`feat_req__lifecycle__launch_priority_support` +- :need:`feat_req__lifecycle__cwd_support` +- :need:`feat_req__lifecycle__process_launch_args` +- :need:`feat_req__lifecycle__std_handle_redir` +- :need:`feat_req__lifecycle__aslr_support` +- :need:`feat_req__lifecycle__process_rlimit_support` +- :need:`feat_req__lifecycle__support_secpol_type` +- command to be executed TODO +- environmental variables TODO + +Dependency parameters +===================== + +These parameters specify how the components depend on each other. + +Recovery parameters +=================== + +These parameters specify the recovery actions for a component, when it fails. + +Alive monitoring parameters +=========================== + +These parameters specify the alive monitoring rules for the application. + +Requirements related to the external monitoring +=============================================== + +These parameters specify how the :term:`Launch Manager` itself is monitored. + +- :need:`feat_req__lifecycle__lm_self_health_check` +- :need:`feat_req__lifecycle__lm_ext_watchdog_notify` +- :need:`feat_req__lifecycle__lm_ext_wdg_failed_test` +- :need:`feat_req__lifecycle__lm_ext_watchdog_cfg` + + +Static Architecture +=================== + +.. logic_arc_int:: Configuration parameters static architecture + :id: logic_arc_int__lifecycle__cfg_params_static + :security: YES + :safety: ASIL_B + :status: valid + :fulfils: feat_req__com__interfaces + + .. uml:: _assets/config_params_static.puml + :scale: 50 + :align: center diff --git a/docs/features/lifecycle/glossary.rst b/docs/features/lifecycle/glossary.rst new file mode 100644 index 0000000000..6fa00b21db --- /dev/null +++ b/docs/features/lifecycle/glossary.rst @@ -0,0 +1,114 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +Glossary +======== + +.. glossary:: + + Launch Manager + Component to start and stop processes on a POSIX like operating system. + + Health Monitor + Provides process local monitoring functionalities such as deadline monitoring + and logical program flow monitoring. + + Control Interface + Interface to control the lifecycle of the system, e.g. to start and stop processes. + + Alive Interface + Interface to monitor the aliveness of a process. + + Sandbox + A sandbox is a set of configurations, which are applied to a process when it + is started. It can include environment variables, secpol policies, cgroup + configurations, user and group IDs etc. + + Health Monitor Interface + Interface to monitor the health of a process, e.g. to check if a process is + alive or if it is running as expected. + + Alive Monitoring + Checks if an application reports an alive state in a certain period. + + Deadline Monitoring + Monitor to detect if a state was reached within a specified time related to + another event. + + Logical Programflow Monitoring + Monitor to detect if certain states were reached in a defined sequence and + time interval. + + Run State + An Run State defines a set of components, which are in status running + and are supervised by the software platform. If the health management system + detects abnormal situation it can change the :term:`Run State`. + + Lifecycle Component + Node of the dependency tree. + + Process + Instantiation of an Executable programs running on the system that are managed by the Launch Manager. + + UID + User Identifier - a unique number assigned to each user on a Unix-like operating system. + + GID + Group Identifier - a unique number assigned to each group on a Unix-like operating system. + + Polling Interval + The time interval between successive checks of a condition or status. + + Working Directory + The current directory from which a process is executed, also known as CWD (Current Working Directory). + + File Descriptor + A handle used by a process to access files or other input/output resources. + + Procmgr + Process Manager - a QNX system component that manages process creation and execution. + + ASLR + Address Space Layout Randomization - a security technique that randomizes the memory layout of processes. + + Recovery Action + Actions taken by the Launch Manager when a process fails or terminates abnormally. + + Liveliness + The state indicating that a process is active and responding as expected. + + Watchdog + A monitoring mechanism that detects system failures and can trigger recovery actions. + + Interval + A period of time between events or measurements. + + QNX + A real-time operating system commonly used in embedded systems. + + + DSS + Device Safe State - a safe operational state that a system can enter during failures. + + DAG + Directed Acyclic Graph - a data structure used to represent dependencies between processes. + + SWC + Software Components - modular software units that can be independently managed. + + Run target + A named collection of processes and their dependencies that can be launched, stopped, or switched as a group to achieve a specific operational mode or configuration. + + Operating System + The system software that manages computer hardware and software resources and provides common services for computer programs. diff --git a/docs/features/lifecycle/index.rst b/docs/features/lifecycle/index.rst index db99e25265..77f6593566 100644 --- a/docs/features/lifecycle/index.rst +++ b/docs/features/lifecycle/index.rst @@ -16,7 +16,7 @@ Lifecycle ---------- +######### .. note:: Document header @@ -27,8 +27,8 @@ Lifecycle :tags: feature_request -Feature flag ------------- +Feature Flag +============ To activate this feature, use the following feature flag: @@ -36,35 +36,28 @@ To activate this feature, use the following feature flag: Abstract --------- +======== The lifecycle feature provides a set of functionalities to manage the lifecycle of components in the S-SCORE platform. The goal is to ensure that components can be -started, stopped, and monitored effectively, providing a robust framework for managing the state of the system. +started, stopped, and monitored effectively, providing a robust framework for +managing the state of the system. Motivation ----------- - -For every ecu handling of startup, shutdown, and monitoring of components is crucial to -ensure the system operates correctly and efficiently. Additionally we need do provide the -means to set the system in different operating modes, such as normal operation, engineering/debug mode, -flash mode etc. +========== +For every ECU, handling of startup, shutdown, and monitoring of components is crucial to ensure the system operates correctly and efficiently. Additionally, we need to provide the means to set the system in different Run States, such as normal operation, engineering/debug mode, flash mode etc. +started, stopped, and monitored effectively, providing a robust framework for managing the state of the system. Rationale ---------- +========= -Main task of the lifecycle system is to start and stop :term:`processes` depending on the -overall state the user wants to achieve and the functional dependencies between -the :term:`processes`. +Main task of the lifecycle system is to start and stop :term:`Processes <Process>` depending on the overall state the user wants to achieve and the functional dependencies between the :term:`Processes <Process>`. -:term:`Lifecycle Component` can be very simple like a single process or more complex like a set of processes -which are started in a certain order and with certain dependencies between them or containers. +A :term:`Lifecycle Component` can be very simple like a single process or more complex like a set of processeswhich are started in a certain order and with certain dependencies between them or containers. -We call a state of the system an :term:`Operating Mode`, which is defined via the -:term:`Lifecycle Component` running on the system at a certain point in time. -A lifecycle component is a configuration unit, which describes the executable, which shall be executed -and the :term:`sandbox` the platform has to provide to run this executable. +We call a state of the system a :term:`Run State`, which is defined via the :term:`Lifecycle Components <Lifecycle Component>` running on the system at a certain point in time. +A lifecycle component is a configuration unit, which describes the executable, which shall be executed and the :term:`sandbox` the platform has to provide to run this executable. E.g. the :term:`sandbox` shall describe @@ -74,37 +67,26 @@ E.g. the :term:`sandbox` shall describe - user and group IDs under which the process shall be started - ... +Via the configuration we define a certain :term:`Run State` and add all the components, which are needed to realize this Run State as dependencies. -Via the configuration we define a certain operting mode and add all the components, which are needed to -realize this operating mode as dependencies. - - -A second task of the lifecycle system is to supervise the aliveness of the :term:`processes`, -which are started and to initiate appropriate actions in case of a failure, which -might result in many cases in a change of the :term:`Operating Mode`. - +A second task of the lifecycle system is to supervise the aliveness of the :term:`Processes <Process>`, +which are started and to initiate appropriate actions in case of a failure, which might result in many cases in a change of the :term:`Run State`. The Lifecycle feature addresses the following stakeholder requirements: -• :need:`stkh_req__execution_model__processes`: Comprehensive process lifecycle management - including startup, shutdown, recovery, and cross-process synchronization of threads +• :need:`stkh_req__execution_model__processes`: Comprehensive process lifecycle management including startup, shutdown, recovery, and cross-process synchronization of threads -• :need:`stkh_req__functional_req__file_based`: Modular configuration file support allowing changes - without rebuilding software, enabling flexible system setup and module management +• :need:`stkh_req__functional_req__file_based`: Modular configuration file support allowing changes without rebuilding software, enabling flexible system setup and module management • :need:`stkh_req__dependability__safety_features`: Implementation of monitoring safety mechanisms -A second task of the lifecycle system is to supervise the aliveness of the processes, which are started -and to initiate appropriate actions in case of a failure, which might result in many cases in -a change of the operting mode. +A second task of the lifecycle system is to supervise the aliveness of the processes, which are started and to initiate appropriate actions in case of a failure, which might result in many cases in a change of the operting mode. Support of containers -===================== +--------------------- -A :term:`Sandbox` can e.g. realized as a container, which is a lightweight, standalone executable -package that includes everything needed to run a piece of software, -including the code, runtime, libraries, and system tools. +A :term:`Sandbox` can also be realized as a container, which is a lightweight, standalone executable package that includes everything needed to run a piece of software, including the code, runtime, libraries, and system tools. In the context of the S-SCORE platform, container can be used to encapsulate applications and their dependencies, ensuring consistent execution across different environments. @@ -112,65 +94,44 @@ Main task of the lifecycle system is to start and stop components with an OCI co environment `<https://github.com/opencontainers/runtime-spec>`__ depending on the overall state the user wants to achieve and the functional dependencies between the processes. -A `container` is a lightweight, standalone executable package that includes everything needed to run a piece of software, -including the code, runtime, libraries, and system tools. -In the context of the S-SCORE platform, containers are used to encapsulate applications and their dependencies, -ensuring consistent execution across different environments. - -We call a runtime-state of the system an `operating mode`, which is defined via the processes running on the -system at a certain point in time the with the `OCI` runtime. +We call a runtime-state of the system an Run State, which is defined via the processes running on the system at a certain point in time. -Coming from the OCI Specification the `operation modes` is a superset of the `OCI` states +Coming from the OCI Specification the operation modes is a superset of the OCI states - Creating - Created - Running - Stopped -Via the configuration we define a certain operting mode and add all the components, which are needed to -realize this operating mode as dependencies. - -A `lifecycle component` is a configuration unit, which describes the `executable`, which shall be executed -and the `sandbox` the platform has to provide to run this executable. -E.g. the `sandbox`` shall describe - -- environment variables, which shall be set via the lifecycle system -- secpol policies on QNX, which shall be applied to the process -- cgroup configurations on linux, which shall be applied to the process -- user and group ids under which the process shall be started. -- ... - -A second task of the lifecycle system is to supervise the aliveness of the processes, which are started -and to initiate appropriate actions in case of a failure, which might result in many cases in -a change of the operting mode. - Specification -------------- - -.. feat_arc_sta:: Feature architecture - :id: feat_arc_sta__lifecycle__overview - :security: YES - :safety: ASIL_B - :status: valid - :fulfils: - :includes: logic_arc_int__lifecycle__controlif, logic_arc_int__lifecycle__health_monitor_if, logic_arc_int__lifecycle__alive_if +============= +.. mod_view_sta:: Feature architecture + :id: mod_view_sta__lifecycle__overview + :includes: comp_arc_sta__lifecycle__launch_manager, comp_arc_sta__lifecycle__healthmonitor .. needarch:: :scale: 50 :align: center - {{ draw_feature(need(), needs) }} - - + {{ draw_module(need(), needs) }} + LifecycleApplication --> logic_arc_int__lifecycle__lifecycle_if : implements + LifecycleApplication --> logic_arc_int__lifecycle__controlif : use + LifecycleApplication --> logic_arc_int__lifecycle__alive_if : use + LifecycleApplication --> logic_arc_int__lifecycle__logical_monitor_if : use + 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 The overall functionality of the feature can be split into 2 subfeatures, which are closely coupled to each other: * **Lifecycle Management**: This subfeature is responsible for the management of - the lifecycle of a :term:`Lifecycle Component`, including starting and stopping :term:`processes`, - managing their dependencies, and handling different operating modes. + the lifecycle of a :term:`Lifecycle Component`, + * Creating/Initializing :term:`Sandbox` + * Starting and stopping :term:`Processes <Process>` via :term:`Run State` s * **Health Monitoring**: Provides platform functionality to monitor certain health conditions of applications: @@ -179,6 +140,7 @@ closely coupled to each other: * Deadline Monitoring * Logical Programflow Monitoring +* **External Monitoring**: Provides a concept to integrate with a external monitoring facilities. Architecture @@ -186,165 +148,86 @@ Architecture The concept is based on 2 major components: -* **:term:`Launch Manager`**: Responsible for starting and stopping components based on - the defined operating modes and alive supervision of the started components +* **Launch Manager**: Responsible for starting and stopping components based on + the defined Run States and alive supervision of the started components -* **:term:`Health Monitor`**: Provides process local monitoring functionalities such as +* **Health Monitor**: Provides process local monitoring functionalities such as deadline monitoring and logical program flow monitoring - - - - - - -Requirements -============ +Details +------- .. toctree:: :maxdepth: 1 :glob: - requirements/* - -Modules -======= - - -.. mod_view_sta:: Lifecycle - :id: mod_view_sta__lifecycle__1 - :includes: comp_arc_sta__lifecycle__launch_manager, comp_arc_sta__lifecycle__healthmonitor - - .. needarch:: - :scale: 50 - :align: center - - {{ draw_module(need(), needs) }} - - -The overall concept is based on 2 components: - -* Component Launch Manager: Responsible for starting and stopping components based on the defined operating modes - and alive supervision of the started components -* Component Health Monitor: Provides process local monitoring fucntionalities - such as deadline monitoring and logical program flow monitoring. - - - - -.. uml:: architecture/_assets/overview_static.puml - :scale: 50 - :align: center - ------------------------------------------------------ - -.. uml:: - :scale: 50 - :align: center - - title Dependency based lifecycle management - - state debug #lightblue - state running #lightblue - state ready_for_shutdown #lightblue - - state app1: /opt/bin/app1 - state app2: /opt/bin/app2 - state app3: /opt/bin/app3 - - state ssh: /usr/bin/ssh - state setup_filesystems: /etc/setup_filesystems.sh - state eth_driver: /bin/net-dev-eth - state filesystem: /bin/net-dev-ufs - state flash_driver: /bin/dev-emmc - - [*] --> debug - [*] -[hidden]-> running - [*] -[hidden]-> ready_for_shutdown - - - running --> app1 - app1 --> app2 - app2 --> networking - running --> app3 - app3 --> networking - - debug --> ssh - ssh --> networking - networking --> setup_filesystems - setup_filesystems --> filesystem - networking --> eth_driver - filesystem --> flash_driver + ./architecture/launch_manager + ./architecture/launch_manager_configuration + ./architecture/health_monitor + ./architecture/external_monitoring - legend right - |Color| Type | - |<#lightblue>| Operating modes provided by the ControlInterface| - endlegend -Architecture ------------- +Requirements +============ .. toctree:: :maxdepth: 1 :glob: - ./architecture/application_health_monitor - ./architecture/control_interface - ./architecture/external_monitoring - ./architecture/configuration_parameters - ./architecture/launch_manager + ./requirements/* - -Requirements ------------- +Terms and Definitions +===================== .. toctree:: :maxdepth: 1 - :glob: - requirements/* + glossary Backwards Compatibility ------------------------ +======================= New feature Security Impact ---------------- +=============== -TBD +The :term:`Launch Manager` has to ensure a proper isolation of the different proceses for +security reasons. Safety Impact -------------- +============= -TBD +The :term:`Launch Manager` has to ensure a proper isolation of the different proceses for +safety reasons. License Impact --------------- +============== -TBD +- How to Teach This ------------------ +================= +TBD Rejected Ideas ============== -TBD +None so far Open Issues =========== -TBD +* Define safety and security concept Footnotes ---------- +========= [A collection of footnotes cited in the CR, and a place to list non-inline hyperlink targets.] diff --git a/docs/features/lifecycle/requirements/index.rst b/docs/features/lifecycle/requirements/index.rst index dfcda62af3..1bc38b5ec3 100644 --- a/docs/features/lifecycle/requirements/index.rst +++ b/docs/features/lifecycle/requirements/index.rst @@ -12,8 +12,8 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -Launch Manager -============== +Requirements +============ Launching Processes ------------------- @@ -22,442 +22,470 @@ Launching Processes :id: feat_req__lifecycle__launch_support :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for launching processes. - + The :term:`Launch Manager` shall provide support for launching :term:`Processes <Process>`. .. feat_req:: Process dependency handling :id: feat_req__lifecycle__process_ordering :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for ordering the launching of processes based on the dependencies. + The :term:`Launch Manager` shall provide support for ordering the launching of + :term:`Processes <Process>` based on the dependencies. .. feat_req:: Launching processes in parallel :id: feat_req__lifecycle__parallel_launch_support :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for launching processes in parallel. - + The :term:`Launch Manager` shall provide support for launching :term:`Processes <Process>` + in parallel. -.. feat_req:: Conditional waitfor launching - :id: feat_req__lifecycle__waitfor_support +.. feat_req:: Control interface support + :id: feat_req__lifecycle__custom_cond_support :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for waitfor conditions to be satisfied to launch processes. + The :term:`Launch Manager` shall provide support to wait for configurable custom + conditions, which can be signaled from applications via :term:`Control Interface`. -.. feat_req:: Control Interface - :id: feat_req__lifecycle__custom_cond_support +.. feat_req:: Forward process information + :id: feat_req__lifecycle__process_input_output :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support to wait for configurable custom conditions, which can be signaled from applications via control interface. - + The :term:`Launch Manager` shall provide support to pass the output of one or + multiple :term:`Processes <Process>` as input arguments to another process. -.. feat_req:: Forward process information - :id: feat_req__lifecycle__process_input_output +.. feat_req:: Handling process args + :id: feat_req__lifecycle__process_launch_args :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support to pass the output of one or multiple processes as input arguments to another process. - + The :term:`Launch Manager` shall provide support for launching a process with a + given set of arguments. -.. feat_req:: Conditionally launch of processes - :id: feat_req__lifecycle__cond_process_start +.. feat_req:: Launching process in debug mode + :id: feat_req__lifecycle__debug_support :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: QM :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support to conditionally start a process or process group based on the return value of a single or multiple processes executed before. - + The :term:`Launch Manager` shall provide support for launching process with a + given set of debug arguments in debug mode. -.. feat_req:: Support for essential processes - :id: feat_req__lifecycle__essential_processes +.. feat_req:: Launching process in state waiting for a debugger connection + :id: feat_req__lifecycle__support_held_state :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall allow to mark processes as "essential" for the startup. + The :term:`Launch Manager` shall provide support for launching a process in a state + waiting for a debugger connection. -.. feat_req:: Stop further processing on failing essential process - :id: feat_req__lifecycle__essential_process_fail +.. feat_req:: Process user, group IDs support + :id: feat_req__lifecycle__uid_gid_support :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - In case a process that is marked as "essential" for the startup fails to start, the launch manager shall stop the further processing of its config and stop the startup sequence. - + The :term:`Launch Manager` shall provide support for launching a process with a + given :term:`UID`/:term:`GID` (user name/Group Identifier). -.. feat_req:: Error reaction on essential process failure - :id: feat_req__lifecycle__error_reaction_config +.. feat_req:: Process priority support + :id: feat_req__lifecycle__launch_priority_support :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall support to configure the error reaction in case an "essential" process failed to start. Possible error reactions are: + The :term:`Launch Manager` shall provide support for launching a process with a + given priority. - * System halt - * System reset - - * Execution of a specifically marked process +.. feat_req:: CWD support + :id: feat_req__lifecycle__cwd_support + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__execution_model__processes + :status: invalid + The :term:`Launch Manager` shall provide support for launching a process with a + given :term:`Working Directory`. -.. feat_req:: Handling process args - :id: feat_req__lifecycle__process_launch_args +.. feat_req:: Launching terminal + :id: feat_req__lifecycle__terminal_support :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for launching a process with a given set of arguments. - + The :term:`Launch Manager` shall provide support for launching a terminal or a + session leader. -.. feat_req:: Launching process in debug mode - :id: feat_req__lifecycle__debug_support +.. feat_req:: Standard handle redirection + :id: feat_req__lifecycle__std_handle_redir :reqtype: Functional :security: NO - :safety: QM + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for launching process with a given set of debug arguments in debug mode. + The :term:`Launch Manager` shall provide support for stdin, stdout, stderr + redirection. +.. feat_req:: Non-root support + :id: feat_req__lifecycle__secpol_non_root + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__dependability__safety_features + :status: invalid -.. feat_req:: Launching process in HELD state - :id: feat_req__lifecycle__support_held_state + The :term:`Launch Manager` shall provide support to be started with security + policy as non-root. + +.. feat_req:: Configurable amount of retries + :id: feat_req__lifecycle__retries_configurable :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for launching a process in a HELD state. - + The :term:`Launch Manager` shall support a configurable amount of retries in + case error occurs during startup of a component (e.g. file not available) occurs. -.. feat_req:: Process user, group ids support - :id: feat_req__lifecycle__uid_gid_support +.. feat_req:: Process capability support + :id: feat_req__lifecycle__capability_support :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for launching a process with a given UID(/GID (/user\_name.Unique identifier)Group Identifier) - + The :term:`Launch Manager` shall provide support for launching :term:`Processes <Process>` + with configured OS-specific capabilities and privileges. -.. feat_req:: Conditional launch total wait time - :id: feat_req__lifecycle__total_wait_time_support +.. feat_req:: File descriptor inheritance support + :id: feat_req__lifecycle__fd_inheritance :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for per condition configurable total wait time for launch conditions to be satisfied. + The :term:`Launch Manager` shall provide support for launching a process with + given :term:`File Descriptor` inheritance restrictions. -.. feat_req:: Conditional launch polling interval - :id: feat_req__lifecycle__polling_interval +.. feat_req:: Security policy support + :id: feat_req__lifecycle__support_secpol_type :reqtype: Functional :security: NO - :safety: ASIL_D - :satisfies: stkh_req__execution_model__processes + :safety: ASIL_B + :satisfies: stkh_req__dependability__safety_features :status: invalid - The launch manager shall provide support for per condition configurable polling interval for launch conditions to be checked. - + The :term:`Launch Manager` shall provide support for launching a process with a + given security policy. -.. feat_req:: Process priority support - :id: feat_req__lifecycle__launch_priority_support +.. feat_req:: Supplementary group support + :id: feat_req__lifecycle__supplementary_groups :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for launching a process with a given priority. + The :term:`Launch Manager` shall provide support for launching a process with a + given set of supplementary groups. - -.. feat_req:: cwd support - :id: feat_req__lifecycle__cwd_support +.. feat_req:: Scheduling support + :id: feat_req__lifecycle__scheduling_policy :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for launching a process with a given working directory. - + The :term:`Launch Manager` shall provide support for launching a process with + certain scheduling policy. -.. feat_req:: launching terminal - :id: feat_req__lifecycle__terminal_support +.. feat_req:: CPU runmask support + :id: feat_req__lifecycle__runmask_support :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for launching a terminal or a session leader. + The :term:`Launch Manager` shall provide support for launching a process with a + given runmask. -.. feat_req:: std handle redirection - :id: feat_req__lifecycle__std_handle_redir +.. feat_req:: ASLR support + :id: feat_req__lifecycle__aslr_support :reqtype: Functional :security: NO - :safety: ASIL_D - :satisfies: stkh_req__execution_model__processes + :safety: ASIL_B + :satisfies: stkh_req__dependability__safety_features :status: invalid - The launch manager shall provide support for stdin, stdout, stderr redirection. + The :term:`Launch Manager` shall provide support for launching process with + :term:`ASLR` (Address Space Layout Randomization). - -.. feat_req:: builtin commands - :id: feat_req__lifecycle__builtin_command_support +.. feat_req:: Resource limit support + :id: feat_req__lifecycle__process_rlimit_support :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for builtin commands. + The :term:`Launch Manager` shall provide support for launching a process with a + given set of system resource limits (rlimit). -.. feat_req:: Non-root support - :id: feat_req__lifecycle__secpol_non_root +.. feat_req:: Process detach from parent support + :id: feat_req__lifecycle__detach_parent_process :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support to be started with security policy as non-root. + The :term:`Launch Manager` shall provide support for launching a process to + detach from parent. +Conditional Launching +--------------------- -.. feat_req:: Configurable amount of retries - :id: feat_req__lifecycle__retries_configurable +.. feat_req:: Conditional launching + :id: feat_req__lifecycle__waitfor_support :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The Launch Manager shall support a configurable amount of retries in case error occurs during startup of a component (e.g. file not available) occurs. + The :term:`Launch Manager` shall provide launching processes based on conditions. - -.. feat_req:: procmgr ability support - :id: feat_req__lifecycle__procmgr_support +.. feat_req:: Conditionally launch of processes + :id: feat_req__lifecycle__cond_process_start :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for launching processes with configured procmgr abilities. - + The :term:`Launch Manager` shall provide support to conditionally start a process + or process group based on the return value of a single or multiple :term:`Processes <Process>` + executed before. -.. feat_req:: file descriptor inheritance support - :id: feat_req__lifecycle__fd_inheritance +.. feat_req:: Condition timeout + :id: feat_req__lifecycle__total_wait_time_support :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for launching a process with given file descriptor inheritance restrictions. - + The :term:`Launch Manager` shall provide support for per condition configurable + total wait time for launch conditions to be satisfied. -.. feat_req:: security policy support - :id: feat_req__lifecycle__support_secpol_type +.. feat_req:: Conditional launch polling interval + :id: feat_req__lifecycle__polling_interval :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for launching a process with a given security policy. + The :term:`Launch Manager` shall provide support for per condition configurable + :term:`Polling Interval` for launch conditions to be checked. - -.. feat_req:: supplementary group support - :id: feat_req__lifecycle__supplementary_groups +.. feat_req:: Pre-start validation + :id: feat_req__lifecycle__validate_conditions :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for launching a process with a given set of supplementary groups. - + The Launch Manager shall be able to validate the pre-start conditions of the executable using the conditions. -.. feat_req:: Scheduling support - :id: feat_req__lifecycle__scheduling_policy +.. feat_req:: post-start validation + :id: feat_req__lifecycle__validation_conditions :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for launching a process with certain scheduling policy. - + The Launch Manager shall be able to validate the start of the executable using the conditions. -.. feat_req:: CPU runmask support - :id: feat_req__lifecycle__runmask_support +.. feat_req:: Launched Process status + :id: feat_req__lifecycle__launcher_status_storage :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for launching a process with a given runmask. - + The Launch Manager shall provide a way to store the status of the launched process. -.. feat_req:: ASLR support - :id: feat_req__lifecycle__aslr_support +.. feat_req:: Condition check based on status + :id: feat_req__lifecycle__condition_check_method :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for launching process with ASLR (Address Space Layout Randomization). - + The Launch Manager shall provide a method for condition check based on process state. -.. feat_req:: ressource limit support - :id: feat_req__lifecycle__process_rlimit_support +.. feat_req:: Configuration of action based on condition evaluation + :id: feat_req__lifecycle__config_actions_cond :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for launching a process with a given set of system resource limits (rlimit). - + The Launch Manager shall provide a way to configure actions based on condition evaluation i.e. to be able to configure SUCCESS and FAILURE case. -.. feat_req:: process detach from parent support - :id: feat_req__lifecycle__detach_parent_process +.. feat_req:: Condition check based on path + :id: feat_req__lifecycle__path_condition_check :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for launching a process to detach from parent. - + The Launch Manager shall provide a method for condition check for a path. -.. feat_req:: Critical process support - :id: feat_req__lifecycle__critical_processes +.. feat_req:: Condition check based on ENV + :id: feat_req__lifecycle__env_variable_cond_check :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for launching a process as a critical process. - + The Launch Manager shall provide a method for condition check for environment variable. -.. feat_req:: Process adoption - :id: feat_req__lifecycle__running_processes +.. feat_req:: Condition check based on all dependency + :id: feat_req__lifecycle__dependency_check :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall adopt already running processes. - + The Launch Manager shall provide a method to check if all dependencies have been executed. -.. feat_req:: Dropping process responsibility - :id: feat_req__lifecycle__drop_supervsion +.. feat_req:: Condition check based on at least one dependency + :id: feat_req__lifecycle__check_dependency_exec :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support to dropping all surveillance and failure reaction activities of processes. + The Launch Manager shall provide a method to check if at least one dependency has been executed. +.. feat_req:: Condition check for each SWC its dependencies + :id: feat_req__lifecycle__define_swc_dependencies + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__execution_model__processes + :status: invalid -.. feat_req:: Multiple instance of executable - :id: feat_req__lifecycle__multi_start_support + The Launch Manager shall provide a way to define for each :term:`SWC` (Software Components), its dependencies. + +.. feat_req:: Condition check for each SWC its stop sequence + :id: feat_req__lifecycle__stop_sequence :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The Launch Manager shall permit an executable to be launched more than once. + The Launch Manager shall provide a way to define the stop sequence for each :term:`SWC` (Software Components). +Process Management +------------------ -.. feat_req:: Pre-start validation - :id: feat_req__lifecycle__validate_conditions +.. feat_req:: Process adoption + :id: feat_req__lifecycle__running_processes :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The Launch Manager shall be able to validate the pre-start conditions of the executable using the conditions. - + The :term:`Launch Manager` shall be able to adopt already running :term:`Processes <Process>`. -.. feat_req:: post-start validation - :id: feat_req__lifecycle__validation_conditions +.. feat_req:: Dropping process responsibility + :id: feat_req__lifecycle__drop_supervsion :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The Launch Manager shall be able to validate the start of the executable using the conditions. + The :term:`Launch Manager` shall provide support to dropping all surveillance + and failure reaction activities of :term:`Processes <Process>`. -.. feat_req:: Managing an externally started process - :id: feat_req__lifecycle__process_ownership +.. feat_req:: Multiple instance of executable + :id: feat_req__lifecycle__multi_start_support :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The Launch Manager shall be able to own an externally started process. + The Launch Manager shall permit an executable to be launched more than once. .. feat_req:: Invalid dependency :id: feat_req__lifecycle__consistent_dependencies :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid @@ -468,7 +496,7 @@ Launching Processes :id: feat_req__lifecycle__stop_process_dependents :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid @@ -479,79 +507,68 @@ Launching Processes :id: feat_req__lifecycle__stop_order_spec :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid The Launch Manager shall permit the stop order of non-dependent processes to be specified. -.. feat_req:: OCI ompliant +.. feat_req:: OCI Compliant :id: feat_req__lifecycle__oci_compliant :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :status: invalid :satisfies: stkh_req__overall_goals__enable_cooperation - The Launch Manager shall be complient to the `OCI Specfication v1.2.0 < https://github.com/opencontainers/runtime-spec/releases/tag/v1.2.0>` + The Launch Manager shall be compliant to the `OCI Specification v1.2.0 <https://github.com/opencontainers/runtime-spec/releases/tag/v1.2.0>`__. -Groups -...... +Run targets +----------- -.. feat_req:: named group - :id: feat_req__lifecycle__named_group_executables +.. feat_req:: Run target support + :id: feat_req__lifecycle__run_target_support :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The Launch Manager shall permit to represent a set of executables as a named group. - + The :term:`Launch Manager` shall provide support for :term:`run targets <Run target>` to define + collections of :term:`Processes <Process>` that can be launched together. -.. feat_req:: Launching group - :id: feat_req__lifecycle__start_named_group_exe +.. feat_req:: Launching run target + :id: feat_req__lifecycle__start_named_run_target :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The Launch Manager shall be able to start a named group of executables. + The :term:`Launch Manager` shall be able to start a named :term:`Run target`. - -.. feat_req:: Stopping group - :id: feat_req__lifecycle__stop_group_executables +.. feat_req:: Switch between run targets + :id: feat_req__lifecycle__switch_run_targets :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The Launch Manager shall be able to stop a named group of executables. - - -.. feat_req:: start group launch - :id: feat_req__lifecycle__launcher_start_group - :reqtype: Functional - :security: NO - :safety: ASIL_D - :satisfies: stkh_req__execution_model__processes - :status: invalid - - The Launch Manager shall be able to start a named group when the launcher is started. - + The :term:`Launch Manager` shall be able to switch between different :term:`run targets <Run target>`. .. feat_req:: Process state :id: feat_req__lifecycle__process_state_comm :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The Launch Manager shall have a means for the launched processes to communicate a state, which represents the launched processes' internal state, to the launcher. + The :term:`Launch Manager` shall have a means for the launched :term:`Processes <Process>` + to communicate a state, which represents the launched processes' internal state, + to the launcher. Terminating Processes @@ -561,346 +578,337 @@ Terminating Processes :id: feat_req__lifecycle__configurable_timeout :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for configurable timeout interval to wait for the process to be stopped. - + The :term:`Launch Manager` shall provide support for configurable timeout + :term:`Interval` to wait for the process to be stopped. .. feat_req:: Terminating process :id: feat_req__lifecycle__process_termination :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for terminating processes. - + The :term:`Launch Manager` shall provide support for terminating :term:`Processes <Process>`. .. feat_req:: Handling process dependency in termination :id: feat_req__lifecycle__terminationn_dependency :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall terminate the processes based on the dependency order. + The :term:`Launch Manager` shall terminate the :term:`Processes <Process>` based on the + dependency order. -.. feat_req:: Configurable delay between SIGTERM and SIGKILL +.. feat_req:: Configurable delay between SIGTERM and SIGKILL :id: feat_req__lifecycle__time_to_wait_config :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The time to wait, before SIGKILL is sent shall be configurable. In case "0" is stated, the SIGKILL shall be sent immediatelly. + The time to wait, before SIGKILL is sent shall be configurable. In case "0" is + stated, the SIGKILL shall be sent immediately. - -.. feat_req:: normal shutdown +.. feat_req:: Normal shutdown :id: feat_req__lifecycle__launch_manager_shutdown :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall support normal shutdown by terminating all process in the dependency order. + The :term:`Launch Manager` shall support normal shutdown by terminating all + process in the dependency order. -.. feat_req:: slow shutdown +.. feat_req:: Slow shutdown :id: feat_req__lifecycle__slow_shutdown_support :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall support slow shutdown by terminating the processes in the dependency order. - + The :term:`Launch Manager` shall support slow shutdown by terminating the + :term:`Processes <Process>` in the dependency order. -.. feat_req:: fast shutdown +.. feat_req:: Fast shutdown :id: feat_req__lifecycle__fast_shutdown_support :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall support fast shutdown by terminating itself without affecting the started processes. - + The :term:`Launch Manager` shall support fast shutdown by terminating itself + without affecting the started :term:`Processes <Process>`. .. feat_req:: Launch Manager shutdown :id: feat_req__lifecycle__launcher_exit_shutdown :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The Launch Manager shall exit after performing shutdown operation by stopping all the processes it owns in the dependency order when requested. - + The :term:`Launch Manager` shall exit after performing shutdown operation by + stopping all the :term:`Processes <Process>` it owns in the dependency order when requested. -.. feat_req:: Configurable delay between SIGTERM and SIGKILL +.. feat_req:: Shutdown signal handling :id: feat_req__lifecycle__shutdown_signal :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall implement a shutdown by sending a SIGTERM to the process. In case the process does not terminate itself, a SIGKILL shall be sent. + The :term:`Launch Manager` shall implement a shutdown by sending a SIGTERM to + the process. In case the process does not terminate itself, a SIGKILL shall be sent. Control Interface ----------------- -.. feat_req:: control commands +.. feat_req:: Control commands :id: feat_req__lifecycle__control_commands :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for commands to control component states. + The :term:`Launch Manager` shall provide support for commands to control + component states. - -.. feat_req:: query commands +.. feat_req:: Query commands :id: feat_req__lifecycle__query_commands :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for commands to query component states. + The :term:`Launch Manager` shall provide support for commands to query component + states. -.. feat_req:: Report "started/running/degraded" +.. feat_req:: Report "started/running/degraded" :id: feat_req__lifecycle__controlif_status :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall be able to report status on components via the control interface. - Note: - status can be "started/running/degraded" - refer to documentation for details + The :term:`Launch Manager` shall be able to report status on components via the + :term:`Control Interface`. + Note: status can be "started/running/degraded" - refer to documentation for details -.. feat_req:: request group launch - :id: feat_req__lifecycle__request_group_launch +.. feat_req:: Request run target launch + :id: feat_req__lifecycle__request_run_target_start :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The Launch Manager shall be able to start a named group respecting the dependencies when requested. - - -.. feat_req:: request group stop - :id: feat_req__lifecycle__request_group_stop - :reqtype: Functional - :security: NO - :safety: ASIL_D - :satisfies: stkh_req__execution_model__processes - :status: invalid - - The Launch Manager shall be able to stop a named group respecting the dependencies when requested. - - -.. feat_req:: request group restart - :id: feat_req__lifecycle__request_group_restart - :reqtype: Functional - :security: NO - :safety: ASIL_D - :satisfies: stkh_req__execution_model__processes - :status: invalid - - The Launch Manager shall be able to restart a named group respecting the dependencies when requested. + The :term:`Launch Manager` shall be able to start a named :term:`Run target` respecting the + dependencies when requested. Monitoring, Notification and Recovery ------------------------------------- -.. feat_req:: process crash monitoring +.. feat_req:: Process crash monitoring :id: feat_req__lifecycle__monitor_abnormal_term :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for monitoring abnormal termination of processes. - + The :term:`Launch Manager` shall provide support for monitoring abnormal + termination of :term:`Processes <Process>`. -.. feat_req:: process state notification +.. feat_req:: Process state notification :id: feat_req__lifecycle__ext_monitor_notify :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for external monitors to get notified on process life status. + The :term:`Launch Manager` shall provide support for external monitors to get + notified on process life status. -.. feat_req:: recovery action +.. feat_req:: Recovery action :id: feat_req__lifecycle__recovery_action_support :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall support recovery action for the abnormally terminated processes. + The :term:`Launch Manager` shall support :term:`Recovery Action` for the + abnormally terminated :term:`Processes <Process>`. - -.. feat_req:: Restart of named group as recovery action - :id: feat_req__lifecycle__recover_group +.. feat_req:: Run target switch as recovery action + :id: feat_req__lifecycle__recov_run_target_switch :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall support a restart of a named group as recovery method in case a single process out of that group terminated abnormally or lost its liveliness. - + The :term:`Launch Manager` shall support switching to a different :term:`Run target` as + recovery action in case a single process terminated abnormally or lost its + :term:`Liveliness`. .. feat_req:: Monitoring and recovery: watchdog support :id: feat_req__lifecycle__smart_watchdog_config :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall support smart watchdog, configurable per process. + The :term:`Launch Manager` shall support a smart :term:`Watchdog`, configurable + per process. -.. feat_req:: Monitoring and recovery: recovery wait time +.. feat_req:: Monitoring and recovery: recovery wait time :id: feat_req__lifecycle__configurable_wait_time :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for configurable wait time that shall elapse before repeating recovery action. - + The :term:`Launch Manager` shall provide support for configurable wait time + that shall elapse before repeating :term:`Recovery Action`. .. feat_req:: Monitoring and recovery: adopted process monitoring :id: feat_req__lifecycle__monitoring_processes :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall provide support for monitoring adopted processes. + The :term:`Launch Manager` shall provide support for monitoring adopted + :term:`Processes <Process>`. - -.. feat_req:: process launch monitoring +.. feat_req:: Process launch monitoring :id: feat_req__lifecycle__failure_detect :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The Launch Manager shall be able to detect and react to failure of the process launch. - + The :term:`Launch Manager` shall be able to detect and react to failure of the + process launch. .. feat_req:: Process liveliness detection :id: feat_req__lifecycle__liveliness_detection :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The Launch Manager shall be able to detect and react to loss of liveliness of the processes it owns. + The :term:`Launch Manager` shall be able to detect and react to loss of + :term:`Liveliness` of the :term:`Processes <Process>` it owns. - -.. feat_req:: process monitoring +.. feat_req:: Process monitoring :id: feat_req__lifecycle__process_monitoring :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The Launch Manager shall monitor the state of the processes as specified by the set of executables. + The :term:`Launch Manager` shall monitor the state of the :term:`Processes <Process>` as + specified by the set of executables. .. feat_req:: Recovery :id: feat_req__lifecycle__process_failure_react :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The Launch Manager shall be able to react to a process failure by optionally performing one of relaunching the process, stopping the process, stopping the process and starting another process, or triggering QOS) Device Safe State (DSS).QNX Operating System ( - + The :term:`Launch Manager` shall be able to react to a process failure by + optionally performing one of relaunching the process, stopping the process, + stopping the process and starting another process, or triggering :term:`QNX` + :term:`Operating System` (:term:`QOS`) Device Safe State (:term:`DSS`). .. feat_req:: Multi-instance :id: feat_req__lifecycle__multi_instance_support :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The Launch Manager shall be able to run in multiple instances with its own configurations on a system. - + The :term:`Launch Manager` shall be able to run in multiple instances with its + own configurations on a system. .. feat_req:: Launch manager self health check :id: feat_req__lifecycle__lm_self_health_check :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall implement time based cyclical monitoring of itself. + The :term:`Launch Manager` shall implement time based cyclical monitoring of itself. .. feat_req:: Launch manager external watchdog notification :id: feat_req__lifecycle__lm_ext_watchdog_notify :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall trigger a notification to an external watchdog for each successful self monitoring test execution. + The :term:`Launch Manager` shall trigger a notification to an external + :term:`Watchdog` for each successful self monitoring test execution. .. feat_req:: Launch manager external watchdog notification - failed test :id: feat_req__lifecycle__lm_ext_wdg_failed_test :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall not trigger an external watchdog notification if an internal health check failed. + The :term:`Launch Manager` shall not trigger an external :term:`Watchdog` + notification if an internal health check failed. .. feat_req:: Launch manager external monitoring configuration :id: feat_req__lifecycle__lm_ext_watchdog_cfg :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid - The launch manager shall support configuring the interval of the internal health check executions + The :term:`Launch Manager` shall support configuring the :term:`Interval` of + the internal health check executions. Logging ------- @@ -909,44 +917,45 @@ Logging :id: feat_req__lifecycle__slog2_logging :reqtype: Functional :security: NO - :safety: ASIL_D - :satisfies: stkh_req__execution_model__processes + :safety: ASIL_B + :satisfies: stkh_req__dev_experience__logging_support :status: invalid - The launch manager shall support slog2 and a logging file as logging destinations. - + The :term:`Launch Manager` shall support OS specific logging facilities to analyze the early + boot sequence. .. feat_req:: Logging state transitions :id: feat_req__lifecycle__process_logging_support :reqtype: Functional :security: NO - :safety: ASIL_D - :satisfies: stkh_req__execution_model__processes + :safety: ASIL_B + :satisfies: stkh_req__dev_experience__logging_support :status: invalid - The launch manager shall provide support for logging process launches, processes exit/recovery, internal tasks, and interaction with external monitor. - + The :term:`Launch Manager` shall provide support for logging process launches, + :term:`Processes <Process>` exit/recovery, internal tasks, and interaction with external monitor. .. feat_req:: Logging timestamp :id: feat_req__lifecycle__log_timestamp :reqtype: Functional :security: NO - :safety: ASIL_D - :satisfies: stkh_req__execution_model__processes + :safety: ASIL_B + :satisfies: stkh_req__dev_experience__logging_support :status: invalid - The launch manager logs shall contain timestamp information. + The :term:`Launch Manager` logs shall contain timestamp information. .. feat_req:: Logging DAG :id: feat_req__lifecycle__dag_logging_controlif :reqtype: Functional :security: NO - :safety: ASIL_D - :satisfies: stkh_req__execution_model__processes + :safety: ASIL_B + :satisfies: stkh_req__dev_experience__logging_support :status: invalid - The launch manager shall provide the possibility to log the DAG in an human readable format, triggered via control interface. + The :term:`Launch Manager` shall provide the possibility to log the :term:`DAG` + in a human readable format, triggered via :term:`Control Interface`. .. feat_req:: Configuration dependency view @@ -966,17 +975,17 @@ Configuration file :id: feat_req__lifecycle__modular_config_support :reqtype: Functional :security: NO - :safety: ASIL_D - :satisfies: stkh_req__execution_model__processes + :safety: ASIL_B + :satisfies: stkh_req__functional_req__file_based :status: invalid The launch manager shall provide modular configuration file support to configure process attributes. .. feat_req:: Runtime configuration compliance - :id: feat_req__lifecycle__config_support_oci + :id: feat_req__lifecycle__runtime_config_compat :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid @@ -987,29 +996,30 @@ Configuration file :id: feat_req__lifecycle__session_extension :reqtype: Functional :security: NO - :safety: ASIL_D - :satisfies: stkh_req__execution_model__processes + :safety: ASIL_B + :satisfies: stkh_req__functional_req__file_based :status: invalid - The launch manager shall provide support for extending already running session with additional new configuration file. - + The :term:`Launch Manager` shall provide support for extending already running + session with additional new configuration file. -.. feat_req:: Module support +.. feat_req:: Module support :id: feat_req__lifecycle__clustering_modules_supp :reqtype: Functional :security: NO - :safety: ASIL_D - :satisfies: stkh_req__execution_model__processes + :safety: ASIL_B + :satisfies: stkh_req__functional_req__file_based :status: invalid - The launch manager shall provide support to clustering set of components as modules. + The :term:`Launch Manager` shall provide support to clustering set of components + as modules. -.. feat_req:: global process properties +.. feat_req:: Global process properties :id: feat_req__lifecycle__central_default_defines :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid @@ -1020,7 +1030,7 @@ Configuration file :id: feat_req__lifecycle__lazy_check :reqtype: Functional :security: NO - :safety: ASIL_D + :safety: ASIL_B :satisfies: stkh_req__execution_model__processes :status: invalid @@ -1047,105 +1057,3 @@ Configuration file :status: invalid The Launch Manager shall have a means to validate the configuration offline. - - -Condition Check ---------------- - -.. feat_req:: Launched Process status - :id: feat_req__lifecycle__launcher_status_storage - :reqtype: Functional - :security: NO - :safety: ASIL_D - :satisfies: stkh_req__execution_model__processes - :status: invalid - - The Launch Manager shall provide a way to store the status of the launched process. - - -.. feat_req:: Condition check based on status - :id: feat_req__lifecycle__condition_check_method - :reqtype: Functional - :security: NO - :safety: ASIL_D - :satisfies: stkh_req__execution_model__processes - :status: invalid - - The Launch Manager shall provide a method for condition check based on process state. - - -.. feat_req:: Configuration of action based on condition evaluation - :id: feat_req__lifecycle__config_actions_cond - :reqtype: Functional - :security: NO - :safety: ASIL_D - :satisfies: stkh_req__execution_model__processes - :status: invalid - - The Launch Manager shall provide a way to configure actions based on condition evaluation i.e. to be able to configure SUCCESS and FAILURE case. - - -.. feat_req:: Condition check based on path - :id: feat_req__lifecycle__path_condition_check - :reqtype: Functional - :security: NO - :safety: ASIL_D - :satisfies: stkh_req__execution_model__processes - :status: invalid - - The Launch Manager shall provide a method for condition check for a path. - - -.. feat_req:: Condition check based on ENV - :id: feat_req__lifecycle__env_variable_cond_check - :reqtype: Functional - :security: NO - :safety: ASIL_D - :satisfies: stkh_req__execution_model__processes - :status: invalid - - The Launch Manager shall provide a method for condition check for environment variable. - - -.. feat_req:: Condition check based on all dependency - :id: feat_req__lifecycle__dependency_check - :reqtype: Functional - :security: NO - :safety: ASIL_D - :satisfies: stkh_req__execution_model__processes - :status: invalid - - The Launch Manager shall provide a method to check if all dependency has been executed. - - -.. feat_req:: Condition check based on at least one dependency - :id: feat_req__lifecycle__check_dependency_exec - :reqtype: Functional - :security: NO - :safety: ASIL_D - :satisfies: stkh_req__execution_model__processes - :status: invalid - - The Launch Manager shall provide a method to check if at least one dependency has been executed. - - -.. feat_req:: Condition check for each SWC its dependencies - :id: feat_req__lifecycle__define_swc_dependencies - :reqtype: Functional - :security: NO - :safety: ASIL_D - :satisfies: stkh_req__execution_model__processes - :status: invalid - - The Launch Manager shall provide a way to define for each SWC), its dependencies.Software Components ( - - -.. feat_req:: Condition check for each SWC its stop sequence - :id: feat_req__lifecycle__stop_sequence - :reqtype: Functional - :security: NO - :safety: ASIL_D - :satisfies: stkh_req__execution_model__processes - :status: invalid - - The Launch Manager shall provide a way to define the stop sequence for each Software Components (SWC). diff --git a/docs/modules/lifecycle/index.rst b/docs/modules/lifecycle/index.rst new file mode 100644 index 0000000000..7f6078aafd --- /dev/null +++ b/docs/modules/lifecycle/index.rst @@ -0,0 +1,59 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +Lifecycle +========= + + +.. mod_view_sta:: Lifecycle + :id: mod_view_sta__lifecycle__modules + :includes: comp_arc_sta__lifecycle__launch_manager, comp_arc_sta__lifecycle__healthmonitor + + .. needarch:: + :scale: 50 + :align: center + + {{ draw_module(need(), needs) }} + +.. comp_arc_sta:: Launch Manager + :id: comp_arc_sta__lifecycle__launch_manager + :status: valid + :safety: ASIL_B + :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: + + .. needarch:: + :scale: 50 + :align: center + + {{ draw_component(need(), needs) }} + +.. comp_arc_sta:: Health Monitor + :id: comp_arc_sta__lifecycle__healthmonitor + :status: valid + :safety: ASIL_B + :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: + + .. needarch:: + :scale: 50 + :align: center + + {{ draw_component(need(), needs) }} diff --git a/docs/modules/os/libc/docs/architecture/index.rst b/docs/modules/os/libc/docs/architecture/index.rst index 4a0094d9c9..a98af055d3 100644 --- a/docs/modules/os/libc/docs/architecture/index.rst +++ b/docs/modules/os/libc/docs/architecture/index.rst @@ -21,7 +21,7 @@ libc Component Architecture :safety: ASIL_B :status: valid :satisfies: - :implements: logic_arc_int__os__fcntl, logic_arc_int__os__stat, logic_arc_int__os__mmap + :implements: logic_arc_int__os__fcntl, logic_arc_int__os__stat, logic_arc_int__os__mmap, logic_arc_int__os__fork .. 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 8ddfb8b33a..dc8bce3c8d 100644 --- a/docs/modules/os/message_passing/docs/architecture/index.rst +++ b/docs/modules/os/message_passing/docs/architecture/index.rst @@ -40,6 +40,18 @@ Message Passing Component Architecture {{ draw_interface(need(), needs) }} +.. logic_arc_int:: OS::fork + :id: logic_arc_int__os__fork + :security: YES + :safety: ASIL_B + :status: valid + + .. needarch:: + :scale: 50 + :align: center + + {{ draw_interface(need(), needs) }} + .. logic_arc_int_op:: Reply :id: logic_arc_int_op__os__reply :security: YES From ccdb731d646cddde6ec243e390a66cb27404c4e6 Mon Sep 17 00:00:00 2001 From: Zoran Cutura <zoran.cutura@etas.com> Date: Mon, 7 Jul 2025 12:57:14 +0000 Subject: [PATCH 071/109] some_ip_gateway: overview SOME/IP gateway some_ip_gateway: corrected bullet list corrected the bullet list in the abstract some_ip_gateway: more detailed architecture added a deeper overview on architecture and discussion about introduction of additional processes and communication channel between SOME/IP service and rest of gateway. some_ip_gateway: added architecture drawings added overview drawing on SOME/IP gateway added draft of drawing on detailed architecture some_ip_gateway: adapted references to requirements added references to communication requirements that shall be fulfilled. some_ip_gateway: adding references to existing requirements added references to requirements from IPC. some_ip_gateway: Cleanup after rebase now building with github_plages__release target. Some referred requirements are not in IPC any more and need to be replaced. Commented out! some_ip_gateway: initial draft Drafting the SOME-IP-Gateway feature in very first version extending first draft of some/ip gateway Added more standard chapters Added Rationale paragraph started adding security topics docs dont build yet removing problems when building docs. Still does not build renamed directory to match s-core constraints adapted Specs for plug-in --- docs/features/communication/index.rst | 1 + .../some_ip_gateway/architecture/index.rst | 57 ++ .../some_ip_gateway_architecture.drawio.svg | 439 ++++++++++++++ .../some_ip_gateway_details.drawio.svg | 552 ++++++++++++++++++ .../communication/some_ip_gateway/index.rst | 136 +++++ .../some_ip_gateway/requirements/index.rst | 50 ++ 6 files changed, 1235 insertions(+) create mode 100644 docs/features/communication/some_ip_gateway/architecture/index.rst create mode 100644 docs/features/communication/some_ip_gateway/architecture/some_ip_gateway_architecture.drawio.svg create mode 100644 docs/features/communication/some_ip_gateway/architecture/some_ip_gateway_details.drawio.svg create mode 100644 docs/features/communication/some_ip_gateway/index.rst create mode 100644 docs/features/communication/some_ip_gateway/requirements/index.rst diff --git a/docs/features/communication/index.rst b/docs/features/communication/index.rst index f432f03ba7..5270d68d46 100644 --- a/docs/features/communication/index.rst +++ b/docs/features/communication/index.rst @@ -30,6 +30,7 @@ Communication docs/**/index ipc/index + some_ip_gateway/index Feature flag ============ diff --git a/docs/features/communication/some_ip_gateway/architecture/index.rst b/docs/features/communication/some_ip_gateway/architecture/index.rst new file mode 100644 index 0000000000..2ee6edec76 --- /dev/null +++ b/docs/features/communication/some_ip_gateway/architecture/index.rst @@ -0,0 +1,57 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +.. _some_ip_gateway_architecture: + +SOME/IP Gateway Architecture +############################ + +.. note:: + For now we store the component architecture in the feature tree, because multi-repo docs are not yet supported. + Once this support becomes available the component architecture will be moved to the module. + +.. toctree:: + :titlesonly: + +SOME/IP Gateway on one side is a regular participant in IPC and uses the according mechanisms to publish +data or to subscribe to data. As such it will need to know and understand the data types that are used in +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. + +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 +that might be independent of the rest of the gateway. But buffering / queuing of messages, events, signals +should be mostly freely programmable by integrators using the SOME/IP gateway. + + +.. figure:: some_ip_gateway_architecture.drawio.svg + :align: center + :name: _some_ip_gateway_architecture + + General overview of SOME/IP Gateway + + +SOME/IP stacks as supplied by AUTOSAR 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. +It is preferred to avoid such additional IPC. + +.. figure:: some_ip_gateway_details.drawio.svg + :align: center + :name: _some_ip_gateway_details + + Detailed components view of SOME/IP Gateway diff --git a/docs/features/communication/some_ip_gateway/architecture/some_ip_gateway_architecture.drawio.svg b/docs/features/communication/some_ip_gateway/architecture/some_ip_gateway_architecture.drawio.svg new file mode 100644 index 0000000000..b0c8ee75ff --- /dev/null +++ b/docs/features/communication/some_ip_gateway/architecture/some_ip_gateway_architecture.drawio.svg @@ -0,0 +1,439 @@ +<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="760px" height="760px" viewBox="-0.5 -0.5 760 760" content="<mxfile><diagram name="Seite-1" id="lhOZF3YuWmg6ZXFho8TY">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</diagram></mxfile>"> + <defs/> + <g> + <g> + <rect x="0" y="0" width="760" height="760" fill="none" stroke="none" pointer-events="all"/> + </g> + <g> + <rect x="240" y="240" width="300" height="340" rx="15" ry="15" fill="#bac8d3" stroke="#23445d" pointer-events="all" style="fill: light-dark(rgb(186, 200, 211), rgb(57, 69, 78)); stroke: light-dark(rgb(35, 68, 93), rgb(160, 188, 210));"/> + </g> + <g> + <ellipse cx="385" cy="170" rx="175" ry="80" fill="none" stroke="#000000" 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 center; width: 348px; height: 1px; padding-top: 170px; margin-left: 211px;"> + <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 + <br/> + mw::com + </div> + </div> + </div> + </foreignObject> + <text x="385" y="174" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IPC... + </text> + </switch> + </g> + </g> + <g> + <rect x="250" y="50" width="80" 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: 78px; height: 1px; padding-top: 85px; 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="290" y="89" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IPC... + </text> + </switch> + </g> + </g> + <g> + <rect x="460" y="290" width="140" height="30" fill="none" stroke="none" transform="rotate(90,530,305)" pointer-events="all"/> + </g> + <g> + <g transform="translate(-0.5 -0.5)rotate(90 530 305)"> + <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: 305px; margin-left: 461px;"> + <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> + SOME/IP Gateway + </b> + </div> + </div> + </div> + </foreignObject> + <text x="530" y="309" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + SOME/IP Gateway + </text> + </switch> + </g> + </g> + <g> + <rect x="260" y="326" width="260" 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: 258px; height: 1px; padding-top: 356px; margin-left: 261px;"> + <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="390" y="360" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Gateway Logic & Configuration + </text> + </switch> + </g> + </g> + <g> + <rect x="400" y="480" 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: 521px; margin-left: 401px;"> + <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/> + communication + <div> + stack + </div> + </div> + </div> + </div> + </foreignObject> + <text x="460" y="525" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + SOME/IP... + </text> + </switch> + </g> + </g> + <g> + <rect x="260" y="480" width="120" 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: 118px; height: 1px; padding-top: 510px; margin-left: 261px;"> + <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> + </div> + </div> + </foreignObject> + <text x="320" y="514" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + End-to-End... + </text> + </switch> + </g> + </g> + <g> + <rect x="310" y="240" 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: 275px; margin-left: 311px;"> + <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="385" y="279" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IPC... + </text> + </switch> + </g> + </g> + <g> + <rect x="414" y="40" width="80" 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: 78px; height: 1px; padding-top: 75px; margin-left: 415px;"> + <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="454" y="79" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IPC... + </text> + </switch> + </g> + </g> + <g> + <rect x="540" y="135" width="80" 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: 78px; height: 1px; padding-top: 170px; margin-left: 541px;"> + <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="580" y="174" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IPC... + </text> + </switch> + </g> + </g> + <g> + <rect x="160" y="150" width="80" 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: 78px; height: 1px; padding-top: 185px; margin-left: 161px;"> + <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="200" y="189" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IPC... + </text> + </switch> + </g> + </g> + <g> + <rect x="260" y="400" width="260" 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: 258px; height: 1px; padding-top: 430px; margin-left: 261px;"> + <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="390" y="434" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Payload Transformation + </text> + </switch> + </g> + </g> + <g> + <path d="M 160 320 L 303.9 276.83" 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 308.93 275.32 L 303.23 280.69 L 303.9 276.83 L 301.22 273.98 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 158.48 270 L 158.48 390 L 10 390 L 10 250 L 137.27 250 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 137.27 250 C 139 254.68 136.16 259.5 129.7 262.86 L 158.48 270.43" 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 center; width: 148px; height: 1px; padding-top: 320px; margin-left: 11px;"> + <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 Gateway is a regular IPC participant - + <br/> + it publishes data and subscribes to data exchanged on IPC + </div> + </div> + </div> + </foreignObject> + <text x="85" y="324" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + SOME/IP Gateway is a regu... + </text> + </switch> + </g> + </g> + <g> + <path d="M 708.89 290 L 708.89 410 L 600 410 L 600 270 L 693.33 270 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 693.33 270 C 694.6 274.68 692.52 279.5 687.78 282.86 L 708.89 290.43" 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 center; width: 108px; height: 1px; padding-top: 340px; margin-left: 601px;"> + <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 Gateway is a single process on the operating system and may be part of other frameworks, ie. FEO + </div> + </div> + </div> + </foreignObject> + <text x="655" y="344" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + SOME/IP Gateway is... + </text> + </switch> + </g> + </g> + <g> + <path d="M 600 351.39 L 546.54 362.47" 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.39 363.53 L 547.54 358.69 L 546.54 362.47 L 548.96 365.54 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 210 429.4 L 256.41 361.26" 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 259.37 356.92 L 258.32 364.68 L 256.41 361.26 L 252.54 360.74 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 208.38 421.43 L 208.38 550 L 50 550 L 50 400 L 185.76 400 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 185.76 400 C 187.6 405.01 184.57 410.18 177.68 413.78 L 208.38 421.89" 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 center; width: 158px; height: 1px; padding-top: 475px; margin-left: 51px;"> + <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 configures IPC participation with events, signals, messages tobe received from IPC and sent to SOME/IP network. + <br/> + Vice versa it passed events, signals, messages from the network to IPC. + </div> + </div> + </div> + </foreignObject> + <text x="130" y="479" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Gateway Logic configures I... + </text> + </switch> + </g> + </g> + <g> + <path d="M 588.54 580 L 524.83 525.15" 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 520.85 521.73 L 528.44 523.64 L 524.83 525.15 L 523.87 528.95 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 688.89 591.43 L 688.89 660 L 580 660 L 580 580 L 673.33 580 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 673.33 580 C 674.6 582.67 672.52 585.43 667.78 587.35 L 688.89 591.67" 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 center; width: 108px; height: 1px; padding-top: 620px; margin-left: 581px;"> + <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; "> + Implementation of services for communication on the network + <span style="font-family: monospace; font-size: 0px; text-align: start; text-wrap-mode: nowrap;"> + %3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22SOME%2FIP%20Gateway%20is%20a%20single%20process%20on%20the%20operating%20system%20and%20may%20be%20part%20of%20other%20frameworks%2C%20ie.%20FEO%22%20style%3D%22whiteSpace%3Dwrap%3Bhtml%3D1%3Bshape%3Dmxgraph.basic.document%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22600%22%20y%3D%22370%22%20width%3D%22110%22%20height%3D%22140%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E + </span> + </div> + </div> + </div> + </foreignObject> + <text x="635" y="624" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Implementation of... + </text> + </switch> + </g> + </g> + <g> + <path d="M 275 630 L 317.15 545.7" 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 319.5 541 L 319.5 548.83 L 317.15 545.7 L 313.24 545.7 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 328.89 645.71 L 328.89 740 L 220 740 L 220 630 L 313.33 630 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 313.33 630 C 314.6 633.68 312.52 637.47 307.78 640.1 L 328.89 646.05" 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 center; width: 108px; height: 1px; padding-top: 685px; margin-left: 221px;"> + <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; "> + Baselib with polynoms for E2E-protection + </div> + </div> + </div> + </foreignObject> + <text x="275" y="689" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Baselib with polyn... + </text> + </switch> + </g> + </g> + <g> + <path d="M 600 485 L 525.7 447.85" 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 521 445.5 L 528.83 445.5 L 525.7 447.85 L 525.7 451.76 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 708.89 456.43 L 708.89 525 L 600 525 L 600 445 L 693.33 445 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 693.33 445 C 694.6 447.67 692.52 450.43 687.78 452.35 L 708.89 456.67" 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 center; width: 108px; height: 1px; padding-top: 485px; margin-left: 601px;"> + <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; "> + translates complex data type representation + </div> + </div> + </div> + </foreignObject> + <text x="655" y="489" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + translates complex... + </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/architecture/some_ip_gateway_details.drawio.svg b/docs/features/communication/some_ip_gateway/architecture/some_ip_gateway_details.drawio.svg new file mode 100644 index 0000000000..699817d6a9 --- /dev/null +++ b/docs/features/communication/some_ip_gateway/architecture/some_ip_gateway_details.drawio.svg @@ -0,0 +1,552 @@ +<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"> + <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="0" y="0" width="1080" height="660" 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> + <rect x="210" y="120" 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="710" y="120" 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: 135px; margin-left: 711px;"> + <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 Gateway + </div> + </div> + </div> + </foreignObject> + <text x="785" y="139" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + SOME/IP Gateway + </text> + </switch> + </g> + </g> + <g> + <rect x="230" y="150" 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="250" cy="130" rx="230" ry="70" fill="none" stroke="#000000" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <rect x="270" y="160" 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: 195px; margin-left: 271px;"> + <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="345" y="199" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IPC... + </text> + </switch> + </g> + </g> + <g> + <rect x="270" y="240" 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: 270px; margin-left: 271px;"> + <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="385" y="274" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Gateway Logic & Configuration + </text> + </switch> + </g> + </g> + <g> + <rect x="230" y="490" 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="325" y="520" 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: 561px; margin-left: 326px;"> + <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="385" y="565" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + SOME/IP... + </text> + </switch> + </g> + </g> + <g> + <rect x="630" y="380" width="120" 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: 118px; height: 1px; padding-top: 410px; margin-left: 631px;"> + <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 + <br/> + PlugIn + </div> + </div> + </div> + </foreignObject> + <text x="690" y="414" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + End-to-End... + </text> + </switch> + </g> + </g> + <g> + <rect x="270" y="310" 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: 340px; margin-left: 271px;"> + <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="385" y="344" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Payload Transformation + </text> + </switch> + </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));"/> + </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: 330px; margin-left: 631px;"> + <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 + <br/> + PlugIn + </div> + </div> + </div> + </foreignObject> + <text x="690" y="334" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Payload Transformati... + </text> + </switch> + </g> + </g> + <g> + <path d="M 500 330 L 540 330 L 562 330" 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 570 338 Q 562 338 562 330 Q 562 322 570 322" 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 630 330 L 575 330" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <ellipse cx="570" cy="330" 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="820" cy="335" rx="5" ry="5" fill="none" stroke="none" pointer-events="all"/> + </g> + <g> + <path d="M 630 345 L 540 345 L 540 409.66 L 562 409.66" 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 570 417.66 Q 562 417.66 562 409.66 Q 562 401.66 570 401.66" 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 630 409.66 L 575 409.66" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <ellipse cx="570" cy="409.66" 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="607.5" y="322.5" width="60" height="15" fill="#ffffff" stroke="#000000" transform="rotate(-90,637.5,330)" 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 637.5 330)"> + <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: 330px; margin-left: 609px;"> + <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="638" y="334" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IFC + </text> + </switch> + </g> + </g> + <g> + <rect x="607.5" y="402.5" width="60" height="15" fill="#ffffff" stroke="#000000" transform="rotate(-90,637.5,410)" 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 637.5 410)"> + <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: 410px; margin-left: 609px;"> + <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="638" y="414" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IFC + </text> + </switch> + </g> + </g> + <g> + <rect x="325" y="520" 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: 528px; margin-left: 326px;"> + <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="385" y="531" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IFC + </text> + </switch> + </g> + </g> + <g> + <rect x="680" y="40" 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: 55px; margin-left: 681px;"> + <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="750" y="59" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IFC = Interface + </text> + </switch> + </g> + </g> + <g> + <rect x="690" y="47.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: 55px; 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; "> + IFC + </div> + </div> + </div> + </foreignObject> + <text x="710" y="59" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IFC + </text> + </switch> + </g> + </g> + <g> + <rect x="220" 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: 221px;"> + <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="255" y="79" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IPC... + </text> + </switch> + </g> + </g> + <g> + <rect x="85" y="160" 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: 195px; margin-left: 86px;"> + <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="120" y="199" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IPC... + </text> + </switch> + </g> + </g> + <g> + <rect x="690" y="10" 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: 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 + </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 + </text> + </switch> + </g> + </g> + <g> + <rect x="110" 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: 111px;"> + <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="145" y="79" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + IPC... + </text> + </switch> + </g> + </g> + <g> + <rect x="556" y="490" 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: 510px; margin-left: 556px;"> + <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="794" y="514" 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="536" y="150" 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: 170px; 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; "> + << ASIL Process >>  1..n + </div> + </div> + </div> + </foreignObject> + <text x="794" y="174" 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 385 370 L 385 462" 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 377 470 Q 377 462 385 462 Q 393 462 393 470" 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 385 520 L 385 475" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <ellipse cx="385" cy="470" 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 980 300 L 980 320 Q 980 330 970 330 L 756.37 330" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="8 8" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + <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));"/> + </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: 270px; margin-left: 921px;"> + <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 + <br/> + Code Generator + </div> + </div> + </div> + </foreignObject> + <text x="980" y="274" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Payload Transformati... + </text> + </switch> + </g> + </g> + <g> + <path d="M 979.29 151.43 L 979.29 220 L 910 220 L 910 140 L 969.39 140 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 969.39 140 C 970.2 142.67 968.87 145.43 965.86 147.35 L 979.29 151.67" 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 center; width: 68px; height: 1px; padding-top: 180px; margin-left: 911px;"> + <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 interface description + </div> + </div> + </div> + </foreignObject> + <text x="945" y="184" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + SOME/IP int... + </text> + </switch> + </g> + </g> + <g> + <path d="M 1025 220 L 1013.82 234.91" 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 1010.67 239.11 L 1012.07 231.41 L 1013.82 234.91 L 1017.67 235.61 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 1059.29 151.43 L 1059.29 220 L 990 220 L 990 140 L 1049.39 140 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 1049.39 140 C 1050.2 142.67 1048.87 145.43 1045.86 147.35 L 1059.29 151.67" 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 center; width: 68px; height: 1px; padding-top: 180px; margin-left: 991px;"> + <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; "> + mw:com + <div> + <font style="color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"> + interface description (headers) + </font> + </div> + </div> + </div> + </div> + </foreignObject> + <text x="1025" y="184" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + mw:com... + </text> + </switch> + </g> + </g> + <g> + <path d="M 945 220 L 954.43 233.73" 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 957.41 238.06 L 950.56 234.27 L 954.43 233.73 L 956.33 230.31 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> + <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/index.rst b/docs/features/communication/some_ip_gateway/index.rst new file mode 100644 index 0000000000..b43996b99c --- /dev/null +++ b/docs/features/communication/some_ip_gateway/index.rst @@ -0,0 +1,136 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +.. _some_ip_gateway_feature: + +SOME/IP-Gateway +########################### + +.. document:: SOME_IP-Gateway + :id: doc__some_ip_gateway + :status: valid + :safety: ASIL_B + :tags: contribution_request, feature_request + + +.. toctree:: + :hidden: + + architecture/index.rst + requirements/index.rst + + +Feature flag +============ + +To activate this feature, use the following feature flag: + +``experimental_some-ip-gateway`` + +Abstract +======== + +This contribution describes how data-exchange that is outside the scope of internal communication (IPC) shall be handled in modules that service data-input and data-output to a platform. +Services handling data in this context can be considered as gateways. +The focus is on a gateway to handle SOME/IP communication with external devices or counterparts, therefore this feature request is called: SOME/IP-Gateway + +This feature request includes: + - A description of how a SOME/IP gateway service (or data broker) shall be implemented + - How the SOME/IP gateway services shall integrate with the zero-copy communication from IPC (which might become a general description of how services plug-in to the IPC context) + - How data shall be mapped or translated between SOME/IP protocol and IPC communication + +.. _Motivation: + +Motivation +========== + +S-CORE is targeting high-performance automotive systems with safety impact. Applications integrated on S-CORE will be distributed across multiple processes and frameworks (like FEO) +that schedule software components (i.e. activities) with the need to exchange data. +For data-exchange between applications the IPC feature is providing high-speed communication capabilities, but when it comes to communication with applications outside the scope of +the S-CORE platform, services are required that will handle protocols for communication with both side. This is for instance the case when communication with rest of vehicle or sensors +needs to be realized with the SOME/IP protocol. + +For software component developers it should be unrecognized that data is originated from a SOME/IP communication channel, the data should be provided with the same API as in IPC. +Nonetheless integrators and architects will have to configure the system to receive or send data over SOME/IP, hence provide it as a SOME/IP service. + + +.. _Rationale: + +Rationale +========== + +SOME/IP and IPC use different mechanisms to communicate on different channels. Applications integrating on S-CORE platform may have certain requirements to data-input that is not directly supported with SOME/IP and vice versa +SOME/IP definition may have requirements that cannot directly be supported by the application providing data on IPC. Therefor it's not only a task of this gateway +to adapt the communication, but also to translate data between the two communication channels and probably even fill data, i.e. when applications require new data that has not be received on SOME/IP or vice versa. + +Hence the gateway on the one side should act as a participant in IPC and fulfill all requirements to this accordingly, whereas on the other side it shall participate in SOME/IP communication +acting as a SOME/IP service fulfilling all SOME/IP requirements and defined communication. Between these two contexts developers shall be able to create signal or data mappings and +translate the different data-types and representations of the two contexts. + +The SOME/IP side shall, where possible, use an existing SOME/IP stack that is fully compatible and complying with the SOME/IP specification from AUTOSAR Adaptive. + +This module shall fulfill the following requirements: + - Multi-Binding support - :need:`feat_req__com__multi_binding_support` + - agnostic binding - :need:`feat_req__com__binding_agnostic_api` + - deployment configuration - :need:`feat_req__com__multi_binding_depl` + + +.. _Specification: + +Specification +============= + +SOME/IP Gateway protocol implementation +--------------------------------------- + +The protocol implementation shall be fully compatible and complying with the SOME/IP specification from AUTOSAR Adaptive. +Specifically the SOME/IP specification from AUTOSAR release 24-11 shall be supported by the SOME/IP Gateway. This shall guarantee that systems integrated with the SOME/IP gateway can be used in +Protocol implementations shall be wrapped in an abstraction API, that stays stable and allows implementations may be exchanged, potentially even by binary only libraries. + + + +SOME/IP Gateway Security Goals +------------------------------ + +As with IPC generally, the security approach for SOME/IP gateway shall achieve the following security goals: + +- confidentiality (:need:`feat_req__ipc__confidentiality`) +- integrity (:need:`feat_req__ipc__integrity`) +- availability (per criticality-level) (:need:`feat_req__ipc__availability`) + + +Backwards Compatibility +======================= + +As there is currently no previous solution for communication in S-CORE, no backwards compatibility is required. +Subsequent changes to the SOME/IP gateway module shall keep the API stable where possible and introduce breaking APIs only with approval from tech lead circle. +Applications shall stay stable on API layer, need to recompile is acceptable. + +Security Impact +=============== + +As the SOME/IP gateway will open direct communication channels on the SOME/IP channels, the SOME/IP implementation shall comply with standard security requirements. + +Safety Impact +============= + + +License Impact +============== + +[How could the copyright impacted by the license of the new contribution?] + + +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 new file mode 100644 index 0000000000..5527d9e4ff --- /dev/null +++ b/docs/features/communication/some_ip_gateway/requirements/index.rst @@ -0,0 +1,50 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +SOME/IP Gateway Requirements +############################ + + +Functional Requirements +======================= + + + +Security Impact +=============== + + + +Safety Impact +============= + +.. feat_req:: SOME/IP Gateway ASIL level + :id: feat_req__some_ip_gateway__asil + :reqtype: Functional + :security: YES + :safety: ASIL_B + :satisfies: stkh_req__communication__safe + :status: valid + + The SOME/IP Gateway shall support safe communication up to ASIL-B. + +.. feat_req:: SOME/IP Gateway QM network stack + :id: feat_req__some_ip_gateway__network_stack + :reqtype: Functional + :security: YES + :safety: QM + :satisfies: stkh_req__communication__safe + :status: valid + + If SOME/IP network stacks are available as QM only. From ca77f196c289a6a1745960981c79c34cb2661ba5 Mon Sep 17 00:00:00 2001 From: Holger Braun <Holger.Braun@continental-corporation.com> Date: Fri, 25 Jul 2025 15:38:01 +0000 Subject: [PATCH 072/109] some_ip_gateway: Add e2e state machine considerations --- .../e2e_state_machine_in_gateway.drawio.svg | 4 + ...2e_state_machine_on_client_side.drawio.svg | 4 + .../some_ip_gateway/architecture/index.rst | 126 +++++++++++++++++- .../communication/some_ip_gateway/index.rst | 3 + 4 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 docs/features/communication/some_ip_gateway/architecture/e2e_state_machine_in_gateway.drawio.svg create mode 100644 docs/features/communication/some_ip_gateway/architecture/e2e_state_machine_on_client_side.drawio.svg diff --git a/docs/features/communication/some_ip_gateway/architecture/e2e_state_machine_in_gateway.drawio.svg b/docs/features/communication/some_ip_gateway/architecture/e2e_state_machine_in_gateway.drawio.svg new file mode 100644 index 0000000000..cf9ffa295c --- /dev/null +++ b/docs/features/communication/some_ip_gateway/architecture/e2e_state_machine_in_gateway.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" 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 diff --git a/docs/features/communication/some_ip_gateway/architecture/e2e_state_machine_on_client_side.drawio.svg b/docs/features/communication/some_ip_gateway/architecture/e2e_state_machine_on_client_side.drawio.svg new file mode 100644 index 0000000000..a3aa7e7592 --- /dev/null +++ b/docs/features/communication/some_ip_gateway/architecture/e2e_state_machine_on_client_side.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" 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 diff --git a/docs/features/communication/some_ip_gateway/architecture/index.rst b/docs/features/communication/some_ip_gateway/architecture/index.rst index 2ee6edec76..777f4e43d8 100644 --- a/docs/features/communication/some_ip_gateway/architecture/index.rst +++ b/docs/features/communication/some_ip_gateway/architecture/index.rst @@ -24,6 +24,8 @@ SOME/IP Gateway Architecture .. toctree:: :titlesonly: +Context View +============ SOME/IP Gateway on one side is a regular participant in IPC and uses the according mechanisms to publish data or to subscribe to data. As such it will need to know and understand the data types that are used in the IPC network. @@ -43,7 +45,8 @@ should be mostly freely programmable by integrators using the SOME/IP gateway. General overview of SOME/IP Gateway - +Structural View +=============== SOME/IP stacks as supplied by AUTOSAR 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, @@ -55,3 +58,124 @@ It is preferred to avoid such additional IPC. :name: _some_ip_gateway_details Detailed components view of SOME/IP Gateway + +E2E Considerations +================== +To cope with SOME/IP stack just beeing QM, we need to prepare for end-to-end protection. The goal shall be to +do the E2E protection/check **as centrally as possible** in the gateway. Unfortunately, the centralized end-to-end +check cannot be done for all relevant E2E properties. The following table proposes where the corresponding E2E properties shall +checked. + +.. list-table:: E2E properties + :widths: 20 50 5 5 + :header-rows: 1 + + * - Protection Property + - Purpose + - Gateway + - IPC Client + * - CRC + - Detects data corruption in the payload and metadata. + - x + - + * - Counter + - Detects message loss, duplication, or reordering. + - x + - x + * - Alive Counter + - Detects if the sender is still active or stuck/frozen + - x + - x + * - Data ID + - Identifies the data format version to prevent misinterpretation. + - + - x + * - Timeout + - Detects if no message is received within a defined time window. + - + - x + +E2E Design and Interface Considerations +--------------------------------------- +As mentioned above, not all E2E checks can be kept hidden within the gateway. For some problems it is up to the application to decide +whether it is still valuable to access and process the data. This is in particular true for duplication or re-odering issues. +Therefore, it is required to pass a **tupel** consisting of the **payload data** as well as **supplementary E2E metadata and error information** +to the IPC clients to enable the client to individually judge on particular E2E issues. + +* The API design needs to put the payload information as well as the additional E2E metadata as close as possible together to easily enable and motivate clients to consequently check for potential errors. +* Additional metadata and error information needs to be incorporated into regular mw::com user interface +* Error related interface design needs to be highly optimezed for the "good case" to have an optimized support for the common IPC case +* AoU's need to be provided to force the user to check for the (E2E-) result +* Additional E2E metadata to be handed over to the clients: + + * Counter, slightly different interpretation depending on profile, n/a in case the profile doesn't support it + * Data ID, n/a in case the profile does not support it or if the Data ID is not explicitely transmitted like in profile 22 + * Profile identification, required to properly interpret E2E attributes like "Counter". (Could be either an "Alive Counter" or a "Sequence Counter" depending on the profile) + * Detailed, profile specific error code (enum) + +* Proposed Error Enumeration + + * No E2E error + * CRC Error + * Sequence error (further subqualification in loss, duplication, reordering is up to the client based on the counter) + +.. 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): + + * OK + * ERROR + * OKSOMELOST + * REPEATED + * WRONGSEQUENCE + * NONEWDATA + * SYNC + * INITIAL + +E2E State Machine Considerations +-------------------------------- +The E2E (End-to-End) state machine as defined within AUTOSAR E2E protocol 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. + +Purpose of the E2E State Machine: +The primary purpose of the E2E state machine is to transform instantaneous "per-cycle" check results into a stable, +long-term communication channel status. This aggregated status is then provided to the consuming application, +enabling it to make informed decisions about whether the received data can be trusted and used for safety-related functions. + +As mentioned above, the E2E statemachine is associated to one communication channel which is in turn associated to exactly one +individual IPC client. Therefore it is an obvious consequence, that the individiual state machine handling and state machine +configuration is responsibility of the client and not a central responsibility of the gateway. +The diagram below outlines this distribution of responsibilties. + +*Diagram: E2E state machine responsibility associated to IPC client* + +.. figure:: e2e_state_machine_on_client_side.drawio.svg + :align: center + :name: _e2e_state_machine_on_client_side + + E2E state machine responsibility associated to IPC client + +**Considered Alternative** + +If we allocate the statemachine responsibility to the gateway the distribution of resposnibilities would look like in the following diagram + +*Diagram: E2E state machine responsibility associated to the gateway* + +.. figure:: e2e_state_machine_in_gateway.drawio.svg + :align: center + :name: _e2e_state_machine_in_gateway + + E2E state machine responsibility associated to the gateway + +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**. + +**=> Alternative dismissed** + +.. note:: + The End-to-End consideration in this chapter do not yet consider methods. + + diff --git a/docs/features/communication/some_ip_gateway/index.rst b/docs/features/communication/some_ip_gateway/index.rst index b43996b99c..a1c9b7055f 100644 --- a/docs/features/communication/some_ip_gateway/index.rst +++ b/docs/features/communication/some_ip_gateway/index.rst @@ -125,6 +125,9 @@ As the SOME/IP gateway will open direct communication channels on the SOME/IP ch Safety Impact ============= +SOME/IP stack and underlying OS network stacks are typically QM only. Freedom from interference needs to be respected between the +safty classified IPC component (mw::com) and the SOME/IP stack which is part of the gateway. The SOME/IP communication itself needs +to be properly protected by E2E to maintain a safe communication via the grey SOME/IP channel. License Impact ============== From 30e23d7fdd691a0f13af0fe21b231e47cc1c7be1 Mon Sep 17 00:00:00 2001 From: Andreas Kaluza <andreas.kaluza@continental.com> Date: Mon, 28 Jul 2025 12:08:51 +0000 Subject: [PATCH 073/109] some_ip_gateway: security and crypto --- .../some_ip_gateway/architecture/index.rst | 18 +- .../e2e_state_machine_in_gateway.drawio.svg | 0 ...2e_state_machine_on_client_side.drawio.svg | 0 .../assets/puml-theme-score.puml | 566 ++++++++++++++++++ .../some_ip_gateway_architecture.drawio.svg | 0 .../some_ip_gateway_details.drawio.svg | 0 .../some_ip_gateway_sec_protocols.drawio.svg | 553 +++++++++++++++++ .../communication/some_ip_gateway/index.rst | 133 +++- .../some_ip_gateway/requirements/index.rst | 20 +- 9 files changed, 1278 insertions(+), 12 deletions(-) rename docs/features/communication/some_ip_gateway/{architecture => assets}/e2e_state_machine_in_gateway.drawio.svg (100%) rename docs/features/communication/some_ip_gateway/{architecture => assets}/e2e_state_machine_on_client_side.drawio.svg (100%) create mode 100644 docs/features/communication/some_ip_gateway/assets/puml-theme-score.puml rename docs/features/communication/some_ip_gateway/{architecture => assets}/some_ip_gateway_architecture.drawio.svg (100%) rename docs/features/communication/some_ip_gateway/{architecture => assets}/some_ip_gateway_details.drawio.svg (100%) create mode 100644 docs/features/communication/some_ip_gateway/assets/some_ip_gateway_sec_protocols.drawio.svg diff --git a/docs/features/communication/some_ip_gateway/architecture/index.rst b/docs/features/communication/some_ip_gateway/architecture/index.rst index 777f4e43d8..6cdcfbdd27 100644 --- a/docs/features/communication/some_ip_gateway/architecture/index.rst +++ b/docs/features/communication/some_ip_gateway/architecture/index.rst @@ -39,7 +39,7 @@ that might be independent of the rest of the gateway. But buffering / queuing of should be mostly freely programmable by integrators using the SOME/IP gateway. -.. figure:: some_ip_gateway_architecture.drawio.svg +.. figure:: ../assets/some_ip_gateway_architecture.drawio.svg :align: center :name: _some_ip_gateway_architecture @@ -53,7 +53,7 @@ separate this QM component from the otherwise ASIL-B compliant components. This which again will require dedicated inter-process-communication between the SOME/IP-stack and the rest of the gateway. It is preferred to avoid such additional IPC. -.. figure:: some_ip_gateway_details.drawio.svg +.. figure:: ../assets/some_ip_gateway_details.drawio.svg :align: center :name: _some_ip_gateway_details @@ -63,7 +63,7 @@ E2E Considerations ================== To cope with SOME/IP stack just beeing QM, we need to prepare for end-to-end protection. The goal shall be to do the E2E protection/check **as centrally as possible** in the gateway. Unfortunately, the centralized end-to-end -check cannot be done for all relevant E2E properties. The following table proposes where the corresponding E2E properties shall +check cannot be done for all relevant E2E properties. The following table proposes where the corresponding E2E properties shall checked. .. list-table:: E2E properties @@ -77,7 +77,7 @@ checked. * - CRC - Detects data corruption in the payload and metadata. - x - - + - * - Counter - Detects message loss, duplication, or reordering. - x @@ -88,11 +88,11 @@ checked. - x * - Data ID - Identifies the data format version to prevent misinterpretation. - - + - - x * - Timeout - Detects if no message is received within a defined time window. - - + - - x E2E Design and Interface Considerations @@ -152,7 +152,7 @@ The diagram below outlines this distribution of responsibilties. *Diagram: E2E state machine responsibility associated to IPC client* -.. figure:: e2e_state_machine_on_client_side.drawio.svg +.. figure:: ../assets/e2e_state_machine_on_client_side.drawio.svg :align: center :name: _e2e_state_machine_on_client_side @@ -164,7 +164,7 @@ If we allocate the statemachine responsibility to the gateway the distribution o *Diagram: E2E state machine responsibility associated to the gateway* -.. figure:: e2e_state_machine_in_gateway.drawio.svg +.. figure:: ../assets/e2e_state_machine_in_gateway.drawio.svg :align: center :name: _e2e_state_machine_in_gateway @@ -177,5 +177,3 @@ can not be selectively distributed according to the particular communication cha .. note:: The End-to-End consideration in this chapter do not yet consider methods. - - diff --git a/docs/features/communication/some_ip_gateway/architecture/e2e_state_machine_in_gateway.drawio.svg b/docs/features/communication/some_ip_gateway/assets/e2e_state_machine_in_gateway.drawio.svg similarity index 100% rename from docs/features/communication/some_ip_gateway/architecture/e2e_state_machine_in_gateway.drawio.svg rename to docs/features/communication/some_ip_gateway/assets/e2e_state_machine_in_gateway.drawio.svg diff --git a/docs/features/communication/some_ip_gateway/architecture/e2e_state_machine_on_client_side.drawio.svg b/docs/features/communication/some_ip_gateway/assets/e2e_state_machine_on_client_side.drawio.svg similarity index 100% rename from docs/features/communication/some_ip_gateway/architecture/e2e_state_machine_on_client_side.drawio.svg rename to docs/features/communication/some_ip_gateway/assets/e2e_state_machine_on_client_side.drawio.svg diff --git a/docs/features/communication/some_ip_gateway/assets/puml-theme-score.puml b/docs/features/communication/some_ip_gateway/assets/puml-theme-score.puml new file mode 100644 index 0000000000..fc78e4ca61 --- /dev/null +++ b/docs/features/communication/some_ip_gateway/assets/puml-theme-score.puml @@ -0,0 +1,566 @@ +'' The referenced original work is published under MIT license +'' MIT license: https://github.com/bschwarz/puml-themes/blob/master/LICENSE +'' +'' conti theme is based on materia theme +'' Author: Andreas Kaluza +'' Copyright (c) 2012 by Andreas Kaluza +'' +'' materia theme based off of the bootstrap theme of the same name +'' https://bootswatch.com/materia/ +'' +'' Author: Brett Schwarz +'' Copyright (c) 2019 by Brett Schwarz + +!$THEME = "score" + +!if %not(%variable_exists("$BGCOLOR")) +!$BGCOLOR = "transparent" +!endif + +skinparam backgroundColor $BGCOLOR +skinparam useBetaStyle true + + + +!$SCORE = "#45ADA8" +!$BLUE = "#2196F3" +!$INDIGO = "#6610f2" +!$PURPLE = "#6f42c1" +!$PINK = "#e83e8c" +!$RED = "#e51c23" +!$ORANGE = "#fd7e14" +!$YELLOW = "#ff9800" +!$GREEN = "#4CAF50" +!$TEAL = "#20c997" +!$CYAN = "#9C27B0" +!$WHITE = "#FFF" +!$GRAY_DARK = "#222" +!$GRAY = "#666" +!$PRIMARY = $SCORE +!$SECONDARY = %lighten($SCORE, 80) +!$SUCCESS = "#4CAF50" +!$INFO = %lighten($SCORE, 40) +!$WARNING = "#ff9800" +!$DANGER = "#e51c23" +!$LIGHT = "#fff" +!$DARK = "#222" + +'' *_LIGHT = tint (lighter) of the main color of 80% +'' *_DARK = shade (darker) of the main color of 80% +'' +!$FGCOLOR = %darken($SCORE, 80) +!$PRIMARY_LIGHT = %lighten($SCORE, 40) +!$PRIMARY_DARK = %darken($SCORE, 40) +!$PRIMARY_TEXT = %darken($SCORE, 80) +!$SECONDARY_LIGHT = "#fff" +!$SECONDARY_DARK = "#cccccc" +!$SECONDARY_TEXT = %darken($SCORE, 80) +!$INFO_LIGHT = %lighten($INFO, 40) +!$INFO_DARK = %darken($INFO, 40) +!$INFO_TEXT = %darken($SCORE, 80) +!$SUCCESS_LIGHT = "#70bf73" +!$SUCCESS_DARK = "#3D8C40" +!$SUCCESS_TEXT = %darken($SCORE, 80) +!$WARNING_LIGHT = "#ffad33" +!$WARNING_DARK = "#CC7A00" +!$WARNING_TEXT = %darken($SCORE, 80) +!$DANGER_DARK = "#b7161c" +!$DANGER_LIGHT = "#B7161C" +!$DANGER_TEXT = %darken($SCORE, 80) + +!procedure $success($msg) + <font color=$SUCCESS><b>$msg +!endprocedure + +!procedure $failure($msg) + <font color=$DANGER><b>$msg +!endprocedure + +!procedure $warning($msg) + <font color=$WARNING><b>$msg +!endprocedure + +!procedure $primary_scheme() + FontColor $PRIMARY_TEXT + BorderColor $PRIMARY + BackgroundColor $PRIMARY_LIGHT-$PRIMARY +!endprocedure +'' +'' Style settings +'' +<style> + root { + BackgroundColor $BGCOLOR + FontColor $PRIMARY_TEXT + HyperLinkColor $BLUE + LineColor $PRIMARY_DARK + LineThickness 1 + Margin 10 + Padding 6 + Shadowing 0.0 + } + node { + Padding 15 + roundcorner 20 + BackgroundColor $PRIMARY-$PRIMARY_DARK + } + caption { + LineThickness 0 + } + footer { + LineThickness 0 + } + groupHeader { + BackgroundColor $SECONDARY + FontColor $INFO + FontStyle bold + } + header { + LineThickness 0 + } + referenceHeader { + BackgroundColor $BGCOLOR + FontColor $DARK + FontStyle bold + } + separator { + BackgroundColor $FGCOLOR + FontColor $BGCOLOR + FontStyle bold + } + title { + FontSize 20 + BorderRoundCorner 8 + BorderThickness 1 + BackgroundColor $SECONDARY_LIGHT-$SECONDARY + FontColor $PRIMARY + BorderColor $SECONDARY + } + nwdiagDiagram { + network { + $primary_scheme() + LineColor $PRIMARY + LineThickness 1.0 + FontColor $PRIMARY_DARK + } + server { + $primary_scheme() + } + arrow { + FontColor $PRIMARY_DARK + LineColor $PRIMARY_DARK + } + group { + BackGroundColor transparent + LineColor $LIGHT_DARK + LineThickness 2.0 + Margin 5 + Padding 5 + } + } + ganttDiagram { + task { + $primary_scheme() + LineColor $PRIMARY + Fontsize 16 + Margin 2 + Padding 2 + } + note { + FontColor $INFO_TEXT + LineColor $INFO_DARK + BackGroundColor $INFO + } + separator { + LineColor $SECONDARY + BackGroundColor $SECONDARY-$SECONDARY_DARK + FontColor $SECONDARY_TEXT + } + milestone { + FontColor $DARK + FontSize 16 + FontStyle italic + BackGroundColor $SECONDARY + LineColor $SECONDARY_DARK + Margin 2 + Padding 2 + } + timeline { + BackgroundColor $SECONDARY + FontColor $SECONDARY_TEXT + } + closed { + BackgroundColor $WARNING_DARK + FontColor $WARNING_TEXT + } + } + jsonDiagram { + node { + BackGroundColor $PRIMARY_LIGHT + } + } + yamlDiagram { + node { + BackGroundColor $PRIMARY_LIGHT + } + } +</style> +'' +'' Global Default Values +'' +skinparam defaultFontName "Arial" +skinparam defaultFontSize 12 +skinparam dpi 100 +skinparam shadowing true +skinparam roundcorner 8 +skinparam ParticipantPadding 1 +skinparam BoxPadding 1 +skinparam Padding 1 +skinparam ArrowColor $GRAY +skinparam stereotype { + CBackgroundColor $SECONDARY_LIGHT + CBorderColor $SECONDARY_DARK + ABackgroundColor $SUCCESS_LIGHT + ABorderColor $SUCCESS_DARK + IBackgroundColor $DANGER_LIGHT + IBorderColor $DANGER_DARK + EBackgroundColor $WARNING_LIGHT + EBorderColor $WARNING_DARK + NBackgroundColor $INFO_LIGHT + NBorderColor $INFO_DARK +} +skinparam title { + FontColor $PRIMARY + BorderColor $SECONDARY_DARK + FontSize 20 + BorderRoundCorner 8 + BorderThickness 1 + BackgroundColor $SECONDARY_LIGHT-$SECONDARY +} + +skinparam legend { + BackgroundColor $SECONDARY + BorderColor $SECONDARY_DARK + FontColor $DARK +} + +!startsub swimlane +skinparam swimlane { + BorderColor $PRIMARY + BorderThickness 2 + TitleBackgroundColor $SECONDARY_LIGHT-$SECONDARY + TitleFontColor $PRIMARY +} +!endsub + +!startsub activity + +skinparam activity { + $primary_scheme() + BarColor $PRIMARY_DARK + StartColor $PRIMARY + EndColor $PRIMARY + '' + DiamondBackgroundColor $PRIMARY_LIGHT + DiamondBorderColor $PRIMARY_DARK + DiamondFontColor $SECONDARY_TEXT + NoteFontColor %darken($SCORE, 40) +} +!endsub + +!startsub participant + +skinparam participant { + $primary_scheme() + ParticipantBorderThickness 2 +} +!endsub + +!startsub actor + +skinparam actor { + $primary_scheme() + FontColor $DARK +} +!endsub + +!startsub arrow + +skinparam arrow { + Thickness 1 + Color $PRIMARY + FontColor $FGCOLOR +} +!endsub + +!startsub sequence + +skinparam sequence { + BorderColor $PRIMARY + ' For some reason sequence title font color does not pick up from global + TitleFontColor $PRIMARY + BackgroundColor transparent + StartColor $PRIMARY + EndColor $PRIMARY + '' + BoxBackgroundColor transparent + BoxBorderColor $GRAY + BoxFontColor $DARK + '' + DelayFontColor $DARK + '' + LifeLineBorderColor $PRIMARY_DARK + LifeLineBorderThickness 2 + LifeLineBackgroundColor $PRIMARY_LIGHT + '' + GroupBorderColor $GRAY + GroupFontColor $DARK + GroupHeaderFontColor $INFO + '' + DividerBackgroundColor $WHITE-$LIGHT + DividerBorderColor $GRAY + DividerBorderThickness 2 + DividerFontColor $DARK + '' + ReferenceBackgroundColor transparent + ReferenceBorderColor $GRAY + ReferenceFontColor $DARK + ReferenceHeaderFontColor $INFO + '' + StereotypeFontColor $PRIMARY_TEXT + '' + ParticipantBorderThickness 0 + GroupBodyBackgroundColor transparent +} +!endsub + +!startsub partition + +skinparam partition { + BorderColor $PRIMARY + FontColor $PRIMARY + BackgroundColor transparent +} +!endsub + +!startsub collections + +skinparam collections { + $primary_scheme() +} +!endsub + +!startsub control + +skinparam control { + $primary_scheme() + FontColor $DARK +} +!endsub + +!startsub entity + +skinparam entity { + $primary_scheme() + FontColor $DARK +} +!endsub + +!startsub boundary + +skinparam boundary { + $primary_scheme() + FontColor $DARK +} +!endsub + +!startsub agent + +skinparam agent { + $primary_scheme() + FontColor $DARK +} +!endsub + +!startsub note + +skinparam note { + BorderThickness 1 + BackgroundColor $INFO_LIGHT-$INFO + BorderColor $INFO + FontColor %darken($SCORE, 40) +} +!endsub + +!startsub artifact + +skinparam artifact { + $primary_scheme() +} +!endsub + +!startsub component + +skinparam component { + $primary_scheme() +} +!endsub + +!startsub interface + +skinparam interface { + BackgroundColor $DANGER_LIGHT + BorderColor $DANGER + FontColor $DARK +} +!endsub + +!startsub storage + +skinparam storage { + $primary_scheme() + FontColor $DARK +} +!endsub + +!startsub node + +skinparam node { + BackgroundColor $SECONDARY_LIGHT-$SECONDARY + BorderColor $PRIMARY + FontColor $DARK +} +!endsub + +!startsub cloud + +skinparam cloud { + BackgroundColor transparent + BorderColor $PRIMARY + FontColor $DARK +} +!endsub + +!startsub database + +skinparam database { + $primary_scheme() + FontColor $DARK +} +!endsub + +!startsub class + +skinparam class { + $primary_scheme() + HeaderBackgroundColor $PRIMARY-$PRIMARY_DARK + StereotypeFontColor $DARK + BorderThickness 1 + AttributeFontColor $LIGHT + AttributeFontSize 11 +} +!endsub + +!startsub object + +skinparam object { + $primary_scheme() + StereotypeFontColor $DARK + BorderThickness 1 + AttributeFontColor $SECONDARY_TEXT + AttributeFontSize 11 +} +!endsub + +!startsub usecase + +skinparam usecase { + $primary_scheme() + BorderThickness 2 + StereotypeFontColor $PRIMARY +} +!endsub + +!startsub rectangle + +skinparam rectangle { + FontColor $PRIMARY + BackgroundColor $SECONDARY_LIGHT-$SECONDARY + BorderThickness 2 + StereotypeFontColor $PRIMARY +} +!endsub + +!startsub package + +skinparam package { + $primary_scheme() + BackgroundColor $SECONDARY_LIGHT-$SECONDARY + BorderThickness 2 +} +!endsub + +!startsub folder + +skinparam folder { + BackgroundColor $WHITE-$SECONDARY_LIGHT + BorderColor $PRIMARY + FontColor $PRIMARY + BorderThickness 2 +} +!endsub + +!startsub frame + +skinparam frame { + BackgroundColor $WHITE-$SECONDARY_LIGHT + BorderColor $INFO + FontColor $INFO + BorderThickness 2 +} +!endsub + +!startsub state + +skinparam state { + $primary_scheme() + BorderColor $PRIMARY_DARK + StartColor $INFO + EndColor $INFO + AttributeFontColor $SECONDARY_TEXT + AttributeFontSize 11 +} +!endsub + +!startsub queue + +skinparam queue { + $primary_scheme() +} +!endsub + +!startsub card + +skinparam card { + BackgroundColor $INFO_LIGHT-$INFO + BorderColor $INFO + FontColor $INFO_TEXT +} +!endsub + +!startsub file + +skinparam file { + BackgroundColor $SECONDARY_LIGHT-$SECONDARY + BorderColor $GRAY + FontColor $GRAY + +} +!endsub + +!startsub stack + +skinparam stack { + $primary_scheme() +} +!endsub diff --git a/docs/features/communication/some_ip_gateway/architecture/some_ip_gateway_architecture.drawio.svg b/docs/features/communication/some_ip_gateway/assets/some_ip_gateway_architecture.drawio.svg similarity index 100% rename from docs/features/communication/some_ip_gateway/architecture/some_ip_gateway_architecture.drawio.svg rename to docs/features/communication/some_ip_gateway/assets/some_ip_gateway_architecture.drawio.svg diff --git a/docs/features/communication/some_ip_gateway/architecture/some_ip_gateway_details.drawio.svg b/docs/features/communication/some_ip_gateway/assets/some_ip_gateway_details.drawio.svg similarity index 100% rename from docs/features/communication/some_ip_gateway/architecture/some_ip_gateway_details.drawio.svg rename to docs/features/communication/some_ip_gateway/assets/some_ip_gateway_details.drawio.svg diff --git a/docs/features/communication/some_ip_gateway/assets/some_ip_gateway_sec_protocols.drawio.svg b/docs/features/communication/some_ip_gateway/assets/some_ip_gateway_sec_protocols.drawio.svg new file mode 100644 index 0000000000..b8950b1b2c --- /dev/null +++ b/docs/features/communication/some_ip_gateway/assets/some_ip_gateway_sec_protocols.drawio.svg @@ -0,0 +1,553 @@ +<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="992px" height="342px" viewBox="-0.5 -0.5 992 342" content="<mxfile><diagram id="G7RO45l4BIlMHNVsUqmB" name="Page-1">7Vttc6IwEP41ztSb8YZ38SNi2+tM7XmH7d3XFFJkCsQLWOv9+ttIQFS4eh60pVJnmrC7iUn2eTZLwI5sBs+XFM1nY+JgvyMJznNHHnUkSdRkAQomWSUSXdUTgUs9hxttBJb3G3Mhb+cuPAdHW4YxIX7szbeFNglDbMdbMkQpWW6bPRB/+1vnyMV7AstG/r70h+fEs3ReqrJRfMGeO0u/WtQGiSZAqTWfSjRDDlnmRPJ5RzYpIXFSC55N7LPVSxcmaXdRos1GRnEYH9SAt3hC/oLPriNpPrQdPhDoAkYYr/i8tV8Lkip60dorBhjA14Fnhxs91FxWXqMVpswg7RGGkXSa6PkKZP1LlCxCB7ORCaBezrwYW3NkM+0SkASyWRz4cCWyUXi+bxKfULgOSQhGwyim5DFzCazlEPmeG0Ldxw/pyC9Q4PkMeHeYOihE2UDyi5auCqYxfs6J+CJeYhLgmK7AhGslnTuUQ1pJHbzcAGQw4LJZDhsalyGOSTfreuM1qHDHFTuRmf7Viel6J7JojsJDHCtqJY59ESF24hfWCXXvz2CKMAchLbqFnY4NM8J2KVQycTL6PXGRteM9FQ+5CesBJQoY5sP7aJ7MEYzvro2bStcIxFvLVEpJ8d8o2ZHki4u+qQsZL3fIukNNRjUPQqzBxYHnOGwQZZxlYr4ziFI1HJb7B3BYqIvD9cdhtdc/wUgsCQdGYr0CLyr/7sVcbPDZYHoOoo9nLExIqppEiHylm9TWernPxblKN4kmwqGxy/o6PodZXU2OjaWCnTF+07f8sP4rD5WVxdx7WvkeUdhlgV1doTMHA1hJVekPdL5VwCV22KdbK4XUXQqJ+xQSpZoCodo8CkFkQ2wKk9Ft1NKopRHX9qU3pFG/cTS6HU16N+OWPy1/uFbX3pA/g/rzceUUs3H9wGy8Ch+meKnTifIJOlFWXtOJr3BnLJ6gE5VXZaLcuHRkRNp74jYZyeijKG+YjIjl50rlGHx3jPorlg45m37f0xtNzQk/SROsGNmPUJ7hz+5nKNcq1i/c5CSVq7Q0x7xmfOeV0Rdz0m1DTxt6ykLPYD/0qEpB6BGFKmJP+YHcqz84K+FxUdfG3fSl7bsEmft4a8l2OmQDzhy50YtVPEDSG5cnu5MXidby54T4Ix6bKFfCH1F7gUBNePXDwvZXkyeF5vWn47axw48y6nqzwwYUYZC/h3c71MEOKguOsKSiHEqqApTNexgzNljD9HwMhQ7D4h0D1dS6gf/fiMV6wyheUFz+0PPDhLXdHFyR9/GjF0U1pQr8NC8rgDRqaFjnvenPE8RGwf1Z4Y5XCTaOeFD1xtgwFjEJSOw9YbCazFYRM063xCT/NrOgExDKzMZDL2Yb3cdHk7r7FmIBmrSic/oq0JSitNHp0/TaWruLvS87Wl+0+dN/o3L3rrgAlUpRjKsif8qG22RUXk2qe729hWL+abRaHxThcvNbnLUu95Mm+fwP</diagram></mxfile>"> + <defs/> + <g> + <g> + <rect x="1" y="221" width="990" height="60" fill="none" stroke="#000000" stroke-width="2" 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: 988px; height: 1px; padding-top: 251px; margin-left: 3px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: left; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <font style="font-size: 20px;"> + Layer 2 + </font> + </div> + </div> + </div> + </foreignObject> + <text x="3" y="255" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px"> + Layer 2 + </text> + </switch> + </g> + </g> + <g> + <rect x="91" y="221" width="900" height="60" rx="9" ry="9" fill="#ff7c80" stroke="none" pointer-events="all" style="fill: light-dark(rgb(255, 124, 128), rgb(195, 82, 86));"/> + </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: 898px; height: 1px; padding-top: 251px; margin-left: 93px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: left; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <font> + <span style="font-size: 16px;"> + <font style="color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"> + MACsec + </font> + </span> + </font> + <div> + <font> + <span style="font-size: 16px;"> + <font style="color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"> + / VLAN + </font> + </span> + </font> + </div> + </div> + </div> + </div> + </foreignObject> + <text x="93" y="255" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px"> + MACsec... + </text> + </switch> + </g> + </g> + <g> + <rect x="1" y="1" width="990" height="80" fill="none" stroke="#000000" stroke-width="2" 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: 988px; height: 1px; padding-top: 41px; margin-left: 3px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: left; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <font style="font-size: 20px;"> + Layer 5-7 + </font> + </div> + </div> + </div> + </foreignObject> + <text x="3" y="45" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px"> + Layer 5-7 + </text> + </switch> + </g> + </g> + <g> + <rect x="301" y="11" width="120" height="60" rx="9" ry="9" fill="#547980" stroke="#000000" pointer-events="all" style="fill: light-dark(rgb(84, 121, 128), rgb(237, 237, 237)); 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: 41px; margin-left: 302px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <font style="color: light-dark(rgb(255, 255, 255), rgb(237, 237, 237)); font-size: 16px;"> + SOME/IP + </font> + <div> + <font color="#ffffff" style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"> + <span style="font-size: 16px;"> + <br/> + </span> + </font> + <div> + <br/> + </div> + </div> + </div> + </div> + </div> + </foreignObject> + <text x="361" y="45" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px" text-anchor="middle"> + SOME/IP... + </text> + </switch> + </g> + </g> + <g> + <rect x="441" y="11" width="120" height="60" rx="9" ry="9" fill="#547980" stroke="#000000" pointer-events="all" style="fill: light-dark(rgb(84, 121, 128), rgb(237, 237, 237)); 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: 41px; margin-left: 442px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <font style="color: light-dark(rgb(255, 255, 255), rgb(237, 237, 237)); font-size: 16px;"> + Signal PDUs + </font> + <div> + <font color="#ffffff" style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"> + <span style="font-size: 16px;"> + <br/> + </span> + </font> + <div> + <br/> + </div> + </div> + </div> + </div> + </div> + </foreignObject> + <text x="501" y="45" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px" text-anchor="middle"> + Signal PDUs... + </text> + </switch> + </g> + </g> + <g> + <rect x="581" y="11" width="120" height="60" rx="9" ry="9" fill="#547980" stroke="#000000" pointer-events="all" style="fill: light-dark(rgb(84, 121, 128), rgb(237, 237, 237)); 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: 41px; margin-left: 582px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <font style="color: light-dark(rgb(255, 255, 255), rgb(237, 237, 237)); font-size: 16px;"> + UDP-NM + </font> + <div> + <font color="#ffffff" style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"> + <span style="font-size: 16px;"> + <br/> + </span> + </font> + <div> + <br/> + </div> + </div> + </div> + </div> + </div> + </foreignObject> + <text x="641" y="45" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px" text-anchor="middle"> + UDP-NM... + </text> + </switch> + </g> + </g> + <g> + <rect x="1" y="81" width="990" height="60" fill="none" stroke="#000000" stroke-width="2" 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: 988px; height: 1px; padding-top: 111px; margin-left: 3px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: left; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <font style="font-size: 20px;"> + Layer 4 + </font> + </div> + </div> + </div> + </foreignObject> + <text x="3" y="115" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px"> + Layer 4 + </text> + </switch> + </g> + </g> + <g> + <rect x="1" y="141" width="990" height="60" fill="none" stroke="#000000" stroke-width="2" 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: 988px; height: 1px; padding-top: 171px; margin-left: 3px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: left; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <font style="font-size: 20px;"> + Layer 3 + </font> + </div> + </div> + </div> + </foreignObject> + <text x="3" y="175" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px"> + Layer 3 + </text> + </switch> + </g> + </g> + <g> + <rect x="1" y="281" width="990" height="60" fill="none" stroke="#000000" stroke-width="2" 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: 988px; height: 1px; padding-top: 311px; margin-left: 3px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: left; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <font style="font-size: 20px;"> + Layer 1 + </font> + </div> + </div> + </div> + </foreignObject> + <text x="3" y="315" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px"> + Layer 1 + </text> + </switch> + </g> + </g> + <g> + <rect x="161" y="11" width="120" height="60" rx="9" ry="9" fill="#547980" stroke="#000000" pointer-events="all" style="fill: light-dark(rgb(84, 121, 128), rgb(237, 237, 237)); 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: 41px; margin-left: 162px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <font style="color: light-dark(rgb(255, 255, 255), rgb(237, 237, 237)); font-size: 16px;"> + DoIP + </font> + <div> + <font color="#ffffff" style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"> + <span style="font-size: 16px;"> + <br/> + </span> + </font> + <div> + <br/> + </div> + </div> + </div> + </div> + </div> + </foreignObject> + <text x="221" y="45" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px" text-anchor="middle"> + DoIP... + </text> + </switch> + </g> + </g> + <g> + <rect x="161" y="91" width="540" height="100" rx="15" ry="15" fill="#547980" stroke="#000000" pointer-events="all" style="fill: light-dark(rgb(84, 121, 128), rgb(237, 237, 237)); 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: 538px; height: 1px; padding-top: 141px; margin-left: 162px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <div> + <font style="color: light-dark(rgb(255, 255, 255), rgb(237, 237, 237)); font-size: 16px;"> + <br/> + </font> + </div> + <font style="color: light-dark(rgb(255, 255, 255), rgb(237, 237, 237)); font-size: 16px;"> + DTCP/IP Stack (e.g. TCP, UDP, IP, ICMP, ARP, DHCP) + </font> + <div> + <font color="#ffffff" style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"> + <span style="font-size: 16px;"> + <br/> + </span> + </font> + <div> + <br/> + </div> + </div> + </div> + </div> + </div> + </foreignObject> + <text x="431" y="145" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px" text-anchor="middle"> + DTCP/IP Stack (e.g. TCP, UDP, IP, ICMP, ARP, DHCP)... + </text> + </switch> + </g> + </g> + <g> + <rect x="721" y="11" width="120" height="180" rx="18" ry="18" fill="#547980" stroke="#000000" pointer-events="all" style="fill: light-dark(rgb(84, 121, 128), rgb(237, 237, 237)); 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: 101px; margin-left: 722px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <span style="font-size: 16px;"> + <font style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"> + AVTP + </font> + </span> + <br/> + <div> + <font color="#ffffff" style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"> + <span style="font-size: 16px;"> + <br/> + </span> + </font> + <div> + <br/> + </div> + </div> + </div> + </div> + </div> + </foreignObject> + <text x="781" y="105" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px" text-anchor="middle"> + AVTP... + </text> + </switch> + </g> + </g> + <g> + <rect x="861" y="11" width="120" height="180" rx="18" ry="18" fill="#547980" stroke="#000000" pointer-events="all" style="fill: light-dark(rgb(84, 121, 128), rgb(237, 237, 237)); 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: 101px; margin-left: 862px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <font style="color: light-dark(rgb(255, 255, 255), rgb(237, 237, 237)); font-size: 16px;"> + gPTP + </font> + <div> + <font color="#ffffff" style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"> + <span style="font-size: 16px;"> + <br/> + </span> + </font> + <div> + <br/> + </div> + </div> + </div> + </div> + </div> + </foreignObject> + <text x="921" y="105" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px" text-anchor="middle"> + gPTP... + </text> + </switch> + </g> + </g> + <g> + <rect x="311" y="41" width="240" height="20" rx="3" ry="3" fill="#ff7c80" stroke="none" pointer-events="all" style="fill: light-dark(rgb(255, 124, 128), rgb(195, 82, 86));"/> + </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: 238px; height: 1px; padding-top: 51px; margin-left: 312px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <font> + <span style="font-size: 16px;"> + <font style="color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"> + SecOC, ACL* + </font> + </span> + </font> + </div> + </div> + </div> + </foreignObject> + <text x="431" y="55" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px" text-anchor="middle"> + SecOC, ACL* + </text> + </switch> + </g> + </g> + <g> + <rect x="161" y="231" width="820" height="40" rx="6" ry="6" fill="#547980" stroke="#000000" pointer-events="all" style="fill: light-dark(rgb(84, 121, 128), rgb(237, 237, 237)); 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: 818px; height: 1px; padding-top: 251px; margin-left: 162px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <font style="color: light-dark(rgb(255, 255, 255), rgb(237, 237, 237)); font-size: 16px;"> + MAC Layer and AVB/TSN/QoS features + </font> + </div> + </div> + </div> + </foreignObject> + <text x="571" y="255" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px" text-anchor="middle"> + MAC Layer and AVB/TSN/QoS features + </text> + </switch> + </g> + </g> + <g> + <rect x="161" y="291" width="120" height="40" rx="6" ry="6" fill="#547980" stroke="#000000" pointer-events="all" style="fill: light-dark(rgb(84, 121, 128), rgb(237, 237, 237)); 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: 311px; margin-left: 162px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <font style="color: light-dark(rgb(255, 255, 255), rgb(237, 237, 237)); font-size: 16px;"> + 100BASE-TX + </font> + </div> + </div> + </div> + </foreignObject> + <text x="221" y="315" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px" text-anchor="middle"> + 100BASE-TX + </text> + </switch> + </g> + </g> + <g> + <rect x="291" y="291" width="690" height="40" rx="6" ry="6" fill="#547980" stroke="#000000" pointer-events="all" style="fill: light-dark(rgb(84, 121, 128), rgb(237, 237, 237)); 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: 688px; height: 1px; padding-top: 311px; margin-left: 292px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <font style="color: light-dark(rgb(255, 255, 255), rgb(237, 237, 237)); font-size: 16px;"> + Automotive Phys 100, 1000, and more MBit/s + </font> + </div> + </div> + </div> + </foreignObject> + <text x="636" y="315" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px" text-anchor="middle"> + Automotive Phys 100, 1000, and more MBit/s + </text> + </switch> + </g> + </g> + <g> + <rect x="221" y="91" width="420" height="20" rx="3" ry="3" fill="#ff7c80" stroke="none" pointer-events="all" style="fill: light-dark(rgb(255, 124, 128), rgb(195, 82, 86));"/> + </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: 418px; height: 1px; padding-top: 101px; margin-left: 222px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <font> + <span style="font-size: 16px;"> + <font style="color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"> + TLS / DTLS + </font> + </span> + </font> + </div> + </div> + </div> + </foreignObject> + <text x="431" y="105" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px" text-anchor="middle"> + TLS / DTLS + </text> + </switch> + </g> + </g> + <g> + <rect x="221" y="151" width="420" height="20" rx="3" ry="3" fill="#ff7c80" stroke="none" pointer-events="all" style="fill: light-dark(rgb(255, 124, 128), rgb(195, 82, 86));"/> + </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: 418px; height: 1px; padding-top: 161px; margin-left: 222px;"> + <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> + <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> + <font> + <span style="font-size: 16px;"> + <font style="color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"> + IPsec + </font> + </span> + </font> + </div> + </div> + </div> + </foreignObject> + <text x="431" y="165" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px" text-anchor="middle"> + IPsec + </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/index.rst b/docs/features/communication/some_ip_gateway/index.rst index a1c9b7055f..c2bb048ba4 100644 --- a/docs/features/communication/some_ip_gateway/index.rst +++ b/docs/features/communication/some_ip_gateway/index.rst @@ -108,6 +108,8 @@ As with IPC generally, the security approach for SOME/IP gateway shall achieve t - confidentiality (:need:`feat_req__ipc__confidentiality`) - integrity (:need:`feat_req__ipc__integrity`) - availability (per criticality-level) (:need:`feat_req__ipc__availability`) +- secure communication (:need:`feat_req__some_ip_gateway__secure_com`) +- access control (:need:`feat_req__some_ip_gateway__access_control`) Backwards Compatibility @@ -120,7 +122,136 @@ Applications shall stay stable on API layer, need to recompile is acceptable. Security Impact =============== -As the SOME/IP gateway will open direct communication channels on the SOME/IP channels, the SOME/IP implementation shall comply with standard security requirements. +There are multiple protocols targeting secure communication. In general a holistic security concept for a vehicle will not apply all together. + +.. figure:: assets/some_ip_gateway_sec_protocols.drawio.svg + :align: center + :name: some_ip_gateway_sec_protocols_ + + Secure communication protocols + + +.. note:: + Access Control List (ACL) is not a security protocol, but a mechanism to restrict access to the SOME/IP Gateway services and tylically allocated within the stateful packet inspection firewall. + +Scope +----- + +As the SOME/IP gateway will open direct communication channels via SOME/IP, where the SOME/IP implementation shall comply with standard security requirements. + +Since SOME/IP is a protocol relies on the security of the underlying transport layer, the SOME/IP gateway makes use of the security features relevant for it. This includes: + +- VLAN (= Virtual Local Area Network): A virtual interface that separates ethernet network packets identified by a VLAN ID +- MACsec: Provides L2 data Integrity, Authenticity and optionally Confidentiality for point-to-point communication. +- IPsec: A network layer protocol suite that secures network connections by encrypting and/or authenticating IP packets. +- TLS (= Transport Layer Security): Authentication, integrity, confidentiality of TCP channels -> Protection for one to one communication. +- DTLS (= Datagram Transport Layer Security): Authentication, integrity, confidentiality of UDP packets -> Protection for multicast communication. +- ACL (= Access Control List): A filter mechanism to ensure that only allowed SOME/IP communication can take place. + +Features included `Feature Request for Security & Crypto <https://github.com/eclipse-score/score/issues/905>`_ e.g cryptographic algorithms, symmetric-, asymmetric encryption, Signature functionality, Certificate management, certificate management, entropy generation, data integrity, key management, are out of scope. + + +Access Control List +------------------- + +An access control mechanism is part of a firewall solution, which states that only the traffic defined in the security policy is allowed onto the network and all other traffic must be silently dropped. +Access Control acts on OSI Layer 5-7. It shall fulfill following: + +- Whitelisting of SOME/IP services and methods based on IP addresses and therefore IP address authenticity. +- A static list which could be updated via OTA (= Over-The-Air) updates. +- Versioning +- ACL shall be able to be switched on/off to allow bypassing in an secured environment e.g. engineering mode or repair shop. +- ACL drop actions shall be logged persistently via a DTC (= Diagnostic Trouble Code) including needed environment data to clearly understand the context of the drop, including the sender, timestamp, Service ID and Instance ID. +- To avoid code injection attacks, into services of the system, only authenticated and authorized communication partners are allowed to write or delete entries into the **Service Registry**. + +.. 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 AUTSAR Adaptive specification. + + +.. uml:: + :name: doc__acl_activity_diagram + :scale: 80 + :align: center + :caption: Simplified Access Control Activity Diagram + + !include assets/puml-theme-score.puml + + start + + :Ingress SOME/IP; + :ACL Check; + + if (Packet matches ACL entry?) then (Yes) + :Process Packet; + else (No) + :Log Event; + if (ACL is active?) then (Yes) + :Drop Packet; + else (No) + :Process Packet; + endif + endif + + stop + + +E2E and CRC (Informal Notes) +---------------------------- + +There are several E2E (= End-to-End) profiles, which utilize various CRC routines as part of AUTOSAR E2E Protocol Specification: + +- CRC8 (SAEJ1850) +- CRC8H2F (0x2F polynomial) +- CRC16 (also known as CCITT-FALSE 16-bit CRC) +- CRC32 (also known as IEEE 802.3 Ethernet 32-bit CRC) +- CRC32P4 (0xF4ACFB13 polynomial) +- CRC64 (CRC-64-ECMA) +- CRC32_J1939 (0x6938392D polynomial) (used by Profile 76). + +These routines can be implemented using different calculation methods: + +- Table based calculation for faster execution, but requiring a larger code size due to ROM tables. +- Runtime calculation for smaller code size (no ROM table), but resulting in slower execution. +- Hardware supported CRC calculation (device-specific) for fast execution and less CPU time. + +The E2E Library itself does not provide CRC routine implementations, instead, it calls the CRC routines from a dedicated CRC library. +It is also a requirement that the CRC used in an E2E profile must be different from the CRC used by the underlying physical communication protocol. + +All E2E profiles can be used in combination with SOME/IP, although specific profiles may have limitations regarding maximum data length or being restricted to fixed-length messages. + +For E2E protection with SOME/IP, the CRC is calculated over specific parts of the serialized SOME/IP message: + +- For profiles 1, 2, 4, 5, 6, 7, 11, and 22, which are typically used for signal-based or periodic event-based communication, the E2E CRC should be calculated over the following elements of the serialized SOME/IP message: + + - Request ID (Client ID / Session ID) + - Protocol Version + - Interface Version + - Message Type + - Return Code + - Payload + +- For profiles 4m, 7m, 8m, and 44m, which are designed for method-based (client-server) communication, the E2E CRC shall be calculated over specific parts of the serialized SOME/IP message. These method-specific profiles incorporate additional fields like Message Type and Message Result within their E2E headers to distinguish between request and response messages and their outcomes. + +The E2E communication protection process involves the sender adding control fields, including the CRC, to the transmitted data, and the receiver then evaluating these fields upon reception. +The middleware, is responsible for determining parameters like DataID, Message Type, Message Result, and SourceID from the exchanged information and then invoking the E2E functions. +The CRC is calculated over the entire E2E header (excluding the CRC bytes themselves) and the user data. +For some profiles (e.g., Profile 5, 6, 22), the Data ID is included as an extension at the end of the user data for CRC calculation, even if it is not explicitly transmitted. + + +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>`_ + +SecOC (Informal Notes) +---------------------- + +- The SecOC protocol provides a mechanism to verify the authenticity and integrity but lacks of confidentiality. +- SecOC (= Secured Onboard Communication) does not offer encryption support by design. +- In contrast to SecOC, TLS can protect all payload of an AUTOSAR PDU including the AUTOSAR PDU header used which overlaps with the SOME/IP message header. +- In case of SOME/IP protocol, the SOME/IP message id can not be protected by SecOC, because it is stripped before SecO is invoked. + Safety Impact ============= diff --git a/docs/features/communication/some_ip_gateway/requirements/index.rst b/docs/features/communication/some_ip_gateway/requirements/index.rst index 5527d9e4ff..ddfbf161c5 100644 --- a/docs/features/communication/some_ip_gateway/requirements/index.rst +++ b/docs/features/communication/some_ip_gateway/requirements/index.rst @@ -24,7 +24,25 @@ Functional Requirements Security Impact =============== +.. feat_req:: SOME/IP Gateway Secure Communication + :id: feat_req__some_ip_gateway__secure_com + :reqtype: Functional + :security: YES + :safety: QM + :satisfies: stkh_req__communication__secure + :status: valid + + The platform shall support secure communication. + +.. feat_req:: SOME/IP Gateway Access Control + :id: feat_req__some_ip_gateway__access_control + :reqtype: Functional + :security: YES + :safety: QM + :satisfies: stkh_req__dependability__security_features + :status: valid + The SOME/IP Gateway shall support access control to restrict access to the gateway services. Safety Impact ============= @@ -43,7 +61,7 @@ Safety Impact :id: feat_req__some_ip_gateway__network_stack :reqtype: Functional :security: YES - :safety: QM + :safety: ASIL_B :satisfies: stkh_req__communication__safe :status: valid From 05befa623ed270e9a1bcba50f8c217275d648700 Mon Sep 17 00:00:00 2001 From: lurtz <727209+lurtz@users.noreply.github.com> Date: Thu, 31 Jul 2025 11:51:08 +0200 Subject: [PATCH 074/109] some_ip_gateway: SOME/IP Service Discovery (#5) SOME/IP service discovery needs to be mapped to IPC features. Also its behavior in relationship to IPC needs to be shown. --- .../communication/some_ip_gateway/index.rst | 1 + .../service_discovery/index.rst | 180 ++++++++++++++++++ 2 files changed, 181 insertions(+) create mode 100644 docs/features/communication/some_ip_gateway/service_discovery/index.rst diff --git a/docs/features/communication/some_ip_gateway/index.rst b/docs/features/communication/some_ip_gateway/index.rst index c2bb048ba4..b3b4359c2e 100644 --- a/docs/features/communication/some_ip_gateway/index.rst +++ b/docs/features/communication/some_ip_gateway/index.rst @@ -29,6 +29,7 @@ SOME/IP-Gateway architecture/index.rst requirements/index.rst + service_discovery/index.rst Feature flag diff --git a/docs/features/communication/some_ip_gateway/service_discovery/index.rst b/docs/features/communication/some_ip_gateway/service_discovery/index.rst new file mode 100644 index 0000000000..e56a5d1e13 --- /dev/null +++ b/docs/features/communication/some_ip_gateway/service_discovery/index.rst @@ -0,0 +1,180 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +.. _some_ip_gateway_service_discovery: + +SOME/IP-Gateway Service Discovery +################################# + +Service discovery deals with discovery and connection setup of services. +The basic summary of service discovery is as follows: + +- provided / required services (including their service elements like events, methods, and fields) must be configured +- (locally) provided services are discovered (locally) via IPC and then offered on the network by sending a SOME/IP-SD message with an OfferService entry according to configuration +- (locally) required services may trigger the discovery on the network by sending of a SOME/IP-SD message with a FindService entry +- when a SOME/IP-SD message containing a FindService entry is received, the SOME/IP gateway checks this service has been already offered locally via IPC +- for IPC service discovery the features of lola are used by the SOME/IP gateway + +Configuration +============= + +The configuration tells the SOME/IP communication stack which services it should provide and which services it should require on the network. +The configuration contains SOME/IP and SOME/IP-SD settings as well as IP interface bindings. +Events, methods and fields are configured as well. + +The integrator must be able to change configuration at runtime deployment. +Thus it is likely read from one or multiple files. + +Provided services +================= + +Services available in the local ECU / VM are offered by the SOME/IP gateway once they become internally available and are present in the configuration. +This is done by sending an SOME/IP-SD messages containing an OfferService entry to the network. +As long as the service is locally available the service offering is periodically (according to the configuration) renewed by sending a SOME/IP-SD messages containing an OfferService entry to the network. + +.. uml:: + :alt: Gateway offers a service to the network + + @startuml + participant "Producer" as IPC_client + participant "Service\nvia IPC" as Service + participant "SOME/IP Gateway" as Someipgateway + actor "Network" as Network + + IPC_client -> Service ** : create() + IPC_client -> Service : OfferService() + Someipgateway -> Service: service_discovery() + Someipgateway -> Network: OfferService + Network -> Someipgateway: SubscribeEventgroup + Someipgateway -> Someipgateway: create_proxy() + @enduml + +Once the service ceased to exist locally, the SOME/IP communication stack sends a SOME/IP-SD message containing a StopOfferService entry to the network. + +.. uml:: + :alt: Gateway stops service offer + + @startuml + participant "Producer" as IPC_client + participant "Service\nvia IPC" as Service + participant "SOME/IP Gateway" as Someipgateway + actor "Network" as Network + + IPC_client -> Service : StopOfferService() + Someipgateway -> Service: service_discovery() + Someipgateway -> Network: StopOfferService + @enduml + +.. note:: ``mw::com::<Proxy>::StartFindService()`` function can tell us that a service is offered or stopped. But using it is awkward / complicated. + +Required services +================= + +For configured required services, the SOME/IP communication stack will send a SOME/IP-SD message containing a FindService entry to the network. + +FindService message might not be needed, if OfferService messages for that services have been already received. + +Upon initial reception of a SOME/IP-SD message containing an OfferService entry, the SOME/IP communication stack checks if the service has been configured as required service. +If so, the SOME/IP communication stack offers the service locally in the ECU / VM. +Here, initial reception is the first reception after a previous service loss or withdrawal, i.e., + +- after the reception of a SOME/IP-SD message containing an StopOfferService entry +- after a TTL expiry of the previous OfferService entry +- after the detection of a reboot of the (remote) service provider +- after a link-down/link-up event + +.. uml:: + :alt: Gateway receives OfferService from the network + + @startuml + actor "Network" as Network + participant "SOME/IP Gateway" as Someipgateway + participant "Service\nvia IPC" as Service + participant "Consumer" as IPC_client + + Network -> Someipgateway: OfferService + Someipgateway -> Service ** : create() + Someipgateway -> Service: OfferService() + IPC_client -> Service: service_discovery() + IPC_client -> Service: connect() + @enduml + +.. note:: + The SOME/IP communication stack can create the service before receiving an OfferService, + but can only start offering it after having received an OfferService message from the network. + This behavior may reduce the time until the service is available for consumers, but may increase boot time. + Thus the decision is to create the service only after having received an OfferService message from the network. + +Upon reception of SOME/IP-SD message containing an StopOfferService entry, the SOME/IP communication stack stops the proxy service offered via IPC as well. + +.. uml:: + :alt: Gateway receives StopOfferService from the network + + @startuml + actor "Network" as Network + participant "SOME/IP Gateway" as Someipgateway + participant "Service\nvia IPC" as Service + participant "Consumer" as IPC_client + + Network -> Someipgateway: StopOfferService + Someipgateway -> Service: StopOfferService() + IPC_client -> Service: service_discovery() + IPC_client -> IPC_client: handle_disconnect() + @enduml + +.. note:: + If the service times out we may internally stop the service, but keep it alive until another timeout is reached. + The intention is to avoid destroying and recreating the service repeatedly. + + TODO: is this optimization for a rare case and worth the complexity? + +FindService +================ + +Upon reception of a SOME/IP-SD message containing a FindService entry, the SOME/IP communication stack checks if the service is available locally and has been configured as provided service. +If both questions are answered positively, the SOME/IP communication stack responds by sending a SOME/IP-SD message containing an OfferService to the sender of the SOME/IP-SD message containing a FindService entry. + +This will **not** trigger creation of the service internally by any means. +Only lookup of running services is done. + +.. uml:: + :alt: Gateway receives FindService from the network + + @startuml + actor "Network" as Network + participant "SOME/IP Gateway" as Someipgateway + participant "Service\nvia IPC" as Service + + Network -> Someipgateway: FindService + Someipgateway -> Service: service_discovery() + alt Service available + Someipgateway -> Network: OfferService + end + @enduml + +If an service is configured to be needed and no OfferService has been received yet, the SOME/IP communication stack may send a SOME/IP-SD message containing a FindService entry. + +.. uml:: + :alt: Gateway sends FindService to the network + + @startuml + actor "Network" as Network + participant "SOME/IP Gateway" as Someipgateway + + loop required Service + alt no OfferService received + Someipgateway -> Network: FindService + end + end + @enduml From 3afe749c29b5061a7941b20a67896aa987eb7f01 Mon Sep 17 00:00:00 2001 From: ZoranCutura <zoran.cutura@etas.com> Date: Tue, 19 Aug 2025 14:28:46 +0000 Subject: [PATCH 075/109] some_ip_gateway: introduced requirements to AUTOSAR compatibility some_ip_gateway: spelling correction some_ip_gateway: spelling corrections some_ip_gateway: ACL and SD conf Changes after reviews and discussions some_ip_gateway: typos some_ip_gateway: changed comment on architecture some_ip_gateway: corrections and AUTOSAR reference corrected typos and wordings introduced requirements to AUTOSAR compatibility review comments addressed some_ip_gateway: adapted requirements to meet com removed requirements for ACL, as they are defined in com already removed ASIL requirement as this is defined for com added remark in specification, that com requirements apply some_ip_gateway: updated requirements with .. stkh missing stkh-requirements added some_ip_gateway: added requirements reworked requirements some_ip_gateway: title underline adapted some_ip_gateway: security-considerations, methods reworked after internal review - methods will be treated mostly like events - security impact adapted to leaner approach - license impact adapted - clean-up and wording some_ip_gateway: license impact to/from AUTOSAR AUTOSAR components like SOME/IP have to make sure to apply AUTOSAR license and constraints correctly. some_ip_gateway: interface to lifecycle added comments on integration with lifecycle management. added comment on licenses impacts with AUTOSAR SOME/IP. Co-authored-by: Ulrich Huber <Ulrich.UH.Huber@bmw.de> Co-authored-by: Lutz Reinhard <Lutz.Reinhard@elektrobit.com> Co-authored-by: Andreas Kaluza <Andreas.Kaluza@continental-corporation.com> --- .../some_ip_gateway/architecture/index.rst | 39 +- .../some_ip_gateway_architecture.drawio.svg | 4 +- .../some_ip_gateway_sec_protocols.drawio.svg | 553 ------------------ .../communication/some_ip_gateway/index.rst | 188 +++--- .../some_ip_gateway/requirements/index.rst | 65 +- .../service_discovery/index.rst | 12 +- 6 files changed, 149 insertions(+), 712 deletions(-) delete mode 100644 docs/features/communication/some_ip_gateway/assets/some_ip_gateway_sec_protocols.drawio.svg diff --git a/docs/features/communication/some_ip_gateway/architecture/index.rst b/docs/features/communication/some_ip_gateway/architecture/index.rst index 6cdcfbdd27..4b3e79164b 100644 --- a/docs/features/communication/some_ip_gateway/architecture/index.rst +++ b/docs/features/communication/some_ip_gateway/architecture/index.rst @@ -17,10 +17,6 @@ SOME/IP Gateway Architecture ############################ -.. note:: - For now we store the component architecture in the feature tree, because multi-repo docs are not yet supported. - Once this support becomes available the component architecture will be moved to the module. - .. toctree:: :titlesonly: @@ -61,7 +57,7 @@ It is preferred to avoid such additional IPC. E2E Considerations ================== -To cope with SOME/IP stack just beeing QM, we need to prepare for end-to-end protection. The goal shall be to +To cope with SOME/IP stack just being QM, we need to prepare for end-to-end protection. The goal shall be to do the E2E protection/check **as centrally as possible** in the gateway. Unfortunately, the centralized end-to-end check cannot be done for all relevant E2E properties. The following table proposes where the corresponding E2E properties shall checked. @@ -98,18 +94,18 @@ checked. E2E Design and Interface Considerations --------------------------------------- As mentioned above, not all E2E checks can be kept hidden within the gateway. For some problems it is up to the application to decide -whether it is still valuable to access and process the data. This is in particular true for duplication or re-odering issues. +whether it is still valuable to access and process the data. This is in particular true for duplication or re-ordering issues. Therefore, it is required to pass a **tupel** consisting of the **payload data** as well as **supplementary E2E metadata and error information** to the IPC clients to enable the client to individually judge on particular E2E issues. * The API design needs to put the payload information as well as the additional E2E metadata as close as possible together to easily enable and motivate clients to consequently check for potential errors. * Additional metadata and error information needs to be incorporated into regular mw::com user interface -* Error related interface design needs to be highly optimezed for the "good case" to have an optimized support for the common IPC case -* AoU's need to be provided to force the user to check for the (E2E-) result +* Error related interface design needs to be highly optimized for the "good case" to have an optimized support for the common IPC case +* Assumptions of Use need to be provided to force the user to check for the (E2E-) result * Additional E2E metadata to be handed over to the clients: * Counter, slightly different interpretation depending on profile, n/a in case the profile doesn't support it - * Data ID, n/a in case the profile does not support it or if the Data ID is not explicitely transmitted like in profile 22 + * Data ID, n/a in case the profile does not support it or if the Data ID is not explicitly transmitted like in profile 22 * Profile identification, required to properly interpret E2E attributes like "Counter". (Could be either an "Alive Counter" or a "Sequence Counter" depending on the profile) * Detailed, profile specific error code (enum) @@ -117,12 +113,16 @@ to the IPC clients to enable the client to individually judge on particular E2E * No E2E error * CRC Error - * Sequence error (further subqualification in loss, duplication, reordering is up to the client based on the counter) + * Sequence error (further sub-qualification in loss, duplication, reordering is up to the client based on the counter) + +.. note:: + CRC Errors might cause problems with corrupted service / instance IDs, as such messages might not get forwarded to the correct recipient. + This requires further discussion during implementation phase. .. 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 error enumeration of the AUTOSAR specification (R24-11): * OK * ERROR @@ -140,15 +140,17 @@ about the overall health and state of a communication channel. Unlike individual 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. -Purpose of the E2E State Machine: +Purpose of the E2E State Machine +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The primary purpose of the E2E state machine is to transform instantaneous "per-cycle" check results into a stable, long-term communication channel status. This aggregated status is then provided to the consuming application, enabling it to make informed decisions about whether the received data can be trusted and used for safety-related functions. -As mentioned above, the E2E statemachine is associated to one communication channel which is in turn associated to exactly one -individual IPC client. Therefore it is an obvious consequence, that the individiual state machine handling and state machine +As mentioned above, the E2E state-machine is associated to one communication channel which is in turn associated to exactly one +individual IPC client. Therefore it is an obvious consequence, that the individual state machine handling and state machine configuration is responsibility of the client and not a central responsibility of the gateway. -The diagram below outlines this distribution of responsibilties. +Even for the same service different clients may use different state machine configuration. +The diagram below outlines this distribution of responsibilities. *Diagram: E2E state machine responsibility associated to IPC client* @@ -159,8 +161,7 @@ The diagram below outlines this distribution of responsibilties. E2E state machine responsibility associated to IPC client **Considered Alternative** - -If we allocate the statemachine responsibility to the gateway the distribution of resposnibilities would look like in the following diagram +If we allocate the state-machine responsibility to the gateway the distribution of responsibilities would look like in the following diagram *Diagram: E2E state machine responsibility associated to the gateway* @@ -170,8 +171,8 @@ If we allocate the statemachine responsibility to the gateway the distribution o E2E state machine responsibility associated to the gateway -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**. +Due to pub/sub nature of mw::com, clients listening on the same topic cannot be separately addressed. Therefore, **the state machine results +cannot be selectively distributed according to the particular communication channel they belong to**. **=> Alternative dismissed** diff --git a/docs/features/communication/some_ip_gateway/assets/some_ip_gateway_architecture.drawio.svg b/docs/features/communication/some_ip_gateway/assets/some_ip_gateway_architecture.drawio.svg index b0c8ee75ff..5c110a038a 100644 --- a/docs/features/communication/some_ip_gateway/assets/some_ip_gateway_architecture.drawio.svg +++ b/docs/features/communication/some_ip_gateway/assets/some_ip_gateway_architecture.drawio.svg @@ -1,4 +1,4 @@ -<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="760px" height="760px" viewBox="-0.5 -0.5 760 760" content="<mxfile><diagram name="Seite-1" id="lhOZF3YuWmg6ZXFho8TY">3Vrbbts4EP0aP9rQjbLz2KRpt8AWDZDFbvtIS7RMVBK1FB3b+/U7vOhKunFipWkDFI44pCjyzJmZI6qz8KY4fOS42n5mKclngZceZuH7WRAEfuzDH2k5aovv+1faknGaGltnuKf/EWP0jHVHU1IPBgrGckGroTFhZUkSMbBhztl+OGzD8uFTK5wRy3Cf4Ny2/kNTsdXWVbDs7H8Qmm2bJ/ux2V+Bm8FmJ/UWp2zfM4W3s/CGMyb0VXG4IblEr8FF3/fhRG+7ME5Kcc4N0Urf8YDzndmcWZg4NrvlbFemRN7gzcLr/ZYKcl/hRPbuwcFg24oih5YPlxua5zcsZxzaJSth0HUtOPtORkZ7oWbtD4QLcuiZzMI/ElYQwY8wpKGNZ0Dcdz5Yxsa27eHfGrHxe9bO1UEDFwadE9CGT0HKfxpSsyBc42SVhmDHPDGMRxZ4MC4IowilFyLYhGJkgDGIhpGNaOg5EG0HXoKoDeinO7gpzuEh12sOV5m8KiA83sG/hBUW4DAhxDx5Fi2nwM8f4udfOfBDDvz8KRi5PIEfLuTmy3VdqV1qPFP60AAKWxY0oRWGfZteeFRvwGUZYApc0QhXZOO6cgX6FHGOHHFuONkAdP/l8y3M8+kOxn3EguzxsYfk+iSOsH0xBAvnNCvhOgGwCJDzWoJEodK8Mx0FTdP8FMGHfuFMYEGZvOvKm8YRUTxKEA6C+5ErQUzhidjyRAu29yfLaDKT1c3wXf+C5YaVG5rtuMbi1ak8QjAKYgvBwFW0JqlZdoroU9fOtZBji10J/NPYWamjFjj5/hJJY1QMU0RWaeQqf6tgHcbxROz2hr5BKwe7A4dvVsEEvrGV122ZzgWbwx+ncyoIcFCzF7P6VbAex8HZWE8RB+1y316pDP3HJZzvkiBT1MpGAr9BXCM/GkoQB64vJUGC6M3CikZvHCCPfx6strJ7K7D6o+wa/ETBHNgy7Q4fc4ZlFfuL47LeMF78mmoMOY4QXkyNhb61f5Jm5N40zWtpb8PkQMXX3vU3idMCmdb7g4FNNY69xh3hFFYn3ye0rYSVfu03ejPJZjeVajVznQS8ZjuekKHSF5hnRAzrrdzeD93CSQ7EeBgeq12EsWeR0fmy5tFaPkktIdvlGESWp5KBNwh2b27LMCrt1W6d03pL5CwpFnIirGRbvVvXCadr1SNY100OyRaXGZGDZCTox4348EgE1FtcyZ7ikMmT1cUa1zRZpCzZFcpFY2m32WyCJHFJuzRex2giaTdWII7c41Qg/iSHSLYEecThNS0zwBs2zVlC6rrxh9hKI6uIfHMsMznyWAtStK4t1DxrYkgiB2/kD9wo6bPhuCB7xr/DjJJIlCzg98Ptl7fh5Xj0shQuHW72X8zN4VNzZ5Pz/IXn+cO8F8bRI5lPtcZp9Lx0GNjpsDk6foV0iJ4L2xNLhbtU+Vfxk4vVeShHDpTjV0PZ1uv2QVVijqVUYRiVGq2NIJIgkGADD7B1k0RqmpU4N40CshXOTGVReYiThMBOUpV+5Pm4mdnUIqJqmKpC/aRYEiHz1MKubX/ThOisUMtUqUsdrmv1hHPWZVahc6l5TrMEWNribeRC9LiK9F0qsi2DF7Ft+exU+BLyL3ZE4vLVItF+F/lUVDmRZGmiTBXtmvAH4LqiLOMqPAcnn31J0NJYR0sN0nAAf/zvjikqslLMN7ig+VF+sYK4YCWrNbWv1YOgv1af9mSvVx20XX4VmJsPAe/UzFJddF0yKuYFS819JTNh0j25ew9F48/uCICSVvVJuW01wCEFHVjey2t5/IYkfgjwfmys345tKPKsaYJuGu20tkdnLKRzFupJOaTFHFJyDnWCDvUkHdIeRMaHaCDsUCftkMmVyMg7pAUeaiQe0nxBrcxDQ6GHZAJERuwhI/eaDWmKtBvqpTppU16ECx2q0uKrpk55sn0i6XWA6YR1jkvartYbXRgimdfakUrnNdMcO7vSe41dJ7pudr/XZxJe1xn1OnHddWS9FYzZopotZfrGIZHNOIvx7SmNjtYTxzS/Z/FZDatP7DpJdwnx1QTFp9HyTz7D6M4tvvWV4DPOMLq69a1f0y4qYitHEVu9WhGzvwxd45rkdN1pxIrlx5IVXf26DW7nP/hA9Fsyvf1fUobpy/DcV05/AqqjZ1N9quO6kV5bnifYRoR9lPzRlU1+fab7E7jePLzHdSGPjOExSpyBLAP5BuWpOUYTx0q/+FTwJtWpul+E7ha3HeiffcKCIvvbyFSJfWYKadfXK6Hh7f8=</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="760px" height="760px" viewBox="-0.5 -0.5 760 760" content="<mxfile><diagram name="Seite-1" id="lhOZF3YuWmg6ZXFho8TY">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</diagram></mxfile>"> <defs/> <g> <g> @@ -303,7 +303,7 @@ <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: 340px; margin-left: 601px;"> <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 Gateway is a single process on the operating system and may be part of other frameworks, ie. FEO + SOME/IP Gateway is a component / service may be used in other frameworks, ie. FEO </div> </div> </div> diff --git a/docs/features/communication/some_ip_gateway/assets/some_ip_gateway_sec_protocols.drawio.svg b/docs/features/communication/some_ip_gateway/assets/some_ip_gateway_sec_protocols.drawio.svg deleted file mode 100644 index b8950b1b2c..0000000000 --- a/docs/features/communication/some_ip_gateway/assets/some_ip_gateway_sec_protocols.drawio.svg +++ /dev/null @@ -1,553 +0,0 @@ -<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="992px" height="342px" viewBox="-0.5 -0.5 992 342" content="<mxfile><diagram id="G7RO45l4BIlMHNVsUqmB" name="Page-1">7Vttc6IwEP41ztSb8YZ38SNi2+tM7XmH7d3XFFJkCsQLWOv9+ttIQFS4eh60pVJnmrC7iUn2eTZLwI5sBs+XFM1nY+JgvyMJznNHHnUkSdRkAQomWSUSXdUTgUs9hxttBJb3G3Mhb+cuPAdHW4YxIX7szbeFNglDbMdbMkQpWW6bPRB/+1vnyMV7AstG/r70h+fEs3ReqrJRfMGeO0u/WtQGiSZAqTWfSjRDDlnmRPJ5RzYpIXFSC55N7LPVSxcmaXdRos1GRnEYH9SAt3hC/oLPriNpPrQdPhDoAkYYr/i8tV8Lkip60dorBhjA14Fnhxs91FxWXqMVpswg7RGGkXSa6PkKZP1LlCxCB7ORCaBezrwYW3NkM+0SkASyWRz4cCWyUXi+bxKfULgOSQhGwyim5DFzCazlEPmeG0Ldxw/pyC9Q4PkMeHeYOihE2UDyi5auCqYxfs6J+CJeYhLgmK7AhGslnTuUQ1pJHbzcAGQw4LJZDhsalyGOSTfreuM1qHDHFTuRmf7Viel6J7JojsJDHCtqJY59ESF24hfWCXXvz2CKMAchLbqFnY4NM8J2KVQycTL6PXGRteM9FQ+5CesBJQoY5sP7aJ7MEYzvro2bStcIxFvLVEpJ8d8o2ZHki4u+qQsZL3fIukNNRjUPQqzBxYHnOGwQZZxlYr4ziFI1HJb7B3BYqIvD9cdhtdc/wUgsCQdGYr0CLyr/7sVcbPDZYHoOoo9nLExIqppEiHylm9TWernPxblKN4kmwqGxy/o6PodZXU2OjaWCnTF+07f8sP4rD5WVxdx7WvkeUdhlgV1doTMHA1hJVekPdL5VwCV22KdbK4XUXQqJ+xQSpZoCodo8CkFkQ2wKk9Ft1NKopRHX9qU3pFG/cTS6HU16N+OWPy1/uFbX3pA/g/rzceUUs3H9wGy8Ch+meKnTifIJOlFWXtOJr3BnLJ6gE5VXZaLcuHRkRNp74jYZyeijKG+YjIjl50rlGHx3jPorlg45m37f0xtNzQk/SROsGNmPUJ7hz+5nKNcq1i/c5CSVq7Q0x7xmfOeV0Rdz0m1DTxt6ykLPYD/0qEpB6BGFKmJP+YHcqz84K+FxUdfG3fSl7bsEmft4a8l2OmQDzhy50YtVPEDSG5cnu5MXidby54T4Ix6bKFfCH1F7gUBNePXDwvZXkyeF5vWn47axw48y6nqzwwYUYZC/h3c71MEOKguOsKSiHEqqApTNexgzNljD9HwMhQ7D4h0D1dS6gf/fiMV6wyheUFz+0PPDhLXdHFyR9/GjF0U1pQr8NC8rgDRqaFjnvenPE8RGwf1Z4Y5XCTaOeFD1xtgwFjEJSOw9YbCazFYRM063xCT/NrOgExDKzMZDL2Yb3cdHk7r7FmIBmrSic/oq0JSitNHp0/TaWruLvS87Wl+0+dN/o3L3rrgAlUpRjKsif8qG22RUXk2qe729hWL+abRaHxThcvNbnLUu95Mm+fwP</diagram></mxfile>"> - <defs/> - <g> - <g> - <rect x="1" y="221" width="990" height="60" fill="none" stroke="#000000" stroke-width="2" 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: 988px; height: 1px; padding-top: 251px; margin-left: 3px;"> - <div style="box-sizing: border-box; font-size: 0; text-align: left; color: #000000; "> - <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> - <font style="font-size: 20px;"> - Layer 2 - </font> - </div> - </div> - </div> - </foreignObject> - <text x="3" y="255" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px"> - Layer 2 - </text> - </switch> - </g> - </g> - <g> - <rect x="91" y="221" width="900" height="60" rx="9" ry="9" fill="#ff7c80" stroke="none" pointer-events="all" style="fill: light-dark(rgb(255, 124, 128), rgb(195, 82, 86));"/> - </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: 898px; height: 1px; padding-top: 251px; margin-left: 93px;"> - <div style="box-sizing: border-box; font-size: 0; text-align: left; color: #000000; "> - <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> - <font> - <span style="font-size: 16px;"> - <font style="color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"> - MACsec - </font> - </span> - </font> - <div> - <font> - <span style="font-size: 16px;"> - <font style="color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"> - / VLAN - </font> - </span> - </font> - </div> - </div> - </div> - </div> - </foreignObject> - <text x="93" y="255" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px"> - MACsec... - </text> - </switch> - </g> - </g> - <g> - <rect x="1" y="1" width="990" height="80" fill="none" stroke="#000000" stroke-width="2" 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: 988px; height: 1px; padding-top: 41px; margin-left: 3px;"> - <div style="box-sizing: border-box; font-size: 0; text-align: left; color: #000000; "> - <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> - <font style="font-size: 20px;"> - Layer 5-7 - </font> - </div> - </div> - </div> - </foreignObject> - <text x="3" y="45" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px"> - Layer 5-7 - </text> - </switch> - </g> - </g> - <g> - <rect x="301" y="11" width="120" height="60" rx="9" ry="9" fill="#547980" stroke="#000000" pointer-events="all" style="fill: light-dark(rgb(84, 121, 128), rgb(237, 237, 237)); 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: 41px; margin-left: 302px;"> - <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> - <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> - <font style="color: light-dark(rgb(255, 255, 255), rgb(237, 237, 237)); font-size: 16px;"> - SOME/IP - </font> - <div> - <font color="#ffffff" style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"> - <span style="font-size: 16px;"> - <br/> - </span> - </font> - <div> - <br/> - </div> - </div> - </div> - </div> - </div> - </foreignObject> - <text x="361" y="45" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px" text-anchor="middle"> - SOME/IP... - </text> - </switch> - </g> - </g> - <g> - <rect x="441" y="11" width="120" height="60" rx="9" ry="9" fill="#547980" stroke="#000000" pointer-events="all" style="fill: light-dark(rgb(84, 121, 128), rgb(237, 237, 237)); 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: 41px; margin-left: 442px;"> - <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> - <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> - <font style="color: light-dark(rgb(255, 255, 255), rgb(237, 237, 237)); font-size: 16px;"> - Signal PDUs - </font> - <div> - <font color="#ffffff" style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"> - <span style="font-size: 16px;"> - <br/> - </span> - </font> - <div> - <br/> - </div> - </div> - </div> - </div> - </div> - </foreignObject> - <text x="501" y="45" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px" text-anchor="middle"> - Signal PDUs... - </text> - </switch> - </g> - </g> - <g> - <rect x="581" y="11" width="120" height="60" rx="9" ry="9" fill="#547980" stroke="#000000" pointer-events="all" style="fill: light-dark(rgb(84, 121, 128), rgb(237, 237, 237)); 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: 41px; margin-left: 582px;"> - <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> - <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> - <font style="color: light-dark(rgb(255, 255, 255), rgb(237, 237, 237)); font-size: 16px;"> - UDP-NM - </font> - <div> - <font color="#ffffff" style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"> - <span style="font-size: 16px;"> - <br/> - </span> - </font> - <div> - <br/> - </div> - </div> - </div> - </div> - </div> - </foreignObject> - <text x="641" y="45" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px" text-anchor="middle"> - UDP-NM... - </text> - </switch> - </g> - </g> - <g> - <rect x="1" y="81" width="990" height="60" fill="none" stroke="#000000" stroke-width="2" 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: 988px; height: 1px; padding-top: 111px; margin-left: 3px;"> - <div style="box-sizing: border-box; font-size: 0; text-align: left; color: #000000; "> - <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> - <font style="font-size: 20px;"> - Layer 4 - </font> - </div> - </div> - </div> - </foreignObject> - <text x="3" y="115" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px"> - Layer 4 - </text> - </switch> - </g> - </g> - <g> - <rect x="1" y="141" width="990" height="60" fill="none" stroke="#000000" stroke-width="2" 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: 988px; height: 1px; padding-top: 171px; margin-left: 3px;"> - <div style="box-sizing: border-box; font-size: 0; text-align: left; color: #000000; "> - <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> - <font style="font-size: 20px;"> - Layer 3 - </font> - </div> - </div> - </div> - </foreignObject> - <text x="3" y="175" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px"> - Layer 3 - </text> - </switch> - </g> - </g> - <g> - <rect x="1" y="281" width="990" height="60" fill="none" stroke="#000000" stroke-width="2" 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: 988px; height: 1px; padding-top: 311px; margin-left: 3px;"> - <div style="box-sizing: border-box; font-size: 0; text-align: left; color: #000000; "> - <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> - <font style="font-size: 20px;"> - Layer 1 - </font> - </div> - </div> - </div> - </foreignObject> - <text x="3" y="315" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px"> - Layer 1 - </text> - </switch> - </g> - </g> - <g> - <rect x="161" y="11" width="120" height="60" rx="9" ry="9" fill="#547980" stroke="#000000" pointer-events="all" style="fill: light-dark(rgb(84, 121, 128), rgb(237, 237, 237)); 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: 41px; margin-left: 162px;"> - <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> - <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> - <font style="color: light-dark(rgb(255, 255, 255), rgb(237, 237, 237)); font-size: 16px;"> - DoIP - </font> - <div> - <font color="#ffffff" style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"> - <span style="font-size: 16px;"> - <br/> - </span> - </font> - <div> - <br/> - </div> - </div> - </div> - </div> - </div> - </foreignObject> - <text x="221" y="45" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px" text-anchor="middle"> - DoIP... - </text> - </switch> - </g> - </g> - <g> - <rect x="161" y="91" width="540" height="100" rx="15" ry="15" fill="#547980" stroke="#000000" pointer-events="all" style="fill: light-dark(rgb(84, 121, 128), rgb(237, 237, 237)); 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: 538px; height: 1px; padding-top: 141px; margin-left: 162px;"> - <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> - <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> - <div> - <font style="color: light-dark(rgb(255, 255, 255), rgb(237, 237, 237)); font-size: 16px;"> - <br/> - </font> - </div> - <font style="color: light-dark(rgb(255, 255, 255), rgb(237, 237, 237)); font-size: 16px;"> - DTCP/IP Stack (e.g. TCP, UDP, IP, ICMP, ARP, DHCP) - </font> - <div> - <font color="#ffffff" style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"> - <span style="font-size: 16px;"> - <br/> - </span> - </font> - <div> - <br/> - </div> - </div> - </div> - </div> - </div> - </foreignObject> - <text x="431" y="145" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px" text-anchor="middle"> - DTCP/IP Stack (e.g. TCP, UDP, IP, ICMP, ARP, DHCP)... - </text> - </switch> - </g> - </g> - <g> - <rect x="721" y="11" width="120" height="180" rx="18" ry="18" fill="#547980" stroke="#000000" pointer-events="all" style="fill: light-dark(rgb(84, 121, 128), rgb(237, 237, 237)); 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: 101px; margin-left: 722px;"> - <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> - <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> - <span style="font-size: 16px;"> - <font style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"> - AVTP - </font> - </span> - <br/> - <div> - <font color="#ffffff" style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"> - <span style="font-size: 16px;"> - <br/> - </span> - </font> - <div> - <br/> - </div> - </div> - </div> - </div> - </div> - </foreignObject> - <text x="781" y="105" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px" text-anchor="middle"> - AVTP... - </text> - </switch> - </g> - </g> - <g> - <rect x="861" y="11" width="120" height="180" rx="18" ry="18" fill="#547980" stroke="#000000" pointer-events="all" style="fill: light-dark(rgb(84, 121, 128), rgb(237, 237, 237)); 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: 101px; margin-left: 862px;"> - <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> - <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> - <font style="color: light-dark(rgb(255, 255, 255), rgb(237, 237, 237)); font-size: 16px;"> - gPTP - </font> - <div> - <font color="#ffffff" style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"> - <span style="font-size: 16px;"> - <br/> - </span> - </font> - <div> - <br/> - </div> - </div> - </div> - </div> - </div> - </foreignObject> - <text x="921" y="105" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px" text-anchor="middle"> - gPTP... - </text> - </switch> - </g> - </g> - <g> - <rect x="311" y="41" width="240" height="20" rx="3" ry="3" fill="#ff7c80" stroke="none" pointer-events="all" style="fill: light-dark(rgb(255, 124, 128), rgb(195, 82, 86));"/> - </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: 238px; height: 1px; padding-top: 51px; margin-left: 312px;"> - <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> - <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> - <font> - <span style="font-size: 16px;"> - <font style="color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"> - SecOC, ACL* - </font> - </span> - </font> - </div> - </div> - </div> - </foreignObject> - <text x="431" y="55" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px" text-anchor="middle"> - SecOC, ACL* - </text> - </switch> - </g> - </g> - <g> - <rect x="161" y="231" width="820" height="40" rx="6" ry="6" fill="#547980" stroke="#000000" pointer-events="all" style="fill: light-dark(rgb(84, 121, 128), rgb(237, 237, 237)); 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: 818px; height: 1px; padding-top: 251px; margin-left: 162px;"> - <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> - <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> - <font style="color: light-dark(rgb(255, 255, 255), rgb(237, 237, 237)); font-size: 16px;"> - MAC Layer and AVB/TSN/QoS features - </font> - </div> - </div> - </div> - </foreignObject> - <text x="571" y="255" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px" text-anchor="middle"> - MAC Layer and AVB/TSN/QoS features - </text> - </switch> - </g> - </g> - <g> - <rect x="161" y="291" width="120" height="40" rx="6" ry="6" fill="#547980" stroke="#000000" pointer-events="all" style="fill: light-dark(rgb(84, 121, 128), rgb(237, 237, 237)); 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: 311px; margin-left: 162px;"> - <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> - <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> - <font style="color: light-dark(rgb(255, 255, 255), rgb(237, 237, 237)); font-size: 16px;"> - 100BASE-TX - </font> - </div> - </div> - </div> - </foreignObject> - <text x="221" y="315" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px" text-anchor="middle"> - 100BASE-TX - </text> - </switch> - </g> - </g> - <g> - <rect x="291" y="291" width="690" height="40" rx="6" ry="6" fill="#547980" stroke="#000000" pointer-events="all" style="fill: light-dark(rgb(84, 121, 128), rgb(237, 237, 237)); 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: 688px; height: 1px; padding-top: 311px; margin-left: 292px;"> - <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> - <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> - <font style="color: light-dark(rgb(255, 255, 255), rgb(237, 237, 237)); font-size: 16px;"> - Automotive Phys 100, 1000, and more MBit/s - </font> - </div> - </div> - </div> - </foreignObject> - <text x="636" y="315" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px" text-anchor="middle"> - Automotive Phys 100, 1000, and more MBit/s - </text> - </switch> - </g> - </g> - <g> - <rect x="221" y="91" width="420" height="20" rx="3" ry="3" fill="#ff7c80" stroke="none" pointer-events="all" style="fill: light-dark(rgb(255, 124, 128), rgb(195, 82, 86));"/> - </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: 418px; height: 1px; padding-top: 101px; margin-left: 222px;"> - <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> - <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> - <font> - <span style="font-size: 16px;"> - <font style="color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"> - TLS / DTLS - </font> - </span> - </font> - </div> - </div> - </div> - </foreignObject> - <text x="431" y="105" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px" text-anchor="middle"> - TLS / DTLS - </text> - </switch> - </g> - </g> - <g> - <rect x="221" y="151" width="420" height="20" rx="3" ry="3" fill="#ff7c80" stroke="none" pointer-events="all" style="fill: light-dark(rgb(255, 124, 128), rgb(195, 82, 86));"/> - </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: 418px; height: 1px; padding-top: 161px; margin-left: 222px;"> - <div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> - <div style="display: inline-block; font-size: 12px; font-family: "Verdana"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> - <font> - <span style="font-size: 16px;"> - <font style="color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"> - IPsec - </font> - </span> - </font> - </div> - </div> - </div> - </foreignObject> - <text x="431" y="165" fill="light-dark(#000000, #ffffff)" font-family=""Verdana"" font-size="12px" text-anchor="middle"> - IPsec - </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/index.rst b/docs/features/communication/some_ip_gateway/index.rst index b3b4359c2e..5d3b6f8507 100644 --- a/docs/features/communication/some_ip_gateway/index.rst +++ b/docs/features/communication/some_ip_gateway/index.rst @@ -12,6 +12,8 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* + # #914 Feature Request for SOME/IP Gateway + .. _some_ip_gateway_feature: SOME/IP-Gateway @@ -48,8 +50,10 @@ The focus is on a gateway to handle SOME/IP communication with external devices This feature request includes: - A description of how a SOME/IP gateway service (or data broker) shall be implemented - - How the SOME/IP gateway services shall integrate with the zero-copy communication from IPC (which might become a general description of how services plug-in to the IPC context) + - How the SOME/IP gateway services shall integrate with the zero-copy communication from IPC - How data shall be mapped or translated between SOME/IP protocol and IPC communication + - How service discovery should be integrated, also for services that are offered by IPC-Clients + - How End-to-End protection and checking shall be realized .. _Motivation: @@ -63,7 +67,7 @@ the S-CORE platform, services are required that will handle protocols for commun needs to be realized with the SOME/IP protocol. For software component developers it should be unrecognized that data is originated from a SOME/IP communication channel, the data should be provided with the same API as in IPC. -Nonetheless integrators and architects will have to configure the system to receive or send data over SOME/IP, hence provide it as a SOME/IP service. +Nonetheless integrators and architects will have to configure the system to receive or send data over SOME/IP. .. _Rationale: @@ -71,19 +75,17 @@ Nonetheless integrators and architects will have to configure the system to rece Rationale ========== -SOME/IP and IPC use different mechanisms to communicate on different channels. Applications integrating on S-CORE platform may have certain requirements to data-input that is not directly supported with SOME/IP and vice versa -SOME/IP definition may have requirements that cannot directly be supported by the application providing data on IPC. Therefor it's not only a task of this gateway -to adapt the communication, but also to translate data between the two communication channels and probably even fill data, i.e. when applications require new data that has not be received on SOME/IP or vice versa. +SOME/IP and IPC use different mechanisms and data representations to communicate. Therefor it's not only a task of this gateway +to adapt the communication, but also to transform from one representation to another. This includes changing data layout, filling in missing data, filtering traffic, error handling, service discovery and further steps. -Hence the gateway on the one side should act as a participant in IPC and fulfill all requirements to this accordingly, whereas on the other side it shall participate in SOME/IP communication -acting as a SOME/IP service fulfilling all SOME/IP requirements and defined communication. Between these two contexts developers shall be able to create signal or data mappings and -translate the different data-types and representations of the two contexts. +Hence the gateway shall be a transparent bridge between IPC and SOME/IP. On the one side it should act as a participant in IPC and fulfill all requirements to this accordingly, where providing data or consuming it. +Whereas on the other side it shall participate in SOME/IP communication acting as a SOME/IP service and client fulfilling all SOME/IP requirements and defined communication. +Between these two contexts developers shall be able to create signal or data mappings and translate the different data-types and representations of the two contexts. -The SOME/IP side shall, where possible, use an existing SOME/IP stack that is fully compatible and complying with the SOME/IP specification from AUTOSAR Adaptive. This module shall fulfill the following requirements: - Multi-Binding support - :need:`feat_req__com__multi_binding_support` - - agnostic binding - :need:`feat_req__com__binding_agnostic_api` + - binding agnostic API - :need:`feat_req__com__binding_agnostic_api` - deployment configuration - :need:`feat_req__com__multi_binding_depl` @@ -92,82 +94,87 @@ This module shall fulfill the following requirements: Specification ============= -SOME/IP Gateway protocol implementation ---------------------------------------- +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. -Specifically the SOME/IP specification from AUTOSAR release 24-11 shall be supported by the SOME/IP Gateway. This shall guarantee that systems integrated with the SOME/IP gateway can be used in +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. 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. + +The SOME/IP Gateway shall support SOME/IP Service Discovery. Please refer to the Service Discovery page for detailed discussions on how SD shall be realized with IPC-Clients. + +.. + # fix #1424 SOME/IP Gateway in lifecycle-management + +SOME/IP Gateway processes and life cycle management +--------------------------------------------------- + +The implementation of a gateway likely requires using one or multiple processes. Startup of processes for the gateway, as with any other +process in the S-CORE system, need to be put under the control of lifecycle-management (see feature Lifecycle). +Hence the SOME/IP Gateway must not start any processes on its own, but configure the lifecycle launch and health-monitoring accordingly. +Specifically for the integration of the SOME/IP Stack "plug-in", which is expected to be QM, whereas the rest of the gateway is ASIL-B, +if one or more additional processes need to be spawned and additional executables need to be involved with the implementation, +all need to go into launch control in health monitoring and must not be setup (fork()) by the gateway. + SOME/IP Gateway Security Goals ------------------------------ -As with IPC generally, the security approach for SOME/IP gateway shall achieve the following security goals: +The security approach for SOME/IP gateway shall achieve the following security goals: + +- access control (:need:`feat_req__com__acl_per_service_instance`) -- confidentiality (:need:`feat_req__ipc__confidentiality`) -- integrity (:need:`feat_req__ipc__integrity`) -- availability (per criticality-level) (:need:`feat_req__ipc__availability`) -- secure communication (:need:`feat_req__some_ip_gateway__secure_com`) -- access control (:need:`feat_req__some_ip_gateway__access_control`) +The SOME/IP Gateway service instance shall be defined in the deployment configuration. + +- :need:`ACL Placement <feat_req__com__acl_placement>` Backwards Compatibility ======================= -As there is currently no previous solution for communication in S-CORE, no backwards compatibility is required. +As there is currently no previous solution for gateways in S-CORE, no backwards compatibility is required. Subsequent changes to the SOME/IP gateway module shall keep the API stable where possible and introduce breaking APIs only with approval from tech lead circle. Applications shall stay stable on API layer, need to recompile is acceptable. Security Impact =============== -There are multiple protocols targeting secure communication. In general a holistic security concept for a vehicle will not apply all together. - -.. figure:: assets/some_ip_gateway_sec_protocols.drawio.svg - :align: center - :name: some_ip_gateway_sec_protocols_ - - Secure communication protocols - +Be aware, communication with SOME/IP generally is considered to be not secure. Integrators may apply measures that are outside the +scope of the SOME/IP gateway to secure the communication (IPsec, MACsec, ...). .. note:: - Access Control List (ACL) is not a security protocol, but a mechanism to restrict access to the SOME/IP Gateway services and tylically allocated within the stateful packet inspection firewall. + it is expected that a feature request for crypto and security will cover the necessary measures. + `Feature Request for Security & Crypto <https://github.com/eclipse-score/score/issues/905>`_ -Scope ------ -As the SOME/IP gateway will open direct communication channels via SOME/IP, where the SOME/IP implementation shall comply with standard security requirements. +Access Control List (ACL) +------------------------- -Since SOME/IP is a protocol relies on the security of the underlying transport layer, the SOME/IP gateway makes use of the security features relevant for it. This includes: +The gateway shall only forward selective service instances originating from IP addresses configured in an allow-list. +The logic required for this is protocol specific and therefore part of this feature request. -- VLAN (= Virtual Local Area Network): A virtual interface that separates ethernet network packets identified by a VLAN ID -- MACsec: Provides L2 data Integrity, Authenticity and optionally Confidentiality for point-to-point communication. -- IPsec: A network layer protocol suite that secures network connections by encrypting and/or authenticating IP packets. -- TLS (= Transport Layer Security): Authentication, integrity, confidentiality of TCP channels -> Protection for one to one communication. -- DTLS (= Datagram Transport Layer Security): Authentication, integrity, confidentiality of UDP packets -> Protection for multicast communication. -- ACL (= Access Control List): A filter mechanism to ensure that only allowed SOME/IP communication can take place. - -Features included `Feature Request for Security & Crypto <https://github.com/eclipse-score/score/issues/905>`_ e.g cryptographic algorithms, symmetric-, asymmetric encryption, Signature functionality, Certificate management, certificate management, entropy generation, data integrity, key management, are out of scope. - - -Access Control List -------------------- +Be aware that an additional security mechanism may be necessary that ensures that IP addresses are not forged. This mechanism is out of scope of this feature. An access control mechanism is part of a firewall solution, which states that only the traffic defined in the security policy is allowed onto the network and all other traffic must be silently dropped. -Access Control acts on OSI Layer 5-7. It shall fulfill following: +Access Control acts on OSI Layer 5-7. It shall fulfill the following: -- Whitelisting of SOME/IP services and methods based on IP addresses and therefore IP address authenticity. -- A static list which could be updated via OTA (= Over-The-Air) updates. -- Versioning -- ACL shall be able to be switched on/off to allow bypassing in an secured environment e.g. engineering mode or repair shop. -- ACL drop actions shall be logged persistently via a DTC (= Diagnostic Trouble Code) including needed environment data to clearly understand the context of the drop, including the sender, timestamp, Service ID and Instance ID. -- To avoid code injection attacks, into services of the system, only authenticated and authorized communication partners are allowed to write or delete entries into the **Service Registry**. +- What SOME/IP service instances to forward +- What IP address is allowed to offer a SOME/IP service instance +- Configuration of ACL is done at deployment +- Versioning of services +- ACL, or single parameters of it, shall be able to be switched on/off +- It shall be possible to persistently log ACL drop actions .. 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 AUTSAR Adaptive specification. + - SOME/IP-SD messages are not protected as per AUTOSAR Adaptive specification. .. uml:: @@ -197,75 +204,46 @@ Access Control acts on OSI Layer 5-7. It shall fulfill following: stop -E2E and CRC (Informal Notes) ----------------------------- - -There are several E2E (= End-to-End) profiles, which utilize various CRC routines as part of AUTOSAR E2E Protocol Specification: - -- CRC8 (SAEJ1850) -- CRC8H2F (0x2F polynomial) -- CRC16 (also known as CCITT-FALSE 16-bit CRC) -- CRC32 (also known as IEEE 802.3 Ethernet 32-bit CRC) -- CRC32P4 (0xF4ACFB13 polynomial) -- CRC64 (CRC-64-ECMA) -- CRC32_J1939 (0x6938392D polynomial) (used by Profile 76). - -These routines can be implemented using different calculation methods: - -- Table based calculation for faster execution, but requiring a larger code size due to ROM tables. -- Runtime calculation for smaller code size (no ROM table), but resulting in slower execution. -- Hardware supported CRC calculation (device-specific) for fast execution and less CPU time. - -The E2E Library itself does not provide CRC routine implementations, instead, it calls the CRC routines from a dedicated CRC library. -It is also a requirement that the CRC used in an E2E profile must be different from the CRC used by the underlying physical communication protocol. +Safety Impact +============= -All E2E profiles can be used in combination with SOME/IP, although specific profiles may have limitations regarding maximum data length or being restricted to fixed-length messages. +SOME/IP stack and underlying OS network stacks are typically QM only. Freedom from interference needs to be respected between the +safety classified IPC component (mw::com) and the SOME/IP stack which is part of the gateway. The SOME/IP communication itself needs +to be properly protected by E2E to maintain a safe communication via the grey SOME/IP channel. -For E2E protection with SOME/IP, the CRC is calculated over specific parts of the serialized SOME/IP message: +End-to-End (E2E) protection with CRC and counters +------------------------------------------------- -- For profiles 1, 2, 4, 5, 6, 7, 11, and 22, which are typically used for signal-based or periodic event-based communication, the E2E CRC should be calculated over the following elements of the serialized SOME/IP message: +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. - - Request ID (Client ID / Session ID) - - Protocol Version - - Interface Version - - Message Type - - Return Code - - Payload +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. -- For profiles 4m, 7m, 8m, and 44m, which are designed for method-based (client-server) communication, the E2E CRC shall be calculated over specific parts of the serialized SOME/IP message. These method-specific profiles incorporate additional fields like Message Type and Message Result within their E2E headers to distinguish between request and response messages and their outcomes. +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. +All communication channels (IPC) to this central service must be qualified for ASIL-B, and protected against data loss / loss of samples. -The E2E communication protection process involves the sender adding control fields, including the CRC, to the transmitted data, and the receiver then evaluating these fields upon reception. -The middleware, is responsible for determining parameters like DataID, Message Type, Message Result, and SourceID from the exchanged information and then invoking the E2E functions. -The CRC is calculated over the entire E2E header (excluding the CRC bytes themselves) and the user data. -For some profiles (e.g., Profile 5, 6, 22), the Data ID is included as an extension at the end of the user data for CRC calculation, even if it is not explicitly transmitted. +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>`_ -SecOC (Informal Notes) ----------------------- - -- The SecOC protocol provides a mechanism to verify the authenticity and integrity but lacks of confidentiality. -- SecOC (= Secured Onboard Communication) does not offer encryption support by design. -- In contrast to SecOC, TLS can protect all payload of an AUTOSAR PDU including the AUTOSAR PDU header used which overlaps with the SOME/IP message header. -- In case of SOME/IP protocol, the SOME/IP message id can not be protected by SecOC, because it is stripped before SecO is invoked. - - -Safety Impact -============= - -SOME/IP stack and underlying OS network stacks are typically QM only. Freedom from interference needs to be respected between the -safty classified IPC component (mw::com) and the SOME/IP stack which is part of the gateway. The SOME/IP communication itself needs -to be properly protected by E2E to maintain a safe communication via the grey SOME/IP channel. - 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. + +Anybody using SOME/IP Gateway needs to make sure to follow the license conditions and rules of AUTOSAR. How to Teach This ================= + +TBD diff --git a/docs/features/communication/some_ip_gateway/requirements/index.rst b/docs/features/communication/some_ip_gateway/requirements/index.rst index ddfbf161c5..bc26141f5f 100644 --- a/docs/features/communication/some_ip_gateway/requirements/index.rst +++ b/docs/features/communication/some_ip_gateway/requirements/index.rst @@ -19,50 +19,59 @@ SOME/IP Gateway Requirements Functional Requirements ======================= - - -Security Impact -=============== - -.. feat_req:: SOME/IP Gateway Secure Communication - :id: feat_req__some_ip_gateway__secure_com +.. feat_req:: Plug-In-IFC for SOME/IP protocol stacks + :id: feat_req__some_ip_gateway__stack_plugin_ifc :reqtype: Functional - :security: YES + :security: NO :safety: QM - :satisfies: stkh_req__communication__secure + :satisfies: stkh_req__communication__extensible_external, stkh_req__communication__supported_net :status: valid - The platform shall support secure communication. + The SOME/IP Gateway shall support an interface to plug-in a SOME/IP stack implementation. -.. feat_req:: SOME/IP Gateway Access Control - :id: feat_req__some_ip_gateway__access_control +.. feat_req:: Plug-In-IFC for End-to-End protection modules + :id: feat_req__some_ip_gateway__e2e_plugin_ifc :reqtype: Functional - :security: YES - :safety: QM - :satisfies: stkh_req__dependability__security_features + :security: NO + :safety: ASIL_B + :satisfies: stkh_req__communication__safe :status: valid - The SOME/IP Gateway shall support access control to restrict access to the gateway services. + The SOME/IP Gateway shall support an interface to plug-in a E2E protection service implementation. -Safety Impact -============= +.. feat_req:: Compatibility with AUTOSAR SOME/IP Protocol Specification + :id: feat_req__some_ip_gateway__someip_protocol + :reqtype: Functional + :security: NO + :safety: ASIL_B + :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>`_ -.. feat_req:: SOME/IP Gateway ASIL level - :id: feat_req__some_ip_gateway__asil +.. feat_req:: Compatibility with AUTOSAR E2E Protocol Specification + :id: feat_req__some_ip_gateway__e2e_specs :reqtype: Functional - :security: YES + :security: NO :safety: ASIL_B - :satisfies: stkh_req__communication__safe + :satisfies: stkh_req__communication__supported_net :status: valid - The SOME/IP Gateway shall support safe communication up to ASIL-B. + 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>`_ + -.. feat_req:: SOME/IP Gateway QM network stack - :id: feat_req__some_ip_gateway__network_stack +.. feat_req:: Compatibility with AUTOSAR SOME/IP Service Discovery Protocol Specification + :id: feat_req__some_ip_gateway__someip_sd_protocol :reqtype: Functional - :security: YES + :security: NO :safety: ASIL_B - :satisfies: stkh_req__communication__safe + :satisfies: stkh_req__communication__supported_net :status: valid - If SOME/IP network stacks are available as QM only. + 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>`_ diff --git a/docs/features/communication/some_ip_gateway/service_discovery/index.rst b/docs/features/communication/some_ip_gateway/service_discovery/index.rst index e56a5d1e13..cee8f4ac6d 100644 --- a/docs/features/communication/some_ip_gateway/service_discovery/index.rst +++ b/docs/features/communication/some_ip_gateway/service_discovery/index.rst @@ -14,17 +14,18 @@ .. _some_ip_gateway_service_discovery: -SOME/IP-Gateway Service Discovery +SOME/IP Gateway Service Discovery ################################# +The implementation shall be fully compatible and complying with the SOME/IP Service Discovery Protocol specification from AUTOSAR Adaptive. Service discovery deals with discovery and connection setup of services. The basic summary of service discovery is as follows: - provided / required services (including their service elements like events, methods, and fields) must be configured - (locally) provided services are discovered (locally) via IPC and then offered on the network by sending a SOME/IP-SD message with an OfferService entry according to configuration -- (locally) required services may trigger the discovery on the network by sending of a SOME/IP-SD message with a FindService entry +- (locally) required services trigger the discovery on the network by sending of a SOME/IP-SD message with a FindService entry - when a SOME/IP-SD message containing a FindService entry is received, the SOME/IP gateway checks this service has been already offered locally via IPC -- for IPC service discovery the features of lola are used by the SOME/IP gateway +- the IPC service discovery is used by the SOME/IP gateway and no parallel discovery mechanism is introduced Configuration ============= @@ -32,6 +33,7 @@ Configuration The configuration tells the SOME/IP communication stack which services it should provide and which services it should require on the network. The configuration contains SOME/IP and SOME/IP-SD settings as well as IP interface bindings. Events, methods and fields are configured as well. +Only full interfaces of services are forwarded (all events, methods, fields of a service). The integrator must be able to change configuration at runtime deployment. Thus it is likely read from one or multiple files. @@ -116,7 +118,7 @@ Here, initial reception is the first reception after a previous service loss or This behavior may reduce the time until the service is available for consumers, but may increase boot time. Thus the decision is to create the service only after having received an OfferService message from the network. -Upon reception of SOME/IP-SD message containing an StopOfferService entry, the SOME/IP communication stack stops the proxy service offered via IPC as well. +Upon reception of SOME/IP-SD message containing an StopOfferService entry, the SOME/IP communication stack stops the service offered via IPC as well. .. uml:: :alt: Gateway receives StopOfferService from the network @@ -163,7 +165,7 @@ Only lookup of running services is done. end @enduml -If an service is configured to be needed and no OfferService has been received yet, the SOME/IP communication stack may send a SOME/IP-SD message containing a FindService entry. +If a service is configured to be needed and no OfferService has been received yet, the SOME/IP communication stack shall send a SOME/IP-SD message containing a FindService entry. .. uml:: :alt: Gateway sends FindService to the network From 341097944124efbc0ee7f78704b6c84759700e5e Mon Sep 17 00:00:00 2001 From: "markus.schu" <markus.schu@accenture.com> Date: Mon, 25 Aug 2025 12:01:26 +0200 Subject: [PATCH 076/109] add initial templates for feo feature and module initial templates for feo module added, add feo_feo component into feo module updated module version for docs-as-code and process_description fixed naming issues in development due to linter changes Resolves: #1616 Change-Id: I7376977d3c1dea5b77d8c5e7eb900c6f9c3b5086 --- MODULE.bazel | 4 +- .../contribution_request/feature_request.rst | 4 +- .../development/cpp/code_analysis.rst | 4 +- .../cpp/misra_2023_rule_mapping.rst | 2 +- docs/contribute/general/folder.rst | 20 +- .../ipc/docs/safety_planning/index.rst | 32 +- .../feo/architecture/_assets/stat_arch.puml | 1 + .../architecture/chklst_arch_inspection.rst | 154 ++++++++ .../feo/architecture/feature_architecture.rst | 31 +- docs/features/frameworks/feo/index.rst | 82 +++-- .../frameworks/feo/requirements/aou_req.rst | 36 ++ .../requirements/chklst_req_inspection.rst | 138 +++++++ .../{index.rst => feature_req.rst} | 16 +- .../chklst_safety_analysis_inspection.rst | 81 +++++ .../feo/safety_analysis/feature_dfa.rst | 50 +++ .../feo/safety_analysis/feature_fmea.rst | 48 +++ .../frameworks/feo/safety_planning/index.rst | 142 ++++++++ docs/features/frameworks/index.rst | 2 +- .../requirements/chklst_req_inspection.rst | 8 +- .../persistency/kvs/requirements/index.rst | 2 +- .../persistency/kvs/safety_planning/index.rst | 32 +- .../baselibs/result/docs/requirements.rst | 2 +- docs/modules/feo/docs/index.rst | 15 +- docs/modules/feo/docs/manual/index.rst | 21 ++ .../modules/feo/docs/manual/safety_manual.rst | 12 +- .../modules/feo/docs/release/release_note.rst | 94 +++++ docs/modules/feo/docs/safety_mgt/index.rst | 23 ++ .../safety_mgt/module_safety_package_fdr.rst | 63 ++++ .../docs/safety_mgt/module_safety_plan.rst | 341 ++++++++++++++++++ .../safety_mgt/module_safety_plan_fdr.rst | 93 +++++ .../module_verification_report.rst | 80 ++++ .../architecture/chklst_arch_inspection.rst | 154 ++++++++ .../architecture/component_architecture.rst | 17 +- .../feo/feo/docs/component_classification.rst | 187 ++++++++++ .../detailed_design/chklst_dd_inspection.rst | 92 +++++ .../component_detailed_design.rst | 66 ++++ docs/modules/feo/feo/docs/index.rst | 164 ++++++++- .../feo/feo/docs/requirements/aou_req.rst | 37 ++ .../requirements/chklst_req_inspection.rst | 138 +++++++ .../requirements/component_requirements.rst | 15 +- .../chklst_safety_analysis_inspection.rst | 81 +++++ .../docs/safety_analysis/component_dfa.rst | 48 +++ .../docs/safety_analysis/component_fmea.rst | 49 +++ docs/modules/feo/feo_com/docs/index.rst | 2 +- docs/modules/feo/feo_log/docs/index.rst | 2 +- docs/modules/feo/feo_time/docs/index.rst | 2 +- docs/modules/feo/feo_tracing/docs/index.rst | 2 +- docs/modules/feo/index.rst | 2 +- .../docs/safety_mgt/module_safety_plan.rst | 46 +-- .../module_verification_report.rst | 2 +- .../kvs/docs/architecture/index.rst | 2 +- .../kvs/docs/requirements/index.rst | 2 +- .../change_management.rst | 41 ++- .../config_management.rst | 22 +- .../documentation_management.rst | 1 + .../problem_resolution.rst | 30 +- .../project_management.rst | 1 + .../quality_management.rst | 104 +++--- .../release_management.rst | 15 +- .../safety_management.rst | 37 +- .../security_management.rst | 83 ++--- .../software_development.rst | 19 +- .../software_verification.rst | 33 +- .../tool_management.rst | 13 +- 64 files changed, 2790 insertions(+), 352 deletions(-) create mode 100644 docs/features/frameworks/feo/architecture/chklst_arch_inspection.rst create mode 100644 docs/features/frameworks/feo/requirements/aou_req.rst create mode 100644 docs/features/frameworks/feo/requirements/chklst_req_inspection.rst rename docs/features/frameworks/feo/requirements/{index.rst => feature_req.rst} (97%) create mode 100644 docs/features/frameworks/feo/safety_analysis/chklst_safety_analysis_inspection.rst create mode 100644 docs/features/frameworks/feo/safety_analysis/feature_dfa.rst create mode 100644 docs/features/frameworks/feo/safety_analysis/feature_fmea.rst create mode 100644 docs/features/frameworks/feo/safety_planning/index.rst create mode 100644 docs/modules/feo/docs/manual/index.rst create mode 100644 docs/modules/feo/docs/release/release_note.rst create mode 100644 docs/modules/feo/docs/safety_mgt/index.rst create mode 100644 docs/modules/feo/docs/safety_mgt/module_safety_package_fdr.rst create mode 100644 docs/modules/feo/docs/safety_mgt/module_safety_plan.rst create mode 100644 docs/modules/feo/docs/safety_mgt/module_safety_plan_fdr.rst create mode 100644 docs/modules/feo/docs/verification/module_verification_report.rst create mode 100644 docs/modules/feo/feo/docs/architecture/chklst_arch_inspection.rst create mode 100644 docs/modules/feo/feo/docs/component_classification.rst create mode 100644 docs/modules/feo/feo/docs/detailed_design/chklst_dd_inspection.rst create mode 100644 docs/modules/feo/feo/docs/detailed_design/component_detailed_design.rst create mode 100644 docs/modules/feo/feo/docs/requirements/aou_req.rst create mode 100644 docs/modules/feo/feo/docs/requirements/chklst_req_inspection.rst create mode 100644 docs/modules/feo/feo/docs/safety_analysis/chklst_safety_analysis_inspection.rst create mode 100644 docs/modules/feo/feo/docs/safety_analysis/component_dfa.rst create mode 100644 docs/modules/feo/feo/docs/safety_analysis/component_fmea.rst diff --git a/MODULE.bazel b/MODULE.bazel index dbbb25da56..94ad62d2ed 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -97,5 +97,5 @@ bazel_dep(name = "score_cli_helper", version = "0.1.1") bazel_dep(name = "score_starpls_lsp", version = "0.1.0") # Checker rule for CopyRight checks/fixs -bazel_dep(name = "score_docs_as_code", version = "1.0.1") -bazel_dep(name = "score_process", version = "1.1.0") +bazel_dep(name = "score_docs_as_code", version = "1.0.2") +bazel_dep(name = "score_process", version = "1.1.1") diff --git a/docs/contribute/contribution_request/feature_request.rst b/docs/contribute/contribution_request/feature_request.rst index 92455f410f..555efcc4af 100644 --- a/docs/contribute/contribution_request/feature_request.rst +++ b/docs/contribute/contribution_request/feature_request.rst @@ -25,7 +25,7 @@ This Guideline is based on or references following documents: * :ref:`Contribution Guideline <contribute_contribution_guideline>` * :ref:`Change Management Plan <change_mgmt_plan>` -* :need:`Feature Template <PROCESS_gd_temp__change__feature_request>` +* :need:`Feature Template <PROCESS_gd_temp__change_feature_request>` Creation of Feature Request ================================ @@ -79,7 +79,7 @@ First of all, change the status of *Feature Request* to "in Progress" state. *Feature Requests*, that stay in the status "Draft" longer as 4 weeks, will be deleted. Afterwards create a PR with your proposal in the `/docs/features <https://github.com/eclipse-score/score/tree/main/docs/features>`_ score repository. There you will find currently existing features as subfolders. Please choose the one that fits your *feature request* the most or -create a new subfolder, if none of existing feature match your *feature request*. Please take care, that the PR follows the :need:`Feature Template <PROCESS_gd_temp__change__feature_request>`. +create a new subfolder, if none of existing feature match your *feature request*. Please take care, that the PR follows the :need:`Feature Template <PROCESS_gd_temp__change_feature_request>`. You should try to put as much information as possible, as a good exhaustive description is a prerequisite for *feature request* to be accepted. It is important to understand, that *feature request* consists of an GitHub Issue, that is used to track organizational information and diff --git a/docs/contribute/development/cpp/code_analysis.rst b/docs/contribute/development/cpp/code_analysis.rst index abb4e4ee58..d04f59b555 100644 --- a/docs/contribute/development/cpp/code_analysis.rst +++ b/docs/contribute/development/cpp/code_analysis.rst @@ -16,7 +16,7 @@ Code Analysis C++ ################# .. document:: Static Code Analysis C++ - :id: doc__cpp__code_analysis + :id: doc__cpp_code_analysis :status: valid Guideline for Static Code Analysis @@ -25,7 +25,7 @@ Static Code Analysis ==================== In order to fulfil the S-CORE related standard requirements a concept for *Static Code Analysis* needs to be established. Input for the analysis is based upon *MISRA* and *ISO26262* standards in accordance to the :need:`doc__cpp_coding_guidelines`. -Checking those rules can partially be automated and implemented by a combination of different tools. Thus a mapping needs to be established which provides a linkage of all *MISRA* requirements to the respective tool requirements/rules. For *MISRA C++:2023* this mapping is established: :need:`here <doc__cpp__misra2023_rule_mapping>` +Checking those rules can partially be automated and implemented by a combination of different tools. Thus a mapping needs to be established which provides a linkage of all *MISRA* requirements to the respective tool requirements/rules. For *MISRA C++:2023* this mapping is established: :need:`here <doc__cpp_misra2023_rule_mapping>` .. needuml:: diff --git a/docs/contribute/development/cpp/misra_2023_rule_mapping.rst b/docs/contribute/development/cpp/misra_2023_rule_mapping.rst index 6f3757d536..3463a24d57 100644 --- a/docs/contribute/development/cpp/misra_2023_rule_mapping.rst +++ b/docs/contribute/development/cpp/misra_2023_rule_mapping.rst @@ -16,7 +16,7 @@ MISRA C++:2023 Rule Mapping ########################### .. document:: MISRA C++:2023 Rule Mapping - :id: doc__cpp__misra2023_rule_mapping + :id: doc__cpp_misra2023_rule_mapping :status: draft .. diff --git a/docs/contribute/general/folder.rst b/docs/contribute/general/folder.rst index b524807e27..f526dc9c12 100644 --- a/docs/contribute/general/folder.rst +++ b/docs/contribute/general/folder.rst @@ -29,12 +29,12 @@ The following shows the folder structure of the platform repository (ordered alp features/ -> All features of the platform <feature_name>/ -> Features including sub-folders and feature (change) request [:need:`PROCESS_wp__feat_request`] architecture/ -> Feature architecture [:need:`PROCESS_wp__feature_arch`] - requirements/ -> Feature requirements [:need:`PROCESS_wp__requirements__feat`] + requirements/ -> Feature requirements [:need:`PROCESS_wp__requirements_feat`] safety_analysis/ -> Safety analysis on feature level [:need:`PROCESS_wp__feature_fmea`], [:need:`PROCESS_wp__feature_dfa`] safety_planning/ -> Feature specific safety workproducts planning security_analysis/ -> Security analysis on feature level [:need:`PROCESS_wp__feature_security_analysis`] verification/ -> Feature verification, consisting of Architecture review [:need:`PROCESS_wp__sw_arch_verification`], - integration_tests/ -> Feature Integration tests [:need:`PROCESS_wp__verification__feat_int_test`] + integration_tests/ -> Feature Integration tests [:need:`PROCESS_wp__verification_feat_int_test`] glossary/ -> Glossary of abbreviations used in the platform context introduction/ -> Background, scope and high-level architecture of the platform features @@ -44,7 +44,7 @@ The following shows the folder structure of the platform repository (ordered alp quality/ -> Quality documentation on platform level: [:need:`PROCESS_wp__qms_report`] requirements/ -> Requirements on platform level - stakeholder/ -> Stakeholder requirements [:need:`PROCESS_wp__requirements__stkh`] + stakeholder/ -> Stakeholder requirements [:need:`PROCESS_wp__requirements_stkh`] tool/ -> Tool requirements (not covered in tool repositories) safety/ -> Safety documentation on platform level (SEooC): [:need:`PROCESS_wp__platform_dfa`], [:need:`PROCESS_wp__platform_safety_manual`], @@ -55,9 +55,9 @@ The following shows the folder structure of the platform repository (ordered alp security/ -> Security documentation on platform level: [:need:`PROCESS_wp__platform_security_manual`], [:need:`PROCESS_wp__platform_security_package`], [:need:`PROCESS_wp__sw_platform_sbom`] verification_report/ -> Platform verification report (reporting all platform feature's verifications) - [:need:`PROCESS_wp__verification__platform_ver_report`] + [:need:`PROCESS_wp__verification_platform_ver_report`] - platform_integration_tests/ -> Integration tests on reference hardware verifying stakeholder requirements. [:need:`PROCESS_wp__verification__platform_test`] + platform_integration_tests/ -> Integration tests on reference hardware verifying stakeholder requirements. [:need:`PROCESS_wp__verification_platform_test`] tools/ -> Platform tools (not covered in tool repositories) README.md -> Entrypoint of the repository @@ -74,7 +74,7 @@ The modules and components shall follow the folder structure which was presented <module_name>/ -> Folder containing all artifacts corresponding to one module. docs/ -> Documentation of the module manual/ -> Module manual, e.g. integration manual, assumptions of use, - safety manual [:need:`PROCESS_wp__requirements__comp_aou`], + safety manual [:need:`PROCESS_wp__requirements_comp_aou`], [:need:`PROCESS_wp__module_safety_manual`], security_manual [:need:`PROCESS_wp__module_security_manual`]. release/ -> Module release note [:need:`PROCESS_wp__module_sw_release_note`], @@ -86,7 +86,7 @@ The modules and components shall follow the folder structure which was presented formal documents reviews [:need:`PROCESS_wp__fdr_reports_security`], module SW bill of material [:need:`PROCESS_wp__sw_module_sbom`] verification_report/ -> Module verification report - components verifications [:need:`PROCESS_wp__verification__module_ver_report`], + components verifications [:need:`PROCESS_wp__verification_module_ver_report`], safety analysis formal reviews [:need:`PROCESS_wp__fdr_reports`] <component_name>/ -> Components of the module. @@ -95,7 +95,7 @@ The modules and components shall follow the folder structure which was presented src/ -> Source files of the component consisting of Include files Source Files - Unit tests [:need:`PROCESS_wp__verification__sw_unit_test`] + Unit tests [:need:`PROCESS_wp__verification_sw_unit_test`] Test doubles <lower_level_comp>/ -> lower level component following <component_name> folder structure details/ -> Private implementation details of the component following <component_name> folder structure @@ -104,12 +104,12 @@ The modules and components shall follow the folder structure which was presented architecture/ -> Component architecture (only if lower level components exist) [:need:`PROCESS_wp__component_arch`]. detailed_design/ -> Detailed Design [:need:`PROCESS_wp__sw_implementation`] - requirements/ -> Component requirements [:need:`PROCESS_wp__requirements__comp`] + requirements/ -> Component requirements [:need:`PROCESS_wp__requirements_comp`] safety_analysis/ -> Safety analysis on component level (only if component architecture exists) [:need:`PROCESS_wp__sw_component_fmea`], [:need:`PROCESS_wp__sw_component_dfa`] security_analysis/ -> Security analysis on component level (only if component architecture exists) [:need:`PROCESS_wp__sw_component_security_analysis`] verification/ -> Component verification, consisting of Architecture review [:need:`PROCESS_wp__sw_arch_verification`], code inspection [:need:`PROCESS_wp__sw_implementation_inspection`], - integration_tests/ -> Component integration tests [:need:`PROCESS_wp__verification__comp_int_test`] + integration_tests/ -> Component integration tests [:need:`PROCESS_wp__verification_comp_int_test`] <lower_level_comp>/ -> Lower level component following <component_name> folder structure diff --git a/docs/features/communication/ipc/docs/safety_planning/index.rst b/docs/features/communication/ipc/docs/safety_planning/index.rst index 2ba14afe36..6755c19d15 100644 --- a/docs/features/communication/ipc/docs/safety_planning/index.rst +++ b/docs/features/communication/ipc/docs/safety_planning/index.rst @@ -31,29 +31,29 @@ Inter-process Communication Safety Work Products - WP status * - :need:`PROCESS_wp__feat_request` - - :need:`PROCESS_gd_temp__change__feature_request` - - :ndf:`copy('status', need_id='PROCESS_gd_temp__change__feature_request')` + - :need:`PROCESS_gd_temp__change_feature_request` + - :ndf:`copy('status', need_id='PROCESS_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:`PROCESS_wp__requirements__feat` - - :need:`PROCESS_gd_temp__req__feat_req` - - :ndf:`copy('status', need_id='PROCESS_gd_temp__req__feat_req')` + * - :need:`PROCESS_wp__requirements_feat` + - :need:`PROCESS_gd_temp__req_feat_req` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__req_feat_req')` - `#69 <https://github.com/eclipse-score/score/issues/69>`_ - :doc:`../requirements/index` - see below - * - :need:`PROCESS_wp__requirements__feat_aou` - - :need:`PROCESS_gd_temp__req__aou_req` - - :ndf:`copy('status', need_id='PROCESS_gd_temp__req__aou_req')` + * - :need:`PROCESS_wp__requirements_feat_aou` + - :need:`PROCESS_gd_temp__req_aou_req` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__req_aou_req')` - <link to issue> - :doc:`../requirements/index` - see below * - :need:`PROCESS_wp__feature_arch` - - :need:`PROCESS_gd_temp__arch__feature` - - :ndf:`copy('status', need_id='PROCESS_gd_temp__arch__feature')` + - :need:`PROCESS_gd_temp__arch_feature` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__arch_feature')` - `#388 <https://github.com/eclipse-score/score/issues/388>`_ - :doc:`../architecture/index` - see below @@ -65,21 +65,21 @@ Inter-process Communication Safety Work Products - <Link to WP> - <automated> - * - :need:`PROCESS_wp__requirements__inspect` - - :need:`PROCESS_gd_chklst__req__inspection` - - :ndf:`copy('status', need_id='PROCESS_gd_chklst__req__inspection')` + * - :need:`PROCESS_wp__requirements_inspect` + - :need:`PROCESS_gd_chklst__req_inspection` + - :ndf:`copy('status', need_id='PROCESS_gd_chklst__req_inspection')` - <link to issue> - <Link to WP> - <automated> * - :need:`PROCESS_wp__sw_arch_verification` - - :need:`PROCESS_gd_chklst__arch__inspection_checklist` - - :ndf:`copy('status', need_id='PROCESS_gd_chklst__arch__inspection_checklist')` + - :need:`PROCESS_gd_chklst__arch_inspection_checklist` + - :ndf:`copy('status', need_id='PROCESS_gd_chklst__arch_inspection_checklist')` - <link to issue> - <Link to WP> - <automated> - * - :need:`PROCESS_wp__verification__feat_int_test` + * - :need:`PROCESS_wp__verification_feat_int_test` - :need:`PROCESS_gd_guidl__verification_guide` - :ndf:`copy('status', need_id='PROCESS_gd_guidl__verification_guide')` - <link to issue> diff --git a/docs/features/frameworks/feo/architecture/_assets/stat_arch.puml b/docs/features/frameworks/feo/architecture/_assets/stat_arch.puml index 1455a17224..f23b490f8a 100644 --- a/docs/features/frameworks/feo/architecture/_assets/stat_arch.puml +++ b/docs/features/frameworks/feo/architecture/_assets/stat_arch.puml @@ -28,6 +28,7 @@ component "logging/\ntracing" as log_trace_mgr component "time" as time_mgr frame "feo" as feo { + component "feo" component "feo_com" component "feo_log" component "feo_time" diff --git a/docs/features/frameworks/feo/architecture/chklst_arch_inspection.rst b/docs/features/frameworks/feo/architecture/chklst_arch_inspection.rst new file mode 100644 index 0000000000..ec203384b8 --- /dev/null +++ b/docs/features/frameworks/feo/architecture/chklst_arch_inspection.rst @@ -0,0 +1,154 @@ +.. + # ******************************************************************************* + # 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:: FEO Feature Architecture Inspection Checklist + :id: doc__arch_inspection_frameworks_feo + :status: draft + :security: NO + :safety: ASIL_B + :tags: frameworks_feo + +FEO Feature 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 S-CORE 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:: Feature Architecture Design Review Checklist FEO + :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 defined :need:`Relations between the architectural elements <PROCESS_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#general-concepts-traceability>`_ + - + - + - + * - 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:`PROCESS_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/frameworks/feo/architecture/feature_architecture.rst b/docs/features/frameworks/feo/architecture/feature_architecture.rst index a9de2b0882..928056f414 100644 --- a/docs/features/frameworks/feo/architecture/feature_architecture.rst +++ b/docs/features/frameworks/feo/architecture/feature_architecture.rst @@ -12,8 +12,16 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -Feature Architecture: FEO -========================= +.. document:: FEO Feature Architecture + :id: doc__frameworks_feo_feat_arch + :status: valid + :security: NO + :safety: ASIL_B + :realizes: PROCESS_wp__feature_arch + + +FEO Feature Architecture +======================== Overview -------- @@ -30,24 +38,24 @@ Feature Components * feo: The main component -* feo-com: Interface to inter-activity data communication +* feo_com: Interface to inter-activity data communication Will be replaced by or become a wrapper of the interface `mw::com` provided by the feature "Communication". -* feo-log: Logging macros (Rust and C++) and logger implementation +* feo_log: Logging macros (Rust and C++) and logger implementation Consists of the following sub-components: - - feo-log: Logging macros (Rust and C++) - - feo-logger: Logger implementation (Rust and C++) + - feo_log: Logging macros (Rust and C++) + - feo_logger: Logger implementation (Rust and C++) Will be replaced by or become a wrapper of an interface provided by the feature "Logging". -* feo-time: Interface to system clocks +* feo_time: Interface to system clocks Will be replaced by or become a wrapper of an interface provided by the feature "Time". -* feo-tracing: Subscriber for Rust tracing API +* feo_tracing: Subscriber for Rust tracing API Will be replaced by or become a wrapper of an interface provided by the feature "Logging". @@ -55,10 +63,10 @@ Feature Components Utility and Example Applications ******************************** -* feo-tracer: A simple tracing daemon receiving trace messages from all feo agents +* feo_tracer: A simple tracing daemon receiving trace messages from all feo agents Consists of the following sub-components: - - feo-tracer: Tracing daemon + - feo_tracer: Tracing daemon - perfetto-model: Support for the Perfetto trace file format Will be replaced by an alternative solution provided by the feature "Tracing". @@ -156,3 +164,6 @@ Logical Interfaces :fulfils: feat_req__feo__application_lifecycle See static architecture. + +.. needextend:: docname is not None and "frameworks/feo/architecture" in docname + :+tags: frameworks_feo diff --git a/docs/features/frameworks/feo/index.rst b/docs/features/frameworks/feo/index.rst index 4e04e3d2b6..ab8170d4e2 100644 --- a/docs/features/frameworks/feo/index.rst +++ b/docs/features/frameworks/feo/index.rst @@ -1,6 +1,6 @@ .. # ******************************************************************************* - # Copyright (c) 2024 Contributors to the Eclipse Foundation + # Copyright (c) 2025 Contributors to the Eclipse Foundation # # See the NOTICE file(s) distributed with this work for additional # information regarding copyright ownership. @@ -16,19 +16,25 @@ Fixed execution order framework (FEO) ##################################### .. document:: Fixed execution order framework - :id: doc__feo + :id: doc__frameworks_feo :status: valid + :security: NO :safety: ASIL_B - :tags: feature_request + :tags: feature_request, frameworks_feo -:need:`Change Request Guideline <PROCESS_gd_guidl__change__change_request>` -and :need:`Feature Request Template <PROCESS_gd_temp__change__feature_request>`. .. toctree:: :hidden: - requirements/index.rst + requirements/feature_req.rst + requirements/aou_req.rst + requirements/chklst_req_inspection.rst architecture/feature_architecture + architecture/chklst_arch_inspection.rst + safety_planning/index.rst + safety_analysis/feature_fmea.rst + safety_analysis/feature_dfa.rst + safety_analysis/chklst_safety_analysis_inspection.rst Feature flag ============ @@ -40,19 +46,19 @@ To activate this feature, use the following feature flag: Abstract ======== -This contribution request describes the fixed execution order and reprocessing -framework (FEO), which is intended to support data-driven or time-driven -applications. It provides a fixed execution order for activities and the +This contribution request describes the fixed execution order and reprocessing +framework (FEO), which is intended to support data-driven or time-driven +applications. It provides a fixed execution order for activities and the necessary infrastructure to reprocess activities in a simulated environment. Motivation -========== +========== There are several automotive use-cases that require a fixed and deterministic computation of tasks. -This is particularly crucial for safety-critical applications where the execution order -of tasks is essential for the correct operation of the system. The FEO framework is designed -for applications supporting data-driven and time-driven applications +This is particularly crucial for safety-critical applications where the execution order +of tasks is essential for the correct operation of the system. The FEO framework is designed +for applications supporting data-driven and time-driven applications mainly in the ADAS domain, ensuring a fixed execution order and supporting reprocessing. (See also :need:`stkh_req__app_architectures__support_data`, : need:`stkh_req__app_architectures__support_time`, `stkh_req__dev_experience__reprocessing`) @@ -71,11 +77,11 @@ these aspects can be implemented. Applications ============ -* The framework is used to build applications +* The framework is used to build applications * Multiple applications based on - the framework can run in parallel on the same host machine + the framework can run in parallel on the same host machine * Applications based on the framework can run in parallel with other - applications not based on the framework + applications not based on the framework * The framework does not support communication between different applications (except via service activities, see below) @@ -105,8 +111,8 @@ Application Activities ====================== * Application activities must only use APIs provided by the framework as defined above -* Application activities are single threaded, they can not run outside of their entry points, - they must not spawn other threads or processs +* Application activities are single threaded, they can not run outside of their entry points, + they must not spawn other threads or process * Activities can be implemented in C++ or Rust, mixed systems with both C++ and Rust activities shall be supported. @@ -118,9 +124,9 @@ Service Activities network communication, direct sensor input or direct actuator output * Service activities may also use APIs external to the framework (e.g. networking APIs, reading from external sensor devices, writing HW I/O, etc.) -* Service activities run at the beginning ("input service activity") and at the end +* Service activities run at the beginning ("input service activity") and at the end ("output service activity") of a task chain (see below) -* Input service activities provide the input values to the application activities +* Input service activities provide the input values to the application activities within the task chain, by means of communication * All input service activities must finish execution before the first application activity is run. This can be achieved by proper setup of the chain dependencies (see below) @@ -135,7 +141,7 @@ Service Activities Communication ============= -* Application type activities can only communicate to other activities within +* Application type activities can only communicate to other activities within the same application and using the provided communication API * Communication consists of sending and receiving messages on named topics * The receiver of a message on a topic does not know the sender, instead it only @@ -145,9 +151,9 @@ Communication * There is no publish/subscribe mechanism accessible to activities, instead the set of known communication topics and the assignment of which activity sends and receives to/from which topic is "runtime static" -* "runtime static" means "static after the startup phase", i.e. during startup, the +* "runtime static" means "static after the startup phase", i.e. during startup, the framework can configure or build up communication connections, but as soon as the - run phase starts (where the activties' step() functions are called), the connections + run phase starts (where the activities' step() functions are called), the connections are fixed and will not change any more. * Communication relations are typically configured in configuration files * Messages/topics are statically typed @@ -200,12 +206,12 @@ Process/Thread/Activity Mapping * There is one executable per process, so an application may consist of multiple executables * Each executable contains part of this framework as well as the activities mapped to the corresponding process -* It is assumed that an external entity starts all the executables belonging to the +* It is assumed that an external entity starts all the executables belonging to the same application. The reason for this is, that for security reasons, only very specific entities should have the ability to create processes * The executables belonging to an application are grouped (e.g. in the filesystem) so that it's clear that they belong together -* One reason for having multiple processes per application is to +* One reason for having multiple processes per application is to achieve Freedom From Interference for safety relevant applications @@ -262,7 +268,7 @@ Lifecycle - run phase - shutdown phase -* During startup phase, the primary proces connects with the secondary processes +* During startup phase, the primary process connects with the secondary processes (if present), in order to: - Build up connections for communication (e.g. find shared memory segments @@ -281,14 +287,14 @@ Lifecycle Activity Init: -* At the end of the startup phase, the framework will invoke the init() entry point +* At the end of the startup phase, the framework will invoke the init() entry point of each activity * The init() method will run in the thread assigned to the activity. * The order in which init() is called for different activities is arbitrary, it may happen in parallel or sequentially. Activity Shutdown: -* At the beginning of the shutdown phase, the framework will invoke the shutdown() +* At the beginning of the shutdown phase, the framework will invoke the shutdown() entry point of each application * The shutdown() method will run in the thread assigned to the activity. * The order of invoking the shutdown() entry points across activities is not defined, @@ -302,15 +308,15 @@ Scheduling * There is exactly one task chain per application * The task chain describes the execution order of the activities in the run phase * Task chains run cyclically, e.g. every 30ms -* Optional: task chains can be triggerd on event +* Optional: task chains can be triggered on event * All activities are executed once per task chain run * All activities finish within a single task chain run -* Running an activity means that the framework is calling its step() function +* Running an activity means that the framework is calling its step() function within the process/thread it has been mapped to * The execution order is defined by a dependency model: - Each activity can depend on N other activities in the same task chain - - An activity's step() function gets called as soon as the step() + - An activity's step() function gets called as soon as the step() functions of the activities it depends on have been called * The framework takes care to run the activities in this order, @@ -323,7 +329,7 @@ Scheduling and activity mapping, the invocation delay is deterministic (apart from differences in the activity execution times) * The execution order and timing of an activity are independent of any communication that activity may perform. -* The dependencies should be defined by the application developer in a way so that +* The dependencies should be defined by the application developer in a way so that processing results passed via communication are available when they are needed (if an activity needs an output of another activity it sets that other activity as its dependency and therefore will only run once the other one @@ -336,7 +342,7 @@ Executor and Agents * The coordinating entity in the primary process is the "executor" * The executor coordinates the invocation of the activities in the order as described above -* As a central entity the executor is able to trace, record or monitor the +* As a central entity the executor is able to trace, record or monitor the system behavior as sequence of activity invocations (see below) * The actual activity invocation is done by an "agent" * The agent exists in each process belonging to an application @@ -396,9 +402,9 @@ Reprocessing - replay of one or many executions of a single activity * In a replay scenario, the framework is used to reproduce the communication messages - and other API behavior (e.g. time, parameters, persistency) as was + and other API behavior (e.g. time, parameters, persistency) as was recorded in a previous run -* In case a whole task chain is reprocessed, the outputs of the input service activites +* In case a whole task chain is reprocessed, the outputs of the input service activities will be reproduced * In case only a single activity is reprocessed, the outputs of the predecessors in the task chain will be reproduced @@ -423,9 +429,9 @@ Tracing Performance =========== -The framework is designed to ensure deterministic execution order and -timing of activities, supporting safety-critical applications -in the automotive domain. In this domain the footprint of the framework is curcial especially +The framework is designed to ensure deterministic execution order and +timing of activities, supporting safety-critical applications +in the automotive domain. In this domain the footprint of the framework is crucial especially w.r.t impact of computation load and latency. diff --git a/docs/features/frameworks/feo/requirements/aou_req.rst b/docs/features/frameworks/feo/requirements/aou_req.rst new file mode 100644 index 0000000000..c3704f194f --- /dev/null +++ b/docs/features/frameworks/feo/requirements/aou_req.rst @@ -0,0 +1,36 @@ +.. + # ******************************************************************************* + # 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:: FEO Assumptions of Use Requirements + :id: doc__frameworks_feo_aou_reqs + :status: valid + :security: NO + :safety: ASIL_B + :realizes: PROCESS_wp__requirements_feat_aou + +FEO Feature Assumption of Use Requirements +========================================== + + +.. aou_req:: FEO something + :id: aou_req__feature_feo__something + :reqtype: Functional + :security: NO + :safety: ASIL_B + :status: valid + + Something shall be done. + +.. needextend:: docname is not None and "frameworks/feo/requirements" in docname + :+tags: frameworks_feo diff --git a/docs/features/frameworks/feo/requirements/chklst_req_inspection.rst b/docs/features/frameworks/feo/requirements/chklst_req_inspection.rst new file mode 100644 index 0000000000..92fd46d71f --- /dev/null +++ b/docs/features/frameworks/feo/requirements/chklst_req_inspection.rst @@ -0,0 +1,138 @@ +.. + # ******************************************************************************* + # 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:: FEO Feature Requirements Inspection Checklist + :id: doc__req_inspection_frameworks_feo + :status: draft + :security: NO + :safety: ASIL_B + :tags: frameworks_feo + + +FEO Feature Requirement Inspection Checklist +============================================ + + + **Purpose** + The purpose of this requirement inspection checklist is to collect the topics to be checked during requirements inspection. + + **Checklist** + + .. list-table:: Feature Requirement Inspection Checklist FEO + :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 sentence template used? + - see :need:`PROCESS_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 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. + - + - + - + * - REQ_02_04 + - Is the requirement description *feasible* ? + - Expectation is that at the time of the inspection the requirement has already some implementation. This can be checked via traces, but also :need:`PROCESS_gd_req__req_attr_impl` shows this. In case the requirement is not mature enough 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 invented. Do those cover the requirement? + - + - + - + * - REQ_03_02 + - For other 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 of the parent requirement*? + - This bullet point 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 implementation will be time consuming, 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 data consumed and set on these interfaces. Are output values completely defined? + - + - + - + * - REQ_07_01 + - Is the *ASIL Attribute* set correctly? + - Derived requirements are checked automatically, see :need:`PROCESS_gd_req__req_linkage_safety`. But for the top level requirements this needs to be checked for correctness. Also AoU from external components need check for correct ASIL as those are the "origin" of safety requirements towards the SW platform. + - + - + - + * - 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). Checklist item is supported by automated check: "Every requirement which satisfies a requirement with security attribute set to YES inherits this". Expectation is that the feature/component requirements/architecture may also be subject to a Software Security Criticality Analysis (process is TBD). + - + - + - + * - REQ_08_01 + - Is the requirement *verifiable*? + - Expectation is that at the time of the inspection already tests are created for the requirement. This can be checked via traces, but also :need:`PROCESS_gd_req__req_attr_test_covered` shows this. In case the requirement is not mature enough at the time of inspection (i.e. missing test cases), a test expert should be invited to the Pull-Request review to explicitly check this item. + - + - + - + * - REQ_09_01 + - For stakeholder requirements: Do those cover assumed safety mechanisms needed by the hardware and system? + - Note that the feature/component requirements also cover safety mechanisms in case those are needed to mitigate failures found during :need:`PROCESS_gd_chklst__safety_analysis` + - + - + - + * - REQ_09_02 + - For other 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. + - + - + - diff --git a/docs/features/frameworks/feo/requirements/index.rst b/docs/features/frameworks/feo/requirements/feature_req.rst similarity index 97% rename from docs/features/frameworks/feo/requirements/index.rst rename to docs/features/frameworks/feo/requirements/feature_req.rst index 436d929ee5..deb534f94d 100644 --- a/docs/features/frameworks/feo/requirements/index.rst +++ b/docs/features/frameworks/feo/requirements/feature_req.rst @@ -1,6 +1,6 @@ .. # ******************************************************************************* - # Copyright (c) 2024 Contributors to the Eclipse Foundation + # Copyright (c) 2025 Contributors to the Eclipse Foundation # # See the NOTICE file(s) distributed with this work for additional # information regarding copyright ownership. @@ -12,8 +12,15 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -Requirements -############ +.. document:: FEO Feature Requirements + :id: doc__frameworks_feo_feat_reqs + :status: valid + :security: NO + :safety: ASIL_B + :realizes: PROCESS_wp__requirements_feat + +FEO Feature Requirements +======================== Definitions @@ -314,3 +321,6 @@ Error Handling for S-CORE v0.5 If an activity fails in the shutdown function, the primary process shall shutdown all remaining activities in arbitrary sequence and terminate itself. + +.. needextend:: docname is not None and "frameworks/feo/requirements" in docname + :+tags: frameworks_feo diff --git a/docs/features/frameworks/feo/safety_analysis/chklst_safety_analysis_inspection.rst b/docs/features/frameworks/feo/safety_analysis/chklst_safety_analysis_inspection.rst new file mode 100644 index 0000000000..efd550b81d --- /dev/null +++ b/docs/features/frameworks/feo/safety_analysis/chklst_safety_analysis_inspection.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 + # ******************************************************************************* + +.. document:: FEO Feature Safety Analysis Inspection Checklist + :id: doc__saf_ana_inspec_frameworks_feo + :status: draft + :security: NO + :safety: ASIL_B + :tags: component_feo + +FEO Feature Safety Analysis Checklist +===================================== + + **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:: FEO Component 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|no> + - + * - REQ_01_02 + - Are the templates for DFA and/or FMEA used? + - See :need:`PROCESS_gd_temp__comp_saf_dfa` / :need:`PROCESS_gd_temp__comp_saf_fmea` and also :need:`PROCESS_gd_req__saf_structure` + - Templates are used to generate the DFA or / and FMEA. + - <yes|no> + - + * - REQ_01_03 + - Were the failure initiators / fault models applied? + - See :need:`PROCESS_gd_guidl__dfa_failure_initiators` / :need:`PROCESS_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|no> + - + * - 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|no> + - + * - 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|no> + - + * - 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|no> + - + * - 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:`PROCESS_wp__verification_platform_ver_report`. + - <yes|no> + - diff --git a/docs/features/frameworks/feo/safety_analysis/feature_dfa.rst b/docs/features/frameworks/feo/safety_analysis/feature_dfa.rst new file mode 100644 index 0000000000..e5b761fdb4 --- /dev/null +++ b/docs/features/frameworks/feo/safety_analysis/feature_dfa.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 + # ******************************************************************************* + +.. document:: FEO Feature DFA + :id: doc__frameworks_feo_dfa + :status: draft + :security: NO + :safety: ASIL_B + :tags: frameworks_feo + :realizes: PROCESS_wp__feature_dfa + +FEO Feature DFA +=============== + +For the DFA analysis where the failure initiators :need:`PROCESS_gd_guidl__dfa_failure_initiators` are used. The analysis is done before the platform DFA is done. +Safety mechanisms that are used by many features are not considered here, but at the platform DFA. The analysis is only done for the needs of the FEO feature. + +Dependent Failure Initiators +---------------------------- + +.. code-block:: rst + + .. feat_saf_dfa:: <Title> + :violates: <Feature architecture> + :id: feat_saf_dfa__<Feature>__<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 Feature Requirement | ID from AoU Feature 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 feature DFA. + + - The above "code-block" directive must be updated + - Fill in all the needed information in the <brackets> diff --git a/docs/features/frameworks/feo/safety_analysis/feature_fmea.rst b/docs/features/frameworks/feo/safety_analysis/feature_fmea.rst new file mode 100644 index 0000000000..69aff509e1 --- /dev/null +++ b/docs/features/frameworks/feo/safety_analysis/feature_fmea.rst @@ -0,0 +1,48 @@ +.. + # ******************************************************************************* + # 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:: FMEA + :id: doc__frameworks_feo_fmea + :status: draft + :security: NO + :safety: ASIL_B + :tags: frameworks_feo + :realizes: PROCESS_wp__feature_fmea + +FEO Feature FMEA +================ + +Failure Mode List +----------------- + +.. code-block:: rst + + + .. feat_saf_fmea:: <Title> + :violates: <Feature architecture> + :id: feat_saf_fmea__<Feature>__<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 Feature Requirement | ID from AoU Feature 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 feature FMEA. + + - The above "code-block" directive must be updated + - Fill in all the needed information in the <brackets> diff --git a/docs/features/frameworks/feo/safety_planning/index.rst b/docs/features/frameworks/feo/safety_planning/index.rst new file mode 100644 index 0000000000..1b0b3972af --- /dev/null +++ b/docs/features/frameworks/feo/safety_planning/index.rst @@ -0,0 +1,142 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + + +FEO Safety Planning +=================== + +.. document:: FEO Safety WPs + :id: doc__feo_safety_wp + :status: draft + :security: NO + :safety: ASIL_B + :realizes: PROCESS_wp__platform_safety_plan + :tags: framework_feo + + +.. list-table:: FEO Work products + :header-rows: 1 + + * - Work product Id + - Link to process + - Process status + - Link to issue + - Link to WP + - WP/doc status + + * - :need:`PROCESS_wp__feat_request` + - :need:`PROCESS_gd_temp__change_feature_request` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__change_feature_request')` + - <link to issue> + - :need:`doc__frameworks_feo` + - :ndf:`copy('status', need_id='doc__frameworks_feo')` + + * - :need:`PROCESS_wp__requirements_feat` + - :need:`PROCESS_gd_temp__req_feat_req` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__req_feat_req')` + - <link to issue> + - :need:`doc__frameworks_feo_feat_reqs` + - doc :ndf:`copy('status', need_id='doc__frameworks_feo_feat_reqs')` & WP below + + * - :need:`PROCESS_wp__requirements_feat_aou` + - :need:`PROCESS_gd_temp__req_aou_req` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__req_aou_req')` + - <link to issue> + - :need:`doc__frameworks_feo_aou_reqs` + - doc :ndf:`copy('status', need_id='doc__frameworks_feo_aou_reqs')` & WP below + + * - :need:`PROCESS_wp__feature_arch` + - :need:`PROCESS_gd_temp__arch_feature` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__arch_feature')` + - <link to issue> + - :need:`doc__frameworks_feo_feat_arch` + - doc :ndf:`copy('status', need_id='doc__frameworks_feo_feat_arch')` & WP below + + * - :need:`PROCESS_wp__feature_fmea` + - :need:`PROCESS_gd_temp__feat_saf_fmea` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__feat_saf_fmea')` + - <link to issue> + - :need:`doc__frameworks_feo_dfa` + - doc :ndf:`copy('status', need_id='doc__frameworks_feo_dfa')` & WP below + + * - :need:`PROCESS_wp__feature_dfa` + - :need:`PROCESS_gd_temp__feat_saf_dfa` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__feat_saf_dfa')` + - <Link to issue> + - :need:`doc__frameworks_feo_fmea` + - doc :ndf:`copy('status', need_id='doc__frameworks_feo_fmea')` & WP below + + * - :need:`PROCESS_wp__fdr_reports` (features's Safety Analyses & DFA) + - :need:`PROCESS_gd_chklst__safety_analysis` + - :ndf:`copy('status', need_id='PROCESS_gd_chklst__safety_analysis')` + - <Link to issue> + - :need:`doc__saf_ana_inspec_frameworks_feo` + - :ndf:`copy('status', need_id='doc__saf_ana_inspec_frameworks_feo')` + + * - :need:`PROCESS_wp__requirements_inspect` + - :need:`PROCESS_gd_chklst__req_inspection` + - :ndf:`copy('status', need_id='PROCESS_gd_chklst__req_inspection')` + - <Link to issue> + - :need:`doc__req_inspection_frameworks_feo` + - :ndf:`copy('status', need_id='doc__req_inspection_frameworks_feo')` + + * - :need:`PROCESS_wp__sw_arch_verification` + - :need:`PROCESS_gd_chklst__arch_inspection_checklist` + - :ndf:`copy('status', need_id='PROCESS_gd_chklst__arch_inspection_checklist')` + - <Link to issue> + - :need:`doc__arch_inspection_frameworks_feo` + - :ndf:`copy('status', need_id='doc__arch_inspection_frameworks_feo')` + + * - :need:`PROCESS_wp__verification_feat_int_test` + - :need:`PROCESS_gd_guidl__verification_guide` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__verification_guide')` + - <link to issue> + - <Link to WP> + - <automated> + +FEO Requirements Status +----------------------- + +.. needtable:: + :filter: "feo" in docname and "requirements" in docname and docname is not None + :style: table + :types: feat_req + :tags: frameworks_feo + :columns: id;status + :colwidths: 25,25 + :sort: title + +FEO AoU Status +-------------- + +.. needtable:: + :filter: "feo" in docname and "requirements" in docname and docname is not None + :style: table + :types: aou_req + :tags: frameworks_feo + :columns: id;status + :colwidths: 25,25 + :sort: title + +FEO Architecture Status +----------------------- + +.. needtable:: + :filter: "feo" in docname and "architecture" in docname and docname is not None + :style: table + :types: feat_arc_sta; feat_arc_dyn + :tags: frameworks_feo + :columns: id;status + :colwidths: 25,25 + :sort: title diff --git a/docs/features/frameworks/index.rst b/docs/features/frameworks/index.rst index 438d692d1a..e719074edc 100644 --- a/docs/features/frameworks/index.rst +++ b/docs/features/frameworks/index.rst @@ -1,6 +1,6 @@ .. # ******************************************************************************* - # Copyright (c) 2024 Contributors to the Eclipse Foundation + # Copyright (c) 2025 Contributors to the Eclipse Foundation # # See the NOTICE file(s) distributed with this work for additional # information regarding copyright ownership. diff --git a/docs/features/persistency/kvs/requirements/chklst_req_inspection.rst b/docs/features/persistency/kvs/requirements/chklst_req_inspection.rst index 74fb719f7c..617194178d 100644 --- a/docs/features/persistency/kvs/requirements/chklst_req_inspection.rst +++ b/docs/features/persistency/kvs/requirements/chklst_req_inspection.rst @@ -39,7 +39,7 @@ Requirement Inspection Checklist Persistency KVS - Issue link * - REQ_01_01 - Is the requirement sentence template used? - - see :need:`PROCESS_gd_temp__req__formulation`, this includes the use of "shall". + - see :need:`PROCESS_gd_temp__req_formulation`, this includes the use of "shall". - Yes - No remarks - https://github.com/eclipse-score/score/issues/960 @@ -63,7 +63,7 @@ Requirement Inspection Checklist Persistency KVS - https://github.com/eclipse-score/score/issues/960 * - REQ_02_04 - Is the requirement description *feasible* ? - - Expectation is that at the time of the inspection the requirement has already some implementation. This can be checked via traces, but also :need:`PROCESS_gd_req__req__attr_impl` shows this. In case the requirement is not mature enough 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. + - Expectation is that at the time of the inspection the requirement has already some implementation. This can be checked via traces, but also :need:`PROCESS_gd_req__req_attr_impl` shows this. In case the requirement is not mature enough 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. - Yes - No remarks - https://github.com/eclipse-score/score/issues/960 @@ -105,7 +105,7 @@ Requirement Inspection Checklist Persistency KVS - https://github.com/eclipse-score/score/issues/960 * - REQ_07_01 - Is the *ASIL Attribute* set correctly? - - Derived requirements are checked automatically, see :need:`PROCESS_gd_req__req__linkage_safety`. But for the top level requirements this needs to be checked for correctness. Also AoU from external components need check for correct ASIL as those are the "origin" of safety requirements towards the SW platform. + - Derived requirements are checked automatically, see :need:`PROCESS_gd_req__req_linkage_safety`. But for the top level requirements this needs to be checked for correctness. Also AoU from external components need check for correct ASIL as those are the "origin" of safety requirements towards the SW platform. - Yes - No remarks - https://github.com/eclipse-score/score/issues/960 @@ -117,7 +117,7 @@ Requirement Inspection Checklist Persistency KVS - https://github.com/eclipse-score/score/issues/960 * - REQ_08_01 - Is the requirement *verifiable*? - - Expectation is that at the time of the inspection already tests are created for the requirement. This can be checked via traces, but also :need:`PROCESS_gd_req__req__attr_test_covered` shows this. In case the requirement is not mature enough at the time of inspection (i.e. missing test cases), a test expert should be invited to the Pull-Request review to explicitly check this item. + - Expectation is that at the time of the inspection already tests are created for the requirement. This can be checked via traces, but also :need:`PROCESS_gd_req__req_attr_test_covered` shows this. In case the requirement is not mature enough at the time of inspection (i.e. missing test cases), a test expert should be invited to the Pull-Request review to explicitly check this item. - Yes - No remarks - https://github.com/eclipse-score/score/issues/960 diff --git a/docs/features/persistency/kvs/requirements/index.rst b/docs/features/persistency/kvs/requirements/index.rst index 774a2fd640..23bba0ebe8 100644 --- a/docs/features/persistency/kvs/requirements/index.rst +++ b/docs/features/persistency/kvs/requirements/index.rst @@ -22,7 +22,7 @@ Requirements :id: doc__persistency_kvs_feat_reqs :status: valid :safety: ASIL_B - :realizes: PROCESS_wp__requirements__feat + :realizes: PROCESS_wp__requirements_feat .. feat_req:: C++ & Rust Interoperability :id: feat_req__persistency__cpp_rust_interop diff --git a/docs/features/persistency/kvs/safety_planning/index.rst b/docs/features/persistency/kvs/safety_planning/index.rst index 92e5a2a9cf..a78af6b442 100644 --- a/docs/features/persistency/kvs/safety_planning/index.rst +++ b/docs/features/persistency/kvs/safety_planning/index.rst @@ -28,29 +28,29 @@ Feature Safety Planning - WP status * - :need:`PROCESS_wp__feat_request` - - :need:`PROCESS_gd_temp__change__feature_request` - - :ndf:`copy('status', need_id='PROCESS_gd_temp__change__feature_request')` + - :need:`PROCESS_gd_temp__change_feature_request` + - :ndf:`copy('status', need_id='PROCESS_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:`PROCESS_wp__requirements__feat` - - :need:`PROCESS_gd_temp__req__feat_req` - - :ndf:`copy('status', need_id='PROCESS_gd_temp__req__feat_req')` + * - :need:`PROCESS_wp__requirements_feat` + - :need:`PROCESS_gd_temp__req_feat_req` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__req_feat_req')` - https://github.com/eclipse-score/score/issues/960 - :ref:`feature_requirements_PersistencyKvs` - valid - * - :need:`PROCESS_wp__requirements__feat_aou` - - :need:`PROCESS_gd_temp__req__aou_req` - - :ndf:`copy('status', need_id='PROCESS_gd_temp__req__aou_req')` + * - :need:`PROCESS_wp__requirements_feat_aou` + - :need:`PROCESS_gd_temp__req_aou_req` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__req_aou_req')` - https://github.com/eclipse-score/score/issues/960 - :ref:`feature_requirements_PersistencyKvs` - valid * - :need:`PROCESS_wp__feature_arch` - - :need:`PROCESS_gd_temp__arch__feature` - - :ndf:`copy('status', need_id='PROCESS_gd_temp__arch__feature')` + - :need:`PROCESS_gd_temp__arch_feature` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__arch_feature')` - https://github.com/eclipse-score/score/issues/1020 - :ref:`feature_architecture_PersistencyKvs` - valid @@ -69,21 +69,21 @@ Feature Safety Planning - :need:`doc__persistency_dfa` - valid - * - :need:`PROCESS_wp__requirements__inspect` - - :need:`PROCESS_gd_chklst__req__inspection` - - :ndf:`copy('status', need_id='PROCESS_gd_chklst__req__inspection')` + * - :need:`PROCESS_wp__requirements_inspect` + - :need:`PROCESS_gd_chklst__req_inspection` + - :ndf:`copy('status', need_id='PROCESS_gd_chklst__req_inspection')` - https://github.com/eclipse-score/score/issues/960 - :need:`doc__req_inspection_persistency` - valid * - :need:`PROCESS_wp__sw_arch_verification` - - :need:`PROCESS_gd_chklst__arch__inspection_checklist` - - :ndf:`copy('status', need_id='PROCESS_gd_chklst__arch__inspection_checklist')` + - :need:`PROCESS_gd_chklst__arch_inspection_checklist` + - :ndf:`copy('status', need_id='PROCESS_gd_chklst__arch_inspection_checklist')` - https://github.com/eclipse-score/score/issues/1020 - Checklist used in Pull Request Review - n/a - * - :need:`PROCESS_wp__verification__feat_int_test` + * - :need:`PROCESS_wp__verification_feat_int_test` - :need:`PROCESS_gd_guidl__verification_guide` - :ndf:`copy('status', need_id='PROCESS_gd_guidl__verification_guide')` - https://github.com/eclipse-score/score/issues/964 diff --git a/docs/modules/baselibs/result/docs/requirements.rst b/docs/modules/baselibs/result/docs/requirements.rst index 5736c332ee..93d62b0b2d 100644 --- a/docs/modules/baselibs/result/docs/requirements.rst +++ b/docs/modules/baselibs/result/docs/requirements.rst @@ -19,7 +19,7 @@ Requirements :id: doc__result_lib_requirements :status: draft :safety: ASIL_B - :realizes: PROCESS_wp__requirements__comp + :realizes: PROCESS_wp__requirements_comp :tags: requirements, result_library Functional Requirements diff --git a/docs/modules/feo/docs/index.rst b/docs/modules/feo/docs/index.rst index d58d0d1a05..3d3730f029 100644 --- a/docs/modules/feo/docs/index.rst +++ b/docs/modules/feo/docs/index.rst @@ -12,11 +12,18 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -Module Documents -================ +.. _feo_module_documentation: + + +FEO Module Documents +#################### .. toctree:: - :maxdepth: 2 :titlesonly: + :maxdepth: 1 + :glob: - manual/safety_manual.rst + manual/index.rst + safety_mgt/index.rst + verification/module_verification_report.rst + release/release_note.rst diff --git a/docs/modules/feo/docs/manual/index.rst b/docs/modules/feo/docs/manual/index.rst new file mode 100644 index 0000000000..4fbc56395d --- /dev/null +++ b/docs/modules/feo/docs/manual/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 + # ******************************************************************************* + +FEO Manuals +########### + +.. toctree:: + :titlesonly: + + safety_manual diff --git a/docs/modules/feo/docs/manual/safety_manual.rst b/docs/modules/feo/docs/manual/safety_manual.rst index 9054d888ef..8600177dab 100644 --- a/docs/modules/feo/docs/manual/safety_manual.rst +++ b/docs/modules/feo/docs/manual/safety_manual.rst @@ -12,9 +12,17 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* +.. document:: FEO Safety Manual + :id: doc__feo_safety_manual + :status: draft + :security: NO + :safety: ASIL_B + :realizes: PROCESS_wp__module_safety_manual + :tags: module_feo + -FEO Module Safety Manual Draft -============================== +FEO Module Safety Manual +======================== Introduction/Scope ------------------ diff --git a/docs/modules/feo/docs/release/release_note.rst b/docs/modules/feo/docs/release/release_note.rst new file mode 100644 index 0000000000..c5756b0497 --- /dev/null +++ b/docs/modules/feo/docs/release/release_note.rst @@ -0,0 +1,94 @@ +.. + # ******************************************************************************* + # 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:: FEO Release Note + :id: doc__feo_release_note + :status: draft + :security: NO + :safety: ASIL_B + :realizes: PROCESS_wp__module_sw_release_note + :tags: module_feo + + +FEO 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. diff --git a/docs/modules/feo/docs/safety_mgt/index.rst b/docs/modules/feo/docs/safety_mgt/index.rst new file mode 100644 index 0000000000..a25c4256a1 --- /dev/null +++ b/docs/modules/feo/docs/safety_mgt/index.rst @@ -0,0 +1,23 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +FEO Safety Management +##################### + +.. toctree:: + :titlesonly: + + module_safety_plan + module_safety_plan_fdr + module_safety_package_fdr diff --git a/docs/modules/feo/docs/safety_mgt/module_safety_package_fdr.rst b/docs/modules/feo/docs/safety_mgt/module_safety_package_fdr.rst new file mode 100644 index 0000000000..fec78d921c --- /dev/null +++ b/docs/modules/feo/docs/safety_mgt/module_safety_package_fdr.rst @@ -0,0 +1,63 @@ +.. + # ******************************************************************************* + # 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:: [Your Module Name] Safety Package Formal Review + :id: doc__module_name_safety_package_fdr + :status: draft + :security: NO + :safety: ASIL_B + :realizes: PROCESS_wp__fdr_reports + :tags: module_feo + +FEO Safety Package Formal Review Report +======================================= + +**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 ] + - <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 the project. + + * - 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/feo/docs/safety_mgt/module_safety_plan.rst b/docs/modules/feo/docs/safety_mgt/module_safety_plan.rst new file mode 100644 index 0000000000..53e1f255b0 --- /dev/null +++ b/docs/modules/feo/docs/safety_mgt/module_safety_plan.rst @@ -0,0 +1,341 @@ +.. + # ******************************************************************************* + # 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:: FEO Safety Plan + :id: doc__feo_safety_plan + :status: draft + :security: NO + :safety: ASIL_B + :realizes: PROCESS_wp__module_safety_plan + :tags: module_feo + + +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. + +Functional Safety Management Scope +================================== + +This Safety Plan's scope is a SW module :ref:`feo_module_documentation` of the SW platform. +The module consists of one or more SW components and will be qualified as a SEooC. + +Functional Safety Management Roles +================================== + ++---------------------------+--------------------------------------------------------+ +| Safety Manager | Markus Schu | ++---------------------------+--------------------------------------------------------+ +| Project Manager | Johannes Glamsch | ++---------------------------+--------------------------------------------------------+ + +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): + - Software Component Qualification :need:`PROCESS_wp__sw_component_class` is not needed, as the code is developed from the scratch: :need:`PROCESS_std_wp__isopas8926__4511`, :need:`PROCESS_std_wp__iso26262__support_1251` + + +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:`PROCESS_wp__module_safety_plan` + - :need:`PROCESS_gd_guidl__saf_plan_definitions` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__saf_plan_definitions')` + - <Link to issue> + - this document + - see above + + * - :need:`PROCESS_wp__module_safety_package` + - :need:`PROCESS_gd_guidl__saf_package` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__saf_package')` + - <Link to issue> + - this document (including the linked documentation) + - see above (and below) + + * - :need:`PROCESS_wp__fdr_reports` (module Safety Plan) + - :need:`PROCESS_gd_chklst__safety_plan` + - :ndf:`copy('status', need_id='PROCESS_gd_chklst__safety_plan')` + - <Link to issue> + - :need:`doc__feo_safety_plan_fdr` + - :ndf:`copy('status', need_id='doc__feo_safety_plan_fdr')` + + * - :need:`PROCESS_wp__fdr_reports` (module Safety Package) + - :need:`PROCESS_gd_chklst__safety_package` + - :ndf:`copy('status', need_id='PROCESS_gd_chklst__safety_package')` + - <Link to issue> + - :need:`doc__module_name_safety_package_fdr` + - :ndf:`copy('status', need_id='doc__module_name_safety_package_fdr')` + + * - :need:`PROCESS_wp__fdr_reports` (module's Safety Analyses & DFA) + - :need:`PROCESS_gd_chklst__safety_analysis` + - :ndf:`copy('status', need_id='PROCESS_gd_chklst__safety_analysis')` + - <Link to issue> + - :need:`doc__safety_analysis_inspection_component_feo` + - :ndf:`copy('status', need_id='doc__safety_analysis_inspection_component_feo')` + + * - :need:`PROCESS_wp__audit_report` + - performed by external experts + - n/a + - <Link to issue> + - <Link to WP> + - <WP status (manual)> + + * - :need:`PROCESS_wp__module_sw_build_config` + - :need:`PROCESS_gd_temp__software_development_plan` + - `copy('status', need_id='PROCESS_gd_temp__software_development_plan')` + - <Link to issue> + - <Link to WP> + - <automated> + + * - :need:`PROCESS_wp__module_safety_manual` + - :need:`PROCESS_gd_temp__safety_manual` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__safety_manual')` + - <Link to issue> + - :need:`doc__feo_safety_manual` + - :ndf:`copy('status', need_id='doc__feo_safety_manual')` + + * - :need:`PROCESS_wp__verification_module_ver_report` + - :need:`PROCESS_gd_temp__mod_ver_report` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__mod_ver_report')` + - <Link to issue> + - :need:`doc__feo_verification_report` + - :ndf:`copy('status', need_id='doc__feo_verification_report')` + + * - :need:`PROCESS_wp__module_sw_release_note` + - :need:`PROCESS_gd_temp__rel_mod_rel_note` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__rel_mod_rel_note')` + - <Link to issue> + - :need:`doc__feo_release_note` + - :ndf:`copy('status', need_id='doc__feo_release_note')` + +FEO Component Work Products List +-------------------------------- + +.. list-table:: FEO Component Work Products List + :header-rows: 1 + + * - Work product Id + - Link to process + - Process status + - Link to issue + - Link to WP + - WP/doc status + + * - :need:`PROCESS_wp__requirements_comp` + - :need:`PROCESS_gd_temp__req_comp_req` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__req_comp_req')` + - <Link to issue> + - :need:`doc__component_feo_requirements` + - doc :ndf:`copy('status', need_id='doc__component_feo_requirements')` & WP below + + * - :need:`PROCESS_wp__requirements_comp_aou` + - :need:`PROCESS_gd_temp__req_aou_req` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__req_aou_req')` + - <Link to issue> + - :need:`doc__component_feo_aou_reqs` + - doc :ndf:`copy('status', need_id='doc__component_feo_aou_reqs')` & WP below + + * - :need:`PROCESS_wp__requirements_inspect` + - :need:`PROCESS_gd_chklst__req_inspection` + - :ndf:`copy('status', need_id='PROCESS_gd_chklst__req_inspection')` + - <Link to issue> + - :need:`doc__req_inspection_component_feo` + - doc :ndf:`copy('status', need_id='doc__req_inspection_component_feo')` + + * - :need:`PROCESS_wp__component_arch` + - :need:`PROCESS_gd_temp__arch_comp` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__arch_comp')` + - <Link to issue> + - :need:`doc__component_feo_architecture` + - doc :ndf:`copy('status', need_id='doc__component_feo_architecture')` & WP below + + * - :need:`PROCESS_wp__sw_arch_verification` + - :need:`PROCESS_gd_chklst__arch_inspection_checklist` + - :ndf:`copy('status', need_id='PROCESS_gd_chklst__arch_inspection_checklist')` + - <Link to issue> + - :need:`doc__arch_inspection_component_feo` + - doc :ndf:`copy('status', need_id='doc__arch_inspection_component_feo')` + + * - :need:`PROCESS_wp__sw_component_fmea` + - :need:`PROCESS_gd_temp__comp_saf_fmea` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__comp_saf_fmea')` + - <Link to issue> + - :need:`doc__component_feo_fmea` + - doc :ndf:`copy('status', need_id='doc__component_feo_fmea')` & WP below + + * - :need:`PROCESS_wp__sw_component_dfa` + - :need:`PROCESS_gd_temp__comp_saf_fmea` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__comp_saf_fmea')` + - <Link to issue> + - :need:`doc__component_feo_dfa` + - doc :ndf:`copy('status', need_id='doc__component_feo_dfa')` & WP below + + * - :need:`PROCESS_wp__sw_implementation` + - :need:`PROCESS_gd_guidl__implementation` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__implementation')` + - <Link to issue> + - <Link to WP> + - <automated> + + * - :need:`PROCESS_wp__verification_sw_unit_test` + - :need:`PROCESS_gd_guidl__verification_guide` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__verification_guide')` + - <Link to issue> + - <Link to WP> + - <automated> + + * - :need:`PROCESS_wp__sw_implementation_inspection` + - :need:`PROCESS_gd_chklst__impl_inspection_checklist` + - :ndf:`copy('status', need_id='PROCESS_gd_chklst__impl_inspection_checklist')` + - <Link to issue> + - :need:`doc__impl_inspection_component_feo` + - :ndf:`copy('status', need_id='doc__impl_inspection_component_feo')` + + * - :need:`PROCESS_wp__verification_comp_int_test` + - :need:`PROCESS_gd_guidl__verification_guide` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__verification_guide')` + - <Link to issue> + - <Link to WP> + - <automated> + + * - :need:`PROCESS_wp__sw_component_class` + - :need:`PROCESS_gd_guidl__component_classification` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__component_classification')` + - not applicable, tailored out + - :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:`PROCESS_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 <name> Work products + :header-rows: 1 + + * - Work product Id + - Link to issue + - Reasoning for tailoring + + * - :need:`PROCESS_wp__requirements_comp` + - <Link to issue> + - Always needed (for Q and QR classification) and also improves process Id 2 + + * - :need:`PROCESS_wp__requirements_comp_aou` + - <Link to issue> + - Always needed (for Q and QR classification) and also improves process Id 5 + + * - :need:`PROCESS_wp__requirements_inspect` + - n/a + - Checklist used in Pull Request Review + + * - :need:`PROCESS_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:`PROCESS_wp__sw_component_fmea` + - <Link to issue> + - <Reasoning for tailoring, could help arguing too high cyclomatic complexity covered by safety mechanisms> + + * - :need:`PROCESS_wp__sw_arch_verification` + - <Link to issue> + - <Reasoning for tailoring, needed if also wf__cr_mt_comparch is required> + + * - :need:`PROCESS_wp__sw_implementation` + - n/a + - If source code is modified, this is not a OSS qualification any more. + + * - :need:`PROCESS_wp__verification_sw_unit_test` + - <Link to issue> + - <Reasoning for tailoring, can improve deficits in process Id 6 and complexity Id 3> + + * - :need:`PROCESS_wp__sw_implementation_inspection` + - <Link to issue> + - <Reasoning for tailoring, can improve deficits in process Id 6 and complexity Id 2> + + * - :need:`PROCESS_wp__verification_comp_int_test` + - <Link to issue> + - Always needed (for Q and QR classification) + + * - :need:`PROCESS_wp__sw_component_class` + - <Link to issue> + - Always needed as basis for tailoring. + +Work Product Status (for Safety Package) +======================================== + +Component Requirements Status +----------------------------- + +.. needtable:: + :filter: "feo" in docname and "requirements" in docname and docname is not None + :style: table + :types: comp_req + :tags: component_feo + :columns: id;status;tags + :colwidths: 25,25,25 + :sort: title + +Component AoU Status +-------------------- + +.. needtable:: + :filter: "feo" in docname and "requirements" in docname and docname is not None + :style: table + :types: aou_req + :tags: component_feo + :columns: id;status;tags + :colwidths: 25,25,25 + :sort: title + +Component Architecture Status +----------------------------- + +.. needtable:: + :filter: "feo" in docname and "architecture" in docname and docname is not None + :style: table + :types: comp_arc_sta; comp_arc_dyn + :tags: component_feo + :columns: id;status;tags + :colwidths: 25,25,25 + :sort: title diff --git a/docs/modules/feo/docs/safety_mgt/module_safety_plan_fdr.rst b/docs/modules/feo/docs/safety_mgt/module_safety_plan_fdr.rst new file mode 100644 index 0000000000..36f6d4cab7 --- /dev/null +++ b/docs/modules/feo/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 + # ******************************************************************************* + +.. document:: FEO Safety Plan Formal Review + :id: doc__feo_safety_plan_fdr + :status: draft + :security: NO + :safety: ASIL_B + :realizes: PROCESS_wp__fdr_reports + :tags: module_feo + +FEO Safety Plan Formal Review Report +==================================== + +**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/feo/docs/verification/module_verification_report.rst b/docs/modules/feo/docs/verification/module_verification_report.rst new file mode 100644 index 0000000000..502aabd2ed --- /dev/null +++ b/docs/modules/feo/docs/verification/module_verification_report.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 + # ******************************************************************************* + +.. document:: FEO Verification Report + :id: doc__feo_verification_report + :status: draft + :security: NO + :safety: ASIL_B + :realizes: PROCESS_wp__verification_module_ver_report + :tags: module_template + +FEO Verification Report +======================= + +This verification report is based on the :need:`PROCESS_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/feo/feo/docs/architecture/chklst_arch_inspection.rst b/docs/modules/feo/feo/docs/architecture/chklst_arch_inspection.rst new file mode 100644 index 0000000000..fd2e08bdca --- /dev/null +++ b/docs/modules/feo/feo/docs/architecture/chklst_arch_inspection.rst @@ -0,0 +1,154 @@ +.. + # ******************************************************************************* + # 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:: FEO Component Architecture Inspection Checklist + :id: doc__arch_inspection_component_feo + :status: draft + :security: NO + :safety: ASIL_B + :tags: component_feo + +FEO Component 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 S-CORE 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:: Component Architecture Design Review Checklist FEO + :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 defined :need:`Relations between the architectural elements <PROCESS_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#general-concepts-traceability>`_ + - + - + - + * - 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:`PROCESS_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/feo/feo/docs/architecture/component_architecture.rst b/docs/modules/feo/feo/docs/architecture/component_architecture.rst index 2eedd9e3fe..46f2647772 100644 --- a/docs/modules/feo/feo/docs/architecture/component_architecture.rst +++ b/docs/modules/feo/feo/docs/architecture/component_architecture.rst @@ -12,8 +12,16 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -feo Component Architecture -************************** +.. document:: FEO Component Architecture + :id: doc__component_feo_architecture + :status: draft + :security: NO + :safety: ASIL_B + :realizes: PROCESS_wp__component_arch + :tags: component_feo + +FEO Component Architecture +========================== Overview -------- @@ -87,7 +95,7 @@ Dynamic Architecture Interfaces ------------------- +---------- .. real_arc_int:: feo::agent::PrimaryConfig :id: real_arc_int__feo__primary_config @@ -142,3 +150,6 @@ Interfaces :language: rust See static architecture. + +.. needextend:: docname is not None and "feo/docs/architecture" in docname + :+tags: component_feo diff --git a/docs/modules/feo/feo/docs/component_classification.rst b/docs/modules/feo/feo/docs/component_classification.rst new file mode 100644 index 0000000000..bb394a7ab8 --- /dev/null +++ b/docs/modules/feo/feo/docs/component_classification.rst @@ -0,0 +1,187 @@ +.. + # ******************************************************************************* + # 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:: [Your Component Name] Component Classification + :id: doc__component_name_comp_class + :status: draft + :security: NO + :safety: ASIL_B + :realizes: PROCESS_wp__sw_component_class + :tags: commponent_feo + +Component Classification +======================== + +| Classification of <component> +| +| <Link to OSS component source (e.g. in github) including the selected version> +| +| Additional documentation considered: +| <list of documentation links> + + +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? + - <HE|PE|NE> + - <Rationale for result> + + * - 2 + - Are requirements available? + - <HE|PE|NE> + - <Rationale for result> + + * - 3 + - Are specifications for functionalities and properties available (architecture)? + - <HE|PE|NE> + - <Rationale for result> + + * - 4 + - Are design specifications available? + - <HE|PE|NE> + - <Rationale for result> + + * - 5 + - Are configuration specification and data available, if applicable? + - <HE|PE|NE> + - <Rationale for result> + + * - 6 + - Are verification measures including tests and reports available? + - <HE|PE|NE> + - <Rationale for result> + + +| (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. + +<component name> is determined as P=<1|2|3> + + +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>** + +<select the correct table below (table for C++ is TBD)> + +.. 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|HM|NM> + - <Number> + + * - 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|HM|NM> + - <Number> + + * - 3 + - | Test exists / Coverage (Function, Line) + | (maybe better: testability, but how to measure?) + - Existing Tests Coverage + - <NH|HM|NM> + - <Number> + + * - 4 + - High amount of public function interfaces + - Number of public function interfaces + - <NH|HM|NM> + - <RNumber> + + * - 5 + - High amount of function parameters + - Number of parameters + - <NH|HM|NM> + - <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 the project or manageable by mitigating the gaps. +| (C=3) in all other cases. +| + +<component name> is determined as C=<1|2|3> + + +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 | ++-------+-------+-------+-------+ + +<component name> is classified as CLAS_OUT=<Q|QR|NQ> + + +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 change request containing this is in status "Accepted", the module safety plan for the component development is adapted based on the following: (select according to above result) +| - Q: Follow the processes for qualification of software components in a safety context. +| - QR: Follow the process for pre-existing software architectural elements +| - NQ: Do no use this element in safety context diff --git a/docs/modules/feo/feo/docs/detailed_design/chklst_dd_inspection.rst b/docs/modules/feo/feo/docs/detailed_design/chklst_dd_inspection.rst new file mode 100644 index 0000000000..1fe4b9574c --- /dev/null +++ b/docs/modules/feo/feo/docs/detailed_design/chklst_dd_inspection.rst @@ -0,0 +1,92 @@ +.. + # ******************************************************************************* + # 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:: FEO Implementation Inspection Checklist + :id: doc__impl_inspection_component_feo + :status: draft + :security: NO + :safety: ASIL_B + :tags: component_feo + +FEO Implementation Inspection Checklist +======================================= + +Purpose +------- + +The purpose of this checklist is to collect the topics to be checked during implementation, +i.e. in the detailed design and the source code of the units. + +The checklist shall be agnostic to which programming language is used. Differences shall be treated +by linking to C++ or Rust specific documentation. + +Checklist +--------- + +.. list-table:: FEO Implementation Checklist + :header-rows: 1 + :widths: 10,30,50,6,6,8 + + * - Review ID + - Acceptance Criteria + - Guidance + - Passed + - Remarks + - Issue link + * - IMPL_01_01 + - Is the design according to guidelines? + - see :need:`PROCESS_gd_temp__detailed_design` and :need:`PROCESS_doc_concept__imp_concept` + (e.g. are the views done with the proposed UML diagrams) + - + - + - + * - IMPL_01_02 + - Is the implementation according to specification? + - Check if the linked component requirements are fulfilled + and detailed design also matches architecture description. + - + - + - + * - IMPL_01_03 + - Are the design decisions and constraints documented? + - Check also for plausibility of these. + - + - + - + * - IMPL_01_04 + - Are all external libraries used by the component specified in the detailed design? + - Check the automated dependency analysis. + Also make sure ASIL rated units also only use ASIL or FFI rated libraries. + - + - + - + * - IMPL_02_01 + - Are the static and dynamic code analysis reports verified for violations? + - All violations in ASIL related code must be justified. This includes the checks of coding guidelines. + - + - + - + * - IMPL_02_02 + - Do manual checks, that are derived from the coding guideline, find no safety critical error? + - Check this list for C++ <link> and this list for Rust <link> + - + - + - + * - IMPL_02_03 + - Are detailed design and source code consistent? + - Check if the static and dynamic design descriptions match the code (e..g. naming of elements) + and that the respective traceability is established (doxygen style comments) + - + - + - diff --git a/docs/modules/feo/feo/docs/detailed_design/component_detailed_design.rst b/docs/modules/feo/feo/docs/detailed_design/component_detailed_design.rst new file mode 100644 index 0000000000..2e81e22a72 --- /dev/null +++ b/docs/modules/feo/feo/docs/detailed_design/component_detailed_design.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 + # ******************************************************************************* + +.. document:: FEO Component Detailed Design + :id: doc__component_feo_detailed_design + :status: draft + :security: NO + :safety: ASIL_B + :realizes: PROCESS_wp__sw_implementation + :tags: component_feo + +FEO Component Detailed Design +============================= + +Description +----------- + +| Design Decisions +| 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/feo/feo/docs/index.rst b/docs/modules/feo/feo/docs/index.rst index 3a9b66d9ed..a1458de62d 100644 --- a/docs/modules/feo/feo/docs/index.rst +++ b/docs/modules/feo/feo/docs/index.rst @@ -12,17 +12,163 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -.. _comp_doc_feo: +.. document:: FEO Component + :id: doc__component_name + :status: draft + :safety: ASIL_B + :realizes: PROCESS_wp__cmpt_request + :tags: component_feo -feo -### +FEO Component +############# -Component Documents -=================== +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. + + +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:`PROCESS_rl__module_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:`PROCESS_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:: - :maxdepth: 2 - :titlesonly: + :hidden: - architecture/component_architecture - requirements/component_requirements + requirements/component_requirements.rst + requirements/chklst_req_inspection.rst + requirements/aou_req.rst + architecture/component_architecture.rst + architecture/chklst_arch_inspection.rst + detailed_design/component_detailed_design.rst + detailed_design/chklst_dd_inspection.rst + safety_analysis/component_fmea.rst + safety_analysis/component_dfa.rst + safety_analysis/chklst_safety_analysis_inspection.rst + component_classification.rst diff --git a/docs/modules/feo/feo/docs/requirements/aou_req.rst b/docs/modules/feo/feo/docs/requirements/aou_req.rst new file mode 100644 index 0000000000..7d23538229 --- /dev/null +++ b/docs/modules/feo/feo/docs/requirements/aou_req.rst @@ -0,0 +1,37 @@ +.. + # ******************************************************************************* + # 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:: FEO Component Assumptions of Use Requirements + :id: doc__component_feo_aou_reqs + :status: valid + :security: NO + :safety: ASIL_B + :realizes: PROCESS_wp__requirements_comp_aou + :tags: component_feo + +FEO Component Assumption of Use Requirements +============================================ + + +.. aou_req:: FEO something + :id: aou_req__component_feo__anything + :reqtype: Functional + :security: NO + :safety: ASIL_B + :status: valid + + Anything shall be done. + +.. needextend:: docname is not None and "feo/docs/requirements" in docname + :+tags: component_feo diff --git a/docs/modules/feo/feo/docs/requirements/chklst_req_inspection.rst b/docs/modules/feo/feo/docs/requirements/chklst_req_inspection.rst new file mode 100644 index 0000000000..38747fd458 --- /dev/null +++ b/docs/modules/feo/feo/docs/requirements/chklst_req_inspection.rst @@ -0,0 +1,138 @@ +.. + # ******************************************************************************* + # 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:: FEO Component Requirements Inspection Checklist + :id: doc__req_inspection_component_feo + :status: draft + :security: NO + :safety: ASIL_B + :tags: component_feo + + +FEO Component Requirement Inspection Checklist +============================================== + + + **Purpose** + The purpose of this requirement inspection checklist is to collect the topics to be checked during requirements inspection. + + **Checklist** + + .. list-table:: Component Requirement Inspection Checklist FEO + :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 sentence template used? + - see :need:`PROCESS_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 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. + - + - + - + * - REQ_02_04 + - Is the requirement description *feasible* ? + - Expectation is that at the time of the inspection the requirement has already some implementation. This can be checked via traces, but also :need:`PROCESS_gd_req__req_attr_impl` shows this. In case the requirement is not mature enough 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 invented. Do those cover the requirement? + - + - + - + * - REQ_03_02 + - For other 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 of the parent requirement*? + - This bullet point 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 implementation will be time consuming, 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 data consumed and set on these interfaces. Are output values completely defined? + - + - + - + * - REQ_07_01 + - Is the *ASIL Attribute* set correctly? + - Derived requirements are checked automatically, see :need:`PROCESS_gd_req__req_linkage_safety`. But for the top level requirements this needs to be checked for correctness. Also AoU from external components need check for correct ASIL as those are the "origin" of safety requirements towards the SW platform. + - + - + - + * - 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). Checklist item is supported by automated check: "Every requirement which satisfies a requirement with security attribute set to YES inherits this". Expectation is that the feature/component requirements/architecture may also be subject to a Software Security Criticality Analysis (process is TBD). + - + - + - + * - REQ_08_01 + - Is the requirement *verifiable*? + - Expectation is that at the time of the inspection already tests are created for the requirement. This can be checked via traces, but also :need:`PROCESS_gd_req__req_attr_test_covered` shows this. In case the requirement is not mature enough at the time of inspection (i.e. missing test cases), a test expert should be invited to the Pull-Request review to explicitly check this item. + - + - + - + * - REQ_09_01 + - For stakeholder requirements: Do those cover assumed safety mechanisms needed by the hardware and system? + - Note that the feature/component requirements also cover safety mechanisms in case those are needed to mitigate failures found during :need:`PROCESS_gd_chklst__safety_analysis` + - + - + - + * - REQ_09_02 + - For other 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. + - + - + - diff --git a/docs/modules/feo/feo/docs/requirements/component_requirements.rst b/docs/modules/feo/feo/docs/requirements/component_requirements.rst index 0a35049d13..a263f9172e 100644 --- a/docs/modules/feo/feo/docs/requirements/component_requirements.rst +++ b/docs/modules/feo/feo/docs/requirements/component_requirements.rst @@ -12,8 +12,16 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -Requirements -############ +.. document:: FEO Component Requirements + :id: doc__component_feo_requirements + :status: draft + :security: NO + :safety: ASIL_B + :realizes: PROCESS_wp__requirements_comp + :tags: component_feo + +FEO Component Requirements +========================== .. comp_req:: Application Processes :id: comp_req__feo__application @@ -366,3 +374,6 @@ Error Handling for S-CORE v0.5 If an activity fails in the shutdown function, the primary process shall shutdown all remaining activities in arbitrary sequence and terminate itself. + +.. needextend:: docname is not None and "feo/docs/requirements" in docname + :+tags: component_feo diff --git a/docs/modules/feo/feo/docs/safety_analysis/chklst_safety_analysis_inspection.rst b/docs/modules/feo/feo/docs/safety_analysis/chklst_safety_analysis_inspection.rst new file mode 100644 index 0000000000..efa8d51710 --- /dev/null +++ b/docs/modules/feo/feo/docs/safety_analysis/chklst_safety_analysis_inspection.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 + # ******************************************************************************* + +.. document:: FEO Safety Analysis Inspection Checklist + :id: doc__safety_analysis_inspection_component_feo + :status: draft + :security: NO + :safety: ASIL_B + :tags: component_feo + +FEO Component Safety Analysis Checklist +======================================= + + **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:: FEO Component 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|no> + - + * - REQ_01_02 + - Are the templates for DFA and/or FMEA used? + - See :need:`PROCESS_gd_temp__comp_saf_dfa` / :need:`PROCESS_gd_temp__comp_saf_fmea` and also :need:`PROCESS_gd_req__saf_structure` + - Templates are used to generate the DFA or / and FMEA. + - <yes|no> + - + * - REQ_01_03 + - Were the failure initiators / fault models applied? + - See :need:`PROCESS_gd_guidl__dfa_failure_initiators` / :need:`PROCESS_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|no> + - + * - 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|no> + - + * - 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|no> + - + * - 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|no> + - + * - 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:`PROCESS_wp__verification_platform_ver_report`. + - <yes|no> + - diff --git a/docs/modules/feo/feo/docs/safety_analysis/component_dfa.rst b/docs/modules/feo/feo/docs/safety_analysis/component_dfa.rst new file mode 100644 index 0000000000..9e9a92fdde --- /dev/null +++ b/docs/modules/feo/feo/docs/safety_analysis/component_dfa.rst @@ -0,0 +1,48 @@ +.. + # ******************************************************************************* + # 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:: FEO Component DFA + :id: doc__component_feo_dfa + :status: draft + :security: NO + :safety: ASIL_B + :realizes: PROCESS_wp__sw_component_dfa + :tags: coponent_feo + + +FEO Component DFA (Dependent Failure Analysis) +============================================== + +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/feo/feo/docs/safety_analysis/component_fmea.rst b/docs/modules/feo/feo/docs/safety_analysis/component_fmea.rst new file mode 100644 index 0000000000..caa422734e --- /dev/null +++ b/docs/modules/feo/feo/docs/safety_analysis/component_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 + # ******************************************************************************* + +.. document:: FEO FMEA + :id: doc__component_feo_fmea + :status: draft + :security: NO + :safety: ASIL_B + :realizes: PROCESS_wp__sw_component_fmea + :tags: component_feo + + +FEO Component FMEA (Failure Modes and Effects Analysis) +======================================================= + + +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/feo/feo_com/docs/index.rst b/docs/modules/feo/feo_com/docs/index.rst index b1f05aa5d3..88252cb503 100644 --- a/docs/modules/feo/feo_com/docs/index.rst +++ b/docs/modules/feo/feo_com/docs/index.rst @@ -17,7 +17,7 @@ feo_com ####### This component will be replaced by or become a wrapper of the interface `mw::com` provided by the feature -"Communication". In the latter case, it is planned to be integrated into the component feo (see :ref:`comp_doc_feo`). +"Communication". In the latter case, it is planned to be integrated into the component feo (see :ref:`feo_module_documentation`). Component Documents =================== diff --git a/docs/modules/feo/feo_log/docs/index.rst b/docs/modules/feo/feo_log/docs/index.rst index 5195cf9472..2f52fd80de 100644 --- a/docs/modules/feo/feo_log/docs/index.rst +++ b/docs/modules/feo/feo_log/docs/index.rst @@ -17,7 +17,7 @@ feo_log ####### This component will be replaced by or become a wrapper of the interface `mw::com` provided by the feature -"Logging". In the latter case, it is planned to be integrated into the component feo (see :ref:`comp_doc_feo`). +"Logging". In the latter case, it is planned to be integrated into the component feo (see :ref:`feo_module_documentation`). Component Documents =================== diff --git a/docs/modules/feo/feo_time/docs/index.rst b/docs/modules/feo/feo_time/docs/index.rst index 6e8705d4ae..bdf76fc2a6 100644 --- a/docs/modules/feo/feo_time/docs/index.rst +++ b/docs/modules/feo/feo_time/docs/index.rst @@ -17,7 +17,7 @@ feo_time ######## This component will be replaced by or become a wrapper of the interface `mw::com` provided by the feature -"Time". In the latter case, it is planned to be integrated into the component feo (see :ref:`comp_doc_feo`). +"Time". In the latter case, it is planned to be integrated into the component feo (see :ref:`feo_module_documentation`). Component Documents =================== diff --git a/docs/modules/feo/feo_tracing/docs/index.rst b/docs/modules/feo/feo_tracing/docs/index.rst index 2bfa8352c9..c0d295472c 100644 --- a/docs/modules/feo/feo_tracing/docs/index.rst +++ b/docs/modules/feo/feo_tracing/docs/index.rst @@ -17,7 +17,7 @@ feo_tracing ########### This component will be replaced by or become a wrapper of the interface `mw::com` provided by the feature -"Logging". In the latter case, it is planned to be integrated into the component feo (see :ref:`comp_doc_feo`). +"Logging". In the latter case, it is planned to be integrated into the component feo (see :ref:`feo_module_documentation`). Component Documents =================== diff --git a/docs/modules/feo/index.rst b/docs/modules/feo/index.rst index 045db16bf2..64daf83d42 100644 --- a/docs/modules/feo/index.rst +++ b/docs/modules/feo/index.rst @@ -13,7 +13,7 @@ # ******************************************************************************* -feo Module +FEO Module ########## .. toctree:: 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 96aaa0615b..00e166107c 100644 --- a/docs/modules/persistency/docs/safety_mgt/module_safety_plan.rst +++ b/docs/modules/persistency/docs/safety_mgt/module_safety_plan.rst @@ -124,7 +124,7 @@ Module Workproducts List - :need:`doc__persistency_safety_manual` - :ndf:`copy('status', need_id='doc__persistency_safety_manual')` - * - :need:`PROCESS_wp__verification__module_ver_report` + * - :need:`PROCESS_wp__verification_module_ver_report` - :need:`PROCESS_gd_temp__mod_ver_report` - :ndf:`copy('status', need_id='PROCESS_gd_temp__mod_ver_report')` - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C964 @@ -132,8 +132,8 @@ Module Workproducts List - :ndf:`copy('status', need_id='doc__persistency_verification_report')` * - :need:`PROCESS_wp__module_sw_release_note` - - :need:`PROCESS_gd_temp__rel__mod_rel_note` - - :ndf:`copy('status', need_id='PROCESS_gd_temp__rel__mod_rel_note')` + - :need:`PROCESS_gd_temp__rel_mod_rel_note` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__rel_mod_rel_note')` - <Link to issue> - :need:`doc__persistency_release_note` - :ndf:`copy('status', need_id='doc__persistency_release_note')` @@ -151,37 +151,37 @@ Component <name> Workproducts List - Link to WP - WP/doc status - * - :need:`PROCESS_wp__requirements__comp` - - :need:`PROCESS_gd_temp__req__comp_req` - - :ndf:`copy('status', need_id='PROCESS_gd_temp__req__comp_req')` + * - :need:`PROCESS_wp__requirements_comp` + - :need:`PROCESS_gd_temp__req_comp_req` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__req_comp_req')` - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C960 - :need:`doc__persistency_kvs_mod_req` - :ndf:`copy('status', need_id='doc__persistency_kvs_mod_req')` & WP below - * - :need:`PROCESS_wp__requirements__comp_aou` - - :need:`PROCESS_gd_temp__req__aou_req` - - :ndf:`copy('status', need_id='PROCESS_gd_temp__req__aou_req')` + * - :need:`PROCESS_wp__requirements_comp_aou` + - :need:`PROCESS_gd_temp__req_aou_req` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__req_aou_req')` - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C960 - :need:`doc__persistency_kvs_mod_req` - :ndf:`copy('status', need_id='doc__persistency_kvs_mod_req')` & WP below - * - :need:`PROCESS_wp__requirements__inspect` - - :need:`PROCESS_gd_chklst__req__inspection` - - :ndf:`copy('status', need_id='PROCESS_gd_chklst__req__inspection')` + * - :need:`PROCESS_wp__requirements_inspect` + - :need:`PROCESS_gd_chklst__req_inspection` + - :ndf:`copy('status', need_id='PROCESS_gd_chklst__req_inspection')` - n/a - Checklist used in Pull Request Review - n/a * - :need:`PROCESS_wp__component_arch` - - :need:`PROCESS_gd_temp__arch__comp` - - :ndf:`copy('status', need_id='PROCESS_gd_temp__arch__comp')` + - :need:`PROCESS_gd_temp__arch_comp` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__arch_comp')` - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C1020 - :need:`doc__persistency_kvs_mod_arch` - :ndf:`copy('status', need_id='doc__persistency_kvs_mod_arch')` & WP below * - :need:`PROCESS_wp__sw_arch_verification` - - :need:`PROCESS_gd_chklst__arch__inspection_checklist` - - :ndf:`copy('status', need_id='PROCESS_gd_chklst__arch__inspection_checklist')` + - :need:`PROCESS_gd_chklst__arch_inspection_checklist` + - :ndf:`copy('status', need_id='PROCESS_gd_chklst__arch_inspection_checklist')` - n/a - Checklist used in Pull Request Review - n/a @@ -207,7 +207,7 @@ Component <name> Workproducts List - <Link to WP> - <automated> - * - :need:`PROCESS_wp__verification__sw_unit_test` + * - :need:`PROCESS_wp__verification_sw_unit_test` - :need:`PROCESS_gd_guidl__verification_guide` - :ndf:`copy('status', need_id='PROCESS_gd_guidl__verification_guide')` - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C964 @@ -221,7 +221,7 @@ Component <name> Workproducts List - Checklist used in Pull Request Review - n/a - * - :need:`PROCESS_wp__verification__comp_int_test` + * - :need:`PROCESS_wp__verification_comp_int_test` - :need:`PROCESS_gd_guidl__verification_guide` - :ndf:`copy('status', need_id='PROCESS_gd_guidl__verification_guide')` - https://github.com/eclipse-score/score/issues/952?issue=eclipse-score%7Cscore%7C964 @@ -254,15 +254,15 @@ If the OSS element is classified as a - Link to issue - Reasoning for tailoring - * - :need:`PROCESS_wp__requirements__comp` + * - :need:`PROCESS_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:`PROCESS_wp__requirements__comp_aou` + * - :need:`PROCESS_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:`PROCESS_wp__requirements__inspect` + * - :need:`PROCESS_wp__requirements_inspect` - n/a - Checklist used in Pull Request Review @@ -282,7 +282,7 @@ If the OSS element is classified as a - n/a - If source code is modified, this is not a OSS qualification any more. - * - :need:`PROCESS_wp__verification__sw_unit_test` + * - :need:`PROCESS_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> @@ -290,7 +290,7 @@ If the OSS element is classified as a - 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:`PROCESS_wp__verification__comp_int_test` + * - :need:`PROCESS_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) diff --git a/docs/modules/persistency/docs/verification/module_verification_report.rst b/docs/modules/persistency/docs/verification/module_verification_report.rst index 276cb12454..0d0a2b414c 100644 --- a/docs/modules/persistency/docs/verification/module_verification_report.rst +++ b/docs/modules/persistency/docs/verification/module_verification_report.rst @@ -19,7 +19,7 @@ Verification Report :id: doc__persistency_verification_report :status: draft :safety: ASIL_B - :realizes: PROCESS_wp__verification__module_ver_report + :realizes: PROCESS_wp__verification_module_ver_report :tags: persistency diff --git a/docs/modules/persistency/kvs/docs/architecture/index.rst b/docs/modules/persistency/kvs/docs/architecture/index.rst index 0b44db85dd..754dbeeb05 100644 --- a/docs/modules/persistency/kvs/docs/architecture/index.rst +++ b/docs/modules/persistency/kvs/docs/architecture/index.rst @@ -117,5 +117,5 @@ Lower Level Components .. attention:: The above directives must be updated according to your component architecture. - - Replace the example content by the real content (according to :need:`PROCESS_gd_guidl__arch__design`) + - Replace the example content by the real content (according to :need:`PROCESS_gd_guidl__arch_design`) - Set the status to valid and start the review/merge process diff --git a/docs/modules/persistency/kvs/docs/requirements/index.rst b/docs/modules/persistency/kvs/docs/requirements/index.rst index 9bd40a6846..daa48f5a70 100644 --- a/docs/modules/persistency/kvs/docs/requirements/index.rst +++ b/docs/modules/persistency/kvs/docs/requirements/index.rst @@ -19,7 +19,7 @@ Requirements :id: doc__persistency_kvs_mod_req :status: valid :safety: ASIL_B - :realizes: PROCESS_wp__requirements__comp + :realizes: PROCESS_wp__requirements_comp .. comp_req:: Key Naming :id: comp_req__persistency__key_naming diff --git a/docs/platform_management_plan/change_management.rst b/docs/platform_management_plan/change_management.rst index b41a197653..4b0d84c5dc 100644 --- a/docs/platform_management_plan/change_management.rst +++ b/docs/platform_management_plan/change_management.rst @@ -16,6 +16,7 @@ :id: doc__platform_change_management_plan :status: draft :safety: ASIL_B + :security: YES :tags: platform_management :realizes: PROCESS_wp__chm_plan @@ -73,7 +74,7 @@ of Change Requests. The tool is used to implement and verify Change Requests wit The next figure gives an overview, how Change Requests are realized in **S-CORE**. An ISSUE is used to create a Change Request including required attributes as defined in -:need:`PROCESS_gd_req__change__attr_uid`. +:need:`PROCESS_gd_req__change_attr_uid`. The ISSUE may be linked to other ISSUEs or SUB-ISSUEs, if required, to manage more complex Change Requests. The implementation of a Change Request requires at least one PR linked to the ISSUE created for the Change Request. @@ -110,35 +111,35 @@ Changes are clustered in the following types: Change Request Traceability Impact Analysis requires the following tools: -:need:`[[title]] <PROCESS_gd_req__change__tool_impact_analysis>` +:need:`[[title]] <PROCESS_gd_req__change_tool_impact_analysis>` Change Request Attributes ^^^^^^^^^^^^^^^^^^^^^^^^^ -:need:`PROCESS_gd_req__change__attr_uid` are implemented as follows: +:need:`PROCESS_gd_req__change_attr_uid` are implemented as follows: -:need:`[[title]] <PROCESS_gd_req__change__attr_uid>` is identical to the ISSUE number. +:need:`[[title]] <PROCESS_gd_req__change_attr_uid>` is identical to the ISSUE number. -:need:`[[title]] <PROCESS_gd_req__change__attr_status>` is defined by the combination of the ISSUE state +:need:`[[title]] <PROCESS_gd_req__change_attr_status>` is defined by the combination of the ISSUE state and the states of the linked PRs. -:need:`[[title]] <PROCESS_gd_req__change__attr_title>` is identical to the ISSUE title. +:need:`[[title]] <PROCESS_gd_req__change_attr_title>` is identical to the ISSUE title. -:need:`[[title]] <PROCESS_gd_req__change__attr_impact_description>` is defined in the linked PR or part of the +:need:`[[title]] <PROCESS_gd_req__change_attr_impact_description>` is defined in the linked PR or part of the description. -:need:`[[title]] <PROCESS_gd_req__change__attr_impact_safety>` is defined in the linked PR or part of the +:need:`[[title]] <PROCESS_gd_req__change_attr_impact_safety>` is defined in the linked PR or part of the description. -:need:`[[title]] <PROCESS_gd_req__change__attr_impact_security>` is defined in the linked PR or part of the +:need:`[[title]] <PROCESS_gd_req__change_attr_impact_security>` is defined in the linked PR or part of the description. -:need:`[[title]] <PROCESS_gd_req__change__attr_types>` is defined by label of a ISSUE and part of the +:need:`[[title]] <PROCESS_gd_req__change_attr_types>` is defined by label of a ISSUE and part of the description. -:need:`[[title]] <PROCESS_gd_req__change__attr_affected_wp>` is defined in the linked PR or part of the +:need:`[[title]] <PROCESS_gd_req__change_attr_affected_wp>` is defined in the linked PR or part of the description. -:need:`[[title]] <PROCESS_gd_req__change__attr_milestone>` is defined by the Milestone of a ISSUE. +:need:`[[title]] <PROCESS_gd_req__change_attr_milestone>` is defined by the Milestone of a ISSUE. .. _change_mgmt_workflow: @@ -164,13 +165,13 @@ The figure below shows the workflow for the simplest case of a Change Request. An ISSUE with the label according to the Change Request type is created in status ``OPEN``. The title of the ISSUE reflects the potential change. The description of the ISSUE may give a brief description of the requested change or modification. Further add here the -:need:`Impact Analysis Template <PROCESS_gd_temp__change__impact_analysis>` and fill it out accordingly. +:need:`Impact Analysis Template <PROCESS_gd_temp__change_impact_analysis>` and fill it out accordingly. The details are part of the Feature/Component Request work product. The Feature/Component Request is provided by a PR, which is linked to the ISSUE in status ``DRAFT``. -For a new Feature/Component Request the provided templates :need:`Feature Request<PROCESS_gd_temp__change__feature_request>`, -:need:`Component Request<PROCESS_gd_temp__change__component_request>` must be used. For a modification of an existing +For a new Feature/Component Request the provided templates :need:`Feature Request<PROCESS_gd_temp__change_feature_request>`, +:need:`Component Request<PROCESS_gd_temp__change_component_request>` must be used. For a modification of an existing Feature/Component, update the existing work products. The linked PR in status ``DRAFT``, which contains the Feature/Component Requests, may contain also @@ -201,10 +202,10 @@ review results are resolved by the :need:`Contributor <PROCESS_rl__contributor>` are documented in the PR. As long as the information is not sufficient, the related PR is kept in status ``OPEN``. -:need:`PROCESS_gd_chklst__change__cr_review` can help to verify whether the information is complete. +:need:`PROCESS_gd_chklst__change_cr_review` can help to verify whether the information is complete. -The realisation parts of the Change Request are reviewed according the checklists of the affected -work products. Verification of the realisation parts must be successful. +The realization parts of the Change Request are reviewed according the checklists of the affected +work products. Verification of the realization parts must be successful. If the verification is not sufficient, the related PR is kept in status ``OPEN`` or may changed back to ``DRAFT`` (compare :need:`doc__issue_guideline`). @@ -278,8 +279,8 @@ Change Management SW Platform Work Products - established * - :need:`PROCESS_wp__platform_mgmt` - - :need:`PROCESS_wf__platform__cr_mt_platform_mgmt_plan` - - :ndf:`copy('status', need_id='PROCESS_wf__platform__cr_mt_platform_mgmt_plan')` + - :need:`PROCESS_wf__platform_cr_mt_platform_mgmt_plan` + - :ndf:`copy('status', need_id='PROCESS_wf__platform_cr_mt_platform_mgmt_plan')` - <Link to issue> - :doc:`index` - :ndf:`copy('status', need_id='doc__platform_mgt_plan')` diff --git a/docs/platform_management_plan/config_management.rst b/docs/platform_management_plan/config_management.rst index 6334dd191f..f6fa32c532 100644 --- a/docs/platform_management_plan/config_management.rst +++ b/docs/platform_management_plan/config_management.rst @@ -16,7 +16,9 @@ :id: doc__config_mgt_plan :status: draft :safety: ASIL_B + :security: YES :tags: platform_management + :realizes: PROCESS_wp__config_mgt_plan Config management / Configuration Management Plan ------------------------------------------------- @@ -25,7 +27,7 @@ Purpose +++++++ The Configuration Management Plan defines how the integrity of all work products -and other project relevant artefacts can be reached and maintained. +and other project relevant artifacts can be reached and maintained. Objectives and scope @@ -44,7 +46,7 @@ Goal of this plan is to describe * how to backup and recover (including long term storage) * how to report the configuration status -note: for definition of "configuration items" check :need:`PROCESS_doc_concept__configuration__process` +note: for definition of "configuration items" check :need:`PROCESS_doc_concept__configuration_process` Approach @@ -89,7 +91,7 @@ Also baselines (which are sets of files) can be shown via GitHub by switching to These baselines are used to build the release, i.e. the documentation, code and verification reports for this tag. For release versioning rules check the respective section of release guideline. -For other artefacts: these are pulled into S-CORE integration repository by forking to be handled as above. +For other artifacts: these are pulled into S-CORE integration repository by forking to be handled as above. Control and Modification @@ -113,7 +115,7 @@ Branches are used as a means of parallel development. In the S-CORE project the * main branch - a "remote" branch (named "main") which contains all the latest file versions checked by CI, reviewed, accepted and merged. * release branch - a "remote" branch derived from main branch which is used to prepare a release, no functional code changes are allowed, only bug fixes and verification based improvements. - Only the technical lead is allowed to approve a merge into a release branch. The branch name is given as defined in :need:`PROCESS_doc_concept__rel__process`. + Only the technical lead is allowed to approve a merge into a release branch. The branch name is given as defined in :need:`PROCESS_doc_concept__rel_process`. The "remote" branch is not "local" to the developer but resides on the "remote" GitHub server. @@ -125,25 +127,25 @@ 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. Baselines are created individually in these repositories, even a different version schema could be adopted. -In case of dependent repositories, the repository dependet upon on has to be baselined first, to be available +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. Every change in the release repository is also taken over into the main branch. The module development team -can decide how to ensure this (e.g. by development in main and cherrypick to release branch). +can decide how to ensure this (e.g. by development in main and cherry-pick to release branch). Backup and Recovery ^^^^^^^^^^^^^^^^^^^ Backup and recovery are covered by the Eclipse Foundation hosting the GitHub service for S-CORE. -For the long term storage, additional measures are taken, see :need:`PROCESS_gd_req__config__workproducts_storage` +For the long term storage, additional measures are taken, see :need:`PROCESS_gd_req__config_workproducts_storage` Status and Reporting ^^^^^^^^^^^^^^^^^^^^ -Work products defined in our proceses have "status" attributes. These are used to communicate to all the stakeholders. +Work products defined in our processes have "status" attributes. These are used to communicate to all the stakeholders. The main communication means is a document list containing all documents including their status. This list is part of the Documentation Management Plan :need:`doc__documentation_mgt_plan` as part of the Platform Management Plan, as defined in :need:`PROCESS_gd_guidl__documentation`. @@ -152,7 +154,7 @@ against the list of planned documents, which is also part of the Documentation M Note that work products consisting of several elements (documented as needs) will be collected in one file which will form a document (e.g. there will be a document (doc__*) "feature xy requirements" and in it all the feature's requirements(feat_req__*)). -This applies to requirements, architeture, detailed design and safety analysis. +This applies to requirements, architecture, detailed design and safety analysis. The files containing the source code and test code are not part of documents as above, their status is implicitly "valid", as these are subject to code and test review before every merge. @@ -172,6 +174,6 @@ The respective tools used in the project are: * "Docs-as-Code" tool: sphinx-needs * CI build tool: Bazel -Note 1: A versioning tool covers part of configuration management but not all (namely: storage, retrieval, control and modification, branching and baselining). +Note 1: A versioning tool covers part of configuration management but not all (namely: storage, retrieval, control and modification, branching and base-lining). Note 2: A "Docs-as-Code" tool is used to identify, attribute and link parts of text files and generate human and machine readable documentation. diff --git a/docs/platform_management_plan/documentation_management.rst b/docs/platform_management_plan/documentation_management.rst index ebe6d0073f..6b5817eff2 100644 --- a/docs/platform_management_plan/documentation_management.rst +++ b/docs/platform_management_plan/documentation_management.rst @@ -16,6 +16,7 @@ :id: doc__documentation_mgt_plan :status: draft :safety: ASIL_B + :security: NO :tags: platform_management :realizes: PROCESS_wp__document_mgt_plan diff --git a/docs/platform_management_plan/problem_resolution.rst b/docs/platform_management_plan/problem_resolution.rst index 439df845e6..2ae3371845 100644 --- a/docs/platform_management_plan/problem_resolution.rst +++ b/docs/platform_management_plan/problem_resolution.rst @@ -64,14 +64,14 @@ problem reported within **S-CORE**. The next figure gives an overview, how problems are created in **S-CORE**. An ISSUE is used to create a problem report including required attributes as defined in the -:need:`Problem Process Requirements <PROCESS_gd_req__problem__attr_uid>`. +:need:`Problem Process Requirements <PROCESS_gd_req__problem_attr_uid>`. .. figure:: _assets/score_problem_resolution_overview.drawio.svg :width: 100% :align: center :alt: Problem Resolution Overview -Therefore the Problem Template :need:`PROCESS_gd_temp__problem__template` shall be used. +Therefore the Problem Template :need:`PROCESS_gd_temp__problem_template` shall be used. .. note:: The template is automatically included in the ISSUE **Problem Report**. @@ -86,9 +86,9 @@ Problem Resolution Attributes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The Problem Problem Resolution Process Requirements are implemented as follows: -:need:`[[title]] <PROCESS_gd_req__problem__attr_uid>` is identical to the ISSUE number. +:need:`[[title]] <PROCESS_gd_req__problem_attr_uid>` is identical to the ISSUE number. -:need:`[[title]] <PROCESS_gd_req__problem__attr_status>` is defined by the combination of the ISSUE state +:need:`[[title]] <PROCESS_gd_req__problem_attr_status>` is defined by the combination of the ISSUE state and the state in the Projects dashboard view. The PR status is also used, if applicable. .. list-table:: Problem Status @@ -120,9 +120,9 @@ and the state in the Projects dashboard view. The PR status is also used, if app - na - na -:need:`[[title]] <PROCESS_gd_req__problem__attr_title>` is identical to the ISSUE title. +:need:`[[title]] <PROCESS_gd_req__problem_attr_title>` is identical to the ISSUE title. -:need:`[[title]] <PROCESS_gd_req__problem__attr_impact_description>` is provided in the Description +:need:`[[title]] <PROCESS_gd_req__problem_attr_impact_description>` is provided in the Description part of the ISSUE. Add here the root cause and impact of the problem. Optionally state, who has to be informed or notified, if applicable, e.g. Safety Manager of a feature. @@ -135,15 +135,15 @@ part of the ISSUE. To provide solutions, use the Solution part of the ISSUE. -:need:`[[title]] <PROCESS_gd_req__problem__attr_anaylsis_results>` is provided in the analysis +:need:`[[title]] <PROCESS_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 -:need:`[[title]] <PROCESS_gd_req__problem__attr_stakeholder>` are provided in the Assignees part of +:need:`[[title]] <PROCESS_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 (Feature Owner) (under discussion, compare https://github.com/eclipse-score/score/issues/870). -:need:`[[title]] <PROCESS_gd_req__problem__attr_classification>` is provided in the Classification +:need:`[[title]] <PROCESS_gd_req__problem_attr_classification>` is provided in the Classification part of the ISSUE. Select one of provided identifiers: .. list-table:: Problem Classification @@ -162,8 +162,8 @@ part of the ISSUE. Select one of provided identifiers: - ``blocker`` -:need:`[[title]] <PROCESS_gd_req__problem__attr_safety_affected>`, -:need:`[[title]] <PROCESS_gd_req__problem__attr_security_affected>` are provided in the Category +:need:`[[title]] <PROCESS_gd_req__problem_attr_safety_affected>`, +:need:`[[title]] <PROCESS_gd_req__problem_attr_security_affected>` are provided in the Category part of the ISSUE. Combinations of them are allowed. If nothing is selected, Quality is affected by default. @@ -171,7 +171,7 @@ Combinations of them are allowed. If nothing is selected, Quality is affected by Use the ASIL classification part of the ISSUE to document the ASIL level concerned, e.g. ASIL_B. -:need:`[[title]] <PROCESS_gd_req__problem__attr_milestone>` is provided in the Expected Closure +:need:`[[title]] <PROCESS_gd_req__problem_attr_milestone>` is provided in the Expected Closure Version part of the ISSUE. Optionally the Milestone part of the ISSUE can be set. @@ -187,7 +187,7 @@ In general, every Problem Resolution follows the following steps: * 3. Initiate the implementation of the Problem Resolution and track it to closure (yellow color) * 3. Close Problem Resolution (purple color) -:need:`PROCESS_gd_guidl__problem__problem` can give additional help. +:need:`PROCESS_gd_guidl__problem_problem` can give additional help. **To 1. Create the Problem Report:** @@ -232,7 +232,7 @@ 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. -:need:`PROCESS_gd_chklst__problem__cr_review` can help to verify whether the information is complete. +:need:`PROCESS_gd_chklst__problem_cr_review` can help to verify whether the information is complete. In case affected parties need to be informed :need:`Technical Lead <PROCESS_rl__technical_lead>` or :need:`Module Lead <PROCESS_rl__module_lead>` will notify them, either updating the Assignees or @@ -269,7 +269,7 @@ this case all linked ISSUEs or PRs are closed or merged, respectively. Especially the solution measures must be checked for their effectiveness and the argumentation is convincing. -:need:`PROCESS_gd_chklst__problem__cr_review` can help to verify whether it can be closed. +:need:`PROCESS_gd_chklst__problem_cr_review` can help to verify whether it can be closed. If this is the case the ISSUE status is set to ``Closed``, otherwise the Projects status is set back to ``In Progress``. diff --git a/docs/platform_management_plan/project_management.rst b/docs/platform_management_plan/project_management.rst index 67d98b5bc6..20ddcdde67 100644 --- a/docs/platform_management_plan/project_management.rst +++ b/docs/platform_management_plan/project_management.rst @@ -16,6 +16,7 @@ :id: doc__project_mgt_plan :status: draft :safety: ASIL_B + :security: YES :realizes: PROCESS_wp__project_mgt :tags: platform_management diff --git a/docs/platform_management_plan/quality_management.rst b/docs/platform_management_plan/quality_management.rst index db68003b5e..c641b0910e 100644 --- a/docs/platform_management_plan/quality_management.rst +++ b/docs/platform_management_plan/quality_management.rst @@ -28,7 +28,7 @@ Purpose The purpose of this document is to define a quality strategy and an approach for the platform. This includes an approach to providing an independent and objective assurance that work products and processes -comply with predefined provisions and plans and that non-conformances are resolved and further prevented. +comply with predefined provisions and plans and that non-conformance is resolved and further prevented. This document includes quality assurance activities, roles and responsibilities, goals, schedule, etc. and a general strategy to implement quality assurance process in this platform. The quality assurance is ensured by automated checks and restrictions, manual checks which includes to proof that there is no manipulation @@ -134,7 +134,7 @@ Objectives and scope - :need:`stkh_req__dependability__automotive_safety`, :doc:`../requirements/stakeholder/index` - 100% of project/platform work products are quality-assured - Feature is released as experimental - - Ensured by the process quality and tool management, :need:`PROCESS_wp__verification__platform_ver_report` - Work products contain the verification of the quality assurance + - Ensured by the process quality and tool management, :need:`PROCESS_wp__verification_platform_ver_report` - Work products contain the verification of the quality assurance * - 4 - Only quality-assured project/platform releases are delivered to the community - :need:`stkh_req__dependability__automotive_safety`, :doc:`../requirements/stakeholder/index` @@ -152,7 +152,7 @@ Objectives and scope - :need:`stkh_req__dependability__automotive_safety`, :doc:`../requirements/stakeholder/index` - 100% of the quality improvement, non-conformance issues are closed - None - - Ensured by the process quality management, :need:`PROCESS_wp__issue_track_system` contain improvements and non-conformances + - Ensured by the process quality management, :need:`PROCESS_wp__issue_track_system` contain improvements and non-conformance 3.4 Work Product Quality Goals @@ -317,22 +317,22 @@ None - <automated> * - :need:`PROCESS_wp__chm_plan` - - :need:`PROCESS_gd_guidl__change__change_request` - - :ndf:`copy('status', need_id='PROCESS_gd_guidl__change__change_request')` + - :need:`PROCESS_gd_guidl__change_change_request` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__change_change_request')` - <Link to issue> - <Link to WP> - <automated> * - :need:`PROCESS_wp__cmpt_request` - - :need:`PROCESS_gd_guidl__change__change_request` - - :ndf:`copy('status', need_id='PROCESS_gd_guidl__change__change_request')` + - :need:`PROCESS_gd_guidl__change_change_request` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__change_change_request')` - <Link to issue> - <Link to WP> - <automated> * - :need:`PROCESS_wp__component_arch` - - :need:`PROCESS_gd_guidl__arch__design` - - :ndf:`copy('status', need_id='PROCESS_gd_guidl__arch__design')` + - :need:`PROCESS_gd_guidl__arch_design` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__arch_design')` - <Link to issue> - <Link to WP> - <automated> @@ -352,15 +352,15 @@ None - <automated> * - :need:`PROCESS_wp__feat_request` - - :need:`PROCESS_gd_guidl__change__change_request` - - :ndf:`copy('status', need_id='PROCESS_gd_guidl__change__change_request')` + - :need:`PROCESS_gd_guidl__change_change_request` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__change_change_request')` - <Link to issue> - - :need:`doc__logging`, :need:`doc__com`, :need:`doc__feo`, :need:`doc__persistency_kvs` + - :need:`doc__logging`, :need:`doc__com`, :need:`doc__frameworks_feo`, :need:`doc__persistency_kvs` - <automated> * - :need:`PROCESS_wp__feature_arch` - - :need:`PROCESS_gd_guidl__arch__design` - - :ndf:`copy('status', need_id='PROCESS_gd_guidl__arch__design')` + - :need:`PROCESS_gd_guidl__arch_design` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__arch_design')` - <Link to issue> - <Link to WP> - <automated> @@ -464,8 +464,8 @@ None - <automated> * - :need:`PROCESS_wp__prm_plan` - - :need:`PROCESS_gd_guidl__problem__problem` - - :ndf:`copy('status', need_id='PROCESS_gd_guidl__problem__problem')` + - :need:`PROCESS_gd_guidl__problem_problem` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__problem_problem')` - <Link to issue> - <Link to WP> - <automated> @@ -478,8 +478,8 @@ None - <automated> * - :need:`PROCESS_wp__process_impr_report` - - :need:`PROCESS_gd_guidl__platform__mgmt_plan` - - :ndf:`copy('status', need_id='PROCESS_gd_guidl__platform__mgmt_plan')` + - :need:`PROCESS_gd_guidl__platform_mgmt_plan` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__platform_mgmt_plan')` - <Link to issue> - <Link to WP> - <automated> @@ -492,8 +492,8 @@ None - <automated> * - :need:`PROCESS_wp__project_mgt` - - :need:`PROCESS_gd_guidl__platform__mgmt_plan` - - :ndf:`copy('status', need_id='PROCESS_gd_guidl__platform__mgmt_plan')` + - :need:`PROCESS_gd_guidl__platform_mgmt_plan` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__platform_mgmt_plan')` - <Link to issue> - <Link to WP> - <automated> @@ -512,51 +512,51 @@ None - <Link to WP> - <automated> - * - :need:`PROCESS_wp__requirements__comp` - - :need:`PROCESS_gd_guidl__req__engineering` - - :ndf:`copy('status', need_id='PROCESS_gd_guidl__req__engineering')` + * - :need:`PROCESS_wp__requirements_comp` + - :need:`PROCESS_gd_guidl__req_engineering` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__req_engineering')` - <Link to issue> - <Link to WP> - <automated> - * - :need:`PROCESS_wp__requirements__comp_aou` - - :need:`PROCESS_gd_guidl__req__engineering` - - :ndf:`copy('status', need_id='PROCESS_gd_guidl__req__engineering')` + * - :need:`PROCESS_wp__requirements_comp_aou` + - :need:`PROCESS_gd_guidl__req_engineering` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__req_engineering')` - <Link to issue> - <Link to WP> - <automated> - * - :need:`PROCESS_wp__requirements__feat` - - :need:`PROCESS_gd_guidl__req__engineering` - - :ndf:`copy('status', need_id='PROCESS_gd_guidl__req__engineering')` + * - :need:`PROCESS_wp__requirements_feat` + - :need:`PROCESS_gd_guidl__req_engineering` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__req_engineering')` - <Link to issue> - <Link to WP> - <automated> - * - :need:`PROCESS_wp__requirements__feat_aou` - - :need:`PROCESS_gd_guidl__req__engineering` - - :ndf:`copy('status', need_id='PROCESS_gd_guidl__req__engineering')` + * - :need:`PROCESS_wp__requirements_feat_aou` + - :need:`PROCESS_gd_guidl__req_engineering` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__req_engineering')` - <Link to issue> - <Link to WP> - <automated> - * - :need:`PROCESS_wp__requirements__inspect` - - :need:`PROCESS_gd_guidl__req__engineering` - - :ndf:`copy('status', need_id='PROCESS_gd_guidl__req__engineering')` + * - :need:`PROCESS_wp__requirements_inspect` + - :need:`PROCESS_gd_guidl__req_engineering` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__req_engineering')` - <Link to issue> - <Link to WP> - <automated> - * - :need:`PROCESS_wp__requirements__stkh` - - :need:`PROCESS_gd_guidl__req__engineering` - - :ndf:`copy('status', need_id='PROCESS_gd_guidl__req__engineering')` + * - :need:`PROCESS_wp__requirements_stkh` + - :need:`PROCESS_gd_guidl__req_engineering` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__req_engineering')` - <Link to issue> - <Link to WP> - <automated> * - :need:`PROCESS_wp__sw_arch_verification` - - :need:`PROCESS_gd_guidl__arch__design` - - :ndf:`copy('status', need_id='PROCESS_gd_guidl__arch__design')` + - :need:`PROCESS_gd_guidl__arch_design` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__arch_design')` - <Link to issue> - <Link to WP> - <automated> @@ -582,7 +582,7 @@ None - <Link to WP> - <automated> - * - :need:`PROCESS_wp__sw_component_dfa` + * - :need:`PROCESS_wp__sw_component_dfa` - :need:`PROCESS_gd_guidl__safety_analysis` - :ndf:`copy('status', need_id='PROCESS_gd_guidl__safety_analysis')` - <Link to issue> @@ -618,15 +618,15 @@ None - <automated> * - :need:`PROCESS_wp__tlm_plan` - - :need:`PROCESS_doc_concept__tool__process` - - :ndf:`copy('status', need_id='PROCESS_doc_concept__tool__process')` + - :need:`PROCESS_doc_concept__tool_process` + - :ndf:`copy('status', need_id='PROCESS_doc_concept__tool_process')` - <Link to issue> - :need:`doc__platform_tool_management_plan` - <automated> * - :need:`PROCESS_wp__tool_verification_report` - - :need:`PROCESS_doc_concept__tool__process` - - :ndf:`copy('status', need_id='PROCESS_doc_concept__tool__process')` + - :need:`PROCESS_doc_concept__tool_process` + - :ndf:`copy('status', need_id='PROCESS_doc_concept__tool_process')` - <Link to issue> - <Link to WP> - <automated> @@ -639,49 +639,49 @@ None - <automated> - * - :need:`PROCESS_wp__verification__comp_int_test` + * - :need:`PROCESS_wp__verification_comp_int_test` - :need:`PROCESS_gd_guidl__verification_guide` - :ndf:`copy('status', need_id='PROCESS_gd_guidl__verification_guide')` - <Link to issue> - <Link to WP> - <automated> - * - :need:`PROCESS_wp__verification__feat_int_test` + * - :need:`PROCESS_wp__verification_feat_int_test` - :need:`PROCESS_gd_guidl__verification_guide` - :ndf:`copy('status', need_id='PROCESS_gd_guidl__verification_guide')` - <Link to issue> - <Link to WP> - <automated> - * - :need:`PROCESS_wp__verification__module_ver_report` + * - :need:`PROCESS_wp__verification_module_ver_report` - :need:`PROCESS_gd_guidl__verification_guide` - :ndf:`copy('status', need_id='PROCESS_gd_guidl__verification_guide')` - <Link to issue> - <Link to WP> - <automated> - * - :need:`PROCESS_wp__verification__plan` + * - :need:`PROCESS_wp__verification_plan` - :need:`PROCESS_gd_guidl__verification_guide` - :ndf:`copy('status', need_id='PROCESS_gd_guidl__verification_guide')` - <Link to issue> - <Link to WP> - <automated> - * - :need:`PROCESS_wp__verification__platform_test` + * - :need:`PROCESS_wp__verification_platform_test` - :need:`PROCESS_gd_guidl__verification_guide` - :ndf:`copy('status', need_id='PROCESS_gd_guidl__verification_guide')` - <Link to issue> - <Link to WP> - <automated> - * - :need:`PROCESS_wp__verification__platform_ver_report` + * - :need:`PROCESS_wp__verification_platform_ver_report` - :need:`PROCESS_gd_guidl__verification_guide` - :ndf:`copy('status', need_id='PROCESS_gd_guidl__verification_guide')` - <Link to issue> - <Link to WP> - <automated> - * - :need:`PROCESS_wp__verification__sw_unit_test` + * - :need:`PROCESS_wp__verification_sw_unit_test` - :need:`PROCESS_gd_guidl__verification_guide` - :ndf:`copy('status', need_id='PROCESS_gd_guidl__verification_guide')` - <Link to issue> diff --git a/docs/platform_management_plan/release_management.rst b/docs/platform_management_plan/release_management.rst index 1d2cd2290b..50a6f286cf 100644 --- a/docs/platform_management_plan/release_management.rst +++ b/docs/platform_management_plan/release_management.rst @@ -16,6 +16,7 @@ :id: doc__platform_release_management_plan :status: draft :safety: ASIL_B + :security: NO :tags: platform_management Release management Plan @@ -44,9 +45,9 @@ Approach Release Scope ^^^^^^^^^^^^^ -One release contains all the files of one repository. So there is a platform release and seperate releases for the modules. +One release contains all the files of one repository. So there is a platform release and separate releases for the modules. It contains also all the verification reports (including their input e.g. test run logs) and documentation collaterals -(e.g. the htmls for the S-CORE homepage) as created during the CI build based on the release tagged repository files. +(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 is reproducible, so this can be re-created from source any time. @@ -60,25 +61,25 @@ Release types are strongly associated with the release version numbering, which S-CORE has two major kinds of releases: experimental and official. These correspond with the "feature flags" defined in :need:`doc__project_mgt_plan`. -* **Experimental** means that the development artefacts needed for the safety package work products may be incomplete. +* **Experimental** means that the development artifacts needed for the safety package work products may be incomplete. These releases are done during development phase to be able to sync between the module repositories. * **Official** means that the processes are fully executed to produce all work products and are documented - with a releae note as in :need:`PROCESS_gd_temp__rel__plat_rel_note` or :need:`PROCESS_gd_temp__rel__mod_rel_note`. + with a release note as in :need:`PROCESS_gd_temp__rel_plat_rel_note` or :need:`PROCESS_gd_temp__rel_mod_rel_note`. For an official release also consider `Eclipse Project Handbook - Releases <https://www.eclipse.org/projects/handbook/#release-releases>`_. Release Planning and Execution ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Generally release planning and execution is described in :need:`PROCESS_wf__rel__mod_rel_note` process. +Generally release planning and execution is described in :need:`PROCESS_wf__rel_mod_rel_note` process. 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. Before every release there will be a phase in which, for the features to be released, no functional updates will be allowed but only bug fixes, addition of tests and quality improvements. -This period will be planned by the technical leads in the mileston planning. There is no general -timespan defined for this, but for the first releases a period of four weeks is recommended as good practice. +This period will be planned by the technical leads in the milestone planning. There is no general +time-span defined for this, but for the first releases a period of four weeks is recommended as good practice. With increasing maturity of the modules it is expected that this period can be reduced. As defined in the process, the releases on module and platform level need to be coordinated. diff --git a/docs/platform_management_plan/safety_management.rst b/docs/platform_management_plan/safety_management.rst index cfdd6d8e43..4b87e00956 100644 --- a/docs/platform_management_plan/safety_management.rst +++ b/docs/platform_management_plan/safety_management.rst @@ -16,6 +16,7 @@ :id: doc__platform_safety_plan :status: draft :safety: ASIL_B + :security: NO :realizes: PROCESS_wp__platform_safety_plan,PROCESS_wp__tailoring :tags: platform_management @@ -228,8 +229,8 @@ The status report is based on safety plans work product lists (see below) and ve * :need:`PROCESS_wp__platform_safety_plan` * :need:`PROCESS_wp__module_safety_plan` -* :need:`PROCESS_wp__verification__platform_ver_report` -* :need:`PROCESS_wp__verification__module_ver_report` +* :need:`PROCESS_wp__verification_platform_ver_report` +* :need:`PROCESS_wp__verification_module_ver_report` *Escalation* @@ -254,7 +255,7 @@ Functional Safety Requirements ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Requirement Engineering is defined in the process description. See :need:`doc__project_mgt_plan`. -The application of ISO 26262 standards requirements is realized by defining process guidances and matching those to the ISO 26262 requirements (see e.g. for example :need:`PROCESS_gd_req__safety__doc_status`). +The application of ISO 26262 standards requirements is realized by defining process guidances and matching those to the ISO 26262 requirements (see e.g. for example :need:`PROCESS_gd_req__safety_doc_status`). Functional Safety Schedule ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -312,8 +313,8 @@ Functional Safety Management SW Platform Work Products - to be shown to assessor * - :need:`PROCESS_wp__qms_plan` - - :need:`PROCESS_wf__platform__cr_mt_platform_mgmt_plan` - - :ndf:`copy('status', need_id='PROCESS_wf__platform__cr_mt_platform_mgmt_plan')` + - :need:`PROCESS_wf__platform_cr_mt_platform_mgmt_plan` + - :ndf:`copy('status', need_id='PROCESS_wf__platform_cr_mt_platform_mgmt_plan')` - `#316 <https://github.com/eclipse-score/score/issues/316>`_ - :doc:`quality_management` - not started @@ -326,8 +327,8 @@ Functional Safety Management SW Platform Work Products - established * - :need:`PROCESS_wp__platform_mgmt` - - :need:`PROCESS_wf__platform__cr_mt_platform_mgmt_plan` - - :ndf:`copy('status', need_id='PROCESS_wf__platform__cr_mt_platform_mgmt_plan')` + - :need:`PROCESS_wf__platform_cr_mt_platform_mgmt_plan` + - :ndf:`copy('status', need_id='PROCESS_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')` @@ -417,36 +418,36 @@ Functional Safety Management SW Platform Work Products - <automated> * - :need:`PROCESS_wp__platform_sw_release_note` - - :need:`PROCESS_gd_temp__rel__plat_rel_note` - - :ndf:`copy('status', need_id='PROCESS_gd_temp__rel__plat_rel_note')` + - :need:`PROCESS_gd_temp__rel_plat_rel_note` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__rel_plat_rel_note')` - <Link to issue> - <Link to WP> - <automated> - * - :need:`PROCESS_wp__verification__platform_ver_report` + * - :need:`PROCESS_wp__verification_platform_ver_report` - :need:`PROCESS_gd_temp__mod_ver_report` - :ndf:`copy('status', need_id='PROCESS_gd_temp__mod_ver_report')` - <Link to issue> - <Link to WP> - <automated> - * - :need:`PROCESS_wp__requirements__stkh` - - :need:`PROCESS_gd_temp__req__stkh_req` - - :ndf:`copy('status', need_id='PROCESS_gd_temp__req__stkh_req')` + * - :need:`PROCESS_wp__requirements_stkh` + - :need:`PROCESS_gd_temp__req_stkh_req` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__req_stkh_req')` - n/a (done already) - :ref:`stakeholder_requirements` - <automated> * - :need:`PROCESS_wp__sw_development_plan` - - :need:`PROCESS_wf__platform__cr_mt_platform_mgmt_plan` - - :ndf:`copy('status', need_id='PROCESS_wf__platform__cr_mt_platform_mgmt_plan')` + - :need:`PROCESS_wf__platform_cr_mt_platform_mgmt_plan` + - :ndf:`copy('status', need_id='PROCESS_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')` - * - :need:`PROCESS_wp__verification__plan` - - :need:`PROCESS_wf__platform__cr_mt_platform_mgmt_plan` - - :ndf:`copy('status', need_id='PROCESS_wf__platform__cr_mt_platform_mgmt_plan')` + * - :need:`PROCESS_wp__verification_plan` + - :need:`PROCESS_wf__platform_cr_mt_platform_mgmt_plan` + - :ndf:`copy('status', need_id='PROCESS_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')` diff --git a/docs/platform_management_plan/security_management.rst b/docs/platform_management_plan/security_management.rst index 21d278d2d7..e94e2a7579 100644 --- a/docs/platform_management_plan/security_management.rst +++ b/docs/platform_management_plan/security_management.rst @@ -16,6 +16,7 @@ :id: doc__platform_security_plan :status: draft :safety: ASIL_B + :security: YES :realizes: PROCESS_wp__platform_security_plan, PROCESS_wp__tailoring :tags: platform_management @@ -73,7 +74,7 @@ Regarding the platform specifics: The SW platform functionality consists of features, which are based on a set of requirements and are developed in parallel. These features are developed into SW components contained in "modules", which are another set of OoCs (initiated by a change request). -A template exists to guide this: need:`PROCESS_gd_temp__module_security_plan`. +A template exists to guide this: :need:`PROCESS_gd_temp__module_security_plan`. Tailoring ^^^^^^^^^ @@ -199,10 +200,10 @@ To exchange general information and to clarify general topics the following comm The security management status is reported in the Technical Lead Circle Meeting which is defined in :need:`doc__project_mgt_plan`. The status report is based on security plans work product lists (see below) and verification reports on platform and module level: -* (tbc after release of process description) need:`PROCESS_wp__platform_security_plan` -* (tbc after release of process description) need:`PROCESS_wp__module_security_plan` -* :need:`PROCESS_wp__verification__platform_ver_report` -* :need:`PROCESS_wp__verification__module_ver_report` +* :need:`PROCESS_wp__platform_security_plan` +* :need:`PROCESS_wp__module_security_plan` +* :need:`PROCESS_wp__verification_platform_ver_report` +* :need:`PROCESS_wp__verification_module_ver_report` *Escalation* @@ -247,7 +248,7 @@ The platform management plan defines :doc:`tool_management` Security Work Products ^^^^^^^^^^^^^^^^^^^^^^ -The work products relevant for a module development is defined within each module security management plan. See need:`PROCESS_gd_temp__module_security_plan`. +The work products relevant for a module development is defined within each module security management plan. See :need:`PROCESS_gd_temp__module_security_plan`. Generic project wide work products are defined below. Security Quality Criteria @@ -278,29 +279,29 @@ Security Management SW Platform Work Products - to be shown to assessor * - :need:`PROCESS_wp__platform_mgmt` - - :need:`PROCESS_wf__platform__cr_mt_platform_mgmt_plan` - - :ndf:`copy('status', need_id='PROCESS_wf__platform__cr_mt_platform_mgmt_plan')` + - :need:`PROCESS_wf__platform_cr_mt_platform_mgmt_plan` + - :ndf:`copy('status', need_id='PROCESS_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:`PROCESS_wp__qms_plan` - - :need:`PROCESS_wf__platform__cr_mt_platform_mgmt_plan` - - :ndf:`copy('status', need_id='PROCESS_wf__platform__cr_mt_platform_mgmt_plan')` + - :need:`PROCESS_wf__platform_cr_mt_platform_mgmt_plan` + - :ndf:`copy('status', need_id='PROCESS_wf__platform_cr_mt_platform_mgmt_plan')` - `#316 <https://github.com/eclipse-score/score/issues/316>`_ - :doc:`quality_management` - not started - * - need:`PROCESS_wp__platform_security_plan` - - need:`PROCESS_gd_guidl__security_plan_definitions` - - ndf:`copy('status', need_id='PROCESS_gd_guidl__security_plan_definitions')` + * - :need:`PROCESS_wp__platform_security_plan` + - :need:`PROCESS_gd_guidl__security_plan_definitions` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__security_plan_definitions')` - `#TBD <https://github.com/eclipse-score/score/issues/381>`_ - this document - see above - * - need:`PROCESS_wp__platform_security_package` - - need:`PROCESS_gd_guidl__security_package` - - ndf:`copy('status', need_id='PROCESS_gd_guidl__security_package')` + * - :need:`PROCESS_wp__platform_security_package` + - :need:`PROCESS_gd_guidl__security_package` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__security_package')` - <Link to issue> - <Link to WP> - <automated> @@ -333,28 +334,28 @@ Security Management SW Platform Work Products - `Process community issues <https://github.com/orgs/eclipse-score/projects/7>`_ - <automated> - * - need:`PROCESS_wp__fdr_reports_security` (platform Security Plan) - - need:`PROCESS_gd_chklst__security_plan` - - ndf:`copy('status', need_id='PROCESS_gd_chklst__security_plan')` + * - :need:`PROCESS_wp__fdr_reports_security` (platform Security Plan) + - :need:`PROCESS_gd_chklst__security_plan` + - :ndf:`copy('status', need_id='PROCESS_gd_chklst__security_plan')` - <Link to issue> - <Link to WP> - <automated> - * - need:`PROCESS_wp__fdr_reports_security` (platform Security Package) - - need:`PROCESS_gd_chklst__security_package` - - ndf:`copy('status', need_id='PROCESS_gd_chklst__security_package')` + * - :need:`PROCESS_wp__fdr_reports_security` (platform Security Package) + - :need:`PROCESS_gd_chklst__security_package` + - :ndf:`copy('status', need_id='PROCESS_gd_chklst__security_package')` - <Link to issue> - <Link to WP> - <automated> - * - need:`PROCESS_wp__fdr_reports_security` (feature's Security Analyses) + * - :need:`PROCESS_wp__fdr_reports_security` (feature's Security Analyses) - Security Analysis FDR tbd - <automated> - <Link to issue> - <Link to WP> - <automated> - * - need:`PROCESS_wp__audit_report_security` + * - :need:`PROCESS_wp__audit_report_security` - performed by external experts - n/a - `#TBD1 <https://github.com/eclipse-score/score/issues/470>`_ @@ -368,9 +369,9 @@ Security Management SW Platform Work Products - <Link to WP> - <automated> - * - need:`PROCESS_wp__platform_security_manual` - - need:`PROCESS_gd_temp__security_manual` - - ndf:`copy('status', need_id='PROCESS_gd_temp__security_manual')` + * - :need:`PROCESS_wp__platform_security_manual` + - :need:`PROCESS_gd_temp__security_manual` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__security_manual')` - <Link to issue> - <Link to WP> - <automated> @@ -382,30 +383,30 @@ Security Management SW Platform Work Products - <Link to WP> - <automated> - * - :need:`PROCESS_wp__verification__platform_ver_report` + * - :need:`PROCESS_wp__verification_platform_ver_report` - :need:`PROCESS_gd_temp__mod_ver_report` - :ndf:`copy('status', need_id='PROCESS_gd_temp__mod_ver_report')` - <Link to issue> - <Link to WP> - <automated> - * - :need:`PROCESS_wp__requirements__stkh` - - :need:`PROCESS_gd_temp__req__stkh_req` - - :ndf:`copy('status', need_id='PROCESS_gd_temp__req__stkh_req')` + * - :need:`PROCESS_wp__requirements_stkh` + - :need:`PROCESS_gd_temp__req_stkh_req` + - :ndf:`copy('status', need_id='PROCESS_gd_temp__req_stkh_req')` - n/a (done already) - :ref:`stakeholder_requirements` - <automated> * - :need:`PROCESS_wp__sw_development_plan` - - :need:`PROCESS_wf__platform__cr_mt_platform_mgmt_plan` - - :ndf:`copy('status', need_id='PROCESS_wf__platform__cr_mt_platform_mgmt_plan')` + - :need:`PROCESS_wf__platform_cr_mt_platform_mgmt_plan` + - :ndf:`copy('status', need_id='PROCESS_wf__platform_cr_mt_platform_mgmt_plan')` - <Link to issue> - :doc:`software_development` - not started - * - :need:`PROCESS_wp__verification__plan` - - :need:`PROCESS_wf__platform__cr_mt_platform_mgmt_plan` - - :ndf:`copy('status', need_id='PROCESS_wf__platform__cr_mt_platform_mgmt_plan')` + * - :need:`PROCESS_wp__verification_plan` + - :need:`PROCESS_wf__platform_cr_mt_platform_mgmt_plan` + - :ndf:`copy('status', need_id='PROCESS_wf__platform_cr_mt_platform_mgmt_plan')` - <Link to issue> - :doc:`software_verification` - not started @@ -418,14 +419,14 @@ Security Management SW Platform Work Products - <automated> * - :need:`PROCESS_wp__tailoring` (generic) - - need:`PROCESS_gd_guidl__security_plan_definitions` - - ndf:`copy('status', need_id='PROCESS_gd_guidl__security_plan_definitions')` + - :need:`PROCESS_gd_guidl__security_plan_definitions` + - :ndf:`copy('status', need_id='PROCESS_gd_guidl__security_plan_definitions')` - `#TBD2 <https://github.com/eclipse-score/score/issues/307>`_ - `REPLACEstandard_iso26262` & :need:`doc__platform_safety_plan` - valid - * - need:`PROCESS_wp__sw_platform_sbom` - - need:`PROCESS_wf__cr_mt_security_sbom` + * - :need:`PROCESS_wp__sw_platform_sbom` + - :need:`PROCESS_wf__cr_mt_security_sbom` - not started - <Link to issue> - <Link to WP> @@ -434,7 +435,7 @@ Security Management SW Platform Work Products Security Management Feature Specific Work Products ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -See feature tree documents (created by using need:`PROCESS_gd_temp__feature_security_wp`): +See feature tree documents (created by using :need:`PROCESS_gd_temp__feature_security_wp`): <link to document for every feature> diff --git a/docs/platform_management_plan/software_development.rst b/docs/platform_management_plan/software_development.rst index 0844381797..f28646e24a 100644 --- a/docs/platform_management_plan/software_development.rst +++ b/docs/platform_management_plan/software_development.rst @@ -20,6 +20,7 @@ Software Development :id: doc__software_development_plan :status: draft :safety: ASIL_B + :security: YES :realizes: PROCESS_wp__sw_development_plan :tags: platform_management @@ -48,13 +49,13 @@ Design and programming language For specifying **Detailed Design** (like for the Architecture) a mixture of UML diagrams and natural language is used. Additionally for the Detailed Design linking to code, Doxygen style comments are used. -This is described in :need:`PROCESS_doc_concept__imp__concept` and guided by :need:`PROCESS_gd_temp__detailed_design` +This is described in :need:`PROCESS_doc_concept__imp_concept` and guided by :need:`PROCESS_gd_temp__detailed_design` As required in :need:`stkh_req__dev_experience__prog_languages`, S-CORE allows the use of two programming languages: **C++ with the language set of C++17** - in case additional elements from C++20 are needed this will be considered by :need:`PROCESS_rl__safety_manager`, :need:`PROCESS_rl__security_manager` and :need:`PROCESS_rl__quality_manager` -and based on their analysis decided by the technical tead circle (:need:`PROCESS_rl__technical_lead`). +and based on their analysis decided by the technical lead circle (:need:`PROCESS_rl__technical_lead`). **Rust - in "Edition" <tbd>** - selection of language edition has still to be done in the S-CORE project. For the Rust code of ASIL rated units the "safe subset" shall be used (which is checked by the compiler by configuration of #![forbid(unsafe_code)] in lib.rs) @@ -64,7 +65,7 @@ C language is allowed in incubation phase, as long it is compilable be the selec Design guideline ^^^^^^^^^^^^^^^^ -The design guideline is defined in :need:`PROCESS_doc_concept__imp__concept` and :need:`PROCESS_gd_guidl__implementation`. +The design guideline is defined in :need:`PROCESS_doc_concept__imp_concept` and :need:`PROCESS_gd_guidl__implementation`. API guideline ^^^^^^^^^^^^^ @@ -78,7 +79,7 @@ Coding guideline **C++** - see :need:`doc__cpp_coding_guidelines` **Rust** - state of the art open source Rust guidelines are currently developed by `Safety Critical Rust Consortium <https://github.com/rustfoundation/safety-critical-rust-consortium/>`_ -(which will be adopted by the S-CORE project). A summary of the current state of informations regarding Rust in safety critical applications can be found in :need:`doc__rust_coding_guidelines`. +(which will be adopted by the S-CORE project). A summary of the current state of information regarding Rust in safety critical applications can be found in :need:`doc__rust_coding_guidelines`. SW configuration guideline ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -97,8 +98,8 @@ Additional tools for static and dynamic analysis (in addition to compilers and C .. rubric:: GitHub is used for hosting, versioning and contribution of the software. Within -pull requests it's possible to contribute. For contribution a seperate process description is -<Link to contribute> available. In the discussion section the informations regarding meeting +pull requests it's possible to contribute. For contribution a separate process description is +<Link to contribute> available. In the discussion section the information regarding meeting minutes and Working Sections were stored. Within issues can bugfixes, improvements, blank issues set up. It's also possible to report there Security vulnerabilities. GitHub Actions is used as a support for continuous integration. @@ -125,12 +126,12 @@ e.g. in process or concept descriptions .. rubric:: Host Compiler C++ -GCC is usesd as host C++ compiler with its associated linker. It's used as a development (compilation and linking) and verification tool +GCC is used as host C++ compiler with its associated linker. It's used as a development (compilation and linking) and verification tool as it generates compiler warnings and builds unit tests and binaries for SW integration testing. .. rubric:: Target Compiler C++ -QCC the qualifiable compiler/linker from Blackberry offered together with its Posix conform Operating System QNX is planned to be used for target compilation. +QCC the qualify-able compiler/linker from Blackberry offered together with its Posix conform Operating System QNX is planned to be used for target compilation. .. rubric:: Clang-tidy @@ -138,7 +139,7 @@ is used in conjunction with the Clang compiler to perform static analysis. .. rubric:: Host Compiler Rust -There is currently no selection of a Rust compiler for S-CORE. Pick your own favourite. +There is currently no selection of a Rust compiler for S-CORE. Pick your own favorite. .. rubric:: Target Compiler Rust diff --git a/docs/platform_management_plan/software_verification.rst b/docs/platform_management_plan/software_verification.rst index cf14f98782..1ad574e9da 100644 --- a/docs/platform_management_plan/software_verification.rst +++ b/docs/platform_management_plan/software_verification.rst @@ -16,8 +16,9 @@ :id: doc__verification_plan :status: draft :safety: ASIL_B + :security: YES :tags: platform_management - :realizes: PROCESS_wp__verification__plan + :realizes: PROCESS_wp__verification_plan Software verification ********************* @@ -71,7 +72,7 @@ Schedules --------- The integration of software elements is driven by change requests and their respective -:need:`PROCESS_doc_getstrt__change__process` model. The contribution of a feature itself implies that it gets fully +:need:`PROCESS_doc_getstrt__change_process` model. The contribution of a feature itself implies that it gets fully verified. Approach @@ -99,7 +100,7 @@ The following types of integrations are applicable: #. **New software elements** get integrated according to the :need:`doc__contr_guideline` #. **Fixes of defects** get integrated based on their prioritization described by the :doc:`problem_resolution`. -#. **Changes** get integrated based on the :need:`PROCESS_wf__change__cr_an_change_request` and will follow +#. **Changes** get integrated based on the :need:`PROCESS_wf__change_cr_an_change_request` and will follow the :need:`doc__pull_request_guideline` as any other artifact. Levels of integration and verification @@ -127,7 +128,7 @@ There are the following different levels of integration and verification defined **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. These tests serve as an optional base for the integrator and will also be part of the - :need:`PROCESS_wp__verification__platform_ver_report`, but more on an informative character. The full scope + :need:`PROCESS_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 platform test of stakeholder requirements for demonstration, but these are not intended to completely covering all stakeholder requirements. @@ -311,7 +312,7 @@ Further quality goals are defined in section :doc:`quality_management`. Coverage of detailed design ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Beside :need:`PROCESS_wp__verification__comp_int_test` and :need:`PROCESS_wp__verification__sw_unit_test` the +Beside :need:`PROCESS_wp__verification_comp_int_test` and :need:`PROCESS_wp__verification_sw_unit_test` the following aspects define the coverage of detailed design. - Statement/Branch/Path coverage as defined by their specific thresholds @@ -321,7 +322,7 @@ following aspects define the coverage of detailed design. Coverage of architectural design ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Beside :need:`PROCESS_wp__verification__comp_int_test` and :need:`PROCESS_wp__verification__feat_int_test` the +Beside :need:`PROCESS_wp__verification_comp_int_test` and :need:`PROCESS_wp__verification_feat_int_test` the following aspects define the coverage of the architectural design. - :need:`PROCESS_wp__sw_arch_verification` - done by walkthrough (QM) or inspection (safety-critical parts) @@ -342,7 +343,7 @@ Test development The verification steps as well as the development of test cases is done along with the implementation of code. A full automation of tests should be achieved and the derived test cases should contain meta -data that gives further information as defined in :need:`PROCESS_gd_req__verification__link_tests`. The list of +data that gives further information as defined in :need:`PROCESS_gd_req__verification_link_tests`. The list of relevant work products is shown above (as part of the development of the product). The different environments that can be used for the test development are defined below. @@ -352,7 +353,7 @@ Pre-existing test cases The recommendations according to the :need:`PROCESS_gd_guidl__verification_guide` for pre-existing test cases is followed. Any pre-existing test case (e.g. from OSS components) is reviewed and adopted -to follow the :need:`PROCESS_gd_guidl__verification_specification` and :need:`PROCESS_gd_req__verification__link_tests`. +to follow the :need:`PROCESS_gd_guidl__verification_specification` and :need:`PROCESS_gd_req__verification_link_tests`. Test execution and result analysis ---------------------------------- @@ -372,9 +373,9 @@ Work products and traceability The traceability between verification relevant work products is one of the defined objectives. An overall overview of the different work products and their relationship is given in project -context - see :need:`PROCESS_wp__verification__plan`. +context - see :need:`PROCESS_wp__verification_plan`. -The work products are related to verification can be found in :need:`PROCESS_wp__verification__plan`. +The work products are related to verification can be found in :need:`PROCESS_wp__verification_plan`. The link between a test specification and the respective requirement or design specification is given by the identifier of the reference annotated to the verification specification. @@ -393,7 +394,7 @@ document: fulfilled when contributing to the project. #. The :need:`PROCESS_rl__committer` needs to verify that the contributor has fulfilled the expected objectives. -In this way roles are followed as defined in :need:`PROCESS_doc_concept__verification__process`. +In this way roles are followed as defined in :need:`PROCESS_doc_concept__verification_process`. Independence of verification ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -404,9 +405,9 @@ people responsible for the test implementation and the actual code which gets te The following test level fall in the responsibility of the :need:`PROCESS_rl__testing_community`: -* :need:`PROCESS_wp__verification__comp_int_test` -* :need:`PROCESS_wp__verification__feat_int_test` -* :need:`PROCESS_wp__verification__platform_test` +* :need:`PROCESS_wp__verification_comp_int_test` +* :need:`PROCESS_wp__verification_feat_int_test` +* :need:`PROCESS_wp__verification_platform_test` Still a :need:`PROCESS_rl__contributor` of one function in a component doesn't prevent them from writing tests for other functions they do not own. @@ -414,11 +415,11 @@ Independence is achieved by the establishment of :need:`PROCESS_rl__testing_comm The following test level fall in the responsibility of the :need:`PROCESS_rl__contributor`: -* :need:`PROCESS_wp__verification__sw_unit_test` +* :need:`PROCESS_wp__verification_sw_unit_test` Unit tests can be the developed by the same :need:`PROCESS_rl__contributor` who also contributed the unit code. A level of independence is achieved as the review process demands to have a review by a :need:`PROCESS_rl__committer` -different to the author of a Pull Request. This is also described in process requirement :need:`PROCESS_gd_req__verification__independence`. +different to the author of a Pull Request. This is also described in process requirement :need:`PROCESS_gd_req__verification_independence`. Note that, each :need:`PROCESS_rl__contributor` of the project acts in a publicly visible space where also others see the contribution and have the possibility to perform additional reviews independent from diff --git a/docs/platform_management_plan/tool_management.rst b/docs/platform_management_plan/tool_management.rst index 90d51504f4..a82fb12973 100644 --- a/docs/platform_management_plan/tool_management.rst +++ b/docs/platform_management_plan/tool_management.rst @@ -16,6 +16,7 @@ :id: doc__platform_tool_management_plan :status: valid :safety: ASIL_B + :security: YES :tags: platform_management :realizes: PROCESS_wp__tlm_plan @@ -56,7 +57,7 @@ Approach Tool Management Attributes ^^^^^^^^^^^^^^^^^^^^^^^^^^ -:need:`PROCESS_gd_req__tool__attr_uid` are implemented as follows: +:need:`PROCESS_gd_req__tool_attr_uid` are implemented as follows: Identification @@ -69,10 +70,10 @@ The most important tools are stored in one GitHub repository, But in general Tool can be stored all over the place. -For each Tool the :need:`PROCESS_gd_temp__tool_management__verif_rpt_template` shall be used to document +For each Tool the :need:`PROCESS_gd_temp__tool_management_verif_rpt_template` shall be used to document the relevant information. -:need:`PROCESS_gd_chklst__tool__cr_review` shall be used to check that all relevant information is considered. +:need:`PROCESS_gd_chklst__tool_cr_review` shall be used to check that all relevant information is considered. The configuration of tools is part of the :need:`doc__config_mgt_plan`. @@ -83,7 +84,7 @@ Evaluation ^^^^^^^^^^ The tool confidence level (TCL) must be determined as outlined in the -:need:`PROCESS_doc_concept__tool__process`. +:need:`PROCESS_doc_concept__tool_process`. Step-by-Step guide: @@ -136,9 +137,9 @@ in the :need:`PROCESS_wp__platform_mgmt` shall be used. In detail: -* Use :need:`PROCESS_wf__req__comp_req` to create requirements for the software tool and :need:`PROCESS_wf__monitor_verify_requirements` for the verification +* Use :need:`PROCESS_wf__req_comp_req` to create requirements for the software tool and :need:`PROCESS_wf__monitor_verify_requirements` for the verification -* Use :need:`PROCESS_wf__verification__comp_int_test` to test the requirements for the software tool and :need:`PROCESS_wf__verification__mod_ver_report` to report +* Use :need:`PROCESS_wf__verification_comp_int_test` to test the requirements for the software tool and :need:`PROCESS_wf__verification_mod_ver_report` to report * If applicable, use for the Analyses: (to be added, after Safety/Security Analyses have been merged) From f2b0fdf13139b4e2ef568949346aa9a783d9da69 Mon Sep 17 00:00:00 2001 From: Leonardo Rossetti <lrossett@redhat.com> Date: Mon, 30 Jun 2025 07:42:30 -0300 Subject: [PATCH 077/109] autosd feature docs Signed-off-by: Leonardo Rossetti <lrossett@redhat.com> --- .../development/autosd/_assets/bluechi.png | Bin 0 -> 207987 bytes .../development/autosd/_assets/platform.png | Bin 0 -> 33941 bytes .../development/autosd/_assets/qm.png | Bin 0 -> 45004 bytes .../development/autosd/index.rst | 213 ++++++++++++++++++ .../operating-system/development/index.rst | 26 +++ docs/features/operating-system/index.rst | 25 ++ 6 files changed, 264 insertions(+) create mode 100644 docs/features/operating-system/development/autosd/_assets/bluechi.png create mode 100644 docs/features/operating-system/development/autosd/_assets/platform.png create mode 100644 docs/features/operating-system/development/autosd/_assets/qm.png create mode 100644 docs/features/operating-system/development/autosd/index.rst create mode 100644 docs/features/operating-system/development/index.rst create mode 100644 docs/features/operating-system/index.rst diff --git a/docs/features/operating-system/development/autosd/_assets/bluechi.png b/docs/features/operating-system/development/autosd/_assets/bluechi.png new file mode 100644 index 0000000000000000000000000000000000000000..ba2b4bab702ffc54feb9b76600af915aa0f0a8fa GIT binary patch literal 207987 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 literal 0 HcmV?d00001 diff --git a/docs/features/operating-system/development/autosd/_assets/platform.png b/docs/features/operating-system/development/autosd/_assets/platform.png new file mode 100644 index 0000000000000000000000000000000000000000..e94724f0f6bb21d3e8d9e2d75036565c5eb5e84e GIT binary patch literal 33941 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 literal 0 HcmV?d00001 diff --git a/docs/features/operating-system/development/autosd/_assets/qm.png b/docs/features/operating-system/development/autosd/_assets/qm.png new file mode 100644 index 0000000000000000000000000000000000000000..3f8e8203b740683cbb48f61e00a387233aee097e GIT binary patch literal 45004 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 literal 0 HcmV?d00001 diff --git a/docs/features/operating-system/development/autosd/index.rst b/docs/features/operating-system/development/autosd/index.rst new file mode 100644 index 0000000000..1067e924cb --- /dev/null +++ b/docs/features/operating-system/development/autosd/index.rst @@ -0,0 +1,213 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +AutoSD +###### + +Abstract +-------- +AutoSD is the upstream binary distribution that serves as the public, in-development preview and functional precursor +of the Red Hat In-Vehicle Operating System (OS). + +AutoSD is downstream of CentOS Stream, so it retains most of the CentOS Stream code with a few divergences, +such as an optimized automotive-specific kernel rather than CentOS Stream’s kernel package. +Red Hat In-Vehicle OS is based on both AutoSD and RHEL, both of which are downstreams of CentOS Stream. + + +.. image:: _assets/platform.png + :width: 600 + :alt: autosd upstream and downstream relationship + :align: center + +Motivation +---------- + +AutoSD allows the S-CORE stack to be built and tested in a very similar architecture that would be used by +the Red Hat In-Vehicle Operating System (OS). + +This section is split into sub-sections to highlight AutoSD's main features. + +Declarative Workloads +^^^^^^^^^^^^^^^^^^^^^^ + +AutoSD uses Quadlet, podman-systemd.unit, a tool that extends Systemd unit files to define linux container workloads +managed by podman and orchestrated by Systemd. + +System level files can be deployed at /etc/containers/systemd. + +Quadlet parse those files when the OS is booting or when a "systemd daemon-reload" is triggered, +generated files are located at "/run/systemd/generator/". + +An sample .container file usually looks like this: + +.. code-block:: + :caption: /etc/containers/systemd/mysleep.container + + [Unit] + Description=The sleep container + After=local-fs.target + + [System] + Restart=always + + [Container] + Image=registry.access.redhat.com/ubi9-minimal:latest + Exec=sleep 1000 + + [Install] + # Start by default on boot + WantedBy=multi-user.target default.target + + +Quadlet also supports the usage of Kubernetes YAML files, allowing the same workload definition to be used +by a kubernetes cluster and Podman: + +.. code-block:: + :caption: /etc/containers/systemd/mysleep.kube + + [Unit] + Description=The sleep container + After=local-fs.target + + [System] + Restart=always + + [kube] + yaml=sleep.yml + + [Install] + # Start by default on boot + WantedBy=multi-user.target default.target + + +.. code-block:: + :caption: /etc/containers/systemd/mysleep.yml + + apiVersion: v1 + kind: Pod + metadata: + name: sleep-pod + spec: + containers: + - name: sleep-container + image: registry.access.redhat.com/ubi9-minimal:latest + command: ["sleep", "1000"] + +Mixed Critical Orchestration +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +AutoSD ships a mixed critical orchestration stack with Systemd, Podman, Eclipse BlueChi and QM (containerized environment for QM workloads), which is tightly coupled to the operating system. + +Its QM environment is mounted from its own partition and run as a linux container using podman from its own sysroot path: + +.. image:: _assets/qm.png + :width: 600 + :alt: autosd upstream and downstream relationship + :align: center + +Eclipse BlueChi enables mixed critical orchestration between QM and non QM workloads with Systemd: + +.. image:: _assets/bluechi.png + :width: 600 + :alt: autosd upstream and downstream relationship + :align: center + +Eclipse BlueChi can also work with other orchestrators, be it on-board or off-board, by relying on "state managers", +which can interact with Eclipse BlueChi through its DBUS API to manage workload lifecycles. + +More details about Eclipse BlueChi and QM can be found at: + +* https://bluechi.readthedocs.io/en/latest/ +* https://qm.readthedocs.io/en/latest/ + +Supported Architectures and Platforms +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +AutoSD images are constantly built and tested against both x86_64 and aarch64 architectures through the Automotive SIG pipelines. It’s also built/tested against the following platforms: + +* Texas Instruments: + + * BeaglePlay (beagleplay) + * SK-AM62x Sitara (am62sk) + * SK-AM69 Jacinto (am69sk) + * TDA4 EVM (tda4vm_sk) + * J784S4 EVM (j784s4evm) + +* Renesas R-Car S4 +* NXP S32G-RDB3 +* Qualcomm Snapdragon Ride SX 4.0 +* Raspberry pi 4 + +The following "virtual platforms" are also supported: + +* QEMU +* AWS +* Azure + +Further details at https://sigs.centos.org/automotive/provisioning/. + +Testing Tools +^^^^^^^^^^^^^ + +AutoSD contains a collection of tools for Perf & Scale tests that can be used to test its S-CORE image: https://sigs.centos.org/automotive/performance_monitoring_with_pcp/#arcaflow-workflow. + +Rationale +--------- + +The proposal is to maintain a repository with manifest AutoSD files to build an image tailored for the S-CORE project, the repository is currently maintained within the CentOS Automotive SIG organization in Gitlab: https://gitlab.com/CentOS/automotive/autosd-image-score, but it could be moved to the S-CORE Github organization as well. + +To run Eclipse S-CORE modules and related components in AutoSD, these need to be packaged, in either linux containers images or RPMs. + +Packaging would happen at the module level, meaning that: + +* A container image for a given module would contain all its components; +* A RPM for a given module would ship all its components as sub-packages. + +The CentOS Automotive SIG can build and host either format. + +There is also the option to test the S-CORE task in some of AutoSD’s supported hardware, if there is interest (needs further discussion on what and how to test). + +Specification +------------- + +Possible impacted areas of the specification: + +* Operating System and related components +* Mixed Critical Orchestration +* IPC + +Backwards Compatibility +----------------------- + + .. note:: + Not needed since it’s a new development platform to be included. + +Security Impact +--------------- + + .. note:: + The platform can help on some security tests, + since it uses several SELinux policies (these can be provided if needed). + +Safety Impact +------------- + + .. note:: + No impact since it’s a development platform. + +License Impact +-------------- + + .. note:: + No impact, image manifest files can be licensed under Apache 2.0. diff --git a/docs/features/operating-system/development/index.rst b/docs/features/operating-system/development/index.rst new file mode 100644 index 0000000000..3f198ec97f --- /dev/null +++ b/docs/features/operating-system/development/index.rst @@ -0,0 +1,26 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + + +Development +########### + +Development platforms ensure the S-CORE stack is functionally working. + +.. toctree:: + :maxdepth: 1 + :glob: + :titlesonly: + + */index diff --git a/docs/features/operating-system/index.rst b/docs/features/operating-system/index.rst new file mode 100644 index 0000000000..fdbf8d2d43 --- /dev/null +++ b/docs/features/operating-system/index.rst @@ -0,0 +1,25 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +Operating System +################ + +Operating Systems can be used to build, run and/or test the Eclipse S-CORE stack. + +.. toctree:: + :maxdepth: 1 + :glob: + :titlesonly: + + */index From 99ceaba2c58b8eebce943a6a92fe0f61f9f4e1ff Mon Sep 17 00:00:00 2001 From: Aymen-Soussi-01 <aymen.soussi@expleogroup.com> Date: Wed, 27 Aug 2025 14:28:20 +0200 Subject: [PATCH 078/109] Update default and custom Bazel modules (#1641) --- .gitignore | 2 +- BUILD | 8 +++----- MODULE.bazel | 38 +++++++------------------------------- 3 files changed, 11 insertions(+), 37 deletions(-) diff --git a/.gitignore b/.gitignore index c95b6c59b7..723d2efd3c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ # Commonly used for local settings and secrets .env - +.venv_docs # Bazel bazel-* MODULE.bazel.lock diff --git a/BUILD b/BUILD index f3086ae564..9f9356eeb3 100644 --- a/BUILD +++ b/BUILD @@ -11,10 +11,8 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -load("@score_cli_helper//:cli_helper.bzl", "cli_helper") -load("@score_cr_checker//:cr_checker.bzl", "copyright_checker") load("@score_docs_as_code//:docs.bzl", "docs") -load("@score_starpls_lsp//:starpls.bzl", "setup_starpls") +load("@score_tooling//:defs.bzl", "cli_helper", "copyright_checker", "setup_starpls") test_suite( name = "format.check", @@ -43,8 +41,8 @@ copyright_checker( "//:BUILD", "//:MODULE.bazel", ], - config = "@score_cr_checker//resources:config", - template = "@score_cr_checker//resources:templates", + config = "@score_tooling//cr_checker/resources:config", + template = "@score_tooling//cr_checker/resources:templates", visibility = ["//visibility:public"], ) diff --git a/MODULE.bazel b/MODULE.bazel index 94ad62d2ed..4adb35efe3 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.4.0") +bazel_dep(name = "aspect_rules_py", version = "1.6.3") ############################################################################### # @@ -58,44 +58,20 @@ bazel_dep(name = "buildifier_prebuilt", version = "8.2.0.2") # Generic linting and formatting rules # ############################################################################### -bazel_dep(name = "aspect_rules_lint", version = "1.4.4") +bazel_dep(name = "aspect_rules_lint", version = "1.5.3") ############################################################################### # # Java version # ############################################################################### -bazel_dep(name = "rules_java", version = "8.13.0") +bazel_dep(name = "rules_java", version = "8.15.1") ############################################################################### # -# Misc. dependency +# Score custom modules loading # ############################################################################### - -bazel_dep(name = "score_python_basics", version = "0.3.4") - -############################################################################### -# -# Checker rule for CopyRight checks/fixes -# -############################################################################### -bazel_dep(name = "score_cr_checker", version = "0.3.1") - -############################################################################### -# -# CLI helper rule for CLI help -# -############################################################################### -bazel_dep(name = "score_cli_helper", version = "0.1.1") - -############################################################################### -# -# StarPLS LSP server -# -############################################################################### -bazel_dep(name = "score_starpls_lsp", version = "0.1.0") -# Checker rule for CopyRight checks/fixs - -bazel_dep(name = "score_docs_as_code", version = "1.0.2") -bazel_dep(name = "score_process", version = "1.1.1") +bazel_dep(name = "score_tooling", version = "1.0.1") +bazel_dep(name = "score_docs_as_code", version = "1.1.0") +bazel_dep(name = "score_process", version = "1.1.2") From a0b51ee9bf853443b11c0f68f7b5f2ecc377204f Mon Sep 17 00:00:00 2001 From: "markus.schu" <markus.schu@accenture.com> Date: Thu, 28 Aug 2025 10:32:44 +0200 Subject: [PATCH 079/109] Add issues to the FEO feature safety plan Set FEO feature plan to valid Add for the requirmed wps the planning issue Change-Id: I7bdb1f7b7d427a474ff8544e2a9ede16dd97a258 --- .../frameworks/feo/safety_planning/index.rst | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/features/frameworks/feo/safety_planning/index.rst b/docs/features/frameworks/feo/safety_planning/index.rst index 1b0b3972af..93c9c88c69 100644 --- a/docs/features/frameworks/feo/safety_planning/index.rst +++ b/docs/features/frameworks/feo/safety_planning/index.rst @@ -13,19 +13,19 @@ # ******************************************************************************* -FEO Safety Planning -=================== +FEO Feature Safety Planning +=========================== -.. document:: FEO Safety WPs +.. document:: FEO Safety Work Products :id: doc__feo_safety_wp - :status: draft + :status: valid :security: NO :safety: ASIL_B :realizes: PROCESS_wp__platform_safety_plan :tags: framework_feo -.. list-table:: FEO Work products +.. list-table:: FEO Feature Work Products :header-rows: 1 * - Work product Id @@ -38,70 +38,70 @@ FEO Safety Planning * - :need:`PROCESS_wp__feat_request` - :need:`PROCESS_gd_temp__change_feature_request` - :ndf:`copy('status', need_id='PROCESS_gd_temp__change_feature_request')` - - <link to issue> + - https://github.com/eclipse-score/score/issues/1646 - :need:`doc__frameworks_feo` - :ndf:`copy('status', need_id='doc__frameworks_feo')` * - :need:`PROCESS_wp__requirements_feat` - :need:`PROCESS_gd_temp__req_feat_req` - :ndf:`copy('status', need_id='PROCESS_gd_temp__req_feat_req')` - - <link to issue> + - https://github.com/eclipse-score/score/issues/1647 - :need:`doc__frameworks_feo_feat_reqs` - doc :ndf:`copy('status', need_id='doc__frameworks_feo_feat_reqs')` & WP below * - :need:`PROCESS_wp__requirements_feat_aou` - :need:`PROCESS_gd_temp__req_aou_req` - :ndf:`copy('status', need_id='PROCESS_gd_temp__req_aou_req')` - - <link to issue> + - https://github.com/eclipse-score/score/issues/1648 - :need:`doc__frameworks_feo_aou_reqs` - doc :ndf:`copy('status', need_id='doc__frameworks_feo_aou_reqs')` & WP below * - :need:`PROCESS_wp__feature_arch` - :need:`PROCESS_gd_temp__arch_feature` - :ndf:`copy('status', need_id='PROCESS_gd_temp__arch_feature')` - - <link to issue> + - https://github.com/eclipse-score/score/issues/1649 - :need:`doc__frameworks_feo_feat_arch` - doc :ndf:`copy('status', need_id='doc__frameworks_feo_feat_arch')` & WP below * - :need:`PROCESS_wp__feature_fmea` - :need:`PROCESS_gd_temp__feat_saf_fmea` - :ndf:`copy('status', need_id='PROCESS_gd_temp__feat_saf_fmea')` - - <link to issue> + - https://github.com/eclipse-score/score/issues/1650 - :need:`doc__frameworks_feo_dfa` - doc :ndf:`copy('status', need_id='doc__frameworks_feo_dfa')` & WP below * - :need:`PROCESS_wp__feature_dfa` - :need:`PROCESS_gd_temp__feat_saf_dfa` - :ndf:`copy('status', need_id='PROCESS_gd_temp__feat_saf_dfa')` - - <Link to issue> + - https://github.com/eclipse-score/score/issues/1651 - :need:`doc__frameworks_feo_fmea` - doc :ndf:`copy('status', need_id='doc__frameworks_feo_fmea')` & WP below * - :need:`PROCESS_wp__fdr_reports` (features's Safety Analyses & DFA) - :need:`PROCESS_gd_chklst__safety_analysis` - :ndf:`copy('status', need_id='PROCESS_gd_chklst__safety_analysis')` - - <Link to issue> + - 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:`PROCESS_wp__requirements_inspect` - :need:`PROCESS_gd_chklst__req_inspection` - :ndf:`copy('status', need_id='PROCESS_gd_chklst__req_inspection')` - - <Link to issue> + - 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:`PROCESS_wp__sw_arch_verification` - :need:`PROCESS_gd_chklst__arch_inspection_checklist` - :ndf:`copy('status', need_id='PROCESS_gd_chklst__arch_inspection_checklist')` - - <Link to issue> + - 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:`PROCESS_wp__verification_feat_int_test` - :need:`PROCESS_gd_guidl__verification_guide` - :ndf:`copy('status', need_id='PROCESS_gd_guidl__verification_guide')` - - <link to issue> + - https://github.com/eclipse-score/score/issues/1655 - <Link to WP> - <automated> From 859af32c6daa69a5d5b20bb4c4610772b9cca227 Mon Sep 17 00:00:00 2001 From: "markus.schu" <markus.schu@accenture.com> Date: Thu, 28 Aug 2025 14:06:19 +0200 Subject: [PATCH 080/109] add planning iusses to the FEO Module Safety Plan set the FEO Module Safety Plan to valid add planning issues to the required work products Change-Id: I19c3b7cca4c6d90676094bed36500a617a6c7d60 --- docs/modules/feo/docs/manual/index.rst | 4 +- .../modules/feo/docs/manual/safety_manual.rst | 2 +- .../modules/feo/docs/release/release_note.rst | 6 +- docs/modules/feo/docs/safety_mgt/index.rst | 4 +- .../safety_mgt/module_safety_package_fdr.rst | 6 +- .../docs/safety_mgt/module_safety_plan.rst | 65 +++++++++---------- .../safety_mgt/module_safety_plan_fdr.rst | 6 +- .../module_verification_report.rst | 6 +- 8 files changed, 49 insertions(+), 50 deletions(-) diff --git a/docs/modules/feo/docs/manual/index.rst b/docs/modules/feo/docs/manual/index.rst index 4fbc56395d..224cdc3631 100644 --- a/docs/modules/feo/docs/manual/index.rst +++ b/docs/modules/feo/docs/manual/index.rst @@ -12,8 +12,8 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -FEO Manuals -########### +FEO Module Manuals +################## .. toctree:: :titlesonly: diff --git a/docs/modules/feo/docs/manual/safety_manual.rst b/docs/modules/feo/docs/manual/safety_manual.rst index 8600177dab..5e9f8f6744 100644 --- a/docs/modules/feo/docs/manual/safety_manual.rst +++ b/docs/modules/feo/docs/manual/safety_manual.rst @@ -12,7 +12,7 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -.. document:: FEO Safety Manual +.. document:: FEO Module Safety Manual :id: doc__feo_safety_manual :status: draft :security: NO diff --git a/docs/modules/feo/docs/release/release_note.rst b/docs/modules/feo/docs/release/release_note.rst index c5756b0497..722e46b0af 100644 --- a/docs/modules/feo/docs/release/release_note.rst +++ b/docs/modules/feo/docs/release/release_note.rst @@ -12,7 +12,7 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -.. document:: FEO Release Note +.. document:: FEO Module Release Note :id: doc__feo_release_note :status: draft :security: NO @@ -21,8 +21,8 @@ :tags: module_feo -FEO Release Note -================ +FEO Module Release Note +======================= | Module Name: FEO diff --git a/docs/modules/feo/docs/safety_mgt/index.rst b/docs/modules/feo/docs/safety_mgt/index.rst index a25c4256a1..47489c8d96 100644 --- a/docs/modules/feo/docs/safety_mgt/index.rst +++ b/docs/modules/feo/docs/safety_mgt/index.rst @@ -12,8 +12,8 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -FEO Safety Management -##################### +FEO Module Safety Management +############################ .. toctree:: :titlesonly: diff --git a/docs/modules/feo/docs/safety_mgt/module_safety_package_fdr.rst b/docs/modules/feo/docs/safety_mgt/module_safety_package_fdr.rst index fec78d921c..1de64a4f3d 100644 --- a/docs/modules/feo/docs/safety_mgt/module_safety_package_fdr.rst +++ b/docs/modules/feo/docs/safety_mgt/module_safety_package_fdr.rst @@ -12,7 +12,7 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -.. document:: [Your Module Name] Safety Package Formal Review +.. document:: FEO Module Safety Package Formal Review :id: doc__module_name_safety_package_fdr :status: draft :security: NO @@ -20,8 +20,8 @@ :realizes: PROCESS_wp__fdr_reports :tags: module_feo -FEO Safety Package Formal Review Report -======================================= +FEO Module Safety Package Formal Review Report +============================================== **1. Purpose** 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 53e1f255b0..562a344fc3 100644 --- a/docs/modules/feo/docs/safety_mgt/module_safety_plan.rst +++ b/docs/modules/feo/docs/safety_mgt/module_safety_plan.rst @@ -12,9 +12,9 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -.. document:: FEO Safety Plan +.. document:: FEO Module Safety Plan :id: doc__feo_safety_plan - :status: draft + :status: valid :security: NO :safety: ASIL_B :realizes: PROCESS_wp__module_safety_plan @@ -50,16 +50,15 @@ 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): - - Software Component Qualification :need:`PROCESS_wp__sw_component_class` is not needed, as the code is developed from the scratch: :need:`PROCESS_std_wp__isopas8926__4511`, :need:`PROCESS_std_wp__iso26262__support_1251` + - No work products excluded - -Functional Safety Module Work products +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 -------------------------- +FEO Module Work Products List +----------------------------- .. list-table:: Module Work products :header-rows: 1 @@ -72,72 +71,72 @@ Module Work products List - WP status * - :need:`PROCESS_wp__module_safety_plan` - - :need:`PROCESS_gd_guidl__saf_plan_definitions` + - :need:`PROCESS_gd_guidl__saf_plan_definitions`, :need:`PROCESS_gd_temp__module_safety_plan` - :ndf:`copy('status', need_id='PROCESS_gd_guidl__saf_plan_definitions')` - - <Link to issue> + - https://github.com/eclipse-score/score/issues/1658 - this document - see above * - :need:`PROCESS_wp__module_safety_package` - :need:`PROCESS_gd_guidl__saf_package` - :ndf:`copy('status', need_id='PROCESS_gd_guidl__saf_package')` - - <Link to issue> + - https://github.com/eclipse-score/score/issues/1659 - this document (including the linked documentation) - - see above (and below) + - see above (and below), safety manual * - :need:`PROCESS_wp__fdr_reports` (module Safety Plan) - :need:`PROCESS_gd_chklst__safety_plan` - :ndf:`copy('status', need_id='PROCESS_gd_chklst__safety_plan')` - - <Link to issue> + - 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:`PROCESS_wp__fdr_reports` (module Safety Package) - :need:`PROCESS_gd_chklst__safety_package` - :ndf:`copy('status', need_id='PROCESS_gd_chklst__safety_package')` - - <Link to issue> + - https://github.com/eclipse-score/score/issues/1660 - :need:`doc__module_name_safety_package_fdr` - :ndf:`copy('status', need_id='doc__module_name_safety_package_fdr')` * - :need:`PROCESS_wp__fdr_reports` (module's Safety Analyses & DFA) - :need:`PROCESS_gd_chklst__safety_analysis` - :ndf:`copy('status', need_id='PROCESS_gd_chklst__safety_analysis')` - - <Link to issue> + - 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:`PROCESS_wp__audit_report` - performed by external experts - n/a - - <Link to issue> + - https://github.com/eclipse-score/score/issues/1661 - <Link to WP> - <WP status (manual)> * - :need:`PROCESS_wp__module_sw_build_config` - :need:`PROCESS_gd_temp__software_development_plan` - - `copy('status', need_id='PROCESS_gd_temp__software_development_plan')` - - <Link to issue> + - :ndf:`copy('status', need_id='PROCESS_gd_temp__software_development_plan')` + - https://github.com/eclipse-score/score/issues/1662 - <Link to WP> - <automated> * - :need:`PROCESS_wp__module_safety_manual` - :need:`PROCESS_gd_temp__safety_manual` - :ndf:`copy('status', need_id='PROCESS_gd_temp__safety_manual')` - - <Link to issue> + - https://github.com/eclipse-score/score/issues/1663 - :need:`doc__feo_safety_manual` - :ndf:`copy('status', need_id='doc__feo_safety_manual')` * - :need:`PROCESS_wp__verification_module_ver_report` - :need:`PROCESS_gd_temp__mod_ver_report` - :ndf:`copy('status', need_id='PROCESS_gd_temp__mod_ver_report')` - - <Link to issue> + - https://github.com/eclipse-score/score/issues/1665 - :need:`doc__feo_verification_report` - :ndf:`copy('status', need_id='doc__feo_verification_report')` * - :need:`PROCESS_wp__module_sw_release_note` - :need:`PROCESS_gd_temp__rel_mod_rel_note` - :ndf:`copy('status', need_id='PROCESS_gd_temp__rel_mod_rel_note')` - - <Link to issue> + - https://github.com/eclipse-score/score/issues/1666 - :need:`doc__feo_release_note` - :ndf:`copy('status', need_id='doc__feo_release_note')` @@ -157,89 +156,89 @@ FEO Component Work Products List * - :need:`PROCESS_wp__requirements_comp` - :need:`PROCESS_gd_temp__req_comp_req` - :ndf:`copy('status', need_id='PROCESS_gd_temp__req_comp_req')` - - <Link to issue> + - 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:`PROCESS_wp__requirements_comp_aou` - :need:`PROCESS_gd_temp__req_aou_req` - :ndf:`copy('status', need_id='PROCESS_gd_temp__req_aou_req')` - - <Link to issue> + - 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:`PROCESS_wp__requirements_inspect` - :need:`PROCESS_gd_chklst__req_inspection` - :ndf:`copy('status', need_id='PROCESS_gd_chklst__req_inspection')` - - <Link to issue> + - 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:`PROCESS_wp__component_arch` - :need:`PROCESS_gd_temp__arch_comp` - :ndf:`copy('status', need_id='PROCESS_gd_temp__arch_comp')` - - <Link to issue> + - 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:`PROCESS_wp__sw_arch_verification` - :need:`PROCESS_gd_chklst__arch_inspection_checklist` - :ndf:`copy('status', need_id='PROCESS_gd_chklst__arch_inspection_checklist')` - - <Link to issue> + - 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:`PROCESS_wp__sw_component_fmea` - :need:`PROCESS_gd_temp__comp_saf_fmea` - :ndf:`copy('status', need_id='PROCESS_gd_temp__comp_saf_fmea')` - - <Link to issue> + - 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:`PROCESS_wp__sw_component_dfa` - :need:`PROCESS_gd_temp__comp_saf_fmea` - :ndf:`copy('status', need_id='PROCESS_gd_temp__comp_saf_fmea')` - - <Link to issue> + - 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:`PROCESS_wp__sw_implementation` - :need:`PROCESS_gd_guidl__implementation` - :ndf:`copy('status', need_id='PROCESS_gd_guidl__implementation')` - - <Link to issue> + - https://github.com/eclipse-score/score/issues/1675 - <Link to WP> - <automated> * - :need:`PROCESS_wp__verification_sw_unit_test` - :need:`PROCESS_gd_guidl__verification_guide` - :ndf:`copy('status', need_id='PROCESS_gd_guidl__verification_guide')` - - <Link to issue> + - https://github.com/eclipse-score/score/issues/1676 - <Link to WP> - <automated> * - :need:`PROCESS_wp__sw_implementation_inspection` - :need:`PROCESS_gd_chklst__impl_inspection_checklist` - :ndf:`copy('status', need_id='PROCESS_gd_chklst__impl_inspection_checklist')` - - <Link to issue> + - 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:`PROCESS_wp__verification_comp_int_test` - :need:`PROCESS_gd_guidl__verification_guide` - :ndf:`copy('status', need_id='PROCESS_gd_guidl__verification_guide')` - - <Link to issue> + - https://github.com/eclipse-score/score/issues/1667 - <Link to WP> - <automated> * - :need:`PROCESS_wp__sw_component_class` - :need:`PROCESS_gd_guidl__component_classification` - :ndf:`copy('status', need_id='PROCESS_gd_guidl__component_classification')` - - not applicable, tailored out + - https://github.com/eclipse-score/score/issues/1679 - :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:`PROCESS_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. +In case an OSS element is used in the module, part 6 has to be filled out, depending on the component classification results. OSS (sub-)component qualification plan ====================================== diff --git a/docs/modules/feo/docs/safety_mgt/module_safety_plan_fdr.rst b/docs/modules/feo/docs/safety_mgt/module_safety_plan_fdr.rst index 36f6d4cab7..97a05d3510 100644 --- a/docs/modules/feo/docs/safety_mgt/module_safety_plan_fdr.rst +++ b/docs/modules/feo/docs/safety_mgt/module_safety_plan_fdr.rst @@ -12,7 +12,7 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -.. document:: FEO Safety Plan Formal Review +.. document:: FEO Module Safety Plan Formal Review :id: doc__feo_safety_plan_fdr :status: draft :security: NO @@ -20,8 +20,8 @@ :realizes: PROCESS_wp__fdr_reports :tags: module_feo -FEO Safety Plan Formal Review Report -==================================== +FEO Module Safety Plan Formal Review Report +=========================================== **1. Purpose** diff --git a/docs/modules/feo/docs/verification/module_verification_report.rst b/docs/modules/feo/docs/verification/module_verification_report.rst index 502aabd2ed..9147ffa6a2 100644 --- a/docs/modules/feo/docs/verification/module_verification_report.rst +++ b/docs/modules/feo/docs/verification/module_verification_report.rst @@ -12,7 +12,7 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -.. document:: FEO Verification Report +.. document:: FEO Module Verification Report :id: doc__feo_verification_report :status: draft :security: NO @@ -20,8 +20,8 @@ :realizes: PROCESS_wp__verification_module_ver_report :tags: module_template -FEO Verification Report -======================= +FEO Module Verification Report +============================== This verification report is based on the :need:`PROCESS_gd_temp__verification_plan`. It covers all the components of the above stated module. From 6a1fcc0f1fe5d47d39171f8229566d05f7a3e7b0 Mon Sep 17 00:00:00 2001 From: Aymen-Soussi-01 <aymen.soussi@expleogroup.com> Date: Thu, 28 Aug 2025 15:28:46 +0200 Subject: [PATCH 081/109] Downgrade aspect_rules_py version (#1683) --- MODULE.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MODULE.bazel b/MODULE.bazel index 4adb35efe3..840ea64dc1 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") +bazel_dep(name = "aspect_rules_py", version = "1.4.0") ############################################################################### # From e23dbd5c182a069e3c8fd70bca37a8e9dc719d27 Mon Sep 17 00:00:00 2001 From: Alexander Lanin <Alexander.Lanin@etas.com> Date: Fri, 29 Aug 2025 10:33:59 +0200 Subject: [PATCH 082/109] Setup area for infrastructure documentation (#1644) --- .github/CODEOWNERS | 24 +++++++----------------- docs/conf.py | 5 +---- docs/design_decisions/DR-001-infra.rst | 16 ++++++++++++++++ docs/design_decisions/index.rst | 26 ++++++++++++++++++++++++++ docs/index.rst | 1 + 5 files changed, 51 insertions(+), 21 deletions(-) create mode 100644 docs/design_decisions/DR-001-infra.rst create mode 100644 docs/design_decisions/index.rst diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index c9476b711c..021154ef61 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -3,15 +3,16 @@ # were modified. All directories should have a proper codeowner # Syntax: https://help.github.com/articles/about-codeowners/ -# Interim solution, commented out is future solution -# * @eclipse-score/infrastructure-maintainers +# Note: last match wins + +# By Default reviews go to the infrastructure community, to address missing lines in this document. * @AlexanderLanin @MaximilianSoerenPollak @dcalavrezo-qorix -# .* @eclipse-score/infrastructure-maintainers + +# All special files go to infrastructure as well .* @AlexanderLanin @MaximilianSoerenPollak @dcalavrezo-qorix -# .github/CODEOWNERS @eclipse-score/automotive-score-technical-leads + .github/CODEOWNERS @antonkri @FScholPer @qor-lb @johannes-esr @markert-r -# /docs/ @eclipse-score/community-process /docs/ @pahmann @PhilipPartsch @masc2023 @aschemmel-tech /docs/conf.py @AlexanderLanin @MaximilianSoerenPollak @dcalavrezo-qorix /docs/contribute/ @eclipse-score/automotive-score-committers @@ -25,6 +26,7 @@ safety_analysis/ @aschemmel-tech @PhilipPartsch @masc2023 # safety_planning/ @eclipse-score/automotive-score-technical-leads safety_planning/ @antonkri @FScholPer @qor-lb @johannes-esr @markert-r verification/ @eclipse-score/automotive-score-committers +/docs/design_decisions/*infra* @AlexanderLanin @MaximilianSoerenPollak @dcalavrezo-qorix /docs/glossary/ @eclipse-score/automotive-score-committers /docs/introduction/ @eclipse-score/automotive-score-committers /docs/manuals/ @eclipse-score/automotive-score-committers @@ -50,15 +52,3 @@ verification/ @eclipse-score/automotive-score-committers /platform_integration_tests/ @eclipse-score/automotive-score-committers # /tools/ @eclipse-score/infrastructure-maintainers /tools/ @AlexanderLanin @MaximilianSoerenPollak @dcalavrezo-qorix - -# in separate <module_name> repositories: -# -# * @eclipse-score/ft-<teamname> -# .* @eclipse-score/ft-<teamname> -# /docs @eclipse-score/community-process -# /docs/manual/safety_manual @eclipse-score/safety-managers -# /docs/release @eclipse-score/automotive-score-technical-leads -# /docs/safety_mgt @eclipse-score/safety-managers -# /docs/safety_mgt/module_safety_plan @eclipse-score/automotive-score-technical-leads -# /docs/verification_report @eclipse-score/automotive-score-technical-leads -# safety_analysis/ @eclipse-score/safety-managers diff --git a/docs/conf.py b/docs/conf.py index 923b5d867e..b428b2afde 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -16,9 +16,6 @@ # For the full list of built-in configuration values, see the documentation: # https://www.sphinx-doc.org/en/master/usage/configuration.html -from typing import Any - - # -- Project information ----------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information @@ -62,7 +59,7 @@ needs_template_folder = "_templates" html_static_path = ["_assets"] needs_global_options = {"collapse": True} -needs_string_links: dict[str, dict[str, Any]] = { +needs_string_links: dict[str, dict[str, object]] = { "source_code_linker": { "regex": r"(?P<value>[^,]+)", "link_url": "{{value}}", diff --git a/docs/design_decisions/DR-001-infra.rst b/docs/design_decisions/DR-001-infra.rst new file mode 100644 index 0000000000..77147983ed --- /dev/null +++ b/docs/design_decisions/DR-001-infra.rst @@ -0,0 +1,16 @@ +.. + # ******************************************************************************* + # 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-001-Infra: Placeholder +######################### diff --git a/docs/design_decisions/index.rst b/docs/design_decisions/index.rst new file mode 100644 index 0000000000..593cda3e44 --- /dev/null +++ b/docs/design_decisions/index.rst @@ -0,0 +1,26 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +Decision Records +================ + + +Infrastructure +~~~~~~~~~~~~~~ + +.. toctree:: + :maxdepth: 1 + :glob: + + DR-*-infra* diff --git a/docs/index.rst b/docs/index.rst index 2d0c18b49f..62019f78c3 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -138,3 +138,4 @@ Project structure and processes Tools <score_tools/index.rst> PMP <platform_management_plan/index.rst> Eclipse <https://projects.eclipse.org/projects/automotive.score> + design_decisions/index From ed8a79d1402e389bc2a5169a9c6b0e96adf218fb Mon Sep 17 00:00:00 2001 From: qor-lb <lars.bauhofer@qorix.ai> Date: Sun, 6 Jul 2025 20:49:30 +0200 Subject: [PATCH 083/109] docs: added abi compatible data types feature request MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Adrian Willenbücher <adrian.willenbuecher.ext@qorix.ai> --- .../abi_compatible_data_types/index.rst | 490 ++++++++++++++++++ .../requirements.rst | 278 ++++++++++ docs/features/communication/index.rst | 1 + docs/requirements/stakeholder/index.rst | 9 + 4 files changed, 778 insertions(+) create mode 100644 docs/features/communication/abi_compatible_data_types/index.rst create mode 100644 docs/features/communication/abi_compatible_data_types/requirements.rst diff --git a/docs/features/communication/abi_compatible_data_types/index.rst b/docs/features/communication/abi_compatible_data_types/index.rst new file mode 100644 index 0000000000..7289c032aa --- /dev/null +++ b/docs/features/communication/abi_compatible_data_types/index.rst @@ -0,0 +1,490 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +.. _abi_compatible_data_types_feature: + +ABI Compatible Data Types +######################### + +.. document:: ABI Compatible Datatypes + :id: doc__abi_compatible_data_types + :status: valid + :safety: ASIL_B + :tags: feature_request, change_management, communication, abi_compatible_data_types + + +.. toctree:: + :hidden: + + requirements.rst + + +Feature flag +============ + +To activate this feature, use the following feature flag: + +``experimental_abi_compatible_data_types`` + + +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. + +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. + + +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. + +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. + + +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. + +This evaluation initially targets the following process configurations: + +* Processes running on the same operating system. +* 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. +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: + +* **Primitive Types**: + + * Boolean + * Numeric (fixed-size integers 8-128 bits, signed and unsigned; IEEE 754 floating-point numbers) + +* **Sequence Types**: + + * Array (fixed-length) + +* **User-Defined Types**: + + * Struct + * Tuple + * Enum (tag-only) + * Variant ("tagged union"; *optional*) + +* **Fixed-Size, Variable-Length Containers**: + + * Vector + * Queue + * Hash map (*optional*) + * Hash set (*optional*) + * Binary tree (*optional*) + +* **Specialized Variants**: + + * Result + * Option + +All provided data types must ensure fixed size and consistent memory layouts. + +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. + +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. + + +.. Rationale +.. ========== + + +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. + +Assumptions +^^^^^^^^^^^ + +* Shared memory regions are mapped at correctly aligned virtual addresses in both processes. +* No serialization or runtime copying occurs when interpreting a type from memory. +* Processes use the same endianness. +* No synchronization or atomicity guarantees are defined at the data type level; these must be provided by the accessing code. +* All memory is allocated statically or pre-reserved. Dynamic memory allocation is disallowed. + +Type Conformance +^^^^^^^^^^^^^^^^ + +Types used in shared memory must meet the following criteria: + +1. **Fixed size and alignment**: Every type must have a known, constant size and alignment at compile time. +2. **Consistent layout across languages**: The layout of a type must be identical in Rust and C++, and on all platforms. +3. **No absolute pointers or references**: Types must not contain absolute pointers/function pointers/references or any pointers/references that point out of the transferred data. +4. **No language-specific metadata**: No vtables, slice headers, or implementation-specific type markers are allowed. + +Each type definition must clearly indicate whether it conforms to these rules natively or requires a custom definition to do so. + +Type Categories +^^^^^^^^^^^^^^^ + +Primitive Types +""""""""""""""" + +These types are ABI-compatible when declared using fixed-size standard types: + + +.. list-table:: Native Type Mapping + :header-rows: 1 + + * - Concept + - Rust + - C++17 + * - Boolean + - ``bool`` + - ``bool`` (1 byte, with ``0x00`` and ``0x01`` as the only valid bit patterns) + * - Integers (N = 8, 16, 32, 64) + - ``uN``, ``iN`` + - ``std::uintN_t``, ``std::intN_t`` + * - Floating point + - ``f32``, ``f64`` + - ``float``, ``double`` (compliant with IEEE 754) + +All types must avoid trap representations and undefined padding. + +Structs and Tuples +"""""""""""""""""" + +Structs and tuples are supported using standard layout rules: + +* **Rust**: Requires ``#[repr(C)]`` + (guarantees C-compatible memory layout; + `full specification <https://doc.rust-lang.org/reference/type-layout.html#the-c-representation>`__) +* **C++**: Requires ``standard_layout`` + (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 ordering must be preserved and padding must be identical across compilers. Any alignment greater than the default must be explicitly declared. + +Enums +""""" + +Only 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. + +Arrays +"""""" + +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. + +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> { + len: u32, + capacity: u32, + elements: [T; N], + } + +.. code-block:: cpp + + template<typename T, std::size_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. +* 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. +* The public API must match standard vector types in usability (e.g. ``push()``, ``pop()``). + +Option Types +"""""""""""" + +ABI-compatible optional types must be implemented manually using a one-byte tag followed by a payload. + +.. code-block:: rust + + #[repr(C)] + pub struct AbiOption<T> { + is_some: u8, + value: T, + } + +.. code-block:: cpp + + template<typename T> + struct AbiOption { + private: + std::uint8_t is_some; + T value; + }; + +* ``is_some == 0`` indicates absence; ``1`` indicates presence. +* The value field is always initialized and occupies memory regardless of state. +* The public API must match standard optional types in usability. + +Result Types +"""""""""""" + +Result types represent tagged unions with two possible states. + +.. code-block:: rust + + #[repr(C)] + pub struct AbiResult<T, E> { + is_ok: u8, + value: AbiResultUnion<T, E>, + } + + #[repr(C)] + union AbiResultUnion<T, E> { + ok: T, + err: E, + } + +.. code-block:: cpp + + template<typename T, typename E> + struct AbiResult { + private: + std::uint8_t is_ok; + union { + T ok; + E err; + } value; + }; + +* ``is_ok == 1`` indicates ``ok`` field is valid +* ``is_ok == 0`` indicates ``err`` field is valid +* The layout must guarantee correct union member interpretation based on the discriminant + +Language Conformance Summary +"""""""""""""""""""""""""""" + +.. list-table:: + :header-rows: 1 + + * - Feature + - Rust Native Support + - C++ Native Support + - Specification Status + * - Primitives + - ✅ Native types + - ✅ Native types + - Conforming + * - Structs + - ✅ ``#[repr(C)]`` + - ✅ ``standard_layout`` + - Conforming + * - Enums (fieldless) + - ✅ ``#[repr(C)]`` + - ✅ With fixed base + - Conforming + * - Arrays + - ✅ ``[T; N]`` + - ✅ ``T[N]`` + - Conforming + * - Vector + - ❌ ``Vec<T>`` + - ❌ ``std::vector<T>`` + - ✅ ``AbiVec<T, N>`` required + * - Option + - ❌ ``Option<T>`` + - ❌ ``std::optional<T>`` + - ✅ ``AbiOption<T>`` required + * - Result + - ❌ ``Result<T, E>`` + - ❌ ``std::expected<T, E>`` + - ✅ ``AbiResult<T, E>`` required + + + +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. + +Workflows +^^^^^^^^^ + +Two potential workflows are considered for creating type descriptions: + +**Description-first Workflow**: The type description is defined independently (e.g., via a schema or domain-specific language). The C++ and Rust type definitions are then generated based on this description as part of the application build process. + +**Definition-first Workflow**: Existing type definitions in Rust or C++ are the source of truth, and the corresponding type description is generated during the build process via compiler tooling. + +Both workflows are valid, and the final decision is deferred pending further feasibility analysis. + +Type Description Format +^^^^^^^^^^^^^^^^^^^^^^^ + +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. + +The choice of serialization format is left open but may include RON, JSON5, or a custom DSL, based on readability, tooling support, and maintainability. + + +.. Backwards Compatibility +.. ======================= + + +Security Impact +=============== + +.. note:: + + This section does not replace a formal security impact analysis. This only guides the design thoughts behind security related topics and is to be understood as a starting point for later workflows. + +The memory underlying an ABI compatible type may potentially be corrupted, e.g., because it originates from an untrusted process, or because of a bug in the producer. As a consequence, any pointers, indices, and offsets need to be validated before they're used to access memory, to ensure they don't address any out-of-bounds locations. In addition, care must be taken to avoid TOC/TOU (*time-of-check to time-of-use*) issues, where the producer might maliciously or inadvertently modify a value after the consumer has already validated it. + + +Safety Impact +============= + +.. note:: + + This section does not replace a formal safety impact analysis. This only guides the design thoughts behind safety related topics and is to be understood as a starting point for later workflows. + +All functionality shall be available to applications rated up to ASIL-B. + + +.. License Impact +.. ============== + + +.. How to Teach This +.. ================== + + +Rejected Ideas +============== + +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. +There are two primary approaches to achieve this goal: + +* *inline type descriptions*, which precede each instance of every type, and +* *external type descriptions*, which are stored separately from the data. + +Inline Type Descriptions +^^^^^^^^^^^^^^^^^^^^^^^^ + +An explicit transformation step between the in-memory representation and the SOME/IP+TLV format can – in theory – be avoided by adding TLVs to ABI compatible types. +This approach, however, comes with significant downsides: + +* Adding inline type descriptions incurs a significant memory overhead across the board, and leads to worse cache behavior. +* It mandates TLV for *all* instances of *all* ABI compatible types, even when TLV is not needed (for example, in a non-TLV SOME/IP gateway). + * This might be mitigated by making TLV optional through a generic respectively a template parameter on the type declaration. +* SOME/IP's specification of big-endianness is in conflict with the requirement of native-endianness for ABI compatible types, making the feasibility of this approach questionable. +* SOME/IP doesn't support "unused" slots in dynamic arrays, so ABI compatible types containing *vectors* (which differentiate between the length and the capacity) couldn't be directly represented in SOME/IP anyway. + +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. +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. +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. +Both the instructions and the interpreter would be specific for the target format. +For example, to translate in-memory ABI compatible types to SOME/IP data structures, the instructions could look like this: + +.. code-block:: rust + + enum Transformation { + /// Copies `length` bytes from input to output. + Copy { length: usize, } + + /// Copies 2 bytes from input to output, swapping endianness. + SwapEndian2, + + /// Copies 4 bytes from input to output, swapping endianness. + SwapEndian4, + + /// Copies 8 bytes from input to output, swapping endianness. + SwapEndian8, + + /// Reads an ABI compatible vector (with an element size of `stride` bytes) from the input, + /// writes the length as big-endian to the output, and writes the given number of elements + /// to the output. + CopyVectorWithLength { stride: usize }, + + ... + } + +Rationale for Rejection +^^^^^^^^^^^^^^^^^^^^^^^ + +Reflection will not be part of version 1.0 of this feature request. + +* Inline type descriptions are too intrusive and generate too much overhead: + + 1. Choosing one particular format, like SOME/IP TLV, would bias the entire system against other formats. + 2. To take full advantage of zero-copy IPC, ABI compatible types must be used during production and consumption of the transmitted data. Having to carry around inline type descriptions in those computations would have a non-negligible performance overhead. + 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. + For now, they're postponed until we have a better understanding of the relevant use cases. + + +.. Open Issues +.. =========== + +.. Glossary +.. ======== + +.. .. _footnotes: + +.. Footnotes +.. ========= diff --git a/docs/features/communication/abi_compatible_data_types/requirements.rst b/docs/features/communication/abi_compatible_data_types/requirements.rst new file mode 100644 index 0000000000..52fe94cf66 --- /dev/null +++ b/docs/features/communication/abi_compatible_data_types/requirements.rst @@ -0,0 +1,278 @@ +.. + # ******************************************************************************* + # 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 +############ + +ABI Compatibility +================= + +Restrictions on Native Types +---------------------------- + +.. feat_req:: Restrict boolean size + :id: feat_req__abi_compatible_data_types__bool_sz + :reqtype: Functional + :security: NO + :safety: QM + :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++). + +.. feat_req:: Fixed-width integers + :id: feat_req__abi_compatible_data_types__int_fix + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__abi_compatible + :status: valid + + For ABI compatibility, all integer types shall use fixed-width definitions (``uN``/``iN`` in Rust; ``std::uintN_t``/``std::intN_t`` in C++), for N ∈ {8, 16, 32, 64}. + +.. feat_req:: Limit floating-point sizes + :id: feat_req__abi_compatible_data_types__flt_sz + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__abi_compatible + :status: valid + + 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:: Fixed-size arrays + :id: feat_req__abi_compatible_data_types__arr_fix + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__abi_compatible + :status: valid + + For ABI compatibility, fixed-size arrays shall be declared as ``[T; N]`` in Rust and with a wrapper around ``T[N]`` to perform bounds-checking in C++, where T itself conforms to the ABI compatibility rules. + +.. feat_req:: Struct and tuple ABI layout + :id: feat_req__abi_compatible_data_types__st_tpl + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__abi_compatible + :status: valid + + For ABI compatibility, tuples and structs shall preserve field order, use ``#[repr(C)]`` in Rust, and be ``standard_layout`` in C++ (no inheritance or virtuals). + +.. feat_req:: Explicit enum representation + :id: feat_req__abi_compatible_data_types__enum_udr + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__abi_compatible + :status: valid + + For ABI compatibility, enums shall have an explicit, fixed underlying representation (e.g. ``#[repr(u8)]`` in Rust; ``enum class E : std::uint8_t`` in C++). + +.. feat_req:: Disallow pointers and metadata + :id: feat_req__abi_compatible_data_types__nop_mt + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__abi_compatible + :status: valid + + For ABI compatibility, types shall not contain absolute pointers, references, slices, function pointers, vtables, or any language-specific metadata. + +.. feat_req:: Compiler-agnostic ABI + :id: feat_req__abi_compatible_data_types__compabi + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__abi_compatible + :status: valid + + For ABI compatibility, all native types shall be ABI-compatible across compilers (e.g. GCC and Clang) using the same endianness. + +Custom Types +------------ + +Vector +^^^^^^ + +.. feat_req:: Provide AbiVec<T,N> + :id: feat_req__abi_compatible_data_types__prv_abv + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__abi_compatible + :status: valid + + An ABI-compatible ``AbiVec<T, N>`` type shall be provided in both C++ and Rust with the specified layout. + + .. code-block:: rust + + #[repr(C)] + pub struct AbiVec<T> { + len: u32, + capacity: u32, + elements: [T; N], + } + + .. code-block:: cpp + + template<typename T, std::size_t N> + struct AbiVec { + private: + std::uint32_t len; + std::uint32_t capacity; + T elements[N]; + }; + +.. feat_req:: AbiVec field semantics + :id: feat_req__abi_compatible_data_types__abv_fld + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__abi_compatible + :status: valid + + ``AbiVec.len`` shall report the current element count; ``AbiVec.capacity`` shall equal the compile-time size ``N``. + +.. feat_req:: AbiVec API + :id: feat_req__abi_compatible_data_types__abv_noa + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__abi_compatible + :status: valid + + 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 + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__abi_compatible + :status: valid + + Any attempt to exceed ``AbiVec.capacity`` shall result in a checked runtime error. + +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 + +.. An ABI-compatible ``AbiOption<T>`` type shall be provided in both C++ and Rust with the specified layout. + +.. .. code-block:: rust + +.. #[repr(C)] +.. pub struct AbiOption<T> { +.. is_some: u8, +.. value: T, +.. } + +.. .. code-block:: cpp + +.. template<typename T> +.. struct AbiOption { +.. private: +.. std::uint8_t 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 + +.. ``AbiOption.is_some`` shall be ``0`` when empty and ``1`` when containing a value. + +.. feat_req:: AbiOption API + :id: feat_req__abi_compatible_data_types__abo_api + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__abi_compatible + :status: valid + + The ``AbiOption`` API shall mirror ``std::optional``/``Option<T>`` without introducing extra fields or indirections. + +Result +^^^^^^ + +.. feat_req:: Provide AbiResult<T,E> + :id: feat_req__abi_compatible_data_types__prv_ari + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__abi_compatible + :status: valid + + An ABI-compatible ``AbiResult<T, E>`` type shall be provided in both C++ and Rust with the specified layout. + + .. code-block:: rust + + #[repr(C)] + pub struct AbiResult<T, E> { + is_ok: u8, + value: AbiResultUnion<T, E>, + } + + #[repr(C)] + union AbiResultUnion<T, E> { + ok: T, + err: E, + } + + .. code-block:: cpp + + template<typename T, typename E> + struct AbiResult { + private: + std::uint8_t is_ok; + union { + T ok; + E err; + } value; + }; + +.. feat_req:: AbiResult is_ok flag + :id: feat_req__abi_compatible_data_types__ari_flg + :reqtype: Functional + :security: NO + :safety: QM + :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. + +.. feat_req:: AbiResult API + :id: feat_req__abi_compatible_data_types__ari_api + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__communication__abi_compatible + :status: valid + + The ``AbiResult`` API shall mirror ``std::expected``/``Result<T, E>`` without hidden storage or pointers. diff --git a/docs/features/communication/index.rst b/docs/features/communication/index.rst index 5270d68d46..30669b5dd4 100644 --- a/docs/features/communication/index.rst +++ b/docs/features/communication/index.rst @@ -31,6 +31,7 @@ Communication docs/**/index ipc/index some_ip_gateway/index + abi_compatible_data_types/index Feature flag ============ diff --git a/docs/requirements/stakeholder/index.rst b/docs/requirements/stakeholder/index.rst index 5a820f9acd..4a22a6feac 100644 --- a/docs/requirements/stakeholder/index.rst +++ b/docs/requirements/stakeholder/index.rst @@ -451,6 +451,15 @@ Communication The platform shall support inter-process communication. +.. stkh_req:: ABI Compatible Data Types + :id: stkh_req__communication__abi_compatible + :reqtype: Functional + :security: NO + :safety: QM + :rationale: ABI compatiblity ensures that the same memory location is correctly interpreted by different programming languages. + :status: valid + + The platform shall support ABI compatible data types for zero-copy communication between Rust and C++ applications. .. stkh_req:: Intra-process Communication :id: stkh_req__communication__intra_process From 6ede3bec96c06ee0459563f1867f3a34720f6e5b Mon Sep 17 00:00:00 2001 From: qor-lb <lars.bauhofer@qorix.ai> Date: Fri, 16 May 2025 16:09:21 +0200 Subject: [PATCH 084/109] docs: initial commit time feature request (#910) added kick-off comments --- docs/features/time/index.rst | 164 +++++++++++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 docs/features/time/index.rst diff --git a/docs/features/time/index.rst b/docs/features/time/index.rst new file mode 100644 index 0000000000..fe24c893e7 --- /dev/null +++ b/docs/features/time/index.rst @@ -0,0 +1,164 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* + +.. _time_feature: + +Time +############# + +.. document:: Time + :id: doc__time + :status: valid + :safety: ASIL_B + :tags: change_management + + +.. toctree:: + :hidden: + + requirements.rst + + +Feature flag +============ + +To activate this feature, use the following feature flag: + +``experimental_time`` + + +Abstract +======== + + +Motivation +========== + +Efficient and accurate time management is critical in automotive systems, affecting functionality, safety, and reliability across various applications. Generally, time relevance can be categorized into the following levels: + +* External Time Synchronization +* In-Vehicle Time Synchronization +* Clocks, Accuracy, and Reading Current Time +* Consistent Logical Time Within Cause-Effect Cycles + + +External Time Synchronization +-------------------------------- + +External time synchronization aims to align the vehicle's internal time reference with a global or external standard. The primary objective is to synchronize with universal time standards such as UTC, which enables accurate timestamping of data across geographically distributed systems, crucial for telematics, fleet management, and regulatory compliance (e.g., event logging, diagnostics, cybersecurity). Additional use cases include ensuring consistent timing across vehicles in a fleet to facilitate coordinated operations or data analysis. Typical synchronization methods include GPS-based satellite synchronization, backend server synchronization over cellular networks. + + +In-Vehicle Time Synchronization +---------------------------------- + +In-vehicle synchronization ensures all Electronic Control Units (ECUs) within a vehicle operate based on a consistent internal time reference, crucial for real-time and safety-critical applications such as autonomous driving, audio/video streaming, and event logging. The synchronization architecture generally involves designating a single ECU as the *Time Grand Master*, typically the ECU with the fastest boot-up time (often a zonal controller hosting a microcontroller portion). Other ECUs synchronize their internal clocks to this master. + +Given the distributed nature of automotive E/E architectures, direct end-to-end synchronization across all ECUs is impractical due to latency and accumulated errors. Instead, synchronization typically occurs via peer-to-peer communication, with time gateways or zonal controllers acting as local masters within subnetworks to maintain accuracy. Network-specific synchronization protocols, such as gPTP for Ethernet, ensure robust, standardized synchronization. + +S-CORE must support industry-standard synchronization protocols like gPTP (IEEE 802.1AS) for Ethernet-based networks, including restrictions defined in AUTOSAR's Time Synchronization Protocol. For CAN-based networks, synchronization standards defined by AUTOSAR, such as the Time Synchronization over CAN, should be supported. + +todo: time syntonization vs synchronization +todo: add standards for other technologies + for 1.0 concentrate (ntp), gptp, can? + extend for time e.g. via someip + +todo: should we support only gPTP or also PTP? for >1.0 +todo: should we support NPT? for >1.0 + +for 1.0 we focus + +Clocks, Accuracy, and Reading Current Time +--------------------------------------------- + +Software stacks contain multiple clock sources: + +- Local Clocks: These include monotonic, system, steady, and high-resolution clocks, providing internal time references independent of external synchronization. +- Synchronized Clocks: These clocks are synchronized to external or internal standards and are critical for tasks requiring accurate timestamps or coordinated execution. +- Secure Clocks: Used specifically in cryptographic contexts to validate digital certificates or ensure secure transaction timestamps; these require protection against tampering and robust synchronization. + +Programming languages typically abstract these clocks (e.g., ``std::chrono`` in C++, ``std::time`` in Rust). Therefore, the integration of S-CORE with existing language-specific abstractions is essential for consistency and ease of use. + +TODO: differentiate between time base (e.g. identify source, synchronized clocks) and how the time is accessed (synchronized clock available via std::chrono) +TODO: S-CORE time/clocks should be explicitly targeted and not implicitly hidden in e.g. std::chrono. score::chrono e.g. could provide a thin wrapper for std::chrono but the user should explicitly choose a score supported time to avoid confusion with std::chrono. + +TODO: asking for a time stamp, should be as fast as possible. + +TODO: states of synchronized clocks, how to handle them? e.g. asking for current time when the clock is not synchronized. Error handling should be possible on per app use-case. +TODO: should we expose the information on time difference since the last synchronization? dedicated api required. + +TODO: alignment with Crypto feature request on secure clocks + +note: the daemon that is responsible for the nw time synrchonization should also synchronize the local hw clock. + +TODO: use existing time synchronization form OS or develop own? Use OS provided might me used for development but finally we need a qualified time synchronization for production. + + +Consistent Logical Time Within Cause-Effect Cycles +----------------------------------------------------- + +In automotive applications, cause-effect chains or distributed algorithms frequently collaborate within defined execution cycles. Within these cycles, it is crucial that all involved algorithms reference the **same logical time** despite potential differences in actual execution start times. Maintaining consistent logical timing within cycles ensures accurate data integration and computational coherence. This consistency is particularly vital in applications such as sensor fusion, control systems, and coordinated vehicle dynamics, where discrepancies in perceived time could lead to inaccuracies in integrated values (e.g., vehicle speed, acceleration, or positional calculations). + +The capability to record and replay logical time is also crucial for providing a sufficient simulation environment for algorithms. This feature enables developers to test and validate algorithms under controlled and repeatable conditions, ensuring their robustness and reliability before deployment. By simulating consistent logical time, it becomes possible to analyze the behavior of distributed systems, identify potential issues, and optimize performance in scenarios that closely mimic real-world operations. + +todo: add reasoning why "the same logical time" is crucial in a cause-effect/task chain (e.g., integrating speed to ...) + +note: potentially exposing the current time stamp by the executor and make it available via IPC to the activities. within activities this could be abstraced by a time api but therefore the time is recordable and replayable. + +Differentiation between where logical time is required. + + + + + +.. Rationale +.. ========== + + +Specification +============= + + +.. Backwards Compatibility +.. ======================= + + +Security Impact +=============== + + +Safety Impact +============= + + +.. License Impact +.. ============== + + +How to Teach This +================== + +.. Rejected Ideas +.. ============== + +.. Open Issues +.. =========== + +Glossary +======== + + +.. _footnotes: + +Footnotes +========= From a8a398bafebce910814fee4c4e3b0ac227ed230e Mon Sep 17 00:00:00 2001 From: Valery Lavrov <valery.lavrov@bmw.de> Date: Fri, 4 Jul 2025 08:28:02 +0200 Subject: [PATCH 085/109] docs: Add SW Requirements specification (#1323) --- docs/features/time/data_flow.puml | 98 +++++++++++++++++++++++++++++++ docs/features/time/index.rst | 69 ++++++++++++++++++++++ 2 files changed, 167 insertions(+) create mode 100644 docs/features/time/data_flow.puml diff --git a/docs/features/time/data_flow.puml b/docs/features/time/data_flow.puml new file mode 100644 index 0000000000..11477fb825 --- /dev/null +++ b/docs/features/time/data_flow.puml @@ -0,0 +1,98 @@ +@startuml + +hide footbox + +autonumber "<font color=red><b>[00]" + +title PTP data flow + +legend top left +| <#LightCoral> | external ECU/Switch | +| <#LightBlue> | gptp stack | +| <#LightGrey> | hw on ECU | +| <#LightGreen> | mw stack | +| <#LightSalmon> | applications | +endlegend + +!pragma teoz true +box "ECU" #f0f5f5 + box "ClientApp" #e6ffe6 + participant "Business logic" as app #LightSalmon + participant "score::time" as mw #LightGreen + end box + participant "Shared resource (ipc)" as sh #LightGreen + box "Time base provider" #LightSteelBlue + participant "Business logic" as timed_bs #LightBlue + participant "libgptp" as libgptp #LightBlue + end box + participant "OS" as os #LightBlue + participant "Time Slave" as gptp #LightBlue + participant "EMAC(eth)" as emac #LightGrey +end box +participant "TimeMaster" as ptp #LightCoral + +==Setup and Initialization== +timed_bs -> sh : create() +app -> mw: init() +note right + Create and initialize + score::time +end note +mw -> sh: init() +mw --> app : timebase ptr* + +==PTP synchronization== +loop every 125ms + ptp <--> gptp : Performing ptp\ncommunication + gptp -> gptp : Calculation GM time\nas per ptp protocol + gptp -> emac : Set synchronized time\nbased on ptp +end loop + +==Main Loop / Runtime== +loop every 50ms + timed_bs -> libgptp : Read current synchronized ptp time + libgptp -> gptp : Use `devctl` to obtain\ncurrent time + note left + switch to kernel space and involve resource manager + end note + gptp -> emac : Read time from\nEMAC register + gptp -> os : get current system (local) time + os --> gptp : Read local clock(TL0) + emac --> gptp: Synchronized ptp time 'Tptp0' + gptp --> libgptp : Current synchronized ptp time 'Tptp0' and 'TL0' + note left + switch to user space + end note + libgptp --> timed_bs : Current synchronized ptp time 'Tptp0' and 'TL0' + timed_bs -> os : get current system (local) time + os --> timed_bs : current time (TL1) + timed_bs -> timed_bs : Validate ptp time and set status flags + note left + Validation of ptp time using local clock ('TL2'): + 1. Inaccuracy detection + 2. loosing data frames detection + 3. verification for monotonicity + end note + timed_bs -> sh : Write data + note left + Store to shared resource received data + 1. last ptp time 'Tptp0' + 2. local clock 'TL0', when ptp was read and + 3. status flags + end note + +end loop + +==Client use-case== +app -> mw : Call ::Now() to read time status +mw -> sh : Read data +sh --> mw +mw -> os : get current system (local) time +os --> mw : Current time (TL2) +mw -> mw : Adjust ptp time, with local clock +note right + current_ptp_time = Tptp0 + (Tl2 - TL0) +end note +mw --> app : Adjusted ptp time and it's status + +@enduml diff --git a/docs/features/time/index.rst b/docs/features/time/index.rst index fe24c893e7..b349727c5b 100644 --- a/docs/features/time/index.rst +++ b/docs/features/time/index.rst @@ -128,6 +128,75 @@ Differentiation between where logical time is required. Specification ============= +In-Vehicle Time Synchronization +------------------------------- + +Definitions: + +**Time Slave** +An actor that runs on the system and is responsible for + +* synchronizing the local clock with an external Time Master using the PTP protocol (IEEE 802.1AS). +* providing the synchronization meta information to the clients, including score::time feature. Where meta information includes, but not limited to synchronization status (synchronized, not synchronized, unstable), time difference to the external time source, last synchronization time, current time point of the local clock and so on. + +**Synchronization process metadata** +Data which is provided by the **Time Slave** and includes the current synchronized time, synchronization status, rate correction, and so on, which are the output or intermediate artifacts of the synchronization process. + +Requirements: + +* REQ_0001: the **Time Slave**, as part of score::time feature, shall synchronize the local clock with an external **Time Master** using the PTP protocol (IEEE 802.1AS). +* REQ_0002: the score::time shall get the current synchronized time and its metadata from the **Time Slave**. +* REQ_0003: the score::time shall maintain the current synchronized time, its synchronization status and **Synchronization process metadata**, to be able to provide the latest values by clients request. +* REQ_0004: the score::time shall validate the current synchronized time, which was received from the **Time Slave** and reflect the validation results in the time point status accordingly. + Validation of the current synchronized time includes: + + * checking the time point for loss of synchronization + * checking the time point for monotonicity + * checking the time point for instability, like time jumps to the past or to the future + +* REQ_0005: the score::time feature shall provide a mechanism to access (read only) to the synchronized time and its status across multiple applications within one ECU. +* REQ_0006: the score::time feature shall provide an access to the synchronized time and its status, see REQ_0005, in an efficient way without any additional overhead, like kernel calls, Resource manager involvement and so on. + *Use case:* frequent access to the current synchronized time and its metadata by multiple clients within one ECU. +* REQ_0007: the score::time feature shall provide a mechanism to access (read only) to the internal state of the synchronization process, see **Synchronization process metadata**, across multiple applications within one ECU. +* REQ_0008: the score::time shall provide a mechanism to log the internal state of the synchronization process, see **Synchronization process metadata**, to be able to debug and diagnose the time synchronization process. + *Use case:* Debugging and diagnostics of the time synchronization process. + +The diagram above illustrates the data flow and interactions between the Time Slave, score::time middleware, and client applications within an ECU during PTP-based time synchronization. + +.. uml:: data_flow.puml + :caption: Data flow between Time Slave, score::time, and clients + +Where + +* The **Time Slave** (gPTP stack) communicates with an external Time Master to maintain accurate time synchronization using the PTP protocol. +* The **Time base provider** periodically reads the synchronized time from the Time Slave, validates it, and writes the results (including status flags and timestamps) into some shared resource towards **score::time** middleware. Different IPC mechanisms can be used for to provide actual synchronized time and its metadata to **Time base provider**, like: + + * shared memory, then the **Time Slave** writes the synchronized time and its metadata into the shared memory, which is then read by the **Time base provider** middleware. + * **Time base provider** polls for current EMAC value with ``devctl`` calls. + * other IPC methods. + +* The **score::time** middleware accesses this shared resource to obtain the latest synchronized time and its metadata, adjusting the time as needed based on the local clock by requests from client applications. +* This architecture ensures efficient, low-overhead distribution of synchronized time and its status to multiple applications within the ECU, supporting both real-time and diagnostic use cases. + +External Time Synchronization +----------------------------- + +* REQ_0010: the score::time feature shall support synchronization with external time sources, such as GPS, based on SOME/IP messages. +* REQ_0011: the score::time shall maintain the current synchronized time and its synchronization status, to be able to provide the latest values by clients request. +* REQ_0012: the score::time feature shall provide a mechanism to access (read only) the current synchronized time from external time sources and its synchronization status. +* REQ_0013: the score::time feature shall provide a mechanism to log the internal state of the external time synchronization process, to be able to debug and diagnose the synchronization process. + +High precision Clock +-------------------- + +* REQ_0014: the score::time feature shall provide a mechanism to access (read only) the high precision clock in nanoseconds precision. + *Use case:* such clocks might be used for time-critical applications, such as audio/video streaming, event logging, and diagnostics. + +Monotonic Clock +--------------- + +* REQ_0015: the score::time feature shall provide a mechanism to access (read only) to monotonic, not adjustable clock value, which is mapped from the known OS or HW clock. + .. Backwards Compatibility .. ======================= From 06d9816ef3e7b47c36938c2f80392fdc5e6b0dfd Mon Sep 17 00:00:00 2001 From: qor-lb <lars.bauhofer@qorix.ai> Date: Thu, 26 Jun 2025 15:21:37 +0200 Subject: [PATCH 086/109] updated motivation Time: Added Clock, TimePoint and TimeSpan description Updated relations between Clocks and their TimePoints. Added the relation between TimePoints and TimeSpans, also the allowed algorithmic operations. Added terminology for frequency, resolution, monotony and steadiness. Added epoch as term. Signed-off-by: Nico Hartmann <14351007+HartmannNico@users.noreply.github.com> moved ws notes to specification --- .../time/_assets/timesync-chain.drawio.svg | 249 +++++++++++++++++ .../time/_assets/timesync-external.drawio.svg | 50 ++++ .../time/_assets/timesync-vehicle.drawio.svg | 255 ++++++++++++++++++ docs/features/time/index.rst | 112 ++++---- 4 files changed, 615 insertions(+), 51 deletions(-) create mode 100644 docs/features/time/_assets/timesync-chain.drawio.svg create mode 100644 docs/features/time/_assets/timesync-external.drawio.svg create mode 100644 docs/features/time/_assets/timesync-vehicle.drawio.svg diff --git a/docs/features/time/_assets/timesync-chain.drawio.svg b/docs/features/time/_assets/timesync-chain.drawio.svg new file mode 100644 index 0000000000..ce58d802a1 --- /dev/null +++ b/docs/features/time/_assets/timesync-chain.drawio.svg @@ -0,0 +1,249 @@ +<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="390px" height="279px" viewBox="-0.5 -0.5 390 279" content="<mxfile pages="4" scale="1" border="0"><diagram id="2to_vZI1dxF-9BGdvlWu" name="chain">7Zpdb5swFIZ/TaTtohHYQMLlmmWdtLZalW3drirHGPBiMDPO1379TDAN1LTr1KbQrrkJvD4E/Jz3GNvKAE6SzYlAWXzGA8IGwAo2A/h+AIAN7bH6KpRtqRy5vlsqkaCBjtoLM/qbaNHS6pIGJG8ESs6ZpFlTxDxNCZYNDQnB182wkLPmXTMUEUOYYcRM9ZIGMi7VsWvt9Y+ERnF1Z9vSLQmqgrWQxyjg65oEpwM4EZzL8ijZTAgr6FVcyus+3NJ6/WCCpPI+F3y6uph8dy9+83Nxck6+Tefy19cjUP7KCrGl7vAELXOiJBKGBU9FNkY0Vd9v8BYz8lZ3Rm4rQoIv04AUN7EG8HgdU0lmGcJF61qZQmmxTJg6s9XhighJFd13jEap0iQvAsyu6N4V4WRTk3TXTghPiBRbFaJbgesPR9pa2mu2X+Vivc8crMXFtcQBT8cibZjo+hZ7pupAY/0HxPaLQey4LYj9p0V86f9I46uz/AotZmk4tUfIm74gxNC+wbcaQDvlC/6CiwsZ84iniJ3yAsUO0k8i5VYP6GgpeRPhrbByvhSY3PEwjn4LIBEReUecV8aRoDHAm+gFYUjSVXO8f3SE8Dki9HuF0DGq/AvKFw+r5MeoWa9lWPTNsq2qs16yB6tYt0928+5pt2rO1xO/ef30Gxy1+M3p2G+jPvnNf55+Gz9LhnavGPrPpmaB5XZcs5X9+wbL8VuWcl2/UG1zjdFXWMDqHJa5rWCAyhdE4lhzqjFBeVbu44R0U3A8zqXgCzLhjAulpjwlhVhtphRXh5Sxqn0AoLX73LpMY2hO2GeeU0l5oWIFn4ha+OmNgDmXkiflTbPi6ZNNVOx2DSOcgeFuk+lqt6p8hHQCF5rpHNlDz9p/HCO5wDGTC8BwfKj0QiO9G3Wa5EaSVa/ljfTqXBjUqyQlNAiKy1trp1ldj8HbnLwDy7tf+cCDlY+50rm7fDJOC5rTlQKRa9CNCglQHl9jq2WjWVuqdsZgDj3PrKnAJePAeVD1tFcjX0pGU/UI1fat1WaSm5XHw5BiMsQ8xSST+RAzjhcH2+UCdsv0GrQ4AhzMEW5njgi8uee2OCIMQ4Dxf+EINf4aY4QDDUfYLY6wD+YIc3X66oincgQcWy0zVPO9/LSOGL06ok+OUJnueowYvzqiM0e4VsvMsvO3hrk/8uqIJ3OE3TJGHM4R6nT/54JdW+0/GnD6Bw==</diagram></mxfile>"> + <defs/> + <g> + <g> + <rect x="28.75" y="0" width="359.75" height="260" 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: 358px; height: 1px; padding-top: 7px; margin-left: 30px;"> + <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; "> + Cause effect chain (cycle) + </div> + </div> + </div> + </foreignObject> + <text x="209" y="19" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Cause effect chain (cycle) + </text> + </switch> + </g> + </g> + <g> + <rect x="14.75" y="9" width="359.75" height="260" 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: 358px; height: 1px; padding-top: 16px; margin-left: 16px;"> + <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; "> + Cause effect chain (cycle) + </div> + </div> + </div> + </foreignObject> + <text x="195" y="28" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Cause effect chain (cycle) + </text> + </switch> + </g> + </g> + <g> + <rect x="0" y="18" width="359.75" height="260" 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: 358px; height: 1px; padding-top: 25px; 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; "> + Cause effect chain (cycle) + </div> + </div> + </div> + </foreignObject> + <text x="180" y="37" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Cause effect chain (cycle) + </text> + </switch> + </g> + </g> + <g> + <path d="M 94.75 114.36 L 138.95 94.27" 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 143.73 92.1 L 138.81 98.18 L 138.95 94.27 L 135.91 91.81 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 94.75 144.36 L 139.16 168.59" 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 143.77 171.1 L 135.95 170.82 L 139.16 168.59 L 139.3 164.68 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="34.75" y="98" width="60" 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: 58px; height: 1px; padding-top: 128px; margin-left: 36px;"> + <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; "> + Task + </div> + </div> + </div> + </foreignObject> + <text x="65" y="132" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Task + </text> + </switch> + </g> + </g> + <g> + <path d="M 204.75 90.1 L 262.84 113.52" 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 267.71 115.49 L 259.91 116.11 L 262.84 113.52 L 262.53 109.62 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="144.75" y="48" width="60" 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: 58px; height: 1px; padding-top: 78px; margin-left: 146px;"> + <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; "> + Task + </div> + </div> + </div> + </foreignObject> + <text x="175" y="82" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Task + </text> + </switch> + </g> + </g> + <g> + <path d="M 204.75 173.48 L 263.02 145.29" 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 267.74 143 L 262.97 149.2 L 263.02 145.29 L 259.92 142.9 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 204.75 197.68 L 262.69 216.37" 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 267.69 217.98 L 259.95 219.16 L 262.69 216.37 L 262.1 212.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="144.75" y="158" width="60" 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: 58px; height: 1px; padding-top: 188px; margin-left: 146px;"> + <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; "> + Task + </div> + </div> + </div> + </foreignObject> + <text x="175" y="192" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Task + </text> + </switch> + </g> + </g> + <g> + <rect x="268.75" y="98" width="60" 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: 58px; height: 1px; padding-top: 128px; margin-left: 270px;"> + <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; "> + Task + </div> + </div> + </div> + </foreignObject> + <text x="299" y="132" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Task + </text> + </switch> + </g> + </g> + <g> + <rect x="268.75" y="198" width="60" 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: 58px; height: 1px; padding-top: 228px; margin-left: 270px;"> + <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; "> + Task + </div> + </div> + </div> + </foreignObject> + <text x="299" y="232" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Task + </text> + </switch> + </g> + </g> + <g> + <path d="M 38.8 180.43 L 40.04 178.61 C 38.47 177.2 36.89 175.67 35.37 174.87 C 33.58 173.81 31.4 173.24 29.66 174.29 C 31.35 172.23 34.2 171.6 37.19 172.42 C 39.15 172.94 41.01 173.95 42.49 174.95 L 43.7 173.1 L 46.75 180.45 Z M 30.35 191.56 C 28.67 191.24 26.16 189.7 25.2 186.1 C 24.74 184.35 24.63 182.11 24.91 179.88 L 22.75 179.68 L 27.8 173.56 L 31.48 180.59 L 29.28 180.33 C 28.79 182.36 28.18 184.39 28.15 186.21 C 28.04 189.12 28.91 190.51 30.35 191.56 Z M 31.27 192.81 L 35.74 186.2 L 36.57 188.27 C 38.97 187.76 42.02 186.99 43.78 185.63 C 45.21 184.59 45.87 183.39 45.96 182.1 C 46.71 184.45 45.53 187.11 44.2 188.49 C 42.69 190.15 40.47 191.44 38.24 192.38 L 39.08 194.4 Z" fill="#000000" stroke="none" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(237, 237, 237));"/> + </g> + <g> + <rect x="34.75" y="168" 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: 183px; margin-left: 36px;"> + <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; "> + x ms + </div> + </div> + </div> + </foreignObject> + <text x="65" y="187" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + x ms + </text> + </switch> + </g> + </g> + <g> + <rect x="14.75" y="248" width="20" height="20" fill="none" stroke="none" pointer-events="all"/> + <path d="M 29.27 261.47 C 29.46 261.64 29.49 261.94 29.3 262.17 C 29.14 262.33 28.87 262.41 28.64 262.25 L 24.28 258.89 C 24.18 258.79 24.09 258.69 24.09 258.48 L 24.09 251.16 C 24.09 250.86 24.36 250.67 24.6 250.67 C 24.91 250.67 25.09 250.96 25.09 251.16 L 25.09 258.27 Z M 24.8 266.35 C 29.73 266.35 33.08 262.19 33.08 258.01 C 33.08 252.93 28.9 249.67 24.77 249.67 C 19.3 249.67 16.42 254.41 16.42 257.78 C 16.42 263.46 20.94 266.35 24.8 266.35 Z M 24.7 268 C 19.77 268 14.87 264.23 14.75 257.88 C 14.75 253.02 18.84 248 24.71 248 C 29.87 248 34.75 252 34.75 258.06 C 34.75 263.43 30.41 268 24.7 268 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" 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> + <rect x="40.75" y="143" width="10" height="10" fill="none" stroke="none" pointer-events="all"/> + <path d="M 48.01 149.74 C 48.11 149.82 48.12 149.97 48.02 150.08 C 47.95 150.16 47.81 150.2 47.7 150.13 L 45.51 148.45 C 45.46 148.4 45.42 148.35 45.42 148.24 L 45.42 144.58 C 45.42 144.43 45.56 144.33 45.67 144.33 C 45.83 144.33 45.92 144.48 45.92 144.58 L 45.92 148.13 Z M 45.78 152.17 C 48.24 152.17 49.92 150.1 49.92 148.01 C 49.92 145.46 47.83 143.83 45.76 143.83 C 43.02 143.83 41.59 146.2 41.59 147.89 C 41.59 150.73 43.85 152.17 45.78 152.17 Z M 45.72 153 C 43.26 153 40.81 151.12 40.75 147.94 C 40.75 145.51 42.8 143 45.73 143 C 48.31 143 50.75 145 50.75 148.03 C 50.75 150.71 48.58 153 45.72 153 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));"/> + </g> + <g> + <rect x="149.75" y="94" width="10" height="10" fill="none" stroke="none" pointer-events="all"/> + <path d="M 157.01 100.74 C 157.11 100.82 157.12 100.97 157.02 101.08 C 156.95 101.16 156.81 101.2 156.7 101.13 L 154.51 99.45 C 154.46 99.4 154.42 99.35 154.42 99.24 L 154.42 95.58 C 154.42 95.43 154.56 95.33 154.67 95.33 C 154.83 95.33 154.92 95.48 154.92 95.58 L 154.92 99.13 Z M 154.78 103.17 C 157.24 103.17 158.92 101.1 158.92 99.01 C 158.92 96.46 156.83 94.83 154.76 94.83 C 152.02 94.83 150.59 97.2 150.59 98.89 C 150.59 101.73 152.85 103.17 154.78 103.17 Z M 154.72 104 C 152.26 104 149.81 102.12 149.75 98.94 C 149.75 96.51 151.8 94 154.73 94 C 157.31 94 159.75 96 159.75 99.03 C 159.75 101.71 157.58 104 154.72 104 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));"/> + </g> + <g> + <rect x="149.75" y="203" width="10" height="10" fill="none" stroke="none" pointer-events="all"/> + <path d="M 157.01 209.74 C 157.11 209.82 157.12 209.97 157.02 210.08 C 156.95 210.16 156.81 210.2 156.7 210.13 L 154.51 208.45 C 154.46 208.4 154.42 208.35 154.42 208.24 L 154.42 204.58 C 154.42 204.43 154.56 204.33 154.67 204.33 C 154.83 204.33 154.92 204.48 154.92 204.58 L 154.92 208.13 Z M 154.78 212.17 C 157.24 212.17 158.92 210.1 158.92 208.01 C 158.92 205.46 156.83 203.83 154.76 203.83 C 152.02 203.83 150.59 206.2 150.59 207.89 C 150.59 210.73 152.85 212.17 154.78 212.17 Z M 154.72 213 C 152.26 213 149.81 211.12 149.75 207.94 C 149.75 205.51 151.8 203 154.73 203 C 157.31 203 159.75 205 159.75 208.03 C 159.75 210.71 157.58 213 154.72 213 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));"/> + </g> + <g> + <rect x="274.75" y="143" width="10" height="10" fill="none" stroke="none" pointer-events="all"/> + <path d="M 282.01 149.74 C 282.11 149.82 282.12 149.97 282.02 150.08 C 281.95 150.16 281.81 150.2 281.7 150.13 L 279.51 148.45 C 279.46 148.4 279.42 148.35 279.42 148.24 L 279.42 144.58 C 279.42 144.43 279.56 144.33 279.67 144.33 C 279.83 144.33 279.92 144.48 279.92 144.58 L 279.92 148.13 Z M 279.78 152.17 C 282.24 152.17 283.92 150.1 283.92 148.01 C 283.92 145.46 281.83 143.83 279.76 143.83 C 277.02 143.83 275.59 146.2 275.59 147.89 C 275.59 150.73 277.85 152.17 279.78 152.17 Z M 279.72 153 C 277.26 153 274.81 151.12 274.75 147.94 C 274.75 145.51 276.8 143 279.73 143 C 282.31 143 284.75 145 284.75 148.03 C 284.75 150.71 282.58 153 279.72 153 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));"/> + </g> + <g> + <rect x="279.75" y="243" width="10" height="10" fill="none" stroke="none" pointer-events="all"/> + <path d="M 287.01 249.74 C 287.11 249.82 287.12 249.97 287.02 250.08 C 286.95 250.16 286.81 250.2 286.7 250.13 L 284.51 248.45 C 284.46 248.4 284.42 248.35 284.42 248.24 L 284.42 244.58 C 284.42 244.43 284.56 244.33 284.67 244.33 C 284.83 244.33 284.92 244.48 284.92 244.58 L 284.92 248.13 Z M 284.78 252.17 C 287.24 252.17 288.92 250.1 288.92 248.01 C 288.92 245.46 286.83 243.83 284.76 243.83 C 282.02 243.83 280.59 246.2 280.59 247.89 C 280.59 250.73 282.85 252.17 284.78 252.17 Z M 284.72 253 C 282.26 253 279.81 251.12 279.75 247.94 C 279.75 245.51 281.8 243 284.73 243 C 287.31 243 289.75 245 289.75 248.03 C 289.75 250.71 287.58 253 284.72 253 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));"/> + </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/time/_assets/timesync-external.drawio.svg b/docs/features/time/_assets/timesync-external.drawio.svg new file mode 100644 index 0000000000..6aac4267a7 --- /dev/null +++ b/docs/features/time/_assets/timesync-external.drawio.svg @@ -0,0 +1,50 @@ +<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="181px" height="261px" viewBox="-0.5 -0.5 181 261" content="<mxfile pages="4" scale="1" border="0"><diagram id="iPMMcD9bUQ2SEtdQO3a7" name="external">5VZNc5swFPw1PtaDwdjkGLtOckhn2vFMM9ObLD1AjeAx4uGP/vpKtmTAOGkzk7aHnoz2LZLealdmFC2L/b1mVf4JBahRGIj9KPo4CsNJNEnMj0UOJyQO4hOQaSkcqQXW8gc4MHBoIwXUPSIhKpJVH+RYlsCphzGtcdenpaj6q1YsgwGw5kwN0ScpKD+hSRy0+APILPcrTwJXKZgnO6DOmcBdB4pWo2ipEen0VOyXoKx4XpfTe3cvVM8b01DS77xwO2f38c022z7o+aIQ3+SXJ/jgZqnp4BsGYfp3Q9SUY4YlU6sWXWhsSgF21sCMWs4jYmXAiQG/A9HBHSZrCA2UU6FctSam6dYejgG4YnUtuYfvpPK0YYN+t9hoDq90FTqjMJ0BvcKbnni25c4CTr57wAJIHwxBg2Ikt31LMOes7MxrxTcPTv83nIXb9Zapxq00PByljPHtIRg3VXCUDxsz6WKXS4J1xY667EwW+5K/qOUWNMH+1e5dNfLOdklOfER3bS4micPybiZ8At5dsejXitXPQDx3Xq1QlgR6tTUq1N6MPpaWIFidn53dc6zGZ1iiQn2cNkrCTTSbmUpq/NrBRQyJmBpcsQ2oz1hLkljacwK7silYwaW5Xx4vCBskwqJDuFUyswWyqVpgQ0qWZgv+mrM7ZI5ynty7othn9joeY5pKDmNzOXKoqB4bt/Dnd7LDLOnbYTa0wzQeusFj726G6cAMXyGX3Bjh0hP9C+wvJCcMxmHcU8v8TVxJT3QzvqLY/E/FJ/5n8RGzzSy+Ep80TUPO/4v4RMGFIaZDQ4RX3BC+PT9m2H5mHGudj7Vo9RM=</diagram></mxfile>"> + <defs/> + <g> + <g> + <path d="M 90 126.37 L 90 155 L 90.08 183.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 90 121.12 L 93.5 128.12 L 90 126.37 L 86.5 128.12 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));"/> + <path d="M 90.1 188.88 L 86.58 181.89 L 90.08 183.63 L 93.58 181.87 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 45 30 C 9 30 0 60 28.8 66 C 0 79.2 32.4 108 55.8 96 C 72 120 126 120 144 96 C 180 96 180 72 157.5 60 C 180 36 144 12 112.5 24 C 90 6 54 6 45 30 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));"/> + </g> + <g> + <rect x="68" y="50" width="45" height="45" fill="none" stroke="none" pointer-events="all"/> + <path d="M 100.67 80.32 C 101.1 80.69 101.17 81.37 100.73 81.88 C 100.38 82.24 99.78 82.42 99.26 82.07 L 89.44 74.51 C 89.22 74.29 89.02 74.06 89.03 73.59 L 89.03 57.11 C 89.03 56.44 89.63 56 90.16 56 C 90.85 56 91.27 56.65 91.27 57.11 L 91.27 73.11 Z M 90.61 91.28 C 101.7 91.28 109.25 81.94 109.25 72.53 C 109.25 61.08 99.84 53.75 90.55 53.75 C 78.23 53.75 71.77 64.41 71.77 72 C 71.77 84.79 81.93 91.28 90.61 91.28 Z M 90.39 95 C 79.29 95 68.27 86.52 68 72.23 C 68 61.3 77.2 50 90.42 50 C 102.03 50 113 58.99 113 72.63 C 113 84.71 103.24 95 90.39 95 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" 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> + <rect x="20.25" y="190" width="139.5" 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: 138px; height: 1px; padding-top: 225px; margin-left: 21px;"> + <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; "> + Vehicle + </div> + </div> + </div> + </foreignObject> + <text x="90" y="229" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Vehicle + </text> + </switch> + </g> + </g> + <g> + <rect x="30" y="230" width="25" height="25" fill="none" stroke="none" pointer-events="all"/> + <path d="M 48.15 246.84 C 48.39 247.05 48.43 247.43 48.18 247.71 C 47.99 247.91 47.65 248.01 47.37 247.82 L 41.91 243.61 C 41.79 243.49 41.68 243.36 41.68 243.1 L 41.68 233.95 C 41.68 233.58 42.01 233.33 42.31 233.33 C 42.7 233.33 42.93 233.7 42.93 233.95 L 42.93 242.84 Z M 42.56 252.93 C 48.72 252.93 52.92 247.74 52.92 242.51 C 52.92 236.16 47.69 232.08 42.53 232.08 C 35.69 232.08 32.09 238.01 32.09 242.22 C 32.09 249.33 37.74 252.93 42.56 252.93 Z M 42.44 255 C 36.27 255 30.15 250.29 30 242.35 C 30 236.28 35.11 230 42.45 230 C 48.9 230 55 235 55 242.57 C 55 249.28 49.58 255 42.44 255 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));"/> + </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/time/_assets/timesync-vehicle.drawio.svg b/docs/features/time/_assets/timesync-vehicle.drawio.svg new file mode 100644 index 0000000000..99140df7aa --- /dev/null +++ b/docs/features/time/_assets/timesync-vehicle.drawio.svg @@ -0,0 +1,255 @@ +<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="391px" height="511px" viewBox="-0.5 -0.5 391 511" content="<mxfile pages="4" scale="1" border="0"><diagram id="tBw3uPJqRDZ8P3MfchIl" name="vehicle">7Vpbb9owGP01SNvDUBLHITwWSltpTKtUdV33ZhJD3IaYOabAfv1s4txwellHSNryRHzifLGPz/nwJR0wnK/PGVoE36iPw45l+OsOOO1Ylmk7tviRyCZBoGMmwIwRX1XKgSvyByvQUOiS+DguVeSUhpwsyqBHowh7vIQhxuiqXG1Kw/JbF2iGNeDKQ6GO3hCfBwnqQiPHLzCZBembTUPdmaO0sgLiAPl0VYDAqAOGjFKeXM3XQxxK8lJekufOHrmbNYzhiL/kAf+rNxnbv++iwTVbDq5HYxR//6KiPKBwqTr8AwfEE71P2sw3KRGMLiMfy1hGBwxWAeH4aoE8eXclhl5gAZ+HomSKywfMOBEknoRkFgmMU1lBb3H6elEdrwuQ6sE5pnPM2UZUUXczNlM5pQOxygcHuP1uDyZwUBgbmGoKKU3MsvA5beJCMfcPLFoaixeXw/9jcA9cAaOX8aDocvo6XZlii1xl4N65Ahov2BeOU0XKeEBnNELhKEcHZebyOmMqdbXl6w5zvlHpAy05LbMpSGSbn8XCrQzWhWnxdK2CJ6VNVvJPZBIRxYhGOEHOiOxxcn9NeBZWXBeiilIeVBbSmI+ObEyXzMNPUKdSKUdshvnzcpS8PqkThkPEyUM501UN+PZRQQTaFCosKIl4XIh8KYFcfrbV35WfC2E5RT3/SM82diSXtCMXYNah12vS1vz7q3n7WrbOn6Xb161wb68u88L3ZN7XG9F560Z0rHYa0XkjRoQV/6MHNWLvaERJg3s0Yj1GdNtoRNttnxH7jRrR2K8R0+lsPoW9LUxu9z2dNdP1/HPuNZ1a7KuZDVbMWN0d4SS9Ug/uaGcPvkuXqB89sb9YG63N7G1d65j6lo9M7can85vPbczwja95TKsZS9ZmLdBYNu2DnUFK7F1fNgWa1keNaxzqy4m+oWvcrtC4XZvG7XemcdicxndnDHVrHL4RjVfs1B9W4/rmQiuJMo3Gs0FPY0ojKr7H3AsUT9vpEWajByxnSQk52XGXrOCjOMhYLTAYc0bv8ZCGlG3DAteaAMcRd6YiDRRwH2LXtwUeogkOL2lMOKHyZMnD8s2FI6fxToUJ5ZzOHz2Toksekkg0IT0+lC1EqkoWXHRmITs+X8/kMWeXTqfEw12PRh5e8LjrhdS739NuE4TaFMiBmiCsCkFYtQlC3w44lCB8Z+LACkFMp1PL8z6CIIDZ6+6sExw9QRxWD/2jHhrTg923W5cg0sBHQbRDEA6wGxaEvstwFESDU4jmBWEdBdGYICAE2nLMcjRBmBWCqO+bKX1v5iiIJgXRa1oQ+lc4R0E0KAjTqC9FiGL+4WuyE5Z/PgxGfwE=</diagram></mxfile>"> + <defs/> + <g> + <g> + <rect x="0" y="0" width="389.75" height="510" 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: 388px; height: 1px; padding-top: 7px; 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; "> + Vehicle + </div> + </div> + </div> + </foreignObject> + <text x="195" y="19" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + Vehicle + </text> + </switch> + </g> + </g> + <g> + <rect x="87.75" y="140" width="100" height="100" 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: 98px; height: 1px; padding-top: 190px; margin-left: 89px;"> + <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; "> + HPC + </div> + </div> + </div> + </foreignObject> + <text x="138" y="194" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + HPC + </text> + </switch> + </g> + </g> + <g> + <path d="M 109.75 305 L 209.78 305 L 209.78 190 L 187.75 190" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <rect x="29.75" y="270" width="80" 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: 78px; height: 1px; padding-top: 305px; 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; "> + ZC + </div> + </div> + </div> + </foreignObject> + <text x="70" y="309" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + ZC + </text> + </switch> + </g> + </g> + <g> + <path d="M 109.75 75 L 209.78 75 L 209.78 190 L 187.75 190" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <rect x="29.75" y="40" width="80" 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: 78px; height: 1px; padding-top: 75px; 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; "> + ZC + </div> + </div> + </div> + </foreignObject> + <text x="70" y="79" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + ZC + </text> + </switch> + </g> + </g> + <g> + <path d="M 269.75 75 L 209.78 75 L 209.78 190 L 187.75 190" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <rect x="269.75" y="40" width="80" 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: 78px; height: 1px; padding-top: 75px; margin-left: 271px;"> + <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; "> + ZC + </div> + </div> + </div> + </foreignObject> + <text x="310" y="79" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + ZC + </text> + </switch> + </g> + </g> + <g> + <path d="M 309.75 340 L 309.78 470 L 329.75 470" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <path d="M 269.75 305 L 209.78 305 L 209.78 190 L 187.75 190" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <rect x="269.75" y="270" width="80" 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: 78px; height: 1px; padding-top: 305px; margin-left: 271px;"> + <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; "> + ZC (GW) + </div> + </div> + </div> + </foreignObject> + <text x="310" y="309" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + ZC (GW) + </text> + </switch> + </g> + </g> + <g> + <path d="M 329.75 370 L 309.78 370 L 309.78 380.56" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <rect x="329.75" y="350" width="40" 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 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: 370px; margin-left: 331px;"> + <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; "> + E + </div> + </div> + </div> + </foreignObject> + <text x="350" y="374" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + E + </text> + </switch> + </g> + </g> + <g> + <path d="M 329.75 420 L 309.78 420 L 309.78 430.56" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/> + </g> + <g> + <rect x="329.75" y="400" width="40" 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 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: 420px; margin-left: 331px;"> + <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; "> + E + </div> + </div> + </div> + </foreignObject> + <text x="350" y="424" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + E + </text> + </switch> + </g> + </g> + <g> + <rect x="329.75" y="450" width="40" 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 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: 470px; margin-left: 331px;"> + <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; "> + E + </div> + </div> + </div> + </foreignObject> + <text x="350" y="474" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle"> + E + </text> + </switch> + </g> + </g> + <g> + <rect x="35.75" y="315" width="20" height="20" fill="none" stroke="none" pointer-events="all"/> + <path d="M 50.27 328.47 C 50.46 328.64 50.49 328.94 50.3 329.17 C 50.14 329.33 49.87 329.41 49.64 329.25 L 45.28 325.89 C 45.18 325.79 45.09 325.69 45.09 325.48 L 45.09 318.16 C 45.09 317.86 45.36 317.67 45.6 317.67 C 45.91 317.67 46.09 317.96 46.09 318.16 L 46.09 325.27 Z M 45.8 333.35 C 50.73 333.35 54.08 329.19 54.08 325.01 C 54.08 319.93 49.9 316.67 45.77 316.67 C 40.3 316.67 37.42 321.41 37.42 324.78 C 37.42 330.46 41.94 333.35 45.8 333.35 Z M 45.7 335 C 40.77 335 35.87 331.23 35.75 324.88 C 35.75 320.02 39.84 315 45.71 315 C 50.87 315 55.75 319 55.75 325.06 C 55.75 330.43 51.41 335 45.7 335 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" 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> + <rect x="97.5" y="210" width="20" height="20" fill="none" stroke="none" pointer-events="all"/> + <path d="M 112.02 223.47 C 112.21 223.64 112.24 223.94 112.05 224.17 C 111.89 224.33 111.62 224.41 111.39 224.25 L 107.03 220.89 C 106.93 220.79 106.84 220.69 106.84 220.48 L 106.84 213.16 C 106.84 212.86 107.11 212.67 107.35 212.67 C 107.66 212.67 107.84 212.96 107.84 213.16 L 107.84 220.27 Z M 107.55 228.35 C 112.48 228.35 115.83 224.19 115.83 220.01 C 115.83 214.93 111.65 211.67 107.52 211.67 C 102.05 211.67 99.17 216.41 99.17 219.78 C 99.17 225.46 103.69 228.35 107.55 228.35 Z M 107.45 230 C 102.52 230 97.62 226.23 97.5 219.88 C 97.5 215.02 101.59 210 107.46 210 C 112.62 210 117.5 214 117.5 220.06 C 117.5 225.43 113.16 230 107.45 230 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));"/> + </g> + <g> + <rect x="274.75" y="315" width="20" height="20" fill="none" stroke="none" pointer-events="all"/> + <path d="M 289.27 328.47 C 289.46 328.64 289.49 328.94 289.3 329.17 C 289.14 329.33 288.87 329.41 288.64 329.25 L 284.28 325.89 C 284.18 325.79 284.09 325.69 284.09 325.48 L 284.09 318.16 C 284.09 317.86 284.36 317.67 284.6 317.67 C 284.91 317.67 285.09 317.96 285.09 318.16 L 285.09 325.27 Z M 284.8 333.35 C 289.73 333.35 293.08 329.19 293.08 325.01 C 293.08 319.93 288.9 316.67 284.77 316.67 C 279.3 316.67 276.42 321.41 276.42 324.78 C 276.42 330.46 280.94 333.35 284.8 333.35 Z M 284.7 335 C 279.77 335 274.87 331.23 274.75 324.88 C 274.75 320.02 278.84 315 284.71 315 C 289.87 315 294.75 319 294.75 325.06 C 294.75 330.43 290.41 335 284.7 335 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));"/> + </g> + <g> + <rect x="274.75" y="84" width="20" height="20" fill="none" stroke="none" pointer-events="all"/> + <path d="M 289.27 97.47 C 289.46 97.64 289.49 97.94 289.3 98.17 C 289.14 98.33 288.87 98.41 288.64 98.25 L 284.28 94.89 C 284.18 94.79 284.09 94.69 284.09 94.48 L 284.09 87.16 C 284.09 86.86 284.36 86.67 284.6 86.67 C 284.91 86.67 285.09 86.96 285.09 87.16 L 285.09 94.27 Z M 284.8 102.35 C 289.73 102.35 293.08 98.19 293.08 94.01 C 293.08 88.93 288.9 85.67 284.77 85.67 C 279.3 85.67 276.42 90.41 276.42 93.78 C 276.42 99.46 280.94 102.35 284.8 102.35 Z M 284.7 104 C 279.77 104 274.87 100.23 274.75 93.88 C 274.75 89.02 278.84 84 284.71 84 C 289.87 84 294.75 88 294.75 94.06 C 294.75 99.43 290.41 104 284.7 104 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));"/> + </g> + <g> + <rect x="35.75" y="84" width="20" height="20" fill="none" stroke="none" pointer-events="all"/> + <path d="M 50.27 97.47 C 50.46 97.64 50.49 97.94 50.3 98.17 C 50.14 98.33 49.87 98.41 49.64 98.25 L 45.28 94.89 C 45.18 94.79 45.09 94.69 45.09 94.48 L 45.09 87.16 C 45.09 86.86 45.36 86.67 45.6 86.67 C 45.91 86.67 46.09 86.96 46.09 87.16 L 46.09 94.27 Z M 45.8 102.35 C 50.73 102.35 54.08 98.19 54.08 94.01 C 54.08 88.93 49.9 85.67 45.77 85.67 C 40.3 85.67 37.42 90.41 37.42 93.78 C 37.42 99.46 41.94 102.35 45.8 102.35 Z M 45.7 104 C 40.77 104 35.87 100.23 35.75 93.88 C 35.75 89.02 39.84 84 45.71 84 C 50.87 84 55.75 88 55.75 94.06 C 55.75 99.43 51.41 104 45.7 104 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));"/> + </g> + <g> + <rect x="333.75" y="376" width="10" height="10" fill="none" stroke="none" pointer-events="all"/> + <path d="M 341.01 382.74 C 341.11 382.82 341.12 382.97 341.02 383.08 C 340.95 383.16 340.81 383.2 340.7 383.13 L 338.51 381.45 C 338.46 381.4 338.42 381.35 338.42 381.24 L 338.42 377.58 C 338.42 377.43 338.56 377.33 338.67 377.33 C 338.83 377.33 338.92 377.48 338.92 377.58 L 338.92 381.13 Z M 338.78 385.17 C 341.24 385.17 342.92 383.1 342.92 381.01 C 342.92 378.46 340.83 376.83 338.76 376.83 C 336.02 376.83 334.59 379.2 334.59 380.89 C 334.59 383.73 336.85 385.17 338.78 385.17 Z M 338.72 386 C 336.26 386 333.81 384.12 333.75 380.94 C 333.75 378.51 335.8 376 338.73 376 C 341.31 376 343.75 378 343.75 381.03 C 343.75 383.71 341.58 386 338.72 386 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));"/> + </g> + <g> + <rect x="333.75" y="426" width="10" height="10" fill="none" stroke="none" pointer-events="all"/> + <path d="M 341.01 432.74 C 341.11 432.82 341.12 432.97 341.02 433.08 C 340.95 433.16 340.81 433.2 340.7 433.13 L 338.51 431.45 C 338.46 431.4 338.42 431.35 338.42 431.24 L 338.42 427.58 C 338.42 427.43 338.56 427.33 338.67 427.33 C 338.83 427.33 338.92 427.48 338.92 427.58 L 338.92 431.13 Z M 338.78 435.17 C 341.24 435.17 342.92 433.1 342.92 431.01 C 342.92 428.46 340.83 426.83 338.76 426.83 C 336.02 426.83 334.59 429.2 334.59 430.89 C 334.59 433.73 336.85 435.17 338.78 435.17 Z M 338.72 436 C 336.26 436 333.81 434.12 333.75 430.94 C 333.75 428.51 335.8 426 338.73 426 C 341.31 426 343.75 428 343.75 431.03 C 343.75 433.71 341.58 436 338.72 436 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));"/> + </g> + <g> + <rect x="333.75" y="476" width="10" height="10" fill="none" stroke="none" pointer-events="all"/> + <path d="M 341.01 482.74 C 341.11 482.82 341.12 482.97 341.02 483.08 C 340.95 483.16 340.81 483.2 340.7 483.13 L 338.51 481.45 C 338.46 481.4 338.42 481.35 338.42 481.24 L 338.42 477.58 C 338.42 477.43 338.56 477.33 338.67 477.33 C 338.83 477.33 338.92 477.48 338.92 477.58 L 338.92 481.13 Z M 338.78 485.17 C 341.24 485.17 342.92 483.1 342.92 481.01 C 342.92 478.46 340.83 476.83 338.76 476.83 C 336.02 476.83 334.59 479.2 334.59 480.89 C 334.59 483.73 336.85 485.17 338.78 485.17 Z M 338.72 486 C 336.26 486 333.81 484.12 333.75 480.94 C 333.75 478.51 335.8 476 338.73 476 C 341.31 476 343.75 478 343.75 481.03 C 343.75 483.71 341.58 486 338.72 486 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));"/> + </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/time/index.rst b/docs/features/time/index.rst index b349727c5b..a0fd902e57 100644 --- a/docs/features/time/index.rst +++ b/docs/features/time/index.rst @@ -21,13 +21,13 @@ Time :id: doc__time :status: valid :safety: ASIL_B - :tags: change_management + :tags: time, feature_request, change_management -.. toctree:: - :hidden: +.. .. toctree:: +.. :hidden: - requirements.rst +.. requirements.rst Feature flag @@ -45,88 +45,97 @@ Abstract Motivation ========== -Efficient and accurate time management is critical in automotive systems, affecting functionality, safety, and reliability across various applications. Generally, time relevance can be categorized into the following levels: - -* External Time Synchronization -* In-Vehicle Time Synchronization -* Clocks, Accuracy, and Reading Current Time -* Consistent Logical Time Within Cause-Effect Cycles - +Efficient and accurate time management is critical in automotive systems, affecting functionality, safety, and reliability across various applications. Time handling spans several layers, from synchronization with external time sources to the consistent use of logical time within in-vehicle software cycles. For this reason, the motivation section describes the context broadly, even if the actual feature request later focuses on a more specific scope. External Time Synchronization --------------------------------- - -External time synchronization aims to align the vehicle's internal time reference with a global or external standard. The primary objective is to synchronize with universal time standards such as UTC, which enables accurate timestamping of data across geographically distributed systems, crucial for telematics, fleet management, and regulatory compliance (e.g., event logging, diagnostics, cybersecurity). Additional use cases include ensuring consistent timing across vehicles in a fleet to facilitate coordinated operations or data analysis. Typical synchronization methods include GPS-based satellite synchronization, backend server synchronization over cellular networks. +----------------------------- +.. figure:: _assets/timesync-external.drawio.svg + :alt: External Time Synchronization + :align: center -In-Vehicle Time Synchronization ----------------------------------- +External time synchronization establishes a reference to a global time standard, such as UTC, through methods like GPS-based synchronization or backend servers accessed via cellular networks. These time sources are relevant for fleet-wide timestamping, telematics, and ensuring regulatory compliance (e.g., event logging, cybersecurity). -In-vehicle synchronization ensures all Electronic Control Units (ECUs) within a vehicle operate based on a consistent internal time reference, crucial for real-time and safety-critical applications such as autonomous driving, audio/video streaming, and event logging. The synchronization architecture generally involves designating a single ECU as the *Time Grand Master*, typically the ECU with the fastest boot-up time (often a zonal controller hosting a microcontroller portion). Other ECUs synchronize their internal clocks to this master. +The details of external synchronization are out of scope for this request but are included to clarify the overall context. -Given the distributed nature of automotive E/E architectures, direct end-to-end synchronization across all ECUs is impractical due to latency and accumulated errors. Instead, synchronization typically occurs via peer-to-peer communication, with time gateways or zonal controllers acting as local masters within subnetworks to maintain accuracy. Network-specific synchronization protocols, such as gPTP for Ethernet, ensure robust, standardized synchronization. +In-Vehicle Time Synchronization +------------------------------- -S-CORE must support industry-standard synchronization protocols like gPTP (IEEE 802.1AS) for Ethernet-based networks, including restrictions defined in AUTOSAR's Time Synchronization Protocol. For CAN-based networks, synchronization standards defined by AUTOSAR, such as the Time Synchronization over CAN, should be supported. +.. figure:: _assets/timesync-vehicle.drawio.svg + :alt: In-Vehicle Time Synchronization + :align: center -todo: time syntonization vs synchronization -todo: add standards for other technologies - for 1.0 concentrate (ntp), gptp, can? - extend for time e.g. via someip +Within the vehicle, synchronization ensures that all ECUs reference a consistent internal time. In modern architectures, this is achieved by designating a statically defined Time Grand Master, typically a zonal controller equipped with a fast-booting microcontroller and responsible for early vehicle functions such as key detection. This controller synchronizes with the external time source and propagates time over the in-vehicle network. -todo: should we support only gPTP or also PTP? for >1.0 -todo: should we support NPT? for >1.0 +The synchronization protocols relevant here are primarily Ethernet-based. The focus lies on gPTP (IEEE 802.1AS) and the corresponding specifications in AUTOSAR Adaptive to ensure compatibility with existing ECUs. Syntonization, the alignment of clock frequency, is as essential as synchronization and must be supported to maintain long-term timing consistency. -for 1.0 we focus +Bridging between different network domains (e.g., Ethernet to CAN) is outside the scope of this feature. In the system context, the High-Performance Computer (HPC) is assumed to be a slave in the time distribution topology and connects via Ethernet to the grandmaster. Time synchronization within CAN segments, typically handled by zonal controllers, is not covered by this feature. Clocks, Accuracy, and Reading Current Time ---------------------------------------------- +------------------------------------------ -Software stacks contain multiple clock sources: +Modern software environments contain several types of clocks (or time bases), including: -- Local Clocks: These include monotonic, system, steady, and high-resolution clocks, providing internal time references independent of external synchronization. -- Synchronized Clocks: These clocks are synchronized to external or internal standards and are critical for tasks requiring accurate timestamps or coordinated execution. -- Secure Clocks: Used specifically in cryptographic contexts to validate digital certificates or ensure secure transaction timestamps; these require protection against tampering and robust synchronization. +* Local clocks, such as monotonic or steady clocks +* Synchronized clocks, aligned with a vehicle-wide or external time base +* Secure or authentic clocks, protected against tampering -Programming languages typically abstract these clocks (e.g., ``std::chrono`` in C++, ``std::time`` in Rust). Therefore, the integration of S-CORE with existing language-specific abstractions is essential for consistency and ease of use. +Mixing clock types unintentionally can lead to non-deterministic behaviors, negatively affecting system stability and correctness. Therefore, explicit selection of the time base by the application is mandatory. TimePoints of different clocks shall be incompatible types. -TODO: differentiate between time base (e.g. identify source, synchronized clocks) and how the time is accessed (synchronized clock available via std::chrono) -TODO: S-CORE time/clocks should be explicitly targeted and not implicitly hidden in e.g. std::chrono. score::chrono e.g. could provide a thin wrapper for std::chrono but the user should explicitly choose a score supported time to avoid confusion with std::chrono. +Applications must be able to detect when a chosen time base is invalid or unsynchronized, enabling them to define appropriate fallback or error-handling strategies. Error states or drift conditions must be detectable by the application. -TODO: asking for a time stamp, should be as fast as possible. +Clock introspection capabilities are required, allowing applications to determine synchronization status and time elapsed since the last successful synchronization. This information is vital during error handling or fallback situations. -TODO: states of synchronized clocks, how to handle them? e.g. asking for current time when the clock is not synchronized. Error handling should be possible on per app use-case. -TODO: should we expose the information on time difference since the last synchronization? dedicated api required. +Access to TimePoints should be as performant as technically feasible due to their frequent use in control loops and high-frequency applications. Although specific latency targets are not defined here, low latency is a fundamental design consideration. -TODO: alignment with Crypto feature request on secure clocks +For cryptographic scenarios the feature also targets secure or authentic clocks. In such cases, a tamper-resistant time source is needed to ensure that time cannot be rolled back to re-enable expired certificates or bypass security controls. Authentic clocks might be signed or verified using hardware security modules. -note: the daemon that is responsible for the nw time synrchonization should also synchronize the local hw clock. +To integrate cleanly with modern programming languages, the time access API should align with idiomatic constructs (e.g., ``std::chrono`` in C++, ``time`` in Rust), while making clear that the source of time is provided by the S-CORE platform. A dedicated namespace such as ``score::chrono`` may wrap native types to make the time source explicit. -TODO: use existing time synchronization form OS or develop own? Use OS provided might me used for development but finally we need a qualified time synchronization for production. +Consistent Logical Time Within Cause-Effect Cycles +-------------------------------------------------- +.. figure:: _assets/timesync-chain.drawio.svg + :alt: Consistent Logical Time Within Cause-Effect Cycles + :align: center -Consistent Logical Time Within Cause-Effect Cycles ------------------------------------------------------ +In distributed automotive applications, control logic is often structured into cause-effect chains. These chains consist of multiple interdependent tasks executing concurrently. Within each cycle of these chains, it is critical that all tasks perceive the same logical timestamp, even if their execution occurs at different actual CPU times. -In automotive applications, cause-effect chains or distributed algorithms frequently collaborate within defined execution cycles. Within these cycles, it is crucial that all involved algorithms reference the **same logical time** despite potential differences in actual execution start times. Maintaining consistent logical timing within cycles ensures accurate data integration and computational coherence. This consistency is particularly vital in applications such as sensor fusion, control systems, and coordinated vehicle dynamics, where discrepancies in perceived time could lead to inaccuracies in integrated values (e.g., vehicle speed, acceleration, or positional calculations). +Sharing a consistent logical timestamp ensures deterministic computations. For instance, integrating sensor measurements such as speed over time into position data requires stable and jitter-resilient timestamps shared across tasks. Additionally, consistent logical time enables reproducibility in testing, simulation, and validation scenarios, as the sequence and timing of events can be reliably replayed. -The capability to record and replay logical time is also crucial for providing a sufficient simulation environment for algorithms. This feature enables developers to test and validate algorithms under controlled and repeatable conditions, ensuring their robustness and reliability before deployment. By simulating consistent logical time, it becomes possible to analyze the behavior of distributed systems, identify potential issues, and optimize performance in scenarios that closely mimic real-world operations. +Logical time must be explicitly provided to the tasks within these cause-effect chains, but its availability in background processes or non-time-sensitive tasks is not required. -todo: add reasoning why "the same logical time" is crucial in a cause-effect/task chain (e.g., integrating speed to ...) -note: potentially exposing the current time stamp by the executor and make it available via IPC to the activities. within activities this could be abstraced by a time api but therefore the time is recordable and replayable. +.. Rationale +.. ========== -Differentiation between where logical time is required. +Specification +============= +.. note:: + From S-CORE workshop regarding Clocks, Accuracy, and Reading Current Time: + The basic concept of Time is represented by two initial and one derived element: + *Clocks* are the sources of time. A clock produced a sequence on *Timepoints*, each representing a specific point in time. + Timepoints have an Order, i.e. the relations "equal" and "less than" are defined. Because of this, TimePoints can be substracted, creating a *TimeSpan*. -.. Rationale -.. ========== + The following operations are valid between TimePoints and TimeSpans: + * Substraction: TimeSpan := TimePoint - TimePoint; TimeSpan := [TimeSpan - TimeSpan] | Negative TimeSpans shall not be allowed, the substraction saturates to zero. + * Addition: TimePoint := TimePoint + TimeSpan; TimeSpan := TimeSpan + TimeSpan + * Multiplication: TimeSpan := Factor * TimeSpan + * Equality: bool := TimePoint == TimePoint; bool := TimeSpan == TimeSpan + * Comparison: bool := TimePoint < TimePoint; bool := TimeSpan < TimeSpan (this includes with equality the less-than-or-equal relation) -Specification -============= + The clock is characterized by main attributes: + + * Frequency: The frequency with which the clock updates the TimePoints it issues. + * Resolution: The accuracy of an individual timepoint. While an ideal clock would have a resolution that is the reciproke of the frequency in reality this may not be the case. + * Monotony: A clock can be monotonous (TP[n+1] >= TP[n] is always maintained), strictly monotonous or not monotonous + * Steady: A steady clock will update in fixed intervals, i.e. each increment is exactly 1/Frequency. For example system clock is neither monotonous nor steady because of summer/winter time and leap seconds. + * Epoch: The TimePoint the clock started ticking. The semantic of the epoch is a documentation property of the clock. Example: Unix system clock has an Epoch value of 0 on 01.01.1970, 00:00:00 UTC. In-Vehicle Time Synchronization ------------------------------- @@ -198,6 +207,7 @@ Monotonic Clock * REQ_0015: the score::time feature shall provide a mechanism to access (read only) to monotonic, not adjustable clock value, which is mapped from the known OS or HW clock. + .. Backwards Compatibility .. ======================= From 83949a657210266b45226f27e23a0a09fef8fee2 Mon Sep 17 00:00:00 2001 From: Uwe Maucher <205777204+umaucher@users.noreply.github.com> Date: Wed, 30 Jul 2025 16:47:36 +0200 Subject: [PATCH 087/109] feature time: Move requirements in own file Follow platform folder structure definition for requirements and bring them to the according structure. --- .../features/time/docs/requirements/index.rst | 166 ++++++++++++++++++ docs/features/time/index.rst | 67 ++----- 2 files changed, 182 insertions(+), 51 deletions(-) create mode 100644 docs/features/time/docs/requirements/index.rst diff --git a/docs/features/time/docs/requirements/index.rst b/docs/features/time/docs/requirements/index.rst new file mode 100644 index 0000000000..0c3bb66c43 --- /dev/null +++ b/docs/features/time/docs/requirements/index.rst @@ -0,0 +1,166 @@ +.. + # ******************************************************************************* + # 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:: Time client PTP sync + :id: feat_req__time__trec_external_sync_ptp + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: + :status: valid + + The **time client**, as part of score::time feature, shall synchronize the local clock with an external **time host** using the PTP protocol (IEEE 802.1AS). + +.. feat_req:: score::time metadata + :id: feat_req__time__time_metadata + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: + :status: valid + + The score::time shall get the current synchronized time and its metadata from the **time host**. + +.. feat_req:: score::time validation + :id: feat_req__time__time_validataion + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: + :status: valid + + The score::time shall validate the current synchronized time, which was received from the **time host** and reflect the validation results in the time point status accordingly. + + Validation of the current synchronized time includes: + * checking the time point for loss of synchronization + * checking the time point for monotonicity + * checking the time point for instability, like time jumps to the past or to the future + +.. feat_req:: score::time multiple applications + :id: feat_req__time__multiple_applications + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: + :status: valid + + The score::time feature shall provide a mechanism to access (read only) to the synchronized time and its status across multiple applications within one ECU. + +.. feat_req:: score::time efficiency + :id: feat_req__time__client_efficiency + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: + :status: valid + + The score::time feature shall provide an access to the synchronized time and its status, see feat_req__time__multiple_applications, in an efficient way without any additional overhead, like kernel calls, Resource manager involvement and so on. + *Use case:* frequent access to the current synchronized time and its metadata by multiple clients within one ECU. + + +.. feat_req:: score::time synchronization process metadata + :id: feat_req__time__sync_process_metadata + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: + :status: valid + + The score::time feature shall provide a mechanism to access (read only) to the internal state of the synchronization process, see **Synchronization process metadata**, across multiple applications within one ECU. + +.. feat_req:: score::time synchronization stat logging + :id: feat_req__time__sync_stat_logging + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: + :status: valid + + The score::time shall provide a mechanism to log the internal state of the synchronization process, see **Synchronization process metadata**, to be able to debug and diagnose the time synchronization process. + *Use case:* Debugging and diagnostics of the time synchronization process. + + +External Time Synchronization +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. feat_req:: score::time external synchronization + :id: feat_req__time__external_sync + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: + :status: valid + + The score::time feature shall support synchronization with external time sources, such as GPS, based on SOME/IP messages. + +.. feat_req:: score::time external synchronization status + :id: feat_req__time__external_sync_status + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: + :status: valid + + The score::time shall maintain the current synchronized time and its synchronization status, to be able to provide the latest values by clients request. + +.. feat_req:: score::time external synchronization time + :id: feat_req__time__external_sync_time + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: + :status: valid + + The score::time feature shall provide a mechanism to access (read only) the current synchronized time from external time sources and its synchronization status. + +.. feat_req:: score::time external synchronization status log + :id: feat_req__time__external_sync_status_log + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: + :status: valid + + The score::time feature shall provide a mechanism to log the internal state of the external time synchronization process, to be able to debug and diagnose the synchronization process. + + +High precision Clock +^^^^^^^^^^^^^^^^^^^^ + +.. feat_req:: score::time high precision clock + :id: feat_req__time__high_precision_clock + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: + :status: valid + + The score::time feature shall provide a mechanism to access (read only) the high precision clock in nanoseconds precision. + *Use case:* such clocks might be used for time-critical applications, such as audio/video streaming, event logging, and diagnostics. + + +Monotonic Clock +^^^^^^^^^^^^^^^ + +.. feat_req:: score::time monotonic clock + :id: feat_req__time__monotonic_clock + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: + :status: valid + + The score::time feature shall provide a mechanism to access (read only) to monotonic, not adjustable clock value, which is mapped from the known OS or HW clock. diff --git a/docs/features/time/index.rst b/docs/features/time/index.rst index a0fd902e57..00b3ee2e2c 100644 --- a/docs/features/time/index.rst +++ b/docs/features/time/index.rst @@ -24,10 +24,13 @@ Time :tags: time, feature_request, change_management -.. .. toctree:: -.. :hidden: +.. toctree:: + :maxdepth: 1 + :glob: + :titlesonly: + :hidden: -.. requirements.rst + docs/**/index Feature flag @@ -142,71 +145,32 @@ In-Vehicle Time Synchronization Definitions: -**Time Slave** +**Time client** An actor that runs on the system and is responsible for -* synchronizing the local clock with an external Time Master using the PTP protocol (IEEE 802.1AS). +* synchronizing the local clock with an external *time host* using the PTP protocol (IEEE 802.1AS). * providing the synchronization meta information to the clients, including score::time feature. Where meta information includes, but not limited to synchronization status (synchronized, not synchronized, unstable), time difference to the external time source, last synchronization time, current time point of the local clock and so on. **Synchronization process metadata** -Data which is provided by the **Time Slave** and includes the current synchronized time, synchronization status, rate correction, and so on, which are the output or intermediate artifacts of the synchronization process. +Data which is provided by the **time client** and includes the current synchronized time, synchronization status, rate correction, and so on, which are the output or intermediate artifacts of the synchronization process. -Requirements: - -* REQ_0001: the **Time Slave**, as part of score::time feature, shall synchronize the local clock with an external **Time Master** using the PTP protocol (IEEE 802.1AS). -* REQ_0002: the score::time shall get the current synchronized time and its metadata from the **Time Slave**. -* REQ_0003: the score::time shall maintain the current synchronized time, its synchronization status and **Synchronization process metadata**, to be able to provide the latest values by clients request. -* REQ_0004: the score::time shall validate the current synchronized time, which was received from the **Time Slave** and reflect the validation results in the time point status accordingly. - Validation of the current synchronized time includes: - - * checking the time point for loss of synchronization - * checking the time point for monotonicity - * checking the time point for instability, like time jumps to the past or to the future - -* REQ_0005: the score::time feature shall provide a mechanism to access (read only) to the synchronized time and its status across multiple applications within one ECU. -* REQ_0006: the score::time feature shall provide an access to the synchronized time and its status, see REQ_0005, in an efficient way without any additional overhead, like kernel calls, Resource manager involvement and so on. - *Use case:* frequent access to the current synchronized time and its metadata by multiple clients within one ECU. -* REQ_0007: the score::time feature shall provide a mechanism to access (read only) to the internal state of the synchronization process, see **Synchronization process metadata**, across multiple applications within one ECU. -* REQ_0008: the score::time shall provide a mechanism to log the internal state of the synchronization process, see **Synchronization process metadata**, to be able to debug and diagnose the time synchronization process. - *Use case:* Debugging and diagnostics of the time synchronization process. - -The diagram above illustrates the data flow and interactions between the Time Slave, score::time middleware, and client applications within an ECU during PTP-based time synchronization. +The diagram bellow illustrates the data flow and interactions between the Time client, score::time middleware, and client applications within an ECU during PTP-based time synchronization. .. uml:: data_flow.puml - :caption: Data flow between Time Slave, score::time, and clients + :caption: Data flow between time client, score::time, and clients Where -* The **Time Slave** (gPTP stack) communicates with an external Time Master to maintain accurate time synchronization using the PTP protocol. -* The **Time base provider** periodically reads the synchronized time from the Time Slave, validates it, and writes the results (including status flags and timestamps) into some shared resource towards **score::time** middleware. Different IPC mechanisms can be used for to provide actual synchronized time and its metadata to **Time base provider**, like: +* The **time client** (gPTP stack) communicates with an external time host to maintain accurate time synchronization using the PTP protocol. +* The **Time base provider** periodically reads the synchronized time from the Time client, validates it, and writes the results (including status flags and timestamps) into some shared resource towards **score::time** middleware. Different IPC mechanisms can be used for to provide actual synchronized time and its metadata to **Time base provider**, like: - * shared memory, then the **Time Slave** writes the synchronized time and its metadata into the shared memory, which is then read by the **Time base provider** middleware. + * shared memory, then the **time client** writes the synchronized time and its metadata into the shared memory, which is then read by the **Time base provider** middleware. * **Time base provider** polls for current EMAC value with ``devctl`` calls. * other IPC methods. * The **score::time** middleware accesses this shared resource to obtain the latest synchronized time and its metadata, adjusting the time as needed based on the local clock by requests from client applications. * This architecture ensures efficient, low-overhead distribution of synchronized time and its status to multiple applications within the ECU, supporting both real-time and diagnostic use cases. -External Time Synchronization ------------------------------ - -* REQ_0010: the score::time feature shall support synchronization with external time sources, such as GPS, based on SOME/IP messages. -* REQ_0011: the score::time shall maintain the current synchronized time and its synchronization status, to be able to provide the latest values by clients request. -* REQ_0012: the score::time feature shall provide a mechanism to access (read only) the current synchronized time from external time sources and its synchronization status. -* REQ_0013: the score::time feature shall provide a mechanism to log the internal state of the external time synchronization process, to be able to debug and diagnose the synchronization process. - -High precision Clock --------------------- - -* REQ_0014: the score::time feature shall provide a mechanism to access (read only) the high precision clock in nanoseconds precision. - *Use case:* such clocks might be used for time-critical applications, such as audio/video streaming, event logging, and diagnostics. - -Monotonic Clock ---------------- - -* REQ_0015: the score::time feature shall provide a mechanism to access (read only) to monotonic, not adjustable clock value, which is mapped from the known OS or HW clock. - - .. Backwards Compatibility .. ======================= @@ -230,14 +194,15 @@ How to Teach This .. Rejected Ideas .. ============== + .. Open Issues .. =========== + Glossary ======== .. _footnotes: - Footnotes ========= From 8456291de7f0ae10007f109d0c62e45e493c76a1 Mon Sep 17 00:00:00 2001 From: Valery Lavrov <valery.lavrov@bmw.de> Date: Mon, 11 Aug 2025 13:42:51 +0200 Subject: [PATCH 088/109] feature time: Add stakeholder requirements (#1600) * feature time: Add stakeholder requirements * feature:time: Update stakeholder requirements - Update requirements - Fix review comments * feature:time: Update stakeholder requirements * feature:time: Update stakeholder requirements * Fix review comments --- .../architecture/_assets}/data_flow.puml | 0 .../features/time/docs/requirements/index.rst | 207 ++++++++++++------ docs/features/time/index.rst | 2 +- docs/requirements/stakeholder/index.rst | 87 ++++++++ 4 files changed, 230 insertions(+), 66 deletions(-) rename docs/features/time/{ => docs/architecture/_assets}/data_flow.puml (100%) diff --git a/docs/features/time/data_flow.puml b/docs/features/time/docs/architecture/_assets/data_flow.puml similarity index 100% rename from docs/features/time/data_flow.puml rename to docs/features/time/docs/architecture/_assets/data_flow.puml diff --git a/docs/features/time/docs/requirements/index.rst b/docs/features/time/docs/requirements/index.rst index 0c3bb66c43..83423e4991 100644 --- a/docs/features/time/docs/requirements/index.rst +++ b/docs/features/time/docs/requirements/index.rst @@ -15,152 +15,229 @@ Requirements ############ -.. feat_req:: Time client PTP sync - :id: feat_req__time__trec_external_sync_ptp +Time Synchronization +^^^^^^^^^^^^^^^^^^^^ + +.. feat_req:: Vehicle Time synchronization + :id: feat_req__time__vehicle_time__sync_with_ptp :reqtype: Functional :security: NO :safety: QM - :satisfies: + :satisfies: stkh_req__time__vehicle_time__time_synchronization :status: valid - The **time client**, as part of score::time feature, shall synchronize the local clock with an external **time host** using the PTP protocol (IEEE 802.1AS). + The **score::time feature** shall synchronize the local clock with an external **Time Master** using the gPTP protocol (IEEE 802.1AS). -.. feat_req:: score::time metadata - :id: feat_req__time__time_metadata +.. feat_req:: Vehicle Time synchronization precision + :id: feat_req__time__vehicle_time__sync_precision :reqtype: Functional :security: NO :safety: QM - :satisfies: + :satisfies: stkh_req__time__vehicle_time__time_synchronization :status: valid - The score::time shall get the current synchronized time and its metadata from the **time host**. + The **score::time feature** shall synchronize the local time, see feat_req__time__vehicle_time__sync_with_ptp, base with **Time Master** within a defined + precision, based on the system setup. + + Note: + + * the particular target precision depends on the system setup + * for AVB nodes the maximum difference in the synchronized time between two AVB ports/ECUs while + both are in state SYNC, and could be 1 usec + * for non-AVB node the precision is relaxed, and could be 200-500 usec -.. feat_req:: score::time validation - :id: feat_req__time__time_validataion +.. feat_req:: Update the HW clock with Vehicle Time + :id: feat_req__time__vehicle_time__hw_synchronization :reqtype: Functional :security: NO :safety: QM - :satisfies: + :satisfies: stkh_req__time__vehicle_time__hw_clock_synchronization :status: valid - The score::time shall validate the current synchronized time, which was received from the **time host** and reflect the validation results in the time point status accordingly. - - Validation of the current synchronized time includes: - * checking the time point for loss of synchronization - * checking the time point for monotonicity - * checking the time point for instability, like time jumps to the past or to the future + The **score::time feature** shall synchronize the local HW clock, which is being used for timestamping ingress and egress network frames, to vehicle time. -.. feat_req:: score::time multiple applications - :id: feat_req__time__multiple_applications +.. feat_req:: Vehicle Time base API + :id: feat_req__time__vehicle_time__time_base_api :reqtype: Functional :security: NO :safety: QM - :satisfies: + :satisfies: stkh_req__time__vehicle_time__time_base_api :status: valid - The score::time feature shall provide a mechanism to access (read only) to the synchronized time and its status across multiple applications within one ECU. + The **score::time feature** shall provide an API to access the synchronized vehicle time. -.. feat_req:: score::time efficiency - :id: feat_req__time__client_efficiency +.. feat_req:: Vehicle Time base accuracy qualifier + :id: feat_req__time__vehicle_time__accuracy_qualifier_api :reqtype: Functional :security: NO :safety: QM - :satisfies: + :satisfies: stkh_req__time__vehicle_time__time_base_api :status: valid - The score::time feature shall provide an access to the synchronized time and its status, see feat_req__time__multiple_applications, in an efficient way without any additional overhead, like kernel calls, Resource manager involvement and so on. - *Use case:* frequent access to the current synchronized time and its metadata by multiple clients within one ECU. + The **score::time feature** shall provide an API to read the accuracy qualifier of the local synchronized time base. + + Note: qualifier shall reflect the accuracy of the local time base, e.g. + + * if it is synchronized to an external time source or not, + * are there any instabilities, like time jumps to the past or to the future + * does the time increase in a monotonic manner. +.. feat_req:: Vehicle Time base time point qualifier + :id: feat_req__time__vehicle_time__time_point_qualifier_api + :reqtype: Functional + :security: NO + :safety: ASIL-B + :satisfies: stkh_req__time__vehicle_time__time_base_api + :status: valid -.. feat_req:: score::time synchronization process metadata - :id: feat_req__time__sync_process_metadata + The **score::time feature** shall provide an API to read the time point qualifier of the local synchronized time base. + + Note: qualifier shall reflect if the time point could be treated as ASIL-B data or QM data + +.. feat_req:: Vehicle Time control flow + :id: feat_req__time__vehicle_time__control_flow :reqtype: Functional :security: NO :safety: QM :satisfies: :status: valid - The score::time feature shall provide a mechanism to access (read only) to the internal state of the synchronization process, see **Synchronization process metadata**, across multiple applications within one ECU. + The **score::time feature** shall provide an access its data via specified APIs in a fast and very efficient manner, + avoiding, if possible, kernel calls, resource manager involvement and so on. + + For APIs see: -.. feat_req:: score::time synchronization stat logging - :id: feat_req__time__sync_stat_logging + * feat_req__time__vehicle_time__time_base_api + * feat_req__time__vehicle_time__accuracy_qualifier_api + * feat_req__time__vehicle_time__time_point_qualifier_api + + *Use case:* frequent access to the current synchronized time and its metadata by multiple clients within one ECU. + +.. feat_req:: Vehicle Time synchronization logging + :id: feat_req__time__vehicle_time__sync_logging :reqtype: Functional :security: NO :safety: QM - :satisfies: + :satisfies: stkh_req__dev_experience__debugging :status: valid - The score::time shall provide a mechanism to log the internal state of the synchronization process, see **Synchronization process metadata**, to be able to debug and diagnose the time synchronization process. - *Use case:* Debugging and diagnostics of the time synchronization process. + The **score::time feature** shall provide a mechanism to log the internal state of the synchronization process, + to be able to debug and diagnose the synchronization process. + *Use case:* Debugging and diagnostics of the time synchronization process. -External Time Synchronization -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Time Synchronization to absolute external sources +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. feat_req:: score::time external synchronization - :id: feat_req__time__external_sync + :id: feat_req__time__absolute_time_syncronization :reqtype: Functional - :security: NO + :security: YES :safety: QM - :satisfies: + :satisfies: stkh_req__time__absolute_time__time_synchronization :status: valid - The score::time feature shall support synchronization with external time sources, such as GPS, based on SOME/IP messages. + The **score::time feature** shall support synchronization with external time sources, such as UTC time from GPS. -.. feat_req:: score::time external synchronization status - :id: feat_req__time__external_sync_status +.. feat_req:: Absolute Time base API + :id: stkh_req__time__external_timebase_api :reqtype: Functional - :security: NO + :security: YES :safety: QM - :satisfies: + :satisfies: stkh_req__time__absolute_time__time_base_api :status: valid - The score::time shall maintain the current synchronized time and its synchronization status, to be able to provide the latest values by clients request. + The **score::time feature** shall provide an API to read the absolute time base, synchronized to external time sources. -.. feat_req:: score::time external synchronization time - :id: feat_req__time__external_sync_time +.. feat_req:: Absolute Time base accuracy qualifier + :id: stkh_req__time__external_timebase_accuracy_qualifier :reqtype: Functional - :security: NO + :security: YES :safety: QM - :satisfies: + :satisfies: stkh_req__time__absolute_time__time_base_api :status: valid - The score::time feature shall provide a mechanism to access (read only) the current synchronized time from external time sources and its synchronization status. + The **score::time feature** shall provide an API to read accuracy qualifier of the absolute time base, synchronized to external time sources. + + Note: the inaccuracy could be indicated in the following manner + + * Inaccuracy higher than 24h + * Inaccuracy less than 24h + * Inaccuracy less than 1h + * Inaccuracy less than 15min + * Inaccuracy less than 60s + * Inaccuracy less than 10s + * Inaccuracy less than 1s + * Inaccuracy less than 500ms + * Inaccuracy less than 100ms + * Inaccuracy less than 50ms + * Inaccuracy less than 10ms + * Inaccuracy not available + +.. feat_req:: Absolute Time base security qualifier + :id: stkh_req__time__external_timebase_security_qualifier + :reqtype: Functional + :security: YES + :safety: QM + :satisfies: stkh_req__time__absolute_time__time_base_api + :status: valid + + The **score::time feature** shall provide an API to read security qualifier of the absolute time base, synchronized to external time sources. + + Note: the security level might be indicated in the following steps + + * No time available + * Time not trustworthy + * Time trustworthy + * Time very trustworthy -.. feat_req:: score::time external synchronization status log +.. feat_req:: Absolute Time synchronization status log :id: feat_req__time__external_sync_status_log :reqtype: Functional :security: NO :safety: QM - :satisfies: + :satisfies: stkh_req__dev_experience__debugging :status: valid - The score::time feature shall provide a mechanism to log the internal state of the external time synchronization process, to be able to debug and diagnose the synchronization process. - + The **score::time feature** shall provide a mechanism to log the internal state of the absolute time synchronization process, + to be able to debug and diagnose the synchronization process. -High precision Clock +Local Clock ^^^^^^^^^^^^^^^^^^^^ -.. feat_req:: score::time high precision clock - :id: feat_req__time__high_precision_clock +.. feat_req:: High precision clock API + :id: feat_req__time__local_time__high_precision_clock_api :reqtype: Functional :security: NO :safety: QM - :satisfies: + :satisfies: stkh_req__time__local_time__high_precision_clock_api :status: valid - The score::time feature shall provide a mechanism to access (read only) the high precision clock in nanoseconds precision. + The **score::time feature** shall provide an API to read the high precision clock in nanoseconds precision. + + Note: to which clock the high precision clock is mapped, depends on the system design. + *Use case:* such clocks might be used for time-critical applications, such as audio/video streaming, event logging, and diagnostics. +.. feat_req:: Monotonic clock API + :id: feat_req__time__local_time__monotonic_clock_api + :reqtype: Functional + :security: NO + :safety: QM + :satisfies: stkh_req__time__local_time__monotonic_clock_api + :status: valid -Monotonic Clock -^^^^^^^^^^^^^^^ + The **score::time feature** shall provide an API to read monotonic, not adjustable clock value. -.. feat_req:: score::time monotonic clock - :id: feat_req__time__monotonic_clock +Testability +^^^^^^^^^^^^ + +.. feat_req:: score::time mocking APIs implementation + :id: feat_req__time__apis_mocking :reqtype: Functional :security: NO :safety: QM - :satisfies: + :satisfies: stkh_req__dev_experience__mockup_public_apis :status: valid - The score::time feature shall provide a mechanism to access (read only) to monotonic, not adjustable clock value, which is mapped from the known OS or HW clock. + The **score::time feature** shall provide support for mocking its public interfaces, enabling unit, + component and integration testing of applications. diff --git a/docs/features/time/index.rst b/docs/features/time/index.rst index 00b3ee2e2c..abbd42762b 100644 --- a/docs/features/time/index.rst +++ b/docs/features/time/index.rst @@ -156,7 +156,7 @@ Data which is provided by the **time client** and includes the current synchroni The diagram bellow illustrates the data flow and interactions between the Time client, score::time middleware, and client applications within an ECU during PTP-based time synchronization. -.. uml:: data_flow.puml +.. uml:: architecture/_assets/data_flow.puml :caption: Data flow between time client, score::time, and clients Where diff --git a/docs/requirements/stakeholder/index.rst b/docs/requirements/stakeholder/index.rst index 4a22a6feac..a53a633587 100644 --- a/docs/requirements/stakeholder/index.rst +++ b/docs/requirements/stakeholder/index.rst @@ -566,6 +566,83 @@ Communication * Diagnostic trouble codes * Diagnostic jobs +Time +---- + +.. stkh_req:: Vehicle Time base Synchronization + :id: stkh_req__time__vehicle_time__time_synchronization + :reqtype: Functional + :security: NO + :safety: QM + :rationale: Enables the system to compare events chronologically. + :status: valid + + The software platform shall provide a time synchronization framework to synchronize its clock + to Time Master within the vehicle. + +.. stkh_req:: Vehicle Time base API + :id: stkh_req__time__vehicle_time__time_base_api + :reqtype: Functional + :security: NO + :safety: QM + :rationale: Enables an application to correlate its data with a vehicle-internal time reference for event timestamp and chronological events comparison. + :status: valid + + The software platform shall provide access to synchronized vehicle time. + +.. stkh_req:: Synchrnize the HW clock with Vehicle Time + :id: stkh_req__time__vehicle_time__hw_clock_synchronization + :reqtype: Functional + :security: NO + :safety: QM + :rationale: Enables the system to compare events from different ECUs chronologically, using the same time base for timestamping ingress and egress frames. + :status: valid + + The software platform shall synchronize the local HW clock to vehicle time. + +.. stkh_req:: Time Synchronization with absolute external time sources + :id: stkh_req__time__absolute_time__time_synchronization + :reqtype: Functional + :security: YES + :safety: QM + :rationale: Enables the system to validate a certificate or token with temporal validity conditions, adding a UTC-timestamp to a data set. + :status: valid + + The software platform shall provide a framework to synchronize the clock to external-to-vehicle absolute time base (UTC). + +.. stkh_req:: Absolute time base API + :id: stkh_req__time__absolute_time__time_base_api + :reqtype: Functional + :security: YES + :safety: QM + :rationale: Enables an application to correlate its data with an absolute vehicle-external time reference for event timestamping and chronological events comparison. + :status: valid + + The software platform shall provide access to the absolute time base, synchronized with external time sources. + +.. stkh_req:: Local High precision Clock API + :id: stkh_req__time__local_time__high_precision_clock_api + :reqtype: Functional + :security: NO + :safety: QM + :rationale: Enables an application to get the current system time, which is essential for time-sensitive operations and event scheduling, via common, mockable and standardized API. + :status: valid + + The software platform shall provide access to the current high precision clock from the system time provider in nanoseconds. + + Note: to which clock the high precision clock is mapped, depends on the system design. + +.. stkh_req:: Local Monotonic Clock API + :id: stkh_req__time__local_time__monotonic_clock_api + :reqtype: Functional + :security: NO + :safety: QM + :rationale: Enables an application to get the current system time, which is essential for time-sensitive operations and event scheduling, via common, mockable and standardized API. + :status: valid + + The software platform shall provide access to the current monotonic clock from the system time provider. + + Note: to which clock the monotonic clock is mapped, depends on the system design. AI Platform ----------- @@ -919,6 +996,16 @@ Developer experience The software platform shall provide a method and interface to enable debugging of the software on target and in vehicle. +.. stkh_req:: Mockup implementation for application testing + :id: stkh_req__dev_experience__mockup_public_apis + :reqtype: Functional + :security: NO + :safety: QM + :rationale: Enables unit, component and integration testing for both platform related and non-platform related applications. + :status: valid + + The software platform shall provide support for mocking its public interfaces, + enabling unit, component and integration testing of applications. .. stkh_req:: Programming languages for application development :id: stkh_req__dev_experience__prog_languages From 38d73af212b2a296fc20a9310fae1750fe20ddef Mon Sep 17 00:00:00 2001 From: qor-lb <lars.bauhofer@qorix.ai> Date: Mon, 11 Aug 2025 19:18:00 +0200 Subject: [PATCH 089/109] docs: feature time - cleaned up requirements - fixed id length and folder structure - removed hw requirements --- .../architecture => }/_assets/data_flow.puml | 0 .../features/time/docs/requirements/index.rst | 79 ++++++++----------- docs/features/time/index.rst | 7 +- docs/requirements/stakeholder/index.rst | 18 ++--- 4 files changed, 45 insertions(+), 59 deletions(-) rename docs/features/time/{docs/architecture => }/_assets/data_flow.puml (100%) diff --git a/docs/features/time/docs/architecture/_assets/data_flow.puml b/docs/features/time/_assets/data_flow.puml similarity index 100% rename from docs/features/time/docs/architecture/_assets/data_flow.puml rename to docs/features/time/_assets/data_flow.puml diff --git a/docs/features/time/docs/requirements/index.rst b/docs/features/time/docs/requirements/index.rst index 83423e4991..2151e5e4ad 100644 --- a/docs/features/time/docs/requirements/index.rst +++ b/docs/features/time/docs/requirements/index.rst @@ -19,59 +19,49 @@ Time Synchronization ^^^^^^^^^^^^^^^^^^^^ .. feat_req:: Vehicle Time synchronization - :id: feat_req__time__vehicle_time__sync_with_ptp + :id: feat_req__time__vehicle_time_sync :reqtype: Functional :security: NO :safety: QM - :satisfies: stkh_req__time__vehicle_time__time_synchronization + :satisfies: stkh_req__time__vehicle_time_sync :status: valid The **score::time feature** shall synchronize the local clock with an external **Time Master** using the gPTP protocol (IEEE 802.1AS). .. feat_req:: Vehicle Time synchronization precision - :id: feat_req__time__vehicle_time__sync_precision + :id: feat_req__time__vehicle_time_sync_prec :reqtype: Functional :security: NO :safety: QM - :satisfies: stkh_req__time__vehicle_time__time_synchronization + :satisfies: stkh_req__time__vehicle_time_sync :status: valid - The **score::time feature** shall synchronize the local time, see feat_req__time__vehicle_time__sync_with_ptp, base with **Time Master** within a defined + The **score::time feature** shall synchronize the local time, see feat_req__time__vehicle_time__sync, base with **Time Master** within a defined precision, based on the system setup. Note: * the particular target precision depends on the system setup * for AVB nodes the maximum difference in the synchronized time between two AVB ports/ECUs while - both are in state SYNC, and could be 1 usec + both are in state SYNC, and could be 1 usec * for non-AVB node the precision is relaxed, and could be 200-500 usec -.. feat_req:: Update the HW clock with Vehicle Time - :id: feat_req__time__vehicle_time__hw_synchronization - :reqtype: Functional - :security: NO - :safety: QM - :satisfies: stkh_req__time__vehicle_time__hw_clock_synchronization - :status: valid - - The **score::time feature** shall synchronize the local HW clock, which is being used for timestamping ingress and egress network frames, to vehicle time. - .. feat_req:: Vehicle Time base API - :id: feat_req__time__vehicle_time__time_base_api + :id: feat_req__time__vehicle_time_time_api :reqtype: Functional :security: NO :safety: QM - :satisfies: stkh_req__time__vehicle_time__time_base_api + :satisfies: stkh_req__time__vehicle_time_api :status: valid The **score::time feature** shall provide an API to access the synchronized vehicle time. .. feat_req:: Vehicle Time base accuracy qualifier - :id: feat_req__time__vehicle_time__accuracy_qualifier_api + :id: feat_req__time__vehicle_time_acc_qual_api :reqtype: Functional :security: NO :safety: QM - :satisfies: stkh_req__time__vehicle_time__time_base_api + :satisfies: stkh_req__time__vehicle_time_api :status: valid The **score::time feature** shall provide an API to read the accuracy qualifier of the local synchronized time base. @@ -83,11 +73,11 @@ Time Synchronization * does the time increase in a monotonic manner. .. feat_req:: Vehicle Time base time point qualifier - :id: feat_req__time__vehicle_time__time_point_qualifier_api + :id: feat_req__time__vehicle_time_time_pt_qual :reqtype: Functional :security: NO - :safety: ASIL-B - :satisfies: stkh_req__time__vehicle_time__time_base_api + :safety: ASIL_B + :satisfies: stkh_req__time__vehicle_time_api :status: valid The **score::time feature** shall provide an API to read the time point qualifier of the local synchronized time base. @@ -95,11 +85,11 @@ Time Synchronization Note: qualifier shall reflect if the time point could be treated as ASIL-B data or QM data .. feat_req:: Vehicle Time control flow - :id: feat_req__time__vehicle_time__control_flow + :id: feat_req__time__vehicle_time_ctrl_flow :reqtype: Functional :security: NO :safety: QM - :satisfies: + :satisfies: stkh_req__time__vehicle_time_api :status: valid The **score::time feature** shall provide an access its data via specified APIs in a fast and very efficient manner, @@ -107,14 +97,14 @@ Time Synchronization For APIs see: - * feat_req__time__vehicle_time__time_base_api - * feat_req__time__vehicle_time__accuracy_qualifier_api - * feat_req__time__vehicle_time__time_point_qualifier_api + * feat_req__time__vehicle_time__time_api + * feat_req__time__vehicle_time__acc_qual_api + * feat_req__time__vehicle_time__time_pt_qual *Use case:* frequent access to the current synchronized time and its metadata by multiple clients within one ECU. .. feat_req:: Vehicle Time synchronization logging - :id: feat_req__time__vehicle_time__sync_logging + :id: feat_req__time__vehicle_time_sync_log :reqtype: Functional :security: NO :safety: QM @@ -126,39 +116,40 @@ Time Synchronization *Use case:* Debugging and diagnostics of the time synchronization process. + Time Synchronization to absolute external sources ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. feat_req:: score::time external synchronization - :id: feat_req__time__absolute_time_syncronization + :id: feat_req__time__abs_sync :reqtype: Functional :security: YES :safety: QM - :satisfies: stkh_req__time__absolute_time__time_synchronization + :satisfies: stkh_req__time__absolute_time_sync :status: valid The **score::time feature** shall support synchronization with external time sources, such as UTC time from GPS. .. feat_req:: Absolute Time base API - :id: stkh_req__time__external_timebase_api + :id: feat_req__time__abs_base_api :reqtype: Functional :security: YES :safety: QM - :satisfies: stkh_req__time__absolute_time__time_base_api + :satisfies: stkh_req__time__absolute_time_api :status: valid The **score::time feature** shall provide an API to read the absolute time base, synchronized to external time sources. .. feat_req:: Absolute Time base accuracy qualifier - :id: stkh_req__time__external_timebase_accuracy_qualifier + :id: feat_req__time__abs_acc_qual :reqtype: Functional :security: YES :safety: QM - :satisfies: stkh_req__time__absolute_time__time_base_api + :satisfies: stkh_req__time__absolute_time_api :status: valid The **score::time feature** shall provide an API to read accuracy qualifier of the absolute time base, synchronized to external time sources. - Note: the inaccuracy could be indicated in the following manner + Note: the inaccuracy could be indicated in the following manner * Inaccuracy higher than 24h * Inaccuracy less than 24h @@ -174,11 +165,11 @@ Time Synchronization to absolute external sources * Inaccuracy not available .. feat_req:: Absolute Time base security qualifier - :id: stkh_req__time__external_timebase_security_qualifier + :id: feat_req__time__abs_sec_qual :reqtype: Functional :security: YES :safety: QM - :satisfies: stkh_req__time__absolute_time__time_base_api + :satisfies: stkh_req__time__absolute_time_api :status: valid The **score::time feature** shall provide an API to read security qualifier of the absolute time base, synchronized to external time sources. @@ -191,7 +182,7 @@ Time Synchronization to absolute external sources * Time very trustworthy .. feat_req:: Absolute Time synchronization status log - :id: feat_req__time__external_sync_status_log + :id: feat_req__time__abs_sync_log :reqtype: Functional :security: NO :safety: QM @@ -205,11 +196,11 @@ Local Clock ^^^^^^^^^^^^^^^^^^^^ .. feat_req:: High precision clock API - :id: feat_req__time__local_time__high_precision_clock_api + :id: feat_req__time__high_prec_clock_api :reqtype: Functional :security: NO :safety: QM - :satisfies: stkh_req__time__local_time__high_precision_clock_api + :satisfies: stkh_req__time__high_precision_clock_api :status: valid The **score::time feature** shall provide an API to read the high precision clock in nanoseconds precision. @@ -219,11 +210,11 @@ Local Clock *Use case:* such clocks might be used for time-critical applications, such as audio/video streaming, event logging, and diagnostics. .. feat_req:: Monotonic clock API - :id: feat_req__time__local_time__monotonic_clock_api + :id: feat_req__time__monotonic_clock_api :reqtype: Functional :security: NO :safety: QM - :satisfies: stkh_req__time__local_time__monotonic_clock_api + :satisfies: stkh_req__time__monotonic_clock_api :status: valid The **score::time feature** shall provide an API to read monotonic, not adjustable clock value. @@ -232,7 +223,7 @@ Testability ^^^^^^^^^^^^ .. feat_req:: score::time mocking APIs implementation - :id: feat_req__time__apis_mocking + :id: feat_req__time__mocking_apis :reqtype: Functional :security: NO :safety: QM diff --git a/docs/features/time/index.rst b/docs/features/time/index.rst index abbd42762b..2e41ac7f3b 100644 --- a/docs/features/time/index.rst +++ b/docs/features/time/index.rst @@ -156,7 +156,7 @@ Data which is provided by the **time client** and includes the current synchroni The diagram bellow illustrates the data flow and interactions between the Time client, score::time middleware, and client applications within an ECU during PTP-based time synchronization. -.. uml:: architecture/_assets/data_flow.puml +.. uml:: _assets/data_flow.puml :caption: Data flow between time client, score::time, and clients Where @@ -201,8 +201,3 @@ How to Teach This Glossary ======== - - -.. _footnotes: -Footnotes -========= diff --git a/docs/requirements/stakeholder/index.rst b/docs/requirements/stakeholder/index.rst index a53a633587..41e3581e2c 100644 --- a/docs/requirements/stakeholder/index.rst +++ b/docs/requirements/stakeholder/index.rst @@ -570,7 +570,7 @@ Time ---- .. stkh_req:: Vehicle Time base Synchronization - :id: stkh_req__time__vehicle_time__time_synchronization + :id: stkh_req__time__vehicle_time_sync :reqtype: Functional :security: NO :safety: QM @@ -581,7 +581,7 @@ Time to Time Master within the vehicle. .. stkh_req:: Vehicle Time base API - :id: stkh_req__time__vehicle_time__time_base_api + :id: stkh_req__time__vehicle_time_api :reqtype: Functional :security: NO :safety: QM @@ -590,8 +590,8 @@ Time The software platform shall provide access to synchronized vehicle time. -.. stkh_req:: Synchrnize the HW clock with Vehicle Time - :id: stkh_req__time__vehicle_time__hw_clock_synchronization +.. stkh_req:: Synchronize the HW clock with Vehicle Time + :id: stkh_req__time__hw_clock_sync :reqtype: Functional :security: NO :safety: QM @@ -600,8 +600,8 @@ Time The software platform shall synchronize the local HW clock to vehicle time. -.. stkh_req:: Time Synchronization with absolute external time sources - :id: stkh_req__time__absolute_time__time_synchronization +.. stkh_req:: Time Synchronization with external sources + :id: stkh_req__time__absolute_time_sync :reqtype: Functional :security: YES :safety: QM @@ -611,7 +611,7 @@ Time The software platform shall provide a framework to synchronize the clock to external-to-vehicle absolute time base (UTC). .. stkh_req:: Absolute time base API - :id: stkh_req__time__absolute_time__time_base_api + :id: stkh_req__time__absolute_time_api :reqtype: Functional :security: YES :safety: QM @@ -621,7 +621,7 @@ Time The software platform shall provide access to the absolute time base, synchronized with external time sources. .. stkh_req:: Local High precision Clock API - :id: stkh_req__time__local_time__high_precision_clock_api + :id: stkh_req__time__high_precision_clock_api :reqtype: Functional :security: NO :safety: QM @@ -633,7 +633,7 @@ Time Note: to which clock the high precision clock is mapped, depends on the system design. .. stkh_req:: Local Monotonic Clock API - :id: stkh_req__time__local_time__monotonic_clock_api + :id: stkh_req__time__monotonic_clock_api :reqtype: Functional :security: NO :safety: QM From bc7305b894649a056ae2f03e2098a7d036ea2b4d Mon Sep 17 00:00:00 2001 From: Alexander Lanin <Alexander.Lanin@etas.com> Date: Mon, 1 Sep 2025 13:47:40 +0200 Subject: [PATCH 090/109] Update Bazel dependencies and clean up Sphinx configuration (#1686) --- MODULE.bazel | 4 ++-- docs/conf.py | 54 +++++----------------------------------------------- 2 files changed, 7 insertions(+), 51 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 840ea64dc1..5208cade05 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -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.1") -bazel_dep(name = "score_docs_as_code", version = "1.1.0") +bazel_dep(name = "score_tooling", version = "1.0.2") +bazel_dep(name = "score_docs_as_code", version = "1.2.0") bazel_dep(name = "score_process", version = "1.1.2") diff --git a/docs/conf.py b/docs/conf.py index b428b2afde..811a1a3167 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -12,60 +12,16 @@ # ******************************************************************************* # Configuration file for the Sphinx documentation builder. -# -# For the full list of built-in configuration values, see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -# -- Project information ----------------------------------------------------- -# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information project = "S-CORE" project_url = "https://eclipse-score.github.io/score" project_prefix = "S-CORE_" -author = "S-CORE" -release = "0.1" - -version = release -# -- General configuration --------------------------------------------------- -# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration +version = "0.1" extensions = [ - "sphinx_design", - "sphinx_needs", + # TODO: remove plantuml here once + # https://github.com/useblocks/sphinx-needs/pull/1508 is merged and docs-as-code + # is updated with new sphinx-needs version "sphinxcontrib.plantuml", - "score_plantuml", - "score_metamodel", - "score_draw_uml_funcs", - "score_source_code_linker", - "score_layout", - "score_header_service", -] - -exclude_patterns = [ - # The following entries are not required when building the documentation - # via 'bazel build //docs:docs', as that command runs in a sandboxed environment. - # However, when building the documentation via 'sphinx-build' or esbonio, - # these entries are required to prevent the build from failing. + "score_sphinx_bundle", ] - -templates_path = ["_templates"] - -# Enable numref -numfig = True - - -# -- sphinx-needs configuration -------------------------------------------- -# Setting the needs layouts -needs_template_folder = "_templates" -html_static_path = ["_assets"] -needs_global_options = {"collapse": True} -needs_string_links: dict[str, dict[str, object]] = { - "source_code_linker": { - "regex": r"(?P<value>[^,]+)", - "link_url": "{{value}}", - "link_name": "Source Code Link", - "options": ["source_code_link"], - }, -} -# This ensures all needs that are imported show up in the build 'needs.json' -needs_builder_filter = "" From b212de2cd1f30868ae515f089207cfebeeeb9c0a Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres <frank.scholter_peres@mercedes-benz.com> Date: Wed, 3 Sep 2025 07:52:26 +0200 Subject: [PATCH 091/109] fix: #1623 removed line of the election --- docs/platform_management_plan/project_management.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/platform_management_plan/project_management.rst b/docs/platform_management_plan/project_management.rst index 20ddcdde67..63308b906a 100644 --- a/docs/platform_management_plan/project_management.rst +++ b/docs/platform_management_plan/project_management.rst @@ -40,7 +40,6 @@ Steering of the project is done by two committees: *project lead circle* and *te * Definition, discussion of and decisions about strategical topics (e.g. which associations to approach, confirmation of roadmap, representation in public). * Decision on which new software modules should be added or removed from the project. The decision is done based on proposal from the *Technical lead circle*. In case of changes to the existing modules and no concordant decision in the *Technical Lead Circle*, the *Project Lead Circle* has to decide about the change. - * Election of new Project Leads. * Election of Technical Leads. * Last instance of escalation path. From f8ee55add5618a169058752bf25e167f88d38c00 Mon Sep 17 00:00:00 2001 From: "armin.bartsch" <armin.bartsch@accenture.com> Date: Tue, 2 Sep 2025 17:10:14 +0200 Subject: [PATCH 092/109] FEO: Move S-CORE v1.0 features to own section in feature description closes: #1081 Change-Id: I1c26532e916cec3d78abe9feebc359dd916a272e --- docs/features/frameworks/feo/index.rst | 160 +++++++++++++++---------- 1 file changed, 100 insertions(+), 60 deletions(-) diff --git a/docs/features/frameworks/feo/index.rst b/docs/features/frameworks/feo/index.rst index ab8170d4e2..b01b5ac5dd 100644 --- a/docs/features/frameworks/feo/index.rst +++ b/docs/features/frameworks/feo/index.rst @@ -342,7 +342,7 @@ Executor and Agents * The coordinating entity in the primary process is the "executor" * The executor coordinates the invocation of the activities in the order as described above -* As a central entity the executor is able to trace, record or monitor the +* As a central entity, the executor is able to trace and monitor the system behavior as sequence of activity invocations (see below) * The actual activity invocation is done by an "agent" * The agent exists in each process belonging to an application @@ -351,9 +351,82 @@ Executor and Agents executes them in its local process on behalf of the executor -External state +Tracing +======= + +* The framework can make use of the tracing API (feo::tracing) to trace + the program flow, mainly for debugging purposes. +* The tracing events generated by the tracing API can be recorded for later + inspection e.g. using a UI like Google Perfetto or Eclipse TraceCompass. + + +Performance +=========== + +The framework is designed to ensure deterministic execution order and +timing of activities, supporting safety-critical applications +in the automotive domain. In this domain the footprint of the framework is crucial especially +w.r.t impact of computation load and latency. + + +.. |example_task_chain| image:: _assets/example_task_chain.png + +.. |example_task_chain_5_threads| image:: _assets/example_task_chain_5_threads.png + +.. |example_task_chain_3_threads_optimized| image:: _assets/example_task_chain_3_threads_optimized.png + +.. |example_task_chain_3_threads_dynamic| image:: _assets/example_task_chain_3_threads_dynamic.png + + +Error Handling ============== +Possible error cases during the different FEO life cycle states shall be handled as follows. For now, the +descriptions are focussed on the intended implementation for S-CORE v0.5. Potential adaptations for +S-CORE v1.0 have been noted down in the next Section. + +* Independent of state + - If the primary process dies, the external lifecycle management shall kill all dependent processes. + - If a secondary process dies, the lifecycle management shall send a termination signal to the primary process. + The primary process shall call the shutdown function of all remaining activities in arbitrary sequence and + terminate itself. + +* State: Lifecycle Manager creates all processes (primary & secondaries) + - If not all secondaries connect to the primary in time, the primary will terminate itself. + The startup functions shall not be triggered. + +* State: Lifecycle Manager has created all processes (primary & secondaries), all secondaries have connected to the primary + - If an error occurs during the execution of a startup function, the primary process shall abort calling startup functions + and terminate itself. For all of the activities whose startup functions have already been called successfully, + the corresponding shutdown functions shall be executed in arbitrary sequence. + - During initialization (i.e. in the startup function of an activity), activities shall check for resource allocation + and report an error to the executor in case of failure. + - If a timeout occurs during startup, stepping or shutdown of an activity, the primary process shall shutdown + all successfully started activities in arbitrary sequence and terminate itself. + - If not all activities reach their initialized state within a certain period of time (startup timeout), + the primary process shall shutdown all successfully started activities in arbitrary sequence and terminate itself. + +* State: Lifecycle Manager has created all processes (primary & secondaries), all secondaries have connected to the primary, all activities have been started up successfully + - If an activity fails in the step function, the primary process shall call shutdown for all activities in + arbitrary sequence and terminate itself. + - If activities do not meet their intermediate (time/memory/cpu-) budgets the issue shall be detected and handled + outside of FEO. (Resource supervision and quotas will be defined in a separate feature request, if needed.) + +* State: Shutdown of activities + - If an activity fails in the shutdown function, the primary process shall shutdown all remaining activities + and terminate itself. + + +Extended features for S-CORE v1.0 +================================= + +The following features will not be implemented as part of S-CORE v0.5, but have been noted down as potential extensions +for v1.0. They shall be considered as drafts only. + + +External state +'''''''''''''' + * Depending on the reprocessing scenario (see below) it might be necessary to put the activities into a well defined state. This can either be done by providing all the input to the activities which they need to get @@ -369,9 +442,12 @@ External state then potentially manipulate the state based on their inputs and then store it back for the next task chain invocation + Recording -========= +''''''''' +* As a central entity, the executor is able to record the system behavior as sequence + of activity invocations. * The framework can record all messages going over its communication topics * For each message the recording includes: @@ -394,7 +470,7 @@ Recording Reprocessing -============ +'''''''''''' * There are multiple possible reprocessing scenarios, for example: @@ -417,39 +493,8 @@ Reprocessing - Providing time via its time API as recorded -Tracing -======= - -* The framework can make use of the tracing API (feo::tracing) to trace - the program flow, mainly for debugging purposes. -* The tracing events generated by the tracing API can be recorded for later - inspection e.g. using a UI like Google Perfetto or Eclipse TraceCompass. - - -Performance -=========== - -The framework is designed to ensure deterministic execution order and -timing of activities, supporting safety-critical applications -in the automotive domain. In this domain the footprint of the framework is crucial especially -w.r.t impact of computation load and latency. - - -.. |example_task_chain| image:: _assets/example_task_chain.png - -.. |example_task_chain_5_threads| image:: _assets/example_task_chain_5_threads.png - -.. |example_task_chain_3_threads_optimized| image:: _assets/example_task_chain_3_threads_optimized.png - -.. |example_task_chain_3_threads_dynamic| image:: _assets/example_task_chain_3_threads_dynamic.png - - -Error Handling for S-CORE v0.5 -============================== - -Possible error cases during the different FEO life cycle states shall be handled as follows. For now, the -descriptions are focussed on the intended implementation for S-CORE v0.5. Potential adaptations for -S-CORE v1.0 have been noted down, but shall be considered as drafts only. +Extended Error Handling +''''''''''''''''''''''' * Independent of state - If the primary process dies, the external lifecycle management shall kill all dependent processes. @@ -458,36 +503,31 @@ S-CORE v1.0 have been noted down, but shall be considered as drafts only. terminate itself. * State: Lifecycle Manager creates all processes (primary & secondaries) - - If not all secondaries connect to the primary in time, - - S-CORE v0.5: the primary will terminate itself. The startup functions shall not be triggered. - - S-CORE v1.0: the primary will not terminate, but report an error to the lifecycle/health management. - The startup functions shall not be triggered. + - If not all secondaries connect to the primary in time, the primary will not terminate, but report an error to the + lifecycle/health management. The startup functions shall not be triggered. * State: Lifecycle Manager has created all processes (primary & secondaries), all secondaries have connected to the primary - - If an error occurs during the execution of a startup function, - - S-CORE v0.5: the primary process shall abort calling startup functions - and terminate itself. For all of the activities whose startup functions have already been called successfully, - the corresponding shutdown functions shall be executed in arbitrary sequence. - - S-CORE v1.0: in addition, the primary process shall report the issue to health management. + - If an error occurs during the execution of a startup function, the primary process shall abort calling startup + functions and terminate itself. For all of the activities whose startup functions have already been called successfully, + the corresponding shutdown functions shall be executed in arbitrary sequence. + In addition, the primary process shall report the issue to health management. - During initialization (i.e. in the startup function of an activity), activities shall check for resource allocation and report an error to the executor in case of failure. - - If a timeout occurs during startup, stepping or shutdown of an activity, - - S-CORE v0.5: the primary process shall shutdown all successfully started activities in arbitrary sequence - and terminate itself. - - S-CORE v1.0: In addition, the primary process shall report the issue to health management. - - If not all activities reach their initialized state within a certain period of time (startup timeout), - - S-CORE v0.5: the primary process shall shutdown all successfully - started activities in arbitrary sequence and terminate itself. - - S-CORE v1.0: In addition, the primary process shall report the issue to health management. + - If a timeout occurs during startup, stepping or shutdown of an activity, the primary process shall shutdown all + successfully started activities in arbitrary sequence and terminate itself. + In addition, the primary process shall report the issue to health management. + - If not all activities reach their initialized state within a certain period of time (startup timeout), the + primary process shall shutdown all successfully started activities in arbitrary sequence and terminate itself. + In addition, the primary process shall report the issue to health management. * State: Lifecycle Manager has created all processes (primary & secondaries), all secondaries have connected to the primary, all activities have been started up successfully - - If an activity fails in the step function, - - S-CORE v0.5: the primary process shall call shutdown for all activities in arbitrary sequence and terminate itself. - - S-CORE v1.0: In addition, a logical waypoint error shall be reported to health management. + - If an activity fails in the step function, the primary process shall call shutdown for all activities in + arbitrary sequence and terminate itself. + In addition, a logical waypoint error shall be reported to health management. - If activities do not meet their intermediate (time/memory/cpu-) budgets the issue shall be detected and handled outside of FEO. (Resource supervision and quotas will be defined in a separate feature request, if needed.) * State: Shutdown of activities - - If an activity fails in the shutdown function, - - S-CORE v0.5: the primary process shall shutdown all remaining activities and terminate itself. - - S-CORE v1.0: In addition, a logical waypoint error shall be reported to health management. + - If an activity fails in the shutdown function, the primary process shall shutdown all remaining activities and + terminate itself. + In addition, a logical waypoint error shall be reported to health management. From 22dd3136c7947dbbfc014a21ac7424547b45728f Mon Sep 17 00:00:00 2001 From: Alexander Lanin <Alexander.Lanin@etas.com> Date: Mon, 8 Sep 2025 15:48:55 +0200 Subject: [PATCH 093/109] DR-001-Infra: Integration Strategy for External Development Tools (#1687) --- docs/design_decisions/DR-001-infra.md | 176 +++++++++++++++++++++++++ docs/design_decisions/DR-001-infra.rst | 16 --- 2 files changed, 176 insertions(+), 16 deletions(-) create mode 100644 docs/design_decisions/DR-001-infra.md delete mode 100644 docs/design_decisions/DR-001-infra.rst diff --git a/docs/design_decisions/DR-001-infra.md b/docs/design_decisions/DR-001-infra.md new file mode 100644 index 0000000000..923fc044a7 --- /dev/null +++ b/docs/design_decisions/DR-001-infra.md @@ -0,0 +1,176 @@ +<!-- +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-001-Infra: Integration Strategy for External Development Tools + +* **Status:** Agreed within Community +* **Owner:** Infrastructure Community +* **Date:** 2025-09-01 + +--- + +## 1. Context / Problem + +We use a broad set of tools (formatters, linters, static analyzers, code generators, license/SBOM and security scanners, doc builders) across multiple repositories. Today, tools are invoked via Bazel, IDEs, and CI with varying levels of pinning and caching. We need a standard approach that runs **identically** in CI, local CLI, and IDE/editor integrations, and that fits ISO 26262/ASPICE constraints (version pinning, determinism, long-term retention, offline path). + +## 2. Requirements + +1. **Version Pinning**: Identical tool versions across CLI/CI/IDE; no hidden network during execution; artifacts hash-pinned. +2. **Config Consistency**: Central baseline config; explicit, reviewable local overrides with drift detection. +3. **Performance**: Fast full and incremental runs; leverage remote cache/execution for heavy, Bazel-config-dependent tools. +4. **Offline & Retention**: Prefetch & store artifacts for ≥10 years; fully offline execution path. +5. **Platforms**: Ubuntu x86_64 + additional to be defined, e.g. Alpine, arm64 etc. +6. **Low Friction**: Minimal per-repo boilerplate; single invocation pattern; easy upgrades. +7. **Maintenance Effort**: Keep the system simple; avoid bespoke per-tool frameworks. + +### Assumptions + +- SCORE keeps the multirepo approach, therefore almost all tools only need to run on a single module at a time. + + +## 3. Options Considered + +### 3.1 Bazel Aspects +Graph-aware aspects perform analysis/formatting per target, running only on affected targets (others are cached). + +**Pros:** +- Efficient: Only runs on affected targets; remote execution possible. +- Config-aware: Linters run on correct configuration as selected via Bazel. + +**Cons:** +- Complexity: Limited know-how, higher maintenance. +- Performance: Slow in rare cases (large targets, per-target Python venvs, duplicate analysis). +- Coverage: Not all tools are packagable (e.g., `dot`, PlantUML); alternatives needed. +- IDE Integration: Aspects lack IDE/editor support; must be supplemented by other methods. + +### 3.2 Bazel Multitool +Centrally pinned binaries executed via `bazel run`. + +**Pros:** +- Simple and compatible with IDE use cases. + +**Cons:** +- No centralized config sharing or caching for slow tools. +- Not all tools are packagable (e.g., `dot`). +- Requires pre-execution setup (environment, dependencies). + +### 3.3 Bazel Rules & Other Bazel Integrations +Custom Bazel rules encapsulate tool invocations/configurations for deeper integration. + +**Pros:** +- Leverages Bazel caching and remote execution. +- Useful where aspects/multitool are unsuitable. + +**Cons:** +- Increased complexity in rule management. +- Typically not compatible with IDE usage. + +### 3.4 Devcontainer +Container image as authoritative tool distribution. + +**Pros:** +- Straightforward onboarding; well-known concept. +- IDE support out of the box. + +**Cons:** +- Large images can be slow on CI. +- Tools may implicitly use container content, not explicit dependencies. + +### 3.5 Native Host Installs +Rely on developer/CI host environment package managers. + +**Pros:** +- Fastest invocation; no wrapper overhead. + +**Cons:** +- No version pinning; unenforceable consistency and high drift. +- Requires native setup. + +## 4. Deep Dives + +### 4.1 Bazel Multitool + +We've invested enough time and energy into a solution with multitool to state that it is +a viable option. However, it requires significant effort and workarounds for tools that need +to be called directly from the IDE (for example, the Python binary). + +We cannot set Bazel commands as executable paths; editor integrations usually expect a direct executable, so a small local wrapper script per repository is required. Examples: `python`, `ruff`, `starpls`, `spellcheck`, `yamlfmt`. + +As multitool does not handle tool configuration, an additional solution is required per tool, which adds complexity. + +### 4.2 Tool Versioning + +For some tools keeping the version exactly the same is less important. Especially +extensions within VS Code typically come with their own bundled binaries. As long as +those are roughly the same version, slight inconsistencies between IDE and CI are +quite acceptable. + +Especially in language servers which are only available within the IDE and are not +strictly safety relevant, this is viable. + +### 4.3 Native Tools in CI + +As using bazel and devcontainer introduces significant overhead, it seems natural to use certain tools natively in CI. +e.g. using the same installation scripts in devcontainers and CI has proven viable in other projects. Or providing a smaller and more dedicated CI image. These approaches will be detailed in a follow-up DR. + +More interestingly there are cases where the exact version is less important (python) or +is managed outside bazel anyway (python requirements.txt files). In such cases native +installs have no disadvantages and are significantly easier (development) and faster (runtime). + + +## 5. Conclusion + +- **Devcontainer** is the primary distribution for all tools, ensuring consistency and ease of onboarding. +- The same devcontainer (possibly stripped down) is used in CI for reproducibility. +- **Bazel aspects** are used for tools that benefit from Bazel-config-dependent analysis or caching. Custom Bazel rules are possible but not actively pursued. +- For small/fast CI jobs, **native installs** are preferred due to speed, especially when version pinning is less critical (see Deep Dive 4.3). +- **Bazel multitool** is a viable alternative for those not using devcontainer, but maintaining it requires significant effort and is not currently feasible for SCORE. + + + +## Appendix: Tool Categories + +**Bazel-config-dependent & cacheable** +_Provided via Bazel aspects and devcontainer for IDE support_ +- Compilers (LLVM/Clang/GCC/… via toolchains) +- `clang-tidy`, `clang-analyzer` + +**Independent & Fast Code Analysis** +_Provided via devcontainer (pre-commit, IDE, CI)_ +- `ruff` (Python) +- `basedpyright` (Python) +- `actionlint` (GitHub Actions) +- `yamlfmt` (YAML) +- `spellcheck` (text) +- `buildifier` (Bazel) + +**Independent Tools** +_Provided via devcontainer_ +- IDE language servers: `rust-analyzer`, `clangd`, `starpls` +- `buildifier`, `bazel-compile-commands` +- `curl`, `qemu-system-aarch64`, `sshpass` (??) +- `protoc` +- `gcovr` + +**Not Natively Cacheable in Bazel** +_Provided via devcontainer_ +- Sphinx (incl. `sphinx-needs`, `PlantUML`, `graphviz`, and many dependencies) +- GraphQL (static code analysis) +- Eclipse Dash (license analysis) + +**System Dependencies** +_Must be provided via devcontainer_ +- `bazelisk` / `bazel` +- `git` +- `dot` diff --git a/docs/design_decisions/DR-001-infra.rst b/docs/design_decisions/DR-001-infra.rst deleted file mode 100644 index 77147983ed..0000000000 --- a/docs/design_decisions/DR-001-infra.rst +++ /dev/null @@ -1,16 +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 - # ******************************************************************************* - -DR-001-Infra: Placeholder -######################### From 5649cbf73035cfbe6f5d123701a696ec0ee19ee0 Mon Sep 17 00:00:00 2001 From: Alexander Lanin <Alexander.Lanin@etas.com> Date: Mon, 8 Sep 2025 16:06:28 +0200 Subject: [PATCH 094/109] DR-002-Infra: Integration Testing in a Distributed Monolith (#1689) --- docs/design_decisions/DR-002-infra.md | 372 ++++++++++++++++++++++++++ 1 file changed, 372 insertions(+) create mode 100644 docs/design_decisions/DR-002-infra.md diff --git a/docs/design_decisions/DR-002-infra.md b/docs/design_decisions/DR-002-infra.md new file mode 100644 index 0000000000..55b5c6b14e --- /dev/null +++ b/docs/design_decisions/DR-002-infra.md @@ -0,0 +1,372 @@ +<!-- +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-002-Infra: Integration Testing in a Distributed Monolith + +* **Status:** Agreed within Community +* **Owner:** Infrastructure Community +* **Date:** 2025-09-01 + +--- +## Executive Summary + +Large systems often span multiple repositories. Each repository can look “green” on its own, yet problems only show up when everything is combined. These late surprises slow down development and make debugging painful. + +The concept described here turns a collection of separate repositories into a system that behaves like a single, continuously tested whole — ensuring the main line is always integrable across all components. + +### Proposed Approach +- Every change in any repository is tested **in combination with the rest of the system**, not just in isolation. +- There are **two testing layers**: + - a **fast feedback loop** (lightweight tests that run on every pull request), + - and a **deeper validation** (heavier tests run after merges or on a schedule). +- This setup guarantees that developers can trust the system as a whole to consistently work. + +### Benefits +- Problems across repositories are caught early. +- Developers spend less time coordinating merges (“merge after me” scenarios disappear). +- The project always has a “known good” baseline to fall back on, enabling stability while still moving fast. + +Note: this concept is easily extendable to support multiple versions of S-CORE. But that's currently not required. + +--- +## Introduction + +Teams often split what is functionally a single system across many repositories. Each +repository can show a green build while the assembled system is already broken. This +article looks at how to bring system-level feedback earlier when you work that way. This +article does not argue for pull requests, trunk-based development, or continuous +integration itself. Those are well covered elsewhere. It also does not look into any +specific tools or implementations for achieving these practices - except for providing a +GitHub based example. + +The context here assumes three things: you develop through pull requests with required +checks; you have multiple interdependent repositories that ship together; and you either +have or will create a central integration repository used only for orchestration. If any +of those are absent you will need to establish them first; the rest of the discussion +builds on them. + +--- +## Motivation / Where Problems Usually Appear +An interface change (for example a renamed field in a shared schema) is updated in two +direct consumers. Their pull requests pass. Another consumer several repositories away +still depends on the old interface and only fails once the whole set of changes reaches +main and a later integration run executes. The defect was present early but only visible +late. Investigation now needs cross-repo log hunting instead of a quick fix while the +change was still in flight. + +Running full end-to-end environments on every pull request is rarely affordable. +Coordinated multi-repository changes are then handled informally through ad-hoc +ordering: “merge yours after mine”. Late detection raises cost and makes regression +origins harder to locate. + +--- +## Core Concepts +We model the integrated system as an explicit set of (component, commit) pairs captured +in a manifest. Manifests are derived deterministically from events: a single pull +request, a coordinated group of pull requests, or a post-merge refresh. A curated fast +subset of integration tests provides pre-merge feedback; a deeper suite runs after +merge. Passing suites produce a recorded manifest (“known good”). Coordinated +multi-repository change is treated as a first-class case—we validate the set as a unit +rather than relying on merge ordering. + +Terminology (brief): +* Component - repository that participates in the assembled product (e.g. service API + repo, shared library). +* Fast subset - curated integration tests finishing in single-digit minutes (protocol + seams, migration boundaries, adapters). +* Tuple - mapping of component names to commit SHAs for one integrated build (e.g. { + users: a1c3f9d, billing: 9e02b4c }). +* Known good - tuple + metadata (timestamp, suite, manifest hash) stored for later + reproduction. + +History & context: classic continuous integration assumed a single codebase; splitting +one system across repositories reintroduces coordination issues CI was intended to +remove. This adapts familiar CI principles (frequent integration, fast feedback, +reproducibility) to a multi-repository boundary. The central integration repository is a +neutral place to define participating components, build manifests, hold +integration-specific helpers (overrides, fixtures, seam tests), and persist known-good +records. It should not contain business logic; keeping it lean reduces accidental +coupling and simplifies review. + +--- +## Integration Workflows +We use three recurring workflows: a single pull request, a coordinated subset when +multiple pull requests must land together, and a post-merge fuller suite. Each produces +a manifest, runs an appropriate depth of tests, and may record the tuple if successful. + +### Visual Overview +```{mermaid} +flowchart TB + subgraph COMP[Component Repos] + pr[PR opened / updated<br/><event>]:::event --> comp_ci[Component tests]:::step + + trigger1[Merge to main<br/><event>]:::event + end + + subgraph INT[Integration Repo] + comp_ci --> |dispatch|detect_changeset[Detect multi repository PRs]:::step + knownGood[(Known good store)]:::artifact + + %% PR + detect_changeset --> buildMan[Build PR/PRs manifest using PR/PRs SHA + known good others]:::step + knownGood --> buildMan + buildMan --> runSubset[Run fast subset of integration tests]:::step + runSubset --> prFeedback[Provide Feedback in PR / all PRs]:::step + + %% Post-merge / scheduled full suite + trigger1 -->|dispatch| fullMan[Build full manifest from latest mains of all repos]:::step + trigger2[schedule<br/><event>]:::event --> fullMan + fullMan --> fullSuite[Run full integration test suite]:::step + fullSuite --> fullPass{Full suite pass?}:::decision + fullPass -->|Yes| knownGood + fullPass -->|No| issue["Create Issue<br>(or a more clever automated bisect solution)"]:::red + end +``` +*High-level flow of integration workflows. Known good store feeds manifest construction for single and coordinated paths; full test suite success updates the store.* + +### Single Pull Request +When a pull request opens or updates, its repository runs its normal fast tests. The +integration repository is also triggered with the repository name, pull request number, +and head SHA. It builds a manifest using that SHA for the changed component and the last +known-good SHAs for others, then runs the curated fast subset. The result is reported +back to the pull request. The manifest and logs are stored even when failing so a +developer can reproduce locally. + +The subset is explicit rather than dynamically inferred. Tests in it should fail quickly +when contracts or shared schemas drift. If the list grows until it is slow it will +either be disabled or ignored; regular curation keeps it useful. + +### Coordinated Multi-Repository Subset +Some changes require multiple repositories to move together (for example a schema +evolution, a cross-cutting refactor, a protocol tightening). We mark related pull +requests using a stable mechanism such as a common label (e.g. changeset:feature-x). The +integration workflow discovers all open pull requests sharing the label, builds a +manifest from their head SHAs, and runs the same fast subset. A unified status is posted +back to each pull request. None merge until the coordinated set is green. This removes +informal merge ordering as a coordination mechanism. + +### Post-Merge Full Suite +After merges we run a deeper suite. Some teams trigger on every push to main; others run +on a schedule (hourly seems to be a common practice). Per-merge runs localise failures +but cost more; batched runs save resources but expand the search space when problems +appear. When the suite fails, retaining the manifest lets you bisect between the last +known-good tuple and the current manifest (using a scripted search across the changed +SHAs if multiple components advanced). On success we append a record for the tuple with +a manifest hash and timing data. + +### Manifests +Manifests are minimal documents describing the composition. They allow reconstruction of +the integrated system later. + +Single pull request example: +``` +pr: 482 +component_under_test: + name: docs-as-code + repo: eclipse-score/docs-as-code + sha: 6bc901f2 +others: + - name: component-a + repo: eclipse-score/component-a + ref: 34985hf8 # based on last known-good + - name: component-b + repo: eclipse-score/component-b + ref: a4fd56re # based on last known-good +subset: pr_fast +timestamp: 2025-08-13T12:14:03Z +``` + +Coordinated example: +``` +components_under_test: + - name: users-service + repo: eclipse-score/users-service + branch: feature/new_email_index + ref: a57hrdfg + pr: 16 + - name: auth-service + repo: eclipse-score/auth-service + branch: feature/lenient-token-parser + ref: q928d46b75 + pr: 150 +others: + - name: billing-service + repo: eclipse-score/billing-service + ref: a4fd56re # based on last known-good +subset: pr_fast +changeset: feature-x +``` + +Large configuration belongs elsewhere; manifests should stay readable and diffable. + +--- +## Example: GitHub Actions (Conceptual) +*Conceptual outline; not yet implemented here.* + +Trigger from a component repository: +``` +name: integration-pr +on: [pull_request] +jobs: + dispatch: + runs-on: ubuntu-latest + steps: + - name: Dispatch to integration repo + uses: peter-evans/repository-dispatch@v3 + with: + token: ${{ secrets.INTEGRATION_TRIGGER_TOKEN }} + repository: eclipse-score/reference_integration + event-type: pr-integration + client-payload: >- + {"repo":"${{ github.repository }}","pr":"${{ github.event.pull_request.number }}","sha":"${{ github.sha }}"} +``` + +Integration repository receiver (subset): +``` +on: + repository_dispatch: + types: [pr-integration] +jobs: + pr-fast-subset: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Parse payload + run: echo '${{ toJson(github.event.client_payload) }}' > payload.json + + - name: Materialize composition + run: gen_pr_manifest.py last_known_good.yaml payload.json > manifest.pr.yaml + + - name: Render MODULE overrides + run: render_overrides.py manifest.pr.yaml > MODULE.override.bzl + + - name: Bazel test (subset) + run: bazel test //integration/subset:pr_fast --override_module_files=MODULE.override.bzl + + - name: Store manifest & results + uses: actions/upload-artifact@v4 + with: + name: pr-subset-${{ github.run_id }} + path: | + manifest.pr.yaml + bazel-testlogs/**/test.log +``` + +Post-merge full suite: +``` +on: + schedule: [{cron: "15 * * * *"}] + repository_dispatch: + types: [component-merged] +jobs: + full-suite: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Generate new last_known_good.yaml + run: update_last_known_good.py last_known_good.yaml > last_known_good.yaml + + - name: Bazel test (full) + run: bazel test //integration/full:all --test_tag_filters=-flaky + + - name: Persist known-good tuple (on success) + if: success() + run: | + git add last_known_good.yaml + git commit -m "update known good" + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: full-${{ github.run_id }} + path: | + bazel-testlogs/**/test.log +``` + +### Recording Known-Good Tuples +Known-good records are stored append-only. +``` +[ + { + "timestamp": "2025-08-13T12:55:10Z", + "tuple": { + "docs-as-code": "6bc901f2", + "component-a": "91c0d4e1", + "component-b": "a44f0cd9" + }, + "manifest_sha256": "4c9b7f...", + "suite": "full", + "duration_s": 742 + } +] +``` +Persisting enables reproduction (attach manifest to a defect), audit (what exactly +passed before a release), gating (choose any known-good tuple), and comparison (diff +manifests to isolate drift) without relying on (rather fragile) links to unique runs in +your CI system. + +--- +## Operating It +**Curating the fast subset:** Tests should fail quickly when public seams change. Keep +the list explicit (e.g. //integration/subset:pr_fast). Remove redundant tests and +quarantine flaky ones; review periodically (monthly or after significant interface +churn) to preserve signal. + +**Handling failures:** For a failing pull request subset: inspect manifest + log; +reproduce locally with a script consuming the manifest. For a failing coordinated set: +treat all related pull requests as atomic. For a failing post-merge full suite: bisect +between the last known-good tuple and current manifest (script permutations if multiple +repositories changed) to narrow cause. Distinguish real regressions from test fragility. + +**Trade-offs and choices:** Manifests + SHAs avoid tag noise and keep validation close +to heads. Two tiers (subset + full) offer a clear mental model; add more only with +evidence. A central orchestration repository centralises caching, secrets, and audit +history. + +**Practical notes:** Cache builds to stabilise subset runtime. Hash manifests (e.g. +SHA-256) for concise references. Expose an endpoint or badge showing the latest known +good. Generate overrides; do not hand-edit ephemeral files. Optionally lint the subset +target for allowed directories. + +**Avoiding pitfalls:** Diff-based dynamic test selection often misses schema or contract +drift. Ad-hoc manual edits to integration config reduce reproducibility. Merge ordering +as coordination defers detection to the last merge. + +**Signs it is working:** Interface breakage is caught pre-merge. Coordinated change sets +show unified status. Multi-repository regressions are localised rapidly using stored +manifests. + +--- +## Releases and Bazel Registry + +Bazel modules should be released only once they are verified, which in this setup is +equivalent to being included in the known-good store. This does not imply that all +verified versions need to end up in a release. That's still up to the module +maintainers. + +However in some cases pre-releases are even mandatory: when two modules are verified +together (multi repo PR) and one depends on the other, the PR cannot be merged without +internally releasing the dependent module, and setting the appropriate dependency in the +other. + +--- +## Summary +By expressing the integrated system as explicit manifests, curating a fast integration +subset for pull requests, and running a deeper post-merge suite, you move discovery of +cross-repository breakage earlier while keeping costs predictable. Each successful run +leaves a reproducible record, making release selection and debugging straightforward. +The approach lets a distributed codebase behave operationally like a single one. + +*Further reading:* Continuous Integration (Fowler), Continuous Delivery (Humble & +Farley), trunk-based development resources. From 5a5b457bf3a545abff5c7d90919f69a25eeb7e88 Mon Sep 17 00:00:00 2001 From: "Alexandru Iulian (uie32542)" <iulian.alexandru@continental-corporation.com> Date: Tue, 9 Sep 2025 13:28:53 +0300 Subject: [PATCH 095/109] json-lib: Add write requirement for JSON lib Signed-off-by: Alexandru Iulian <iulian.alexandru@continental-corporation.com> --- docs/modules/baselibs/json/docs/index.rst | 5 ++--- docs/modules/baselibs/json/docs/requirements/index.rst | 10 ++++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/docs/modules/baselibs/json/docs/index.rst b/docs/modules/baselibs/json/docs/index.rst index b3b4d00d04..9fc17ada03 100644 --- a/docs/modules/baselibs/json/docs/index.rst +++ b/docs/modules/baselibs/json/docs/index.rst @@ -72,14 +72,13 @@ The following details and requirements describe the aspects of current feature i General considerations ---------------------- -The JSON-Library should provide parsing and data conversion capabilities: +The JSON-Library should provide parsing, writing and data conversion capabilities: :need:`comp_req__json__validation` :need:`comp_req__json__deserialization` +:need:`comp_req__json__serialization` :need:`comp_req__json__user_format` -The component should be extensible in the future in order to support conversion of user format to JSON data. - User friendly API ----------------- diff --git a/docs/modules/baselibs/json/docs/requirements/index.rst b/docs/modules/baselibs/json/docs/requirements/index.rst index bd2b187d8b..bb24a384bb 100644 --- a/docs/modules/baselibs/json/docs/requirements/index.rst +++ b/docs/modules/baselibs/json/docs/requirements/index.rst @@ -38,6 +38,16 @@ General Requirements The JSON-Library shall provide a service to parse JSON data according to RFC8259. +.. comp_req:: JSON Serialization + :id: comp_req__json__serialization + :reqtype: Functional + :security: NO + :safety: ASIL_B + :satisfies: feat_req__baselibs__json_library + :status: valid + + The JSON-Library shall provide a service to serialize user format into JSON data according to RFC8259. + .. comp_req:: Return data in user format :id: comp_req__json__user_format :reqtype: Functional From 88c9d6b54a32d7933cdc0ff385cfe71dec952898 Mon Sep 17 00:00:00 2001 From: Lars Bauhofer <155632781+qor-lb@users.noreply.github.com> Date: Tue, 9 Sep 2025 13:06:40 +0200 Subject: [PATCH 096/109] Revert "autosd feature docs" --- .../development/autosd/_assets/bluechi.png | Bin 207987 -> 0 bytes .../development/autosd/_assets/platform.png | Bin 33941 -> 0 bytes .../development/autosd/_assets/qm.png | Bin 45004 -> 0 bytes .../development/autosd/index.rst | 213 ------------------ .../operating-system/development/index.rst | 26 --- docs/features/operating-system/index.rst | 25 -- 6 files changed, 264 deletions(-) delete mode 100644 docs/features/operating-system/development/autosd/_assets/bluechi.png delete mode 100644 docs/features/operating-system/development/autosd/_assets/platform.png delete mode 100644 docs/features/operating-system/development/autosd/_assets/qm.png delete mode 100644 docs/features/operating-system/development/autosd/index.rst delete mode 100644 docs/features/operating-system/development/index.rst delete mode 100644 docs/features/operating-system/index.rst diff --git a/docs/features/operating-system/development/autosd/_assets/bluechi.png b/docs/features/operating-system/development/autosd/_assets/bluechi.png deleted file mode 100644 index ba2b4bab702ffc54feb9b76600af915aa0f0a8fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207987 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 diff --git a/docs/features/operating-system/development/autosd/_assets/platform.png b/docs/features/operating-system/development/autosd/_assets/platform.png deleted file mode 100644 index e94724f0f6bb21d3e8d9e2d75036565c5eb5e84e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33941 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 diff --git a/docs/features/operating-system/development/autosd/_assets/qm.png b/docs/features/operating-system/development/autosd/_assets/qm.png deleted file mode 100644 index 3f8e8203b740683cbb48f61e00a387233aee097e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45004 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 diff --git a/docs/features/operating-system/development/autosd/index.rst b/docs/features/operating-system/development/autosd/index.rst deleted file mode 100644 index 1067e924cb..0000000000 --- a/docs/features/operating-system/development/autosd/index.rst +++ /dev/null @@ -1,213 +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 - # ******************************************************************************* - -AutoSD -###### - -Abstract --------- -AutoSD is the upstream binary distribution that serves as the public, in-development preview and functional precursor -of the Red Hat In-Vehicle Operating System (OS). - -AutoSD is downstream of CentOS Stream, so it retains most of the CentOS Stream code with a few divergences, -such as an optimized automotive-specific kernel rather than CentOS Stream’s kernel package. -Red Hat In-Vehicle OS is based on both AutoSD and RHEL, both of which are downstreams of CentOS Stream. - - -.. image:: _assets/platform.png - :width: 600 - :alt: autosd upstream and downstream relationship - :align: center - -Motivation ----------- - -AutoSD allows the S-CORE stack to be built and tested in a very similar architecture that would be used by -the Red Hat In-Vehicle Operating System (OS). - -This section is split into sub-sections to highlight AutoSD's main features. - -Declarative Workloads -^^^^^^^^^^^^^^^^^^^^^^ - -AutoSD uses Quadlet, podman-systemd.unit, a tool that extends Systemd unit files to define linux container workloads -managed by podman and orchestrated by Systemd. - -System level files can be deployed at /etc/containers/systemd. - -Quadlet parse those files when the OS is booting or when a "systemd daemon-reload" is triggered, -generated files are located at "/run/systemd/generator/". - -An sample .container file usually looks like this: - -.. code-block:: - :caption: /etc/containers/systemd/mysleep.container - - [Unit] - Description=The sleep container - After=local-fs.target - - [System] - Restart=always - - [Container] - Image=registry.access.redhat.com/ubi9-minimal:latest - Exec=sleep 1000 - - [Install] - # Start by default on boot - WantedBy=multi-user.target default.target - - -Quadlet also supports the usage of Kubernetes YAML files, allowing the same workload definition to be used -by a kubernetes cluster and Podman: - -.. code-block:: - :caption: /etc/containers/systemd/mysleep.kube - - [Unit] - Description=The sleep container - After=local-fs.target - - [System] - Restart=always - - [kube] - yaml=sleep.yml - - [Install] - # Start by default on boot - WantedBy=multi-user.target default.target - - -.. code-block:: - :caption: /etc/containers/systemd/mysleep.yml - - apiVersion: v1 - kind: Pod - metadata: - name: sleep-pod - spec: - containers: - - name: sleep-container - image: registry.access.redhat.com/ubi9-minimal:latest - command: ["sleep", "1000"] - -Mixed Critical Orchestration -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -AutoSD ships a mixed critical orchestration stack with Systemd, Podman, Eclipse BlueChi and QM (containerized environment for QM workloads), which is tightly coupled to the operating system. - -Its QM environment is mounted from its own partition and run as a linux container using podman from its own sysroot path: - -.. image:: _assets/qm.png - :width: 600 - :alt: autosd upstream and downstream relationship - :align: center - -Eclipse BlueChi enables mixed critical orchestration between QM and non QM workloads with Systemd: - -.. image:: _assets/bluechi.png - :width: 600 - :alt: autosd upstream and downstream relationship - :align: center - -Eclipse BlueChi can also work with other orchestrators, be it on-board or off-board, by relying on "state managers", -which can interact with Eclipse BlueChi through its DBUS API to manage workload lifecycles. - -More details about Eclipse BlueChi and QM can be found at: - -* https://bluechi.readthedocs.io/en/latest/ -* https://qm.readthedocs.io/en/latest/ - -Supported Architectures and Platforms -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -AutoSD images are constantly built and tested against both x86_64 and aarch64 architectures through the Automotive SIG pipelines. It’s also built/tested against the following platforms: - -* Texas Instruments: - - * BeaglePlay (beagleplay) - * SK-AM62x Sitara (am62sk) - * SK-AM69 Jacinto (am69sk) - * TDA4 EVM (tda4vm_sk) - * J784S4 EVM (j784s4evm) - -* Renesas R-Car S4 -* NXP S32G-RDB3 -* Qualcomm Snapdragon Ride SX 4.0 -* Raspberry pi 4 - -The following "virtual platforms" are also supported: - -* QEMU -* AWS -* Azure - -Further details at https://sigs.centos.org/automotive/provisioning/. - -Testing Tools -^^^^^^^^^^^^^ - -AutoSD contains a collection of tools for Perf & Scale tests that can be used to test its S-CORE image: https://sigs.centos.org/automotive/performance_monitoring_with_pcp/#arcaflow-workflow. - -Rationale ---------- - -The proposal is to maintain a repository with manifest AutoSD files to build an image tailored for the S-CORE project, the repository is currently maintained within the CentOS Automotive SIG organization in Gitlab: https://gitlab.com/CentOS/automotive/autosd-image-score, but it could be moved to the S-CORE Github organization as well. - -To run Eclipse S-CORE modules and related components in AutoSD, these need to be packaged, in either linux containers images or RPMs. - -Packaging would happen at the module level, meaning that: - -* A container image for a given module would contain all its components; -* A RPM for a given module would ship all its components as sub-packages. - -The CentOS Automotive SIG can build and host either format. - -There is also the option to test the S-CORE task in some of AutoSD’s supported hardware, if there is interest (needs further discussion on what and how to test). - -Specification -------------- - -Possible impacted areas of the specification: - -* Operating System and related components -* Mixed Critical Orchestration -* IPC - -Backwards Compatibility ------------------------ - - .. note:: - Not needed since it’s a new development platform to be included. - -Security Impact ---------------- - - .. note:: - The platform can help on some security tests, - since it uses several SELinux policies (these can be provided if needed). - -Safety Impact -------------- - - .. note:: - No impact since it’s a development platform. - -License Impact --------------- - - .. note:: - No impact, image manifest files can be licensed under Apache 2.0. diff --git a/docs/features/operating-system/development/index.rst b/docs/features/operating-system/development/index.rst deleted file mode 100644 index 3f198ec97f..0000000000 --- a/docs/features/operating-system/development/index.rst +++ /dev/null @@ -1,26 +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 - # ******************************************************************************* - - -Development -########### - -Development platforms ensure the S-CORE stack is functionally working. - -.. toctree:: - :maxdepth: 1 - :glob: - :titlesonly: - - */index diff --git a/docs/features/operating-system/index.rst b/docs/features/operating-system/index.rst deleted file mode 100644 index fdbf8d2d43..0000000000 --- a/docs/features/operating-system/index.rst +++ /dev/null @@ -1,25 +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 - # ******************************************************************************* - -Operating System -################ - -Operating Systems can be used to build, run and/or test the Eclipse S-CORE stack. - -.. toctree:: - :maxdepth: 1 - :glob: - :titlesonly: - - */index From 2bdb9a6735fec870b588ca7a47d5304e1827c933 Mon Sep 17 00:00:00 2001 From: Alekhya Reddy <Alekhya.Reddy@bti.bmwgroup.com> Date: Thu, 28 Aug 2025 10:49:50 +0200 Subject: [PATCH 097/109] Committing Base Libs Architecture --- .../baselibs/docs/architecture/index.rst | 103 ++++++++++++++++++ docs/features/baselibs/index.rst | 1 + 2 files changed, 104 insertions(+) create mode 100644 docs/features/baselibs/docs/architecture/index.rst diff --git a/docs/features/baselibs/docs/architecture/index.rst b/docs/features/baselibs/docs/architecture/index.rst new file mode 100644 index 0000000000..52db5c339f --- /dev/null +++ b/docs/features/baselibs/docs/architecture/index.rst @@ -0,0 +1,103 @@ +.. + # ******************************************************************************* + # 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 + # ******************************************************************************* +.. _baselibs_architecture: + +Architecture +===================== + +Overview +-------- + +A brief overview of Baselibs is described :ref:`baselibs_feature`. + +Description +----------- + +A detailed description of the Baselibs module requirements is located :need:`feat_req__baselibs__core_utilities`. + +The Baselibs module provides foundational software utilities, safety mechanisms and robust infrastructure components. It comprises essential libraries organized into functional categories: + +**Core Utility Libraries** + +- **bitmanipulation**: Utilities for bit manipulation operations +- **containers**: Specialized container implementations including ``DynamicArray`` and intrusive linked lists +- **utils**: Reusable utilities including type traits, mathematical utilities and string manipulation helpers + +**Threading and Concurrency** + +- **concurrency**: Interface for parallel execution of C++ callables with thread pool management + +**Data Processing and Serialization** + +- **json**: JSON abstraction layer with pluggable backend support +- **static_reflection_with_serialization**: Binary serialization/deserialization with compile-time type reflection + +**File System and I/O Operations** + +- **filesystem**: Filesystem manipulation library similar to ``std::filesystem`` + +**Memory Management** + +- **memory**: Memory handling utilities for safety-critical applications with shared memory support + +**Operating System Abstraction** + +- **os**: OS Abstraction Layer (OSAL) for POSIX-like systems including Linux and QNX + +**Error Handling and Safety** + +- **result**: Error handling without exceptions, conforming to C++23 ``std::expected`` specification +- **safecpp**: Safety framework including exception prevention and overflow-safe implementations + +**Modern C++ Extensions and Logging** + +- **futurecpp**: C++14 Standard Library extensions with backported components +- **mw::log**: Logging library for automotive systems with structured logging and multiple backends + +These libraries form an integrated ecosystem designed for code reuse, consistency and safety throughout the platform. + + + +Rationale Behind Architecture Decomposition +******************************************* + +The decomposition of Baselibs into modular libraries is motivated by the need for code reuse, maintainability and consistent APIs across the platform. This approach enables platform modules to leverage common infrastructure, reduces duplication and supports safety and security requirements. + +Static Architecture +------------------- + +.. feat_arc_sta:: Static View + :id: feat_arc_sta__baselibs__static_view_arch + :security: YES + :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 + + .. needarch:: + :scale: 50 + :align: center + + {{ draw_feature(need(), needs) }} + +Logical Interfaces +------------------ + +The Baselibs feature exposes the following logical interfaces defined in the :doc:`/modules/baselibs/index`: + +.. needtable:: + :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'] diff --git a/docs/features/baselibs/index.rst b/docs/features/baselibs/index.rst index e515c2ba4b..ed9ed6f8cf 100644 --- a/docs/features/baselibs/index.rst +++ b/docs/features/baselibs/index.rst @@ -28,6 +28,7 @@ Base Libraries :hidden: docs/requirements/index.rst + docs/architecture/index.rst Feature flag From 5eb88cfd14f61fa0d3dd07bc368ef91011d61c38 Mon Sep 17 00:00:00 2001 From: b-rei <98818686+b-rei@users.noreply.github.com> Date: Mon, 15 Sep 2025 10:37:00 +0200 Subject: [PATCH 098/109] Update index page of documentation in S-CORE (#1724) * Removed the first line of teaser under Introduction This links to duplicate and outdated contents. Additionally removed the entries from the top navigation bar leading to introduction and how to contribute * Perform forwarding to marketing website Added Contribute back into the TOC Added hidden TOC entry for introduction page to enable forwarding. --- docs/index.rst | 35 ++------ docs/introduction/index.rst | 155 +++--------------------------------- 2 files changed, 18 insertions(+), 172 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 62019f78c3..06611ffa82 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -41,34 +41,6 @@ Welcome & Overview **Welcome to the Software documentation of the S-CORE project.** -Introduction -~~~~~~~~~~~~ - -.. grid:: 1 1 3 3 - :class-container: score-grid - - .. grid-item-card:: - - Scope - ^^^ - The project develops an open source core stack for Software Defined Vehicles (SDVs), - targeting embedded high-performance Electronic Control Units (ECUs). - Check our :ref:`Scope <introduction_scope>` for details. - - .. grid-item-card:: - - Project Status - ^^^ - Check out our roadmap to see the project's key milestones and features we have planned. - :ref:`Click here to explore! <introduction_roadmap>` - - .. grid-item-card:: - - How to Contribute? - ^^^ - The only way to influence Eclipse S-CORE is to contribute - S-CORE is open! Please check our - :ref:`Contribute <contribute>` guide for more information. - Software artifacts ~~~~~~~~~~~~~~~~~~ @@ -129,7 +101,6 @@ Project structure and processes .. toctree:: :maxdepth: 1 - introduction/index requirements/index features/index modules/index @@ -139,3 +110,9 @@ Project structure and processes PMP <platform_management_plan/index.rst> Eclipse <https://projects.eclipse.org/projects/automotive.score> design_decisions/index + + .. toctree:: + :maxdepth: 1 + :hidden: + + introduction/index diff --git a/docs/introduction/index.rst b/docs/introduction/index.rst index 0849a5791e..8e5d5bba10 100644 --- a/docs/introduction/index.rst +++ b/docs/introduction/index.rst @@ -12,150 +12,19 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -.. _introduction: +Eclipse S-CORE (Eclipse Safe Open Vehicle Core) +############################################### -Introduction -============ +.. raw:: html -Background ----------- + <script type="text/javascript"> + // Redirect immediately using JavaScript + window.location.replace("https://eclipse.dev/score/"); + </script> + <meta http-equiv="refresh" content="0; url=https://eclipse.dev/score/"> + <link rel="canonical" href="https://eclipse.dev/score/"> -With the upcoming of central EE architectures in vehicles, computing power has been upgraded on few central components called 'High Performance Computers' or HPC. Together with these computing units comes an upgrade of operating systems towards multi-threaded schedulers with memory and resource separation in processes. There is a gap between these operating systems and the application layer that requires a common interface with functions and features for applications and application domains. The sum of these common and domain-agnostic functions is generally called "Middleware". The project uses the term "Core Software Stack" for this kind of functionality in differentiation to domain specific software stacks. -.. _introduction_scope: - -Scope ------ - -The scope of this project is the development of an open source core stack for Software Defined Vehicles (SDVs), specifically targeting embedded high-performance Electronic Control Units (ECUs). - -Safe Open Vehicle Core is targeting to be the non-differentiating core of a software stack running on HPC ECUs of a software-defined vehicle. Consequently, this project's scope are the "inner layers" of such a stack between a hardware abstraction as its 'lower bound', 'southbound interface' and a platform API towards vehicle function applications as its 'upper bound', 'northbound interface'. - -Out of scope are said applications running on this stack (those carry the differentiating aspects covered by adopters of the stack). As well out of scope are any aspects related to a concrete hardware target, which will be freely chosen by each adopter individually, as per the needs of and as they see fit with their vehicle architecture — except support for a potential reference hardware. Furthermore, any off-board functionality (e.g. cloud services) is considered out of scope. Looking beyond mere implementations in code, the project very well considers establishing concepts and implementations of processes, or a "way of doing things", or best practices to be in scope — but only as long as it pertains to making code fit for automotive grade. - -Guiding Principles ------------------- -The project aims to BUILD THE BEST AUTOMOTIVE RUNTIME SOLUTION ONLY ONCE. To achieve this, it is guided by several key principles. - -Common Stack & Industry-Wide Collaboration -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - - The Safe Open Vehicle Core project aims to create a common full stack solution of a software runtime that serves as the best possible solution for shared industry problems. By achieving efficiencies through a single, joint solution instead of multiple specific ones, the project addresses non-differentiating scopes and ensures that the scope is significant for multiple parties, rather than catering to singular interests. - -Speed -^^^^^ - - The project accelerates development by working in open source, focusing on code-centric and iterative methods rather than primarily on textual specifications. - -Abstraction and Extensibility -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - - The project emphasizes the decoupling of hardware (HW) and software (SW), ensuring that applications do not depend on specific hardware characteristics. It establishes predetermined breaking points to enable the exchange of implementations of individual layers, aspects, and components, such as ECU communication protocols. Additionally, it focuses on enabling project-specific extensions of the stack, providing a flexible framework that can be customized and extended to meet the specific requirements of different projects. - -Quality & Efficiency -^^^^^^^^^^^^^^^^^^^^ - - The Safe Open Vehicle Core project aims for a lean, no-frills solution to lower complexity and increase efficiency. The project strives for support of modern implementation paradigms and languages like Rust or C++, uses human-readable specification languages that are domain and target-driven, and avoids complex exchange data formats. It seeks the optimal balance between modularity and resource consumption and follows state-of-the-art processes to develop safe and secure software in an open source environment. - - - -By achieving these goals and adhering to these key principles, the Safe Open Vehicle Core Project aims to deliver a versatile, safe and secure core stack that supports the evolving needs of the automotive industry and accelerates the adoption of software-defined vehicle technologies. - -Architecture ------------- - -The following figures show a draft version of the planned architecture of the core stack. The architecture will be refined further as part of the project. - -High Level View on the Core Stack -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The following high level architecture picture gives you an overview of the main platform building blocks -including hardware specific peripherals. - -.. image:: _assets/score_architecture_high_level_overview.png - :width: 900 - :alt: High level view on the core stack - :align: center - -Target Picture of Core Stack - PRELIMINARY -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The following image shows platform architecture in more details including surroundings as -Board support package (BSP) and HW specific. - -.. image:: _assets/score_architecture_core_stack_target_picture.png - :width: 900 - :alt: Target picture the core stack (preliminary) - :align: center - -.. _introduction_roadmap: - -Roadmap -------- - -Here you can find the preliminary roadmap of the project: - -.. image:: _assets/score_roadmap.drawio.svg - :alt: project roadmap - :align: center - -Please be aware, that the roadmap is transferred to and maintained in the `GitHub project <https://github.com/orgs/eclipse-score/projects/13/views/2>`_. -Please follow this link to get the latest state of the planning. - -MVP Phase -^^^^^^^^^ - -The main goals of the *MVP Phase* are following: - -* establish a working infrastructure, that enables every developer of the project to specify - requirements and architecture, implement code and test it accordingly. -* set-up project structure, that covers all aspects of the open source software development including - cooperation between developers and teams, planning, creation of the roadmap and coordination meetings. -* define a software development process compliant to ISO 26262:2018, that is a pre-requisite for any other software development in the project. - -A lot of preparation was already done in the background, therefore we are quite optimistic to finish the *MVP Phase* -latest in the beginning of 2025. - -Alignment Phase -^^^^^^^^^^^^^^^ - -In the *Alignment Phase* the main goal is to align on the feature architecture and requirements of the *S-CORE Platform v1.0*. -Additionally it is important to define the roadmap and the order, in which the features should be implemented. - -Development Phase -^^^^^^^^^^^^^^^^^ - -The *Development Phase* is the phase, where the implementation of the main modules of the platform should happen. -The most important milestone here is the *Release v0.5*, that should contain the basic modules, e.g *IPC*. -The *Release v0.5* milestone will show, whether previously defined software development process will work and how big is the acceptance and -the interest of the automotive community to the project. - -Series Stability & Evolution Phase -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -In this phase the project should be in an well established state and accepted by the community. Continuous development -of the features is taking place. - -How we Work ------------ - -Meetings -^^^^^^^^ - -Regular meetings (and corresponding meeting minutes) are held as part of the project: - -- `Teams & Circles <https://github.com/orgs/eclipse-score/discussions>`_ - -Typically teams and circles meet weekly. - -A public meeting calendar for the *S-CORE* project is in preparation. - -Partners -^^^^^^^^ - -The people working in this project are listed `here <https://projects.eclipse.org/projects/automotive.score/who>`_. - - -How to contribute -^^^^^^^^^^^^^^^^^ -For a guide on how to get involved and start contributing, please checkout :ref:`contribute`. + <p> + If you are not redirected automatically, follow this <a href="https://eclipse.dev/score/">link to Eclipse S-CORE Introduction page</a>. + </p> From 829529b3598367f439d4ba5a2114d249017c6419 Mon Sep 17 00:00:00 2001 From: aschemmel-tech <aschemmel_job@arcor.de> Date: Tue, 16 Sep 2025 13:32:40 +0200 Subject: [PATCH 099/109] CODEOWNERS - correct and update Signed-off-by: aschemmel-tech <aschemmel_job@arcor.de> --- .github/CODEOWNERS | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 021154ef61..bdd2eecae1 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -6,49 +6,49 @@ # Note: last match wins # By Default reviews go to the infrastructure community, to address missing lines in this document. -* @AlexanderLanin @MaximilianSoerenPollak @dcalavrezo-qorix +* @AlexanderLanin @dcalavrezo-qorix # All special files go to infrastructure as well -.* @AlexanderLanin @MaximilianSoerenPollak @dcalavrezo-qorix +.* @AlexanderLanin @dcalavrezo-qorix -.github/CODEOWNERS @antonkri @FScholPer @qor-lb @johannes-esr @markert-r +.github/CODEOWNERS @antonkri @FScholPer @qor-lb @johannes-esr /docs/ @pahmann @PhilipPartsch @masc2023 @aschemmel-tech -/docs/conf.py @AlexanderLanin @MaximilianSoerenPollak @dcalavrezo-qorix +/docs/conf.py @AlexanderLanin @dcalavrezo-qorix /docs/contribute/ @eclipse-score/automotive-score-committers # /docs/features/ @eclipse-score/automotive-score-technical-leads -/docs/features/ @antonkri @FScholPer @qor-lb @johannes-esr @markert-r +/docs/features/ @antonkri @FScholPer @qor-lb @johannes-esr architecture/ @eclipse-score/automotive-score-committers # requirements/ @eclipse-score/automotive-score-technical-leads -requirements/ @antonkri @FScholPer @qor-lb @johannes-esr @markert-r +requirements/ @antonkri @FScholPer @qor-lb @johannes-esr # safety_analysis/ @eclipse-score/safety-managers safety_analysis/ @aschemmel-tech @PhilipPartsch @masc2023 # safety_planning/ @eclipse-score/automotive-score-technical-leads -safety_planning/ @antonkri @FScholPer @qor-lb @johannes-esr @markert-r +safety_planning/ @antonkri @FScholPer @qor-lb @johannes-esr verification/ @eclipse-score/automotive-score-committers -/docs/design_decisions/*infra* @AlexanderLanin @MaximilianSoerenPollak @dcalavrezo-qorix +/docs/design_decisions/*infra* @AlexanderLanin @dcalavrezo-qorix /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/automotive-score-technical-leads -/docs/platform_management_plan/ @antonkri @FScholPer @qor-lb @johannes-esr @markert-r +# /docs/platform_management_plan/ @eclipse-score/community-process +/docs/platform_management_plan/ @pahmann @PhilipPartsch @masc2023 @aschemmel-tech # /docs/quality/ @eclipse-score/quality-managers -/docs/quality/ @masc2023 @pahmann +/docs/quality/ @masc2023 @pahmann @PandaeDo # /docs/requirements/stakeholder/ @eclipse-score/automotive-score-technical-leads -/docs/requirements/stakeholder/ @antonkri @FScholPer @qor-lb @johannes-esr @markert-r +/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/safety/ @eclipse-score/safety-managers -/docs/safety/ @aschemmel-tech @PhilipPartsch @masc2023 +/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_tools/ @eclipse-score/automotive-score-committers # /docs/security/ @eclipse-score/security-managers -/docs/security/ @masc2023 +/docs/security/ @masc2023 @PandaeDo # /docs/verification_report @eclipse-score/automotive-score-technical-leads -/docs/verification_report @antonkri @FScholPer @qor-lb @johannes-esr @markert-r +/docs/verification_report @antonkri @FScholPer @qor-lb @johannes-esr /platform_integration_tests/ @eclipse-score/automotive-score-committers # /tools/ @eclipse-score/infrastructure-maintainers -/tools/ @AlexanderLanin @MaximilianSoerenPollak @dcalavrezo-qorix +/tools/ @AlexanderLanin @dcalavrezo-qorix From 9f2308ebc2d49b67753b3b2c3089a1f379b65b83 Mon Sep 17 00:00:00 2001 From: Alexander Lanin <Alexander.Lanin@etas.com> Date: Thu, 18 Sep 2025 22:57:29 +0200 Subject: [PATCH 100/109] add forking guide (#1731) --- docs/contribute/fork/index.md | 323 ++++++++++++++++++++++++++++++++++ docs/contribute/index.rst | 1 + 2 files changed, 324 insertions(+) create mode 100644 docs/contribute/fork/index.md diff --git a/docs/contribute/fork/index.md b/docs/contribute/fork/index.md new file mode 100644 index 0000000000..97ebd3efd4 --- /dev/null +++ b/docs/contribute/fork/index.md @@ -0,0 +1,323 @@ +# Enterprise Forking Guide for S-CORE Repositories + +## 1. Purpose & Context + +This guide helps companies (tool vendors, integrators, OEMs, suppliers) decide how to structure forks of S-CORE repositories to: + +- Contribute efficiently upstream +- Integrate internal compliance & security workflows +- Keep proprietary or distribution-specific assets separate +- Avoid accidental leakage of secrets or internal IP +- Automate promotion of reviewed code to the public community + +> S-CORE spans 50+ repositories. You don't need a one-size-fits-all approach — pick the minimal model per repository and evolve as needs grow. + +### 1.1 Audience + +Engineering organizations managing both internal and external code flows; platform/DevEx teams formalizing contribution and publication pipelines; compliance and security stakeholders. + +### 1.2 Goals +Provide a decision and execution framework that reduces friction and risk while keeping the path to upstream contribution short. + +### 1.3 Out of Scope +License interpretation, export control, internal HR / policy approvals. You must comply with S-CORE licensing independently. + +### 1.4 Private vs Public Forks + +Each model description focuses on WHEN to use it and inherent CONSTRAINTS. Implementation details are in Section 2. + +#### Public Fork + +- Use when: You only need to contribute upstream or maintain a long-lived divergence openly. +- Pros: Simple, no internal infra, no delays for daily work. +- Constraints: No internal-only code separation; risk of accidental leakage if you try to “hide” things manually. Review happens in public, which may not suit all contributions. All authors must be comfortable with public exposure. + +#### Internal Fork + +- Use when: You passively consume S-CORE (read-only) or maintain internal extensions not (yet) publishable. +- Pros: Freedom to experiment internally; shield proprietary assets. +- Constraints: Requires disciplined syncing from upstream to avoid drift. Requires internal infrastructure. No contributions possible. + +Note that internal forks can use any infrastructure and do not need to be on GitHub. + +#### Hybrid (Both) + +- Use when: You both maintain internal-only additions AND contribute upstream regularly. + +--- + +## 2. Implementing the Hybrid Approach + +When organizations need both internal-only work and a path to upstream contribution, adopt a hybrid approach. Below each variant includes a short "use / pros / constraints" summary and recommended practices. + +Depending on policy and compliance constraints, pick the simplest viable variant and document ownership for sync and publication tooling. + +### 2.1 Public-first Workflow + +All S-CORE targeting contributions happen directly on the public fork. + +Recommendations + +1. Short-lived feature branches (e.g., `topic` or `<username>/<topic>`) +2. Open an individual PR for each change upstream +3. Delete merged branches + +Notes + +- Your fork's `main` may either track upstream or remain unused. +- Use pre-commit checks to detect internal-only patterns before pushing. + +Use when + +- You primarily contribute upstream or maintain public divergences. + +Pros + +- Simple: little infrastructure needed and fewer delays for day-to-day work. + +Constraints + +- No built-in separation for internal-only code; manual hiding is error-prone. +- History and reviews are public; not suitable for all compliance/privacy needs. +- Potentially not suitable for large or sensitive contributions. + +### 2.2 Internal-first Workflow + +Development happens internally; publication to a public fork is an explicit, audited step. This is common where compliance, IP, or privacy constraints apply. + +Common reasons + +- Organizational policies requiring internal vetting before public exposure +- Need to shield proprietary assets +- Need to restrict author visibility + +Workflow overview + +Just an example, obviously adapt to your needs. + +- Development in `internal/feature_unverified` +- Merge to `internal/feature_verified` after internal review +- Transfer to `public_fork/feature` (manual or automated transformation) +- Open PR to `eclipse-score/feature` (manual or automated) + +Use when + +- Your organization mandates internal control and vetting before any public push. + +Pros + +- Good for protecting IP and meeting regulatory/compliance requirements. + +Constraints + +- Requires internal infrastructure and operational processes to manage branches, reviews, and syncing. +- Demands disciplined synchronization from upstream to avoid painful drift and costly merges. +- Typically increases TTM (time-to-merge) for open contributions; may hinder collaborative workflows. + +Note: internal forks do not need to live on GitHub; choose infrastructure that meets your needs. + +### 2.3 Mixing Both Workflows + +Some organizations choose a pragmatic mix: public-first for small changes, internal-first for large or sensitive changes. + +Use when + +- You need both, efficiency and internal-first workflows. + +Pros + +- Flexible: reduce friction for frequent contributions while protecting sensitive work. Lets you apply lightweight public workflows for small items and/or trusted contributors, and heavier internal processes for sensitive work. See when to use-sections in internal-first and public-first workflows for guidance. + +Constraints + +- Adds process complexity and requires clear tooling and ownership to avoid confusion and double-work. +- Requires careful documentation and automation to keep transformations, authorship, and history coherent across boundaries. + + + +## 3. How To work with forks + +First and foremost see [GitHub's guide to working with forks](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo) + +Note that in enterprise environments forks will usually be created by forking into an company organization (e.g. `my_company/score`) rather than a personal account. And those will be created by infrastructure administrators rather than individual developers. + +You can create such a fork e.g. via the GitHub CLI, [`gh repo fork eclipse-score/score`](https://cli.github.com/manual/gh_repo_fork), or via an infrastructure-as-code process. + +The default remote names will be: + +- `origin`: your fork (e.g. `my_company/score`) +- `upstream`: the original repo (e.g. `eclipse-score/score`) + +### Flow of a feature + +There is a number of ways to achieve the same result in git, and it comes down to personal/team preference. Here is one possible approach. + +```bash +# Update local main +git switch main +git pull upstream main + +# Create a feature branch +git switch -c <feature-branch> + +# Commit and push +git add . +git commit -m "<message>" +git push -u origin <feature-branch> +``` + +Now you can create PRs from `<feature-branch>` to `upstream/main` directly. See [GitHub Docs - Creating a pull request from a fork](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork) for details. +Alternatively you can use `gh pr create` to create PRs from the command line. + + +#### Opinionated Alternative: change main reference + +If you prefer to keep your local `main` tracking upstream directly (and avoid maintaining `my_company/main`), set upstream as the branch's upstream and fast-forward when needed: + +```bash +git switch main +git branch --set-upstream-to=upstream/main +git reset --hard upstream/main +``` + +This makes daily flow trivial: `git pull` on `main` gives you the latest upstream state. + +--- + +## Rest, unsorted + +### Transformation / Filtering Pipeline (Copybara Implementation) + +Adds controlled publication with filtering and metadata normalization. + +#### Overview + +[Copybara](https://github.com/google/copybara) synchronizes code between repositories and can: + +- Mirror internal → public +- Filter files +- Transform content and metadata +- Preserve coherent history + +#### Key Benefits + +Iterative (non-squash) commits: + +- Retain individual commits +- Preserve messages & timestamps +- Avoid history compression + +File filtering: + +- Exclude internal-only assets (e.g., `.github/workflows`, `copy.bara.sky`) +- Publish only OSS-relevant content + +Author preservation: + +```python +authoring = authoring.pass_thru("Qorix Bot <bot@qorix.dev>") +``` + +Preserves original commit authors for traceability. + +Transformations: +Supports `core.replace`, `core.move`, `core.transform`, header injection, folder renames. + +Example: + +```python +transformations = [ + core.replace( + before = "INTERNAL_PATH", + after = "PUBLIC_PATH", + ) +] +``` + +#### Minimal Configuration Example + +```python +origin = git.origin( + url = "https://github.com/qorix-group/inc_orchestrator_internal.git", + ref = "main", +) + +destination = git.destination( + url = "https://github.com/qorix-group/inc_orchestrator.git", + fetch = "refs/heads/main", + push = "refs/heads/{{BRANCH}}", +) + +core.workflow( + name = "publish_branch", + mode = "ITERATIVE", + origin = origin, + origin_files = glob([ + "**", + ], exclude=[ + "copy.bara.sky", + "sync.sky", + ".github/workflows/copybara.yml", + ".github/workflows/sync.yml", + ]), + destination = destination, + authoring = authoring.pass_thru("Qorix Bot <bot@qorix.dev>"), + transformations = [], +) +``` + +#### CI Integration {#ci-integration} + +Example CI steps to generate a GitHub App token, configure git, and run Copybara: + +```yaml +- name: Generate GitHub App token + id: generate_token + uses: tibdex/github-app-token@v2 + with: + app_id: ${{ secrets.GH_APP_ID }} + private_key: ${{ secrets.GH_APP_PRIVATE_KEY }} + +- name: Configure Git + run: | + git config --global user.name "Qorix Bot" + git config --global user.email "bot@qorix.dev" + echo "https://x-access-token:${{ steps.generate_token.outputs.token }}@github.com" > ~/.git-credentials + +- name: Run Copybara + run: | + sed -i "s/{{BRANCH}}/${{ github.event.inputs.branch_name }}/g" copy.bara.sky + curl -LO https://github.com/qorix-group/copybara/releases/download/v20250508/copybara_deploy.jar + java -jar copybara_deploy.jar migrate copy.bara.sky publish_branch +``` + +#### Local Usage + +```bash +java -jar copybara_deploy.jar --init-history --force copy.bara.sky publish_branch +``` + +Use local runs to preview migrations or sync new branches outside CI. + +#### Challenges & Trade-offs + +| Challenge | Impact | +|-----------|--------| +| No native GH default token support | Extra auth setup | +| Requires state for first branch push | One-time `--init-history` nuance | +| Credential & git config ceremony | Boilerplate in CI | +| Additional maintenance | Long-term ownership needed | + +#### Summary + +Copybara offers a controlled, scriptable way to synchronize repositories while filtering content and preserving authorship. Use it when manual workflows no longer scale or policy filtering is mandatory. + +### Keeping Your Fork Updated + +Periodically update your fork's `main` from S-CORE `main` and run internal checks (tests, linting, compliance) before accepting changes. Neglecting regular syncs increases integration cost over time. + +### Prefer GitHub Apps instead of (Fine Grained) Personal Access Tokens + +Prefer GitHub Apps for automated CI access where possible; fine-grained PATs increase token-management overhead and invite accidental long-lived credential exposure. + +TODO: add short examples and links to recommended app installation steps. diff --git a/docs/contribute/index.rst b/docs/contribute/index.rst index 913e33b2d9..2a35c24a0b 100644 --- a/docs/contribute/index.rst +++ b/docs/contribute/index.rst @@ -71,3 +71,4 @@ For further details on our project structure and planning, please refer to the : documentation/index development/index ci/index + fork/index From 6d5dbe534cf40fbb43a350617c27cc29b363c7e2 Mon Sep 17 00:00:00 2001 From: "markus.schu" <markus.schu@accenture.com> Date: Sun, 7 Sep 2025 16:09:52 +0200 Subject: [PATCH 101/109] update change management plan update to reflect changes in process description https://github.com/eclipse-score/process_description/pull/167 and https://github.com/eclipse-score/process_description/pull/148 Resolves: #1310 Change-Id: I6a58c1f0c457c654230e01ffb30a179b1729bcf4 --- .github/ISSUE_TEMPLATE/3-change.yml | 94 ++++++ .../score_change_request_change.drawio.svg | 4 + .../score_change_request_overview.drawio.svg | 4 - ...change_request_overview_complex.drawio.svg | 4 + ..._change_request_overview_simple.drawio.svg | 4 + ...ange_request_workflow_complex_1.drawio.svg | 4 - ...ange_request_workflow_complex_2.drawio.svg | 4 - ..._change_request_workflow_simple.drawio.svg | 2 +- .../change_management.rst | 291 ++++++++++-------- 9 files changed, 267 insertions(+), 144 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/3-change.yml create mode 100644 docs/platform_management_plan/_assets/score_change_request_change.drawio.svg delete mode 100644 docs/platform_management_plan/_assets/score_change_request_overview.drawio.svg create mode 100644 docs/platform_management_plan/_assets/score_change_request_overview_complex.drawio.svg create mode 100644 docs/platform_management_plan/_assets/score_change_request_overview_simple.drawio.svg delete mode 100644 docs/platform_management_plan/_assets/score_change_request_workflow_complex_1.drawio.svg delete mode 100644 docs/platform_management_plan/_assets/score_change_request_workflow_complex_2.drawio.svg diff --git a/.github/ISSUE_TEMPLATE/3-change.yml b/.github/ISSUE_TEMPLATE/3-change.yml new file mode 100644 index 0000000000..7119196e01 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/3-change.yml @@ -0,0 +1,94 @@ +# ******************************************************************************* +# 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 +# ******************************************************************************* + +name: "Change Request" +description: Issue to track a change +title: "Change: Your Change Request title" +labels: ["codeowner_review"] +body: + - type: dropdown + attributes: + label: Change Request Type + options: + - Feature Request + - Feature Modification + - Component Request + - Component Modification + default: 0 + validations: + required: true + - type: textarea + attributes: + label: Description of the Change Request + description: | + - Exact description of the Change Request + - Impact to users of the feature/component + - Use following template within a PR and link it to this issue + [Change Management Feature Request Template](https://eclipse-score.github.io/process_description/main/process_areas/change_management/guidance/change_management_feature_template.html) needs to be used + [Change Management Component Request Template](https://eclipse-score.github.io/process_description/main/process_areas/change_management/guidance/change_management_component_template.html) needs to be used + [For (Process) Improvements, Improvement Issue Template](https://github.com/eclipse-score/process_description/blob/main/.github/ISSUE_TEMPLATE/2-improvement.yml) needs to be used + validations: + required: true + - type: textarea + attributes: + label: Estimates for realization + description: | + - Estimate the effort, resources, risk for the realization + validations: + required: true + - type: checkboxes + attributes: + label: Affects work products + options: + - label: Requirements + - label: Architecture + - label: Safety/Security Analysis + - label: Detailed Design + required: true + - type: textarea + attributes: + label: Impact analysis + description: | + - Details on the impacted work products + - Use the following template and/or run the impact analysis tool provided + If the following template is use within a PR, link it to this issue + [Change Management Impact Analysis Template](https://eclipse-score.github.io/process_description/main/process_areas/change_management/guidance/change_management_impact_analysis_template.html) needs to be used + validations: + required: true + - type: checkboxes + attributes: + label: Safety or Security relevance + options: + - label: none + - label: Safety relevant + - label: Security relevant + validations: + required: true + - type: dropdown + attributes: + label: ASIL classification + options: + - QM + - ASIL_B + default: 0 + validations: + required: true + - type: dropdown + attributes: + label: Expected Implementation Version + options: + - 0.5 + - 1.0 + default: 0 + validations: + required: false diff --git a/docs/platform_management_plan/_assets/score_change_request_change.drawio.svg b/docs/platform_management_plan/_assets/score_change_request_change.drawio.svg new file mode 100644 index 0000000000..4c75ac37b6 --- /dev/null +++ b/docs/platform_management_plan/_assets/score_change_request_change.drawio.svg @@ -0,0 +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="1185px" height="173px" viewBox="-0.5 -0.5 1185 173" content="<mxfile host="Electron" modified="2025-09-07T08:14:20.223Z" 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="o4HdefBE8ba8ubFbZlxI" version="20.3.0" type="device"><diagram id="yk6BuyGx8g93CQDW87nx" name="Page-1">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</diagram></mxfile>"><defs/><g><image x="-0.5" y="-0.5" width="1184" height="172" xlink:href="data:image/png;base64,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" preserveAspectRatio="none"/><rect x="10" y="90" width="200" height="70" fill="rgb(255, 255, 255)" 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: 198px; height: 1px; padding-top: 125px; 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><font style="font-size: 23px;">Change Request<br /></font></b><br />Issue to track a change</div></div></div></foreignObject><text x="110" y="129" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Change Request...</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 diff --git a/docs/platform_management_plan/_assets/score_change_request_overview.drawio.svg b/docs/platform_management_plan/_assets/score_change_request_overview.drawio.svg deleted file mode 100644 index 38dc8ac428..0000000000 --- a/docs/platform_management_plan/_assets/score_change_request_overview.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ -<?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="1041px" height="339px" viewBox="-0.5 -0.5 1041 339" content="<mxfile host="Electron" modified="2025-03-08T12:09:30.496Z" 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="svqxWcTrMKDDS_cAQQ-G" version="20.3.0" type="device"><diagram id="0w90vh-N4AjfHz9zUi27" name="Model">7Vpbd6I6FP41rnXOg11A5OKj2stMT2ctR6dTe166IkThFAkNser8+gkQ5BLEusRiO8c+lOwkm7D39+29E2iBwWJ9Q6Bvf8MWcluKZK1b4LKlKAAYMvsXSjaxpN2R1FgyJ44Vy+RUMHZ+IS6UuHTpWCjIDaQYu9Tx80ITex4yaU4GCcGr/LAZdvN39eEcCYKxCV1R+uBY1I6lhiql8i/ImdvJnWWJ9yxgMpgLAhtaeJURgasWGBCMaXy1WA+QG1ovsUs873pH73ZhBHn0LRMwwctn77UXvKw3t5cPT37gTNsKXxvdJA+MLPb8vIkJtfEce9C9SqV9psezUKhVYq10zB3GPhPKTPgfonTDnQmXFDORTRcu7w0oJLQXOocJTBcGgWMm4mvHTYahtUMn4V0uVN56zPRcrvkCosYmaXiUbCbZxmOqIWym06JWMk80JrdvgJfE5KaBE+V5M7udt8kTuLu9dgxf8dqyzlEJyRzRioGKFg8MDZy5BXfWDcILxFbEBhDkQuq85gEIOY7n23F8KrMj3GQG+NjxaJDRPAwFbADnZFtPEMopKWsgBxx2EetMWpnFpaIIXAcATTtjoNXr/NXTzJis5vjf1390K5C9iUR+tPW6fZ/xVqUzplAxvw9/3oLhw6/7m/73SX/22AzrU2qmbHzMkbGcmgdHC7mrZOPFhaTsiRmsMUTEYbZF5CTxoNQJ8pmEA6Dnw4EqF/JIcYYhS5Uzjg4g7ujuftSfjR5GZHH1JRi8gLH1sTCbglEyQB6MDB+HgrGRMFbqhHPBrFpAYKe7D7Pdo2doxfpqLy8KM47mRaXvXqG75Pb+Oh7fXwl0yZNhZTsUjX0Y4WLFivc88GcMVgPsYhLNBTM1/Avl2KMZefyLsEjwM8r0aNGvCpWviFC0roTR1t9awbLA4OFgldbkclJo25l6PJl4TAotrWfAp6xnkhp1bz3TbaqeqVx2hgPDUa0E0Dq6ZugiAWbRr4wAQO4AtVMTAdQiAbSkiH8PApQioOF8fILtXeljJmcO+3Z3cu0V/o4sI8tC8lMLPo4XyycW3HxYxqkySYZsAxt67LEVzWUm6k8Ju5qHVyP0skQBFZAS2NAPLy1sLheRS/bRcRoj5266N8YdwKquUUwr+hvTinGqtCJ/+LxStf3Nsqj88WsvMI+KcWJpNXSh11KYNmnAEgHBbtz4hj2Hssh/pkAH4PyA3mk2f1yoUd2aySHGvj1d2Drl1qyq0PpozOkKzEmyQ1hA5fyuvSxx0tEOIs/12ABZ8deR5ZL+JKl8XfguisgUUe8n88hsk809JbpFLX/1ZjNkUgYmRgJMnkP3EGwtTRr8nShjTx6vNp5yCnaH+jla5bqKRYHtaveNxeLp2C4JxjvjarFOUpea463p0GiK01Wr/nM2WR3jHTdZ5bxpZJd1cvwbZ5/Uqpb9f1I7h6TW0ZtOat0z5mb6AkL/aC/Pq3LPyU9XNOE9garklcTPJByuiKrU4jmNJr/tnObg1yGaXiz4an4hVxmcM+HwGkG6JIipG+CFj70onknbU6Di8dAPxKIepCjgO2obmc+uE8TPeo77aKFAaDwGyerOnDRNQ/xhSUoBO5JU1L0ji2zF052ZhVmZ5p0EXWfuhXGM+STcUvdDXzgmdHu8Y+FYVhw3EVsfnEaqwpDDOcH0qv2WehnqYqEy4ElHKBU9hsVCvclFtRSOiRe2/OuoAi5ACSw6NcCi9NuCRk4Rd6UP/T33W1WfWrx/ljnKiWJ8Hd/322IY/XSvew0hn5Xw6WQbsdIPH/5cQlV9B9LAN49HeVFk1Ofnjqae7hCDNdPvl+O6Mv0MHFz9Bg==</diagram></mxfile>"><defs/><g><path d="M 280 76.37 L 280.03 258.03 L 413.63 258" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 280 71.12 L 283.5 78.12 L 280 76.37 L 276.5 78.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 418.88 258 L 411.88 261.5 L 413.63 258 L 411.88 254.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 346.37 40 L 643.63 40" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 341.12 40 L 348.12 36.5 L 346.37 40 L 348.12 43.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 648.88 40 L 641.88 43.5 L 643.63 40 L 641.88 36.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 243.04 77.63 L 243 138.03 L 170.03 138.03 L 170.01 166.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 243.04 72.38 L 246.54 79.38 L 243.04 77.63 L 239.54 79.38 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 170 171.88 L 166.51 164.88 L 170.01 166.63 L 173.51 164.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 229.97 77.39 L 230.03 118.03 L 90.03 118.03 L 90.03 248.03 L 170.03 248.03 L 170.01 271.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 229.96 72.14 L 233.47 79.13 L 229.97 77.39 L 226.47 79.14 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 170 276.88 L 166.51 269.88 L 170.01 271.63 L 173.51 269.89 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="220" y="10" width="120" height="60" fill="#f5f5f5" stroke="#666666" 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: 118px; height: 1px; padding-top: 40px; margin-left: 221px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ISSUE</div></div></div></foreignObject><text x="280" y="44" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">ISSUE</text></switch></g><path d="M 546.37 258 L 643.63 258" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 541.12 258 L 548.12 254.5 L 546.37 258 L 548.12 261.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 648.88 258 L 641.88 261.5 L 643.63 258 L 641.88 254.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="420" y="228" width="120" height="60" fill="#647687" stroke="#314354" 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: 118px; height: 1px; padding-top: 258px; margin-left: 421px;"><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;">PR</div></div></div></foreignObject><text x="480" y="262" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">PR</text></switch></g><path d="M 120 40 L 213.63 40" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 218.88 40 L 211.88 43.5 L 213.63 40 L 211.88 36.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 0 0 L 120 0 L 120 68 Q 90 46.4 60 68 Q 30 89.6 0 68 L 0 12 Z" fill="rgb(255, 255, 255)" 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 center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 28px; margin-left: 1px;"><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;">Change<br />Request</div></div></div></foreignObject><text x="60" y="32" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Change...</text></switch></g><path d="M 776.37 40.03 L 980.03 40.03 L 980.03 91.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 771.12 40.03 L 778.12 36.53 L 776.37 40.03 L 778.12 43.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 980.03 96.88 L 976.53 89.88 L 980.03 91.63 L 983.53 89.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 650 0 L 770 0 L 770 68 Q 740 46.4 710 68 Q 680 89.6 650 68 L 650 12 Z" fill="rgb(255, 255, 255)" 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 center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 28px; margin-left: 651px;"><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;">Plan, Control, Monitor</div></div></div></foreignObject><text x="710" y="32" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Plan, Control, Monit...</text></switch></g><path d="M 776.37 258.03 L 984.03 258.03 L 983.96 168.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 771.12 258.03 L 778.12 254.53 L 776.37 258.03 L 778.12 261.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 983.96 163.12 L 987.47 170.12 L 983.96 168.37 L 980.47 170.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 650 218 L 770 218 L 770 286 Q 740 264.4 710 286 Q 680 307.6 650 286 L 650 230 Z" fill="rgb(255, 255, 255)" 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 center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 246px; margin-left: 651px;"><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: 14px; 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: 12px;">Implement, Verify<br style="" />(Affected work products)</font></div></div></div></foreignObject><text x="710" y="250" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="14px" text-anchor="middle">Implement, Verify...</text></switch></g><path d="M 546.37 138 L 643.63 138" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 541.12 138 L 548.12 134.5 L 546.37 138 L 548.12 141.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 648.88 138 L 641.88 141.5 L 643.63 138 L 641.88 134.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="420" y="108" width="120" height="60" fill="#647687" stroke="#314354" 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: 118px; height: 1px; padding-top: 138px; margin-left: 421px;"><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;">PR</div></div></div></foreignObject><text x="480" y="142" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">PR</text></switch></g><path d="M 776.37 138 L 913.63 138" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 771.12 138 L 778.12 134.5 L 776.37 138 L 778.12 141.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 918.88 138 L 911.88 141.5 L 913.63 138 L 911.88 134.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 650 98 L 770 98 L 770 166 Q 740 144.4 710 166 Q 680 187.6 650 166 L 650 110 Z" fill="rgb(255, 255, 255)" 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 center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 126px; margin-left: 651px;"><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: 14px; 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: 12px;">Implement, Verify<br style="" />(Affected work products)</font></div></div></div></foreignObject><text x="710" y="130" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="14px" text-anchor="middle">Implement, Verify...</text></switch></g><path d="M 310 76.37 L 310.03 138.03 L 413.63 138" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 310 71.12 L 313.5 78.12 L 310 76.37 L 306.5 78.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 418.88 138 L 411.88 141.5 L 413.63 138 L 411.88 134.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 920 98 L 1040 98 L 1040 166 Q 1010 144.4 980 166 Q 950 187.6 920 166 L 920 110 Z" fill="rgb(255, 255, 255)" 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 center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 126px; margin-left: 921px;"><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;">Feature/Component Request<br />Templates, Checklists</div></div></div></foreignObject><text x="980" y="130" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Feature/Component Re...</text></switch></g><rect x="465" y="173" width="30" 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: 193px; margin-left: 480px;"><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><font style="font-size: 23px;">:</font></b></div></div></div></foreignObject><text x="480" y="197" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">:</text></switch></g><path d="M 236.37 203 L 325 203 L 325 153 L 413.63 153" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 231.12 203 L 238.12 199.5 L 236.37 203 L 238.12 206.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 418.88 153 L 411.88 156.5 L 413.63 153 L 411.88 149.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="110" y="173" width="120" height="60" fill="#f5f5f5" stroke="#666666" 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: 118px; height: 1px; padding-top: 203px; margin-left: 111px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">SUB-<br />ISSUE</div></div></div></foreignObject><text x="170" y="207" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">SUB-...</text></switch></g><path d="M 236.37 308.03 L 325 308.03 L 325 273 L 413.63 273" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 231.12 308.03 L 238.12 304.53 L 236.37 308.03 L 238.12 311.53 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 418.88 273 L 411.88 276.5 L 413.63 273 L 411.88 269.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="110" y="278" width="120" height="60" fill="#f5f5f5" stroke="#666666" 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: 118px; height: 1px; padding-top: 308px; margin-left: 111px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ISSUE</div></div></div></foreignObject><text x="170" y="312" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">ISSUE</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 diff --git a/docs/platform_management_plan/_assets/score_change_request_overview_complex.drawio.svg b/docs/platform_management_plan/_assets/score_change_request_overview_complex.drawio.svg new file mode 100644 index 0000000000..dda4ac191c --- /dev/null +++ b/docs/platform_management_plan/_assets/score_change_request_overview_complex.drawio.svg @@ -0,0 +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="1041px" height="469px" viewBox="-0.5 -0.5 1041 469" content="<mxfile host="Electron" modified="2025-09-07T08:30:43.229Z" 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="tufqRN-hiMbfv5RVEyg1" version="20.3.0" type="device"><diagram id="0w90vh-N4AjfHz9zUi27" name="Model">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</diagram></mxfile>"><defs/><g><path d="M 280 206.37 L 280 388 L 413.63 388" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 280 201.12 L 283.5 208.12 L 280 206.37 L 276.5 208.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 418.88 388 L 411.88 391.5 L 413.63 388 L 411.88 384.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 243.04 207.63 L 243 268 L 170 268 L 170 296.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 243.04 202.38 L 246.54 209.38 L 243.04 207.63 L 239.54 209.38 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 170 301.88 L 166.5 294.88 L 170 296.63 L 173.5 294.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 229.97 207.39 L 230 248 L 90 248 L 90 378 L 170 378 L 170 401.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 229.96 202.14 L 233.47 209.14 L 229.97 207.39 L 226.47 209.14 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 170 406.88 L 166.5 399.88 L 170 401.63 L 173.5 399.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="220" y="140" width="120" height="60" fill="#f5f5f5" stroke="#666666" 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: 118px; height: 1px; padding-top: 170px; margin-left: 221px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ISSUE</div></div></div></foreignObject><text x="280" y="174" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">ISSUE</text></switch></g><path d="M 546.37 388 L 643.63 388" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 541.12 388 L 548.12 384.5 L 546.37 388 L 548.12 391.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 648.88 388 L 641.88 391.5 L 643.63 388 L 641.88 384.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="420" y="358" width="120" height="60" fill="#647687" stroke="#314354" 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: 118px; height: 1px; padding-top: 388px; margin-left: 421px;"><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;">PR</div></div></div></foreignObject><text x="480" y="392" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">PR</text></switch></g><path d="M 120 170 L 213.63 170" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 218.88 170 L 211.88 173.5 L 213.63 170 L 211.88 166.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 0 130 L 120 130 L 120 198 Q 90 176.4 60 198 Q 30 219.6 0 198 L 0 142 Z" fill="rgb(255, 255, 255)" 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 center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 158px; margin-left: 1px;"><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;">Change<br />Request</div></div></div></foreignObject><text x="60" y="162" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Change...</text></switch></g><path d="M 776.37 388 L 984 388 L 983.96 298.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 771.12 388 L 778.12 384.5 L 776.37 388 L 778.12 391.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 983.96 293.12 L 987.46 300.12 L 983.96 298.37 L 980.46 300.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 650 348 L 770 348 L 770 416 Q 740 394.4 710 416 Q 680 437.6 650 416 L 650 360 Z" fill="#fff2cc" stroke="#d6b656" 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 center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 376px; margin-left: 651px;"><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: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-size: 12px;">Affected Work Products</span></div></div></div></foreignObject><text x="710" y="380" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="14px" text-anchor="middle">Affected Work Pro...</text></switch></g><path d="M 546.37 268 L 643.63 268" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 541.12 268 L 548.12 264.5 L 546.37 268 L 548.12 271.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 648.88 268 L 641.88 271.5 L 643.63 268 L 641.88 264.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="420" y="238" width="120" height="60" fill="#647687" stroke="#314354" 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: 118px; height: 1px; padding-top: 268px; margin-left: 421px;"><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;">PR</div></div></div></foreignObject><text x="480" y="272" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">PR</text></switch></g><path d="M 776.37 268 L 913.63 268" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 771.12 268 L 778.12 264.5 L 776.37 268 L 778.12 271.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 918.88 268 L 911.88 271.5 L 913.63 268 L 911.88 264.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 650 228 L 770 228 L 770 296 Q 740 274.4 710 296 Q 680 317.6 650 296 L 650 240 Z" fill="#fff2cc" stroke="#d6b656" 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 center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 256px; margin-left: 651px;"><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: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-size: 12px;">Affected Work Products</span></div></div></div></foreignObject><text x="710" y="260" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="14px" text-anchor="middle">Affected Work Pro...</text></switch></g><path d="M 310 206.37 L 310 268 L 413.63 268" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 310 201.12 L 313.5 208.12 L 310 206.37 L 306.5 208.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 418.88 268 L 411.88 271.5 L 413.63 268 L 411.88 264.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 920 228 L 1040 228 L 1040 296 Q 1010 274.4 980 296 Q 950 317.6 920 296 L 920 240 Z" fill="rgb(255, 255, 255)" 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 center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 256px; margin-left: 921px;"><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;">Templates, <br />Checklists</div></div></div></foreignObject><text x="980" y="260" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Templates,...</text></switch></g><rect x="465" y="303" width="30" 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: 323px; margin-left: 480px;"><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><font style="font-size: 23px;">:</font></b></div></div></div></foreignObject><text x="480" y="327" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">:</text></switch></g><path d="M 236.37 333 L 325 333 L 325 283 L 413.63 283" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 231.12 333 L 238.12 329.5 L 236.37 333 L 238.12 336.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 418.88 283 L 411.88 286.5 L 413.63 283 L 411.88 279.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="110" y="303" width="120" height="60" fill="#f5f5f5" stroke="#666666" 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: 118px; height: 1px; padding-top: 333px; margin-left: 111px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">SUB-<br />ISSUE</div></div></div></foreignObject><text x="170" y="337" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">SUB-...</text></switch></g><path d="M 236.37 438 L 325 438 L 325 403 L 413.63 403" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 231.12 438 L 238.12 434.5 L 236.37 438 L 238.12 441.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 418.88 403 L 411.88 406.5 L 413.63 403 L 411.88 399.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="110" y="408" width="120" height="60" fill="#f5f5f5" stroke="#666666" 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: 118px; height: 1px; padding-top: 438px; margin-left: 111px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ISSUE</div></div></div></foreignObject><text x="170" y="442" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">ISSUE</text></switch></g><path d="M 346.37 170 L 413.63 170" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 341.12 170 L 348.12 166.5 L 346.37 170 L 348.12 173.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 418.88 170 L 411.88 173.5 L 413.63 170 L 411.88 166.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 420 130 L 540 130 L 540 198 Q 510 176.4 480 198 Q 450 219.6 420 198 L 420 142 Z" fill="rgb(255, 255, 255)" 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 center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 158px; 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: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Change<br />Template</div></div></div></foreignObject><text x="480" y="162" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Change...</text></switch></g><path d="M 346.37 40 L 413.63 40" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 341.12 40 L 348.12 36.5 L 346.37 40 L 348.12 43.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 418.88 40 L 411.88 43.5 L 413.63 40 L 411.88 36.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="220" y="10" width="120" height="60" fill="#647687" stroke="#314354" 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: 118px; height: 1px; padding-top: 40px; margin-left: 221px;"><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;">PR</div></div></div></foreignObject><text x="280" y="44" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">PR</text></switch></g><path d="M 280 133.63 L 280 110 L 280 76.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 280 138.88 L 276.5 131.88 L 280 133.63 L 283.5 131.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 280 71.12 L 283.5 78.12 L 280 76.37 L 276.5 78.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 420 0 L 540 0 L 540 68 Q 510 46.4 480 68 Q 450 89.6 420 68 L 420 12 Z" fill="rgb(255, 255, 255)" 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 center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 28px; 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: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Feature/Component<br />Request<br />Template</div></div></div></foreignObject><text x="480" y="32" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Feature/Component...</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 diff --git a/docs/platform_management_plan/_assets/score_change_request_overview_simple.drawio.svg b/docs/platform_management_plan/_assets/score_change_request_overview_simple.drawio.svg new file mode 100644 index 0000000000..02dc63d462 --- /dev/null +++ b/docs/platform_management_plan/_assets/score_change_request_overview_simple.drawio.svg @@ -0,0 +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="556px" height="221px" viewBox="-0.5 -0.5 556 221" content="<mxfile host="Electron" modified="2025-09-07T08:21:18.760Z" 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="gIXw8knOxCWGj2NBp42e" version="20.3.0" type="device"><diagram id="0w90vh-N4AjfHz9zUi27" name="Model">1VjbUtswEP2aPNKJ7+ERQkI70A5DaIGnjrA3tkH2GllOYr6+si1HvkAIbTKk5gHt0a4uu3t2RxkY42h1zkgSfEcP6EAfequBcTbQddM2dfGvQPIK0TSnAnwWehJSwCx8AQkOJZqFHqQtRY5IeZi0QRfjGFzewghjuGyrzZG2d02IDz1g5hLaR29DjwcVOrKGCv8KoR/UO2tDORORWlkCaUA8XDYgYzIwxgyRV6NoNQZaOK/2S2U3fWN2fTAGMd/GYHSxWMx/Bc+3N08nv+f84vzl8ceRKc/G8/rC4In7SxEZD9DHmNCJQk8ZZrEHxapDISmdS8REgJoAH4HzXAaTZBwFFPCIytn+yeVlUsyYCxuOW2cAYT7wDXoy6Yq7NDaQfjkHjICzXCgwoISHi3asiUwZf62nvCoG0rEfcLJcd0FoJncaByQWR9NtKm5x+sDEyC9G1/CcQcp7QRG5kxRDD90sKr12ugxCDrOElP5aCvK1ffxQBeny4V2nL4BxWG10k5w9Oh7JXK7JvKbpUnFDqxM+aPCiNty5b63PSGDhQpbfSftSuC+EL1Ytnq2ak2e5lFKRuPykqEoCcClJ09Ct4WlI/50f+pb8MA6KH3qPH99ms5+TXmTbcXuHAHPhzzFSZKWtMbeKvwLHmDfw6iuDwPAJGjN2+e2IOY7TZY6+JXPsfTHH2Loq3UCUiDyAQy1LlmkdWlk6/oyytPfyYm9ZXkYHVV7sXqJfXe+0ttimY4+cfm2Zl99rtcXQTMMy91VbDPuza4tzwOkPq5DfqXYtpPvGjOrchVA3btXwVY+/b7X41xv+/ju5vWuqSdMrDMWRVZLZdifJrONO8lRXknbNd0h3Kau7lDnsLFXdureUiC3JG2pJoZBuOLSjdZnRfSN91EIMqlMobqyd/Pd0GfUq1BQIz5jouNMxRgnGRf68/Vr47xu2Ye2vYQtRPbKriKmfKozJHw==</diagram></mxfile>"><defs/><g><path d="M 120 40 L 203.63 40" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 208.88 40 L 201.88 43.5 L 203.63 40 L 201.88 36.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 0 0 L 120 0 L 120 68 Q 90 46.4 60 68 Q 30 89.6 0 68 L 0 12 Z" fill="rgb(255, 255, 255)" 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 center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 28px; margin-left: 1px;"><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;">Change<br />Request</div></div></div></foreignObject><text x="60" y="32" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Change...</text></switch></g><path d="M 336.37 40 L 428.63 40" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 331.12 40 L 338.12 36.5 L 336.37 40 L 338.12 43.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 433.88 40 L 426.88 43.5 L 428.63 40 L 426.88 36.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="210" y="10" width="120" height="60" fill="#f5f5f5" stroke="#666666" 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: 118px; height: 1px; padding-top: 40px; margin-left: 211px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ISSUE</div></div></div></foreignObject><text x="270" y="44" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">ISSUE</text></switch></g><path d="M 435 0 L 555 0 L 555 68 Q 525 46.4 495 68 Q 465 89.6 435 68 L 435 12 Z" fill="rgb(255, 255, 255)" 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 center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 28px; margin-left: 436px;"><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;">Change<br />Template</div></div></div></foreignObject><text x="495" y="32" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Change...</text></switch></g><path d="M 336.37 180 L 428.63 180" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 331.12 180 L 338.12 176.5 L 336.37 180 L 338.12 183.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 433.88 180 L 426.88 183.5 L 428.63 180 L 426.88 176.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="210" y="150" width="120" height="60" fill="#647687" stroke="#314354" 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: 118px; height: 1px; padding-top: 180px; margin-left: 211px;"><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;">PR</div></div></div></foreignObject><text x="270" y="184" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">PR</text></switch></g><path d="M 270 76.37 L 270 110 L 270 143.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 270 71.12 L 273.5 78.12 L 270 76.37 L 266.5 78.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 270 148.88 L 266.5 141.88 L 270 143.63 L 273.5 141.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 435 140 L 555 140 L 555 208 Q 525 186.4 495 208 Q 465 229.6 435 208 L 435 152 Z" fill="rgb(255, 255, 255)" 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 center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 168px; margin-left: 436px;"><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;">Feature/Component<br />Request<br />Template</div></div></div></foreignObject><text x="495" y="172" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Feature/Component...</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 diff --git a/docs/platform_management_plan/_assets/score_change_request_workflow_complex_1.drawio.svg b/docs/platform_management_plan/_assets/score_change_request_workflow_complex_1.drawio.svg deleted file mode 100644 index 9cdf1931f9..0000000000 --- a/docs/platform_management_plan/_assets/score_change_request_workflow_complex_1.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ -<?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="891px" height="992px" viewBox="-0.5 -0.5 891 992" content="<mxfile host="Electron" modified="2025-03-05T07:27:58.953Z" 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="204tE7KN9-QgA6hrLwAY" version="20.3.0" type="device"><diagram id="0w90vh-N4AjfHz9zUi27" name="Model">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</diagram></mxfile>"><defs/><g><rect x="0" y="720" width="890" height="140" 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: 888px; height: 1px; padding-top: 790px; margin-left: 2px;"><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: normal; overflow-wrap: normal;"><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />CR status:<br />accepted<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></div></div></div></foreignObject><text x="2" y="794" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" font-weight="bold">CR status:...</text></switch></g><rect x="570" y="580" width="320" height="140" fill="#dae8fc" stroke="#6c8ebf" 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: 318px; height: 1px; padding-top: 650px; margin-left: 572px;"><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: normal; overflow-wrap: normal;"><br /><br /><br /><br /><br />CR status:<br />in review<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><div style=""><br /></div></div></div></div></foreignObject><text x="572" y="654" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" font-weight="bold">CR status:...</text></switch></g><rect x="230" y="580" width="340" height="140" 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: 338px; height: 1px; padding-top: 650px; margin-left: 232px;"><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: normal; overflow-wrap: normal;"><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />CR status:<br />accepted<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></div></div></div></foreignObject><text x="232" y="654" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" font-weight="bold">CR status:...</text></switch></g><rect x="0" y="300" width="890" height="140" fill="#f5f5f5" stroke="#666666" 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: 888px; height: 1px; padding-top: 370px; margin-left: 2px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />CR status:<br />draft<br /><br /><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="2" y="374" fill="#333333" font-family="Helvetica" font-size="12px" font-weight="bold">CR status:...</text></switch></g><rect x="230" y="440" width="340" height="140" fill="#dae8fc" stroke="#6c8ebf" 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: 338px; height: 1px; padding-top: 510px; margin-left: 232px;"><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: normal; overflow-wrap: normal;"><br /><br /><br /><br /><br />CR status:<br />in review<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><div style=""><br /></div></div></div></div></foreignObject><text x="232" y="514" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" font-weight="bold">CR status:...</text></switch></g><path d="M 210 359.32 L 240.03 359.28 L 263.63 359.85" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 268.88 359.97 L 261.8 363.3 L 263.63 359.85 L 261.97 356.3 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 209.64 320.32 L 235 320.31 L 520.03 319.97 L 520.03 359.97 L 573.63 360" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 578.88 360 L 571.88 363.5 L 573.63 360 L 571.88 356.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="90" y="310" width="120" height="60" 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: 118px; height: 1px; padding-top: 340px; margin-left: 91px;"><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;">ISSUE<br />[OPEN]</div></div></div></foreignObject><text x="150" y="344" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ISSUE...</text></switch></g><path d="M 152 70 L 152 165.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 152 170.88 L 148.5 163.88 L 152 165.63 L 155.5 163.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="92" y="100" width="60" 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: 115px; margin-left: 122px;"><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;">creates</div></div></div></foreignObject><text x="122" y="119" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">creates</text></switch></g><ellipse cx="152" cy="55" rx="15" ry="15" fill="#000000" stroke="none" pointer-events="all"/><rect x="102" y="0" width="120" 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: 20px; margin-left: 162px;"><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><font style="font-size: 18px;">Contributor</font></b></div></div></div></foreignObject><text x="162" y="24" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Contributor</text></switch></g><path d="M 92 212 L 70.03 212.03 L 70.03 339.97 L 83.63 339.99" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 88.88 340 L 81.88 343.49 L 83.63 339.99 L 81.89 336.49 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 92 172 L 212 172 L 212 240 Q 182 218.4 152 240 Q 122 261.6 92 240 L 92 184 Z" fill="rgb(255, 255, 255)" 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 center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 200px; margin-left: 93px;"><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;">Change<br />Request<br />(CR)</div></div></div></foreignObject><text x="152" y="204" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Change...</text></switch></g><path d="M 500 430 L 500 473.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 500 478.88 L 496.5 471.88 L 500 473.63 L 503.5 471.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="440" y="370" width="120" height="60" fill="#647687" stroke="#314354" 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: 118px; height: 1px; padding-top: 400px; margin-left: 441px;"><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;">PR #1<br />[DRAFT]</div></div></div></foreignObject><text x="500" y="404" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">PR #1...</text></switch></g><path d="M 500 540 L 500 613.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 500 618.88 L 496.5 611.88 L 500 613.63 L 503.5 611.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="440" y="480" width="120" height="60" 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: 118px; height: 1px; padding-top: 510px; margin-left: 441px;"><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;">PR #1<br />[OPEN]</div></div></div></foreignObject><text x="500" y="514" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">PR #1...</text></switch></g><path d="M 440 650 L 396.37 650" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 391.12 650 L 398.12 646.5 L 396.37 650 L 398.12 653.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="440" y="620" width="120" height="60" fill="#6a00ff" stroke="#3700cc" 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: 118px; height: 1px; padding-top: 650px; margin-left: 441px;"><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;">PR #1<br />[MERGED]</div></div></div></foreignObject><text x="500" y="654" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">PR #1...</text></switch></g><rect x="90" y="760" width="120" height="60" 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: 118px; height: 1px; padding-top: 790px; margin-left: 91px;"><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;">ISSUE<br />[CLOSED]</div></div></div></foreignObject><text x="150" y="794" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ISSUE...</text></switch></g><rect x="750" y="370" width="120" height="60" fill="#647687" stroke="#314354" 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: 118px; height: 1px; padding-top: 400px; margin-left: 751px;"><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;">PR #2<br />[DRAFT]</div></div></div></foreignObject><text x="810" y="404" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">PR #2...</text></switch></g><path d="M 810 680 L 810 753.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 810 758.88 L 806.5 751.88 L 810 753.63 L 813.5 751.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="750" y="620" width="120" height="60" 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: 118px; height: 1px; padding-top: 650px; margin-left: 751px;"><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;">PR #2<br />[OPEN]</div></div></div></foreignObject><text x="810" y="654" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">PR #2...</text></switch></g><path d="M 750 790 L 716.37 790" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 711.12 790 L 718.12 786.5 L 716.37 790 L 718.12 793.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="750" y="760" width="120" height="60" fill="#6a00ff" stroke="#3700cc" 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: 118px; height: 1px; padding-top: 790px; margin-left: 751px;"><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;">PR #2<br />[MERGED]</div></div></div></foreignObject><text x="810" y="794" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">PR #2...</text></switch></g><path d="M 390 359.97 L 415 359.97 L 415 399.97 L 433.63 399.99" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 438.88 400 L 431.88 403.49 L 433.63 399.99 L 431.89 396.49 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="270" y="330" width="120" height="60" 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: 118px; height: 1px; padding-top: 360px; margin-left: 271px;"><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;">SUB-ISSUE #1<br />[OPEN]</div></div></div></foreignObject><text x="330" y="364" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">SUB-ISSUE #1...</text></switch></g><path d="M 700 359.97 L 725 359.97 L 725 399.97 L 743.63 399.97" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 748.88 399.97 L 741.88 403.47 L 743.63 399.97 L 741.88 396.47 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="580" y="330" width="120" height="60" 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: 118px; height: 1px; padding-top: 360px; margin-left: 581px;"><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;">SUB-ISSUE #2<br />[OPEN]</div></div></div></foreignObject><text x="640" y="364" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">SUB-ISSUE #2...</text></switch></g><rect x="270" y="620" width="120" height="60" 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: 118px; height: 1px; padding-top: 650px; margin-left: 271px;"><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;">SUB-ISSUE #1<br />[CLOSED]</div></div></div></foreignObject><text x="330" y="654" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">SUB-ISSUE #1...</text></switch></g><path d="M 390 510 L 433.63 510" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 438.88 510 L 431.88 513.5 L 433.63 510 L 431.88 506.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="270" y="480" width="120" height="60" 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: 118px; height: 1px; padding-top: 510px; margin-left: 271px;"><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;">SUB-ISSUE #1<br />[OPEN]</div></div></div></foreignObject><text x="330" y="514" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">SUB-ISSUE #1...</text></switch></g><rect x="0" y="440" width="230" height="140" fill="#f5f5f5" stroke="#666666" 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: 228px; height: 1px; padding-top: 510px; margin-left: 2px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />CR status:<br />draft<br /><br /><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="2" y="514" fill="#333333" font-family="Helvetica" font-size="12px" font-weight="bold">CR status:...</text></switch></g><rect x="570" y="440" width="320" height="140" fill="#f5f5f5" stroke="#666666" 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: 318px; height: 1px; padding-top: 510px; margin-left: 572px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />CR status:<br />draft<br /><br /><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="572" y="514" fill="#333333" font-family="Helvetica" font-size="12px" font-weight="bold">CR status:...</text></switch></g><rect x="0" y="580" width="230" height="140" fill="#dae8fc" stroke="#6c8ebf" 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: 228px; height: 1px; padding-top: 650px; margin-left: 2px;"><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: normal; overflow-wrap: normal;"><br /><br /><br /><br /><br />CR status:<br />in review<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><div style=""><br /></div></div></div></div></foreignObject><text x="2" y="654" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" font-weight="bold">CR status:...</text></switch></g><rect x="590" y="760" width="120" height="60" 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: 118px; height: 1px; padding-top: 790px; margin-left: 591px;"><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;">SUB-ISSUE #2<br />[CLOSED]</div></div></div></foreignObject><text x="650" y="794" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">SUB-ISSUE #2...</text></switch></g><path d="M 150 370 L 150 753.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 150 758.88 L 146.5 751.88 L 150 753.63 L 153.5 751.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 700 650 L 743.63 650" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 748.88 650 L 741.88 653.5 L 743.63 650 L 741.88 646.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="580" y="620" width="120" height="60" 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: 118px; height: 1px; padding-top: 650px; margin-left: 581px;"><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;">SUB-ISSUE #2<br />[OPEN]</div></div></div></foreignObject><text x="640" y="654" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">SUB-ISSUE #2...</text></switch></g><path d="M 810 430 L 810 613.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 810 618.88 L 806.5 611.88 L 810 613.63 L 813.5 611.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></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 diff --git a/docs/platform_management_plan/_assets/score_change_request_workflow_complex_2.drawio.svg b/docs/platform_management_plan/_assets/score_change_request_workflow_complex_2.drawio.svg deleted file mode 100644 index 8ff6d27471..0000000000 --- a/docs/platform_management_plan/_assets/score_change_request_workflow_complex_2.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ -<?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="1151px" height="992px" viewBox="-0.5 -0.5 1151 992" content="<mxfile host="Electron" modified="2025-03-07T18:12:10.836Z" 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="zaxYqF7PGFEx74OzO-ol" version="20.3.0" type="device"><diagram id="0w90vh-N4AjfHz9zUi27" name="Model">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</diagram></mxfile>"><defs/><g><rect x="700" y="300" width="450" height="140" fill="#f5f5f5" stroke="#666666" 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: 448px; height: 1px; padding-top: 370px; margin-left: 702px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />CR status:<br />draft<br /><br /><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="702" y="374" fill="#333333" font-family="Helvetica" font-size="12px" font-weight="bold">CR status:...</text></switch></g><rect x="700" y="580" width="450" height="140" 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: 448px; height: 1px; padding-top: 650px; margin-left: 702px;"><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: normal; overflow-wrap: normal;"><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />CR status:<br />accepted<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></div></div></div></foreignObject><text x="702" y="654" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" font-weight="bold">CR status:...</text></switch></g><rect x="700" y="440" width="450" height="140" fill="#dae8fc" stroke="#6c8ebf" 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: 448px; height: 1px; padding-top: 510px; margin-left: 702px;"><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: normal; overflow-wrap: normal;"><br /><br /><br /><br /><br />CR status:<br />in review<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><div style=""><br /></div></div></div></div></foreignObject><text x="702" y="514" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" font-weight="bold">CR status:...</text></switch></g><rect x="0" y="720" width="570" height="140" 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: 568px; height: 1px; padding-top: 790px; margin-left: 2px;"><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: normal; overflow-wrap: normal;"><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />CR status:<br />accepted<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></div></div></div></foreignObject><text x="2" y="794" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" font-weight="bold">CR status:...</text></switch></g><rect x="230" y="580" width="340" height="140" 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: 338px; height: 1px; padding-top: 650px; margin-left: 232px;"><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: normal; overflow-wrap: normal;"><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />CR status:<br />accepted<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></div></div></div></foreignObject><text x="232" y="654" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" font-weight="bold">CR status:...</text></switch></g><rect x="0" y="300" width="570" height="140" fill="#f5f5f5" stroke="#666666" 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: 568px; height: 1px; padding-top: 370px; margin-left: 2px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />CR status:<br />draft<br /><br /><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="2" y="374" fill="#333333" font-family="Helvetica" font-size="12px" font-weight="bold">CR status:...</text></switch></g><rect x="230" y="440" width="340" height="140" fill="#dae8fc" stroke="#6c8ebf" 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: 338px; height: 1px; padding-top: 510px; margin-left: 232px;"><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: normal; overflow-wrap: normal;"><br /><br /><br /><br /><br />CR status:<br />in review<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><div style=""><br /></div></div></div></div></foreignObject><text x="232" y="514" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" font-weight="bold">CR status:...</text></switch></g><path d="M 210 340 L 240 340 L 240 400 L 263.63 400" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 268.88 400 L 261.88 403.5 L 263.63 400 L 261.88 396.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 210 320 L 590 320 L 590 400 L 783.63 400" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 788.88 400 L 781.88 403.5 L 783.63 400 L 781.88 396.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="90" y="310" width="120" height="60" 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: 118px; height: 1px; padding-top: 340px; margin-left: 91px;"><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><SCORE-REPO></b><br />ISSUE<br />[OPEN]</div></div></div></foreignObject><text x="150" y="344" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"><SCORE-REPO>...</text></switch></g><path d="M 152 70 L 152 165.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 152 170.88 L 148.5 163.88 L 152 165.63 L 155.5 163.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="92" y="100" width="60" 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: 115px; margin-left: 122px;"><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;">creates</div></div></div></foreignObject><text x="122" y="119" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">creates</text></switch></g><ellipse cx="152" cy="55" rx="15" ry="15" fill="#000000" stroke="none" pointer-events="all"/><rect x="102" y="0" width="120" 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: 20px; margin-left: 162px;"><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><font style="font-size: 18px;">Contributor</font></b></div></div></div></foreignObject><text x="162" y="24" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Contributor</text></switch></g><path d="M 92 212 L 70 212 L 70 340 L 83.63 340" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 88.88 340 L 81.88 343.5 L 83.63 340 L 81.88 336.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 92 172 L 212 172 L 212 240 Q 182 218.4 152 240 Q 122 261.6 92 240 L 92 184 Z" fill="rgb(255, 255, 255)" 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 center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 200px; margin-left: 93px;"><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;">Change<br />Request<br />(CR)</div></div></div></foreignObject><text x="152" y="204" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Change...</text></switch></g><path d="M 493 430 L 493 473.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 493 478.88 L 489.5 471.88 L 493 473.63 L 496.5 471.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="433" y="370" width="120" height="60" fill="#647687" stroke="#314354" 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: 118px; height: 1px; padding-top: 400px; margin-left: 434px;"><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;"><b style=""><SCORE-REPO><br /></b>PR<br />[DRAFT]</div></div></div></foreignObject><text x="493" y="404" fill="#FFFFFF" font-family="Helvetica" font-size="12px" text-anchor="middle"><SCORE-REPO>...</text></switch></g><path d="M 493 540 L 493 623.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 493 628.88 L 489.5 621.88 L 493 623.63 L 496.5 621.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="433" y="480" width="120" height="60" 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: 118px; height: 1px; padding-top: 510px; margin-left: 434px;"><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;"><b><SCORE-REPO><br /></b>PR<br />[OPEN]</div></div></div></foreignObject><text x="493" y="514" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle"><SCORE-REPO>...</text></switch></g><path d="M 433 660 L 396.37 660" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 391.12 660 L 398.12 656.5 L 396.37 660 L 398.12 663.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="433" y="630" width="120" height="60" fill="#6a00ff" stroke="#3700cc" 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: 118px; height: 1px; padding-top: 660px; margin-left: 434px;"><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;"><b><SCORE-REPO><br /></b>PR<br />[MERGED]</div></div></div></foreignObject><text x="493" y="664" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle"><SCORE-REPO>...</text></switch></g><rect x="90" y="760" width="120" height="60" 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: 118px; height: 1px; padding-top: 790px; margin-left: 91px;"><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><SCORE-REPO></b><br />[CLOSED]</div></div></div></foreignObject><text x="150" y="794" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"><SCORE-REPO>...</text></switch></g><rect x="0" y="440" width="230" height="280" fill="#dae8fc" stroke="#6c8ebf" 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: 228px; height: 1px; padding-top: 580px; margin-left: 2px;"><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: normal; overflow-wrap: normal;"><br /><br /><br /><br /><br />CR status:<br />in review<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><div style=""><br /></div></div></div></div></foreignObject><text x="2" y="584" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" font-weight="bold">CR status:...</text></switch></g><path d="M 910 400 L 983.63 400" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 988.88 400 L 981.88 403.5 L 983.63 400 L 981.88 396.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="790" y="370" width="120" height="60" 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: 118px; height: 1px; padding-top: 400px; margin-left: 791px;"><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><MODULE-REPO></b><br />ISSUE<br />[OPEN]</div></div></div></foreignObject><text x="850" y="404" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"><MODULE-REPO>...</text></switch></g><path d="M 1050 430 L 1050 483.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1050 488.88 L 1046.5 481.88 L 1050 483.63 L 1053.5 481.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="990" y="370" width="120" height="60" fill="#647687" stroke="#314354" 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: 118px; height: 1px; padding-top: 400px; margin-left: 991px;"><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;"><b style=""><MODULE-REPO><br /></b>PR<br />[DRAFT]</div></div></div></foreignObject><text x="1050" y="404" fill="#FFFFFF" font-family="Helvetica" font-size="12px" text-anchor="middle"><MODULE-REPO>...</text></switch></g><path d="M 1050 550 L 1050 613.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1050 618.88 L 1046.5 611.88 L 1050 613.63 L 1053.5 611.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="990" y="490" width="120" height="60" 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: 118px; height: 1px; padding-top: 520px; margin-left: 991px;"><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;"><b><MODULE-REPO><br /></b>PR<br />[OPEN]</div></div></div></foreignObject><text x="1050" y="524" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle"><MODULE-REPO>...</text></switch></g><path d="M 990 650 L 916.37 650" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 911.12 650 L 918.12 646.5 L 916.37 650 L 918.12 653.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="990" y="620" width="120" height="60" fill="#6a00ff" stroke="#3700cc" 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: 118px; height: 1px; padding-top: 650px; margin-left: 991px;"><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;"><b><MODULE-REPO><br /></b>PR<br />[MERGED]</div></div></div></foreignObject><text x="1050" y="654" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle"><MODULE-REPO>...</text></switch></g><path d="M 390 400 L 426.63 400" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 431.88 400 L 424.88 403.5 L 426.63 400 L 424.88 396.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="270" y="370" width="120" height="60" 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: 118px; height: 1px; padding-top: 400px; margin-left: 271px;"><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><SCORE-REPO><br /></b>SUB-ISSUE<br />[OPEN]</div></div></div></foreignObject><text x="330" y="404" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"><SCORE-REPO>...</text></switch></g><path d="M 390 510 L 426.63 510" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 431.88 510 L 424.88 513.5 L 426.63 510 L 424.88 506.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="270" y="480" width="120" height="60" 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: 118px; height: 1px; padding-top: 510px; margin-left: 271px;"><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><SCORE-REPO><br /></b>SUB-ISSUE<br />[OPEN]</div></div></div></foreignObject><text x="330" y="514" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"><SCORE-REPO>...</text></switch></g><rect x="270" y="630" width="120" height="60" 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: 118px; height: 1px; padding-top: 660px; margin-left: 271px;"><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><SCORE-REPO></b><br />[CLOSED]</div></div></div></foreignObject><text x="330" y="664" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"><SCORE-REPO>...</text></switch></g><path d="M 910 520 L 983.63 520" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 988.88 520 L 981.88 523.5 L 983.63 520 L 981.88 516.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="790" y="490" width="120" height="60" 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: 118px; height: 1px; padding-top: 520px; margin-left: 791px;"><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><MODULE-REPO></b><br />ISSUE<br />[OPEN]</div></div></div></foreignObject><text x="850" y="524" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"><MODULE-REPO>...</text></switch></g><rect x="790" y="620" width="120" height="60" 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: 118px; height: 1px; padding-top: 650px; margin-left: 791px;"><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><MODULE-REPO></b><br />[CLOSED]</div></div></div></foreignObject><text x="850" y="654" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"><MODULE-REPO>...</text></switch></g><path d="M 150 370 L 150 753.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 150 758.88 L 146.5 751.88 L 150 753.63 L 153.5 751.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></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 diff --git a/docs/platform_management_plan/_assets/score_change_request_workflow_simple.drawio.svg b/docs/platform_management_plan/_assets/score_change_request_workflow_simple.drawio.svg index e13c7a3e18..9b49ebc1bc 100644 --- a/docs/platform_management_plan/_assets/score_change_request_workflow_simple.drawio.svg +++ b/docs/platform_management_plan/_assets/score_change_request_workflow_simple.drawio.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="481px" height="914px" viewBox="-0.5 -0.5 481 914" content="<mxfile host="Electron" modified="2025-03-07T17:29:25.072Z" 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="nsAP3WzAnRwBZ6gRqzGW" version="20.3.0" type="device"><diagram id="0w90vh-N4AjfHz9zUi27" name="Model">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</diagram></mxfile>"><defs/><g><rect x="0" y="580" width="480" height="140" 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: 478px; height: 1px; padding-top: 650px; margin-left: 2px;"><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: normal; overflow-wrap: normal;"><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />CR status:<br />accepted<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></div></div></div></foreignObject><text x="2" y="654" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" font-weight="bold">CR status:...</text></switch></g><rect x="0" y="300" width="480" height="140" fill="#f5f5f5" stroke="#666666" 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: 478px; height: 1px; padding-top: 370px; margin-left: 2px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />CR status:<br />draft<br /><br /><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="2" y="374" fill="#333333" font-family="Helvetica" font-size="12px" font-weight="bold">CR status:...</text></switch></g><rect x="0" y="440" width="480" height="140" fill="#dae8fc" stroke="#6c8ebf" 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: 478px; height: 1px; padding-top: 510px; margin-left: 2px;"><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: normal; overflow-wrap: normal;"><br /><br /><br /><br /><br />CR status:<br />in review<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><div style=""><br /></div></div></div></div></foreignObject><text x="2" y="514" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" font-weight="bold">CR status:...</text></switch></g><path d="M 235 360 L 323.63 360" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 328.88 360 L 321.88 363.5 L 323.63 360 L 321.88 356.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 175 390 L 175 473.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 175 478.88 L 171.5 471.88 L 175 473.63 L 178.5 471.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="115" y="330" width="120" height="60" 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: 118px; height: 1px; padding-top: 360px; margin-left: 116px;"><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;">ISSUE<br />[OPEN]</div></div></div></foreignObject><text x="175" y="364" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ISSUE...</text></switch></g><path d="M 170 70 L 170 165.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 170 170.88 L 166.5 163.88 L 170 165.63 L 173.5 163.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="110" y="100" width="60" 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: 115px; margin-left: 140px;"><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;">creates</div></div></div></foreignObject><text x="140" y="119" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">creates</text></switch></g><ellipse cx="170" cy="55" rx="14.999999999999998" ry="14.999999999999998" fill="#000000" stroke="none" pointer-events="all"/><rect x="120" y="0" width="120" 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: 20px; margin-left: 180px;"><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><font style="font-size: 18px;">Contributor</font></b></div></div></div></foreignObject><text x="180" y="24" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Contributor</text></switch></g><path d="M 110 212 L 90.04 212.04 L 90.04 360.04 L 108.63 360.01" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 113.88 360 L 106.89 363.51 L 108.63 360.01 L 106.88 356.51 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 110 172 L 230 172 L 230 240 Q 200 218.4 170 240 Q 140 261.6 110 240 L 110 184 Z" fill="rgb(255, 255, 255)" 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 center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 200px; margin-left: 111px;"><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;">Change<br />Request<br />(CR)</div></div></div></foreignObject><text x="170" y="204" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Change...</text></switch></g><path d="M 390 390 L 390 473.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 390 478.88 L 386.5 471.88 L 390 473.63 L 393.5 471.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="330" y="330" width="120" height="60" fill="#647687" stroke="#314354" 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: 118px; height: 1px; padding-top: 360px; margin-left: 331px;"><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;">PR<br />[DRAFT]</div></div></div></foreignObject><text x="390" y="364" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">PR...</text></switch></g><path d="M 390 540 L 390 613.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 390 618.88 L 386.5 611.88 L 390 613.63 L 393.5 611.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="330" y="480" width="120" height="60" 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: 118px; height: 1px; padding-top: 510px; margin-left: 331px;"><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;">PR<br />[OPEN]</div></div></div></foreignObject><text x="390" y="514" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">PR...</text></switch></g><path d="M 330 650 L 241.37 650" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 236.12 650 L 243.12 646.5 L 241.37 650 L 243.12 653.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="330" y="620" width="120" height="60" fill="#6a00ff" stroke="#3700cc" 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: 118px; height: 1px; padding-top: 650px; margin-left: 331px;"><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;">PR<br />[MERGED]</div></div></div></foreignObject><text x="390" y="654" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">PR...</text></switch></g><rect x="115" y="620" width="120" height="60" 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: 118px; height: 1px; padding-top: 650px; margin-left: 116px;"><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;">ISSUE<br />[CLOSED]</div></div></div></foreignObject><text x="175" y="654" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ISSUE...</text></switch></g><path d="M 235 510 L 323.63 510" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 328.88 510 L 321.88 513.5 L 323.63 510 L 321.88 506.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="115" y="480" width="120" height="60" 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: 118px; height: 1px; padding-top: 510px; margin-left: 116px;"><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;">ISSUE<br />[OPEN]</div></div></div></foreignObject><text x="175" y="514" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ISSUE...</text></switch></g><rect x="0" y="720" width="480" height="140" fill="#fad9d5" stroke="#ae4132" 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: 478px; height: 1px; padding-top: 790px; margin-left: 2px;"><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: normal; overflow-wrap: normal;"><br /><br /><br /><br /><br />CR status:<br />rejected<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><div style=""><br /></div></div></div></div></foreignObject><text x="2" y="794" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" font-weight="bold">CR status:...</text></switch></g><rect x="115" y="760" width="120" height="60" 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: 118px; height: 1px; padding-top: 790px; margin-left: 116px;"><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;">ISSUE<br />[CLOSED]</div></div></div></foreignObject><text x="175" y="794" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ISSUE...</text></switch></g><path d="M 330 790 L 241.37 790" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 236.12 790 L 243.12 786.5 L 241.37 790 L 243.12 793.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="330" y="760" width="120" height="60" fill="#d80073" stroke="#a50040" 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: 118px; height: 1px; padding-top: 790px; margin-left: 331px;"><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;">PR<br />[Closed]</div></div></div></foreignObject><text x="390" y="794" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">PR...</text></switch></g><path d="M 450 510.04 L 470.04 510.04 L 470.04 790.04 L 456.37 790.04" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 451.12 790.04 L 458.12 786.54 L 456.37 790.04 L 458.12 793.54 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></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="1031px" height="1053px" viewBox="-0.5 -0.5 1031 1053" content="<mxfile host="Electron" modified="2025-09-07T11:20:28.836Z" 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="pzJW9AMS_ExNRxj-02vJ" version="20.3.0" type="device"><diagram id="0w90vh-N4AjfHz9zUi27" name="Model">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</diagram></mxfile>"><defs/><g><rect x="150" y="720" width="880" height="140" 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: 878px; height: 1px; padding-top: 790px; margin-left: 152px;"><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: normal; overflow-wrap: normal;"><br /><br /><br /><br /><br /><br /><br /><br /><br />status:<br />closed<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></div></div></div></foreignObject><text x="152" y="794" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" font-weight="bold">status:...</text></switch></g><rect x="150" y="580" width="880" height="140" 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: 878px; height: 1px; padding-top: 650px; margin-left: 152px;"><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: normal; overflow-wrap: normal;"><br /><br /><br /><br /><br /><br /><br /><br /><br />status:<br />in implementation<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></div></div></div></foreignObject><text x="152" y="654" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" font-weight="bold">status:...</text></switch></g><rect x="150" y="300" width="880" height="140" fill="#f5f5f5" stroke="#666666" 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: 878px; height: 1px; padding-top: 370px; margin-left: 152px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;"><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />status:<br />open<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></div></div></div></foreignObject><text x="152" y="374" fill="#333333" font-family="Helvetica" font-size="12px" font-weight="bold">status:...</text></switch></g><rect x="150" y="440" width="880" height="140" fill="#dae8fc" stroke="#6c8ebf" 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: 878px; height: 1px; padding-top: 510px; margin-left: 152px;"><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: normal; overflow-wrap: normal;"><br /><br /><br /><br /><br />status:<br />in review<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><div style=""><br /></div></div></div></div></foreignObject><text x="152" y="514" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" font-weight="bold">status:...</text></switch></g><path d="M 385 360 L 443.63 360" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 448.88 360 L 441.88 363.5 L 443.63 360 L 441.88 356.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 325 390 L 325 430 L 770 430 L 770 396.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 770 391.12 L 773.5 398.12 L 770 396.37 L 766.5 398.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 325 390 L 325 430 L 950 430 L 950 396.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 950 391.12 L 953.5 398.12 L 950 396.37 L 946.5 398.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="265" y="330" width="120" height="60" 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: 118px; height: 1px; padding-top: 360px; margin-left: 266px;"><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;">ISSUE<br />[Open]</div></div></div></foreignObject><text x="325" y="364" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ISSUE...</text></switch></g><path d="M 320 70 L 320 165.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 320 170.88 L 316.5 163.88 L 320 165.63 L 323.5 163.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="260" y="100" width="60" 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: 115px; margin-left: 290px;"><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;">creates</div></div></div></foreignObject><text x="290" y="119" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">creates</text></switch></g><ellipse cx="320" cy="55" rx="15" ry="15" fill="#000000" stroke="none" pointer-events="all"/><rect x="270" y="0" width="120" 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: 20px; margin-left: 330px;"><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><font style="font-size: 18px;">Contributor</font></b></div></div></div></foreignObject><text x="330" y="24" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Contributor</text></switch></g><path d="M 260 212 L 240 212 L 240 345 L 258.63 345" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 263.88 345 L 256.88 348.5 L 258.63 345 L 256.88 341.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 260 172 L 380 172 L 380 240 Q 350 218.4 320 240 Q 290 261.6 260 240 L 260 184 Z" fill="rgb(255, 255, 255)" 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 center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 200px; 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: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Change Request</div></div></div></foreignObject><text x="320" y="204" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Change Request</text></switch></g><path d="M 325 826.37 L 325 850 L 770 850 L 770 820" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 325 821.12 L 328.5 828.12 L 325 826.37 L 321.5 828.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="265" y="760" width="120" height="60" 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: 118px; height: 1px; padding-top: 790px; margin-left: 266px;"><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;">ISSUE<br />[Closed]</div></div></div></foreignObject><text x="325" y="794" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ISSUE...</text></switch></g><path d="M 330 540 L 330 570 L 770 570 L 770 546.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 770 541.12 L 773.5 548.12 L 770 546.37 L 766.5 548.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="265" y="480" width="120" height="60" 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: 118px; height: 1px; padding-top: 510px; margin-left: 266px;"><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;">ISSUE<br />[Open]</div></div></div></foreignObject><text x="325" y="514" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ISSUE...</text></switch></g><rect x="150" y="860" width="880" height="140" fill="#bac8d3" stroke="#23445d" 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: 878px; height: 1px; padding-top: 930px; margin-left: 152px;"><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: normal; overflow-wrap: normal;"><br /><br /><br /><br /><br />CR status:<br />rejected<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><div style=""><br /></div></div></div></div></foreignObject><text x="152" y="934" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" font-weight="bold">CR status:...</text></switch></g><path d="M 325 966.37 L 325 990 L 770 990 L 770 960" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 325 961.12 L 328.5 968.12 L 325 966.37 L 321.5 968.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="265" y="900" width="120" height="60" fill="#647687" stroke="#314354" 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: 118px; height: 1px; padding-top: 930px; margin-left: 266px;"><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;">ISSUE<br />[Closed as not planned]</div></div></div></foreignObject><text x="325" y="934" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">ISSUE...</text></switch></g><path d="M 494.97 390 L 494.97 473.62" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 494.97 478.87 L 491.47 471.87 L 494.97 473.62 L 498.47 471.87 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="450" y="330" width="90" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 450 350 L 540 350" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 470 330 L 470 390" 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 center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 360px; margin-left: 451px;"><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;"><br />status:<br />     No Status</div></div></div></foreignObject><text x="495" y="364" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">status:...</text></switch></g><rect x="469" y="326" width="70" 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: 341px; margin-left: 504px;"><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;">Projects</div></div></div></foreignObject><text x="504" y="345" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Projects</text></switch></g><path d="M 385 510 L 443.63 510" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 448.88 510 L 441.88 513.5 L 443.63 510 L 441.88 506.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 495.02 540 L 495.02 613.62" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 495.02 618.87 L 491.52 611.87 L 495.02 613.62 L 498.52 611.87 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="450" y="480" width="90" height="60" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/><path d="M 450 500 L 540 500" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/><path d="M 470 480 L 470 540" fill="none" stroke="#82b366" 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 center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 510px; margin-left: 451px;"><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;"><br />status:<br />Todo</div></div></div></foreignObject><text x="495" y="514" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">status:...</text></switch></g><rect x="469" y="476" width="70" 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: 491px; margin-left: 504px;"><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;">Projects</div></div></div></foreignObject><text x="504" y="495" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Projects</text></switch></g><path d="M 265 665 L 230 665 L 230 915 L 258.63 915" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 263.88 915 L 256.88 918.5 L 258.63 915 L 256.88 911.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 325 680 L 325 710 L 950 710 L 950 686.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 950 681.12 L 953.5 688.12 L 950 686.37 L 946.5 688.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 325 680 L 325 710 L 770 710 L 770 686.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 770 681.12 L 773.5 688.12 L 770 686.37 L 766.5 688.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="265" y="620" width="120" height="60" 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: 118px; height: 1px; padding-top: 650px; margin-left: 266px;"><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;">ISSUE<br />[Open]</div></div></div></foreignObject><text x="325" y="654" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ISSUE...</text></switch></g><path d="M 384 650 L 442.63 650" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 447.88 650 L 440.88 653.5 L 442.63 650 L 440.88 646.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 493.97 680 L 493.97 753.62" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 493.97 758.87 L 490.47 751.87 L 493.97 753.62 L 497.47 751.87 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="449" y="620" width="90" height="60" fill="#fff2cc" stroke="#d6b656" pointer-events="all"/><path d="M 449 640 L 539 640" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/><path d="M 469 620 L 469 680" fill="none" stroke="#d6b656" 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 center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 650px; margin-left: 450px;"><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;"><br />status:<br />     In Progress</div></div></div></foreignObject><text x="494" y="654" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">status:...</text></switch></g><rect x="468" y="616" width="70" 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: 631px; margin-left: 503px;"><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;">Projects</div></div></div></foreignObject><text x="503" y="635" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Projects</text></switch></g><path d="M 265 510 L 130 510 L 130 930 L 258.63 930" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 263.88 930 L 256.88 933.5 L 258.63 930 L 256.88 926.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 390.37 790 L 449 790" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 385.12 790 L 392.12 786.5 L 390.37 790 L 392.12 793.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 539 790 L 560 790 L 560 650 L 545.37 650" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 540.12 650 L 547.12 646.5 L 545.37 650 L 547.12 653.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="449" y="760" width="90" height="60" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><path d="M 449 780 L 539 780" fill="none" stroke="#9673a6" stroke-miterlimit="10" pointer-events="all"/><path d="M 469 760 L 469 820" fill="none" stroke="#9673a6" 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 center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 790px; margin-left: 450px;"><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;"><br />status:<br />     Done</div></div></div></foreignObject><text x="494" y="794" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">status:...</text></switch></g><rect x="468" y="756" width="70" 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: 771px; margin-left: 503px;"><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;">Projects</div></div></div></foreignObject><text x="503" y="775" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Projects</text></switch></g><path d="M 35 340.5 L 45 340.5 L 45 398.5 L 55.5 398.5 L 40 417.5 L 24.5 398.5 L 35 398.5 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="20" y="290" width="80" 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: 305px; margin-left: 60px;"><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><font style="font-size: 14px;">Creation</font></b></div></div></div></foreignObject><text x="60" y="309" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Creation</text></switch></g><rect x="20" y="440" width="80" 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: 455px; margin-left: 60px;"><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><font style="font-size: 14px;">Analysis</font></b></div></div></div></foreignObject><text x="60" y="459" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Analysis</text></switch></g><path d="M 35 502.5 L 45 502.5 L 45 560.5 L 55.5 560.5 L 40 579.5 L 24.5 560.5 L 35 560.5 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="0" y="580" width="120" height="50" 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: 605px; margin-left: 60px;"><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><font style="font-size: 14px;">Implement and <br />Monitor<br /></font></b></div></div></div></foreignObject><text x="60" y="609" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Implement and...</text></switch></g><path d="M 35 642.5 L 45 642.5 L 45 700.5 L 55.5 700.5 L 40 719.5 L 24.5 700.5 L 35 700.5 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="25" y="740" width="60" 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: 755px; margin-left: 55px;"><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><font style="font-size: 14px;">Close<br /></font></b></div></div></div></foreignObject><text x="55" y="759" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Close </text></switch></g><path d="M 35 782.5 L 45 782.5 L 45 840.5 L 55.5 840.5 L 40 859.5 L 24.5 840.5 L 35 840.5 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 265 360 L 110 360 L 110 950 L 258.63 950" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 263.88 950 L 256.88 953.5 L 258.63 950 L 256.88 946.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 1010 360 L 1020 360 L 1020 930 L 836.37 930" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 831.12 930 L 838.12 926.5 L 836.37 930 L 838.12 933.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="890" y="330" width="120" height="60" 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: 118px; height: 1px; padding-top: 360px; margin-left: 891px;"><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;">PR<br />[Open]</div></div></div></foreignObject><text x="950" y="364" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">PR...</text></switch></g><rect x="710" y="330" width="120" height="60" fill="#647687" stroke="#314354" 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: 118px; height: 1px; padding-top: 360px; margin-left: 711px;"><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;">PR<br />[Draft]</div></div></div></foreignObject><text x="770" y="364" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">PR...</text></switch></g><path d="M 1010 510 L 1020 510 L 1020 930 L 836.37 930" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 831.12 930 L 838.12 926.5 L 836.37 930 L 838.12 933.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="890" y="480" width="120" height="60" 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: 118px; height: 1px; padding-top: 510px; margin-left: 891px;"><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;">PR<br />[Open]</div></div></div></foreignObject><text x="950" y="514" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">PR...</text></switch></g><rect x="710" y="480" width="120" height="60" fill="#647687" stroke="#314354" 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: 118px; height: 1px; padding-top: 510px; margin-left: 711px;"><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;">PR<br />[Draft]</div></div></div></foreignObject><text x="770" y="514" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">PR...</text></switch></g><rect x="710" y="760" width="120" height="60" fill="#6a00ff" stroke="#3700cc" 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: 118px; height: 1px; padding-top: 790px; margin-left: 711px;"><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;">PR<br />[Merged]</div></div></div></foreignObject><text x="770" y="794" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">PR...</text></switch></g><rect x="710" y="900" width="120" height="60" fill="#d80073" stroke="#a50040" 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: 118px; height: 1px; padding-top: 930px; margin-left: 711px;"><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;">PR<br />[Closed]</div></div></div></foreignObject><text x="770" y="934" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">PR...</text></switch></g><rect x="840" y="340" 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: 355px; margin-left: 860px;"><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: nowrap;">OR</div></div></div></foreignObject><text x="860" y="359" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" font-weight="bold">OR</text></switch></g><rect x="840" y="495" 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: 510px; margin-left: 860px;"><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: nowrap;">OR</div></div></div></foreignObject><text x="860" y="514" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" font-weight="bold">OR</text></switch></g><path d="M 329.44 540 L 329.4 570 L 950 570 L 950 546.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 950 541.12 L 953.5 548.12 L 950 546.37 L 946.5 548.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 1010 650 L 1020 650 L 1020 930 L 836.37 930" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 831.12 930 L 838.12 926.5 L 836.37 930 L 838.12 933.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="890" y="620" width="120" height="60" 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: 118px; height: 1px; padding-top: 650px; margin-left: 891px;"><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;">PR<br />[Open]</div></div></div></foreignObject><text x="950" y="654" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">PR...</text></switch></g><rect x="710" y="620" width="120" height="60" fill="#647687" stroke="#314354" 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: 118px; height: 1px; padding-top: 650px; margin-left: 711px;"><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;">PR<br />[Draft</div></div></div></foreignObject><text x="770" y="654" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">PR...</text></switch></g><rect x="840" y="635" 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: 650px; margin-left: 860px;"><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: nowrap;">OR</div></div></div></foreignObject><text x="860" y="654" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" font-weight="bold">OR</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 diff --git a/docs/platform_management_plan/change_management.rst b/docs/platform_management_plan/change_management.rst index 4b0d84c5dc..612ec76ff9 100644 --- a/docs/platform_management_plan/change_management.rst +++ b/docs/platform_management_plan/change_management.rst @@ -14,7 +14,7 @@ .. document:: Change Management Plan :id: doc__platform_change_management_plan - :status: draft + :status: valid :safety: ASIL_B :security: YES :tags: platform_management @@ -30,8 +30,9 @@ This document implements parts of the :need:`PROCESS_wp__platform_mgmt`. Purpose +++++++ The purpose of the Change Management Plan is to guide the execution of the -Change Requests of a project including their creation, analysis, approval, implementation, -and verification. +Change Requests of a project including their creation, analysis, implementation, closure and +control. Where a change is defined as an introduction of a new feature/component or modification of +an existing feature/component. Objectives and Scope @@ -40,15 +41,12 @@ Objectives and Scope Change Management Goals ^^^^^^^^^^^^^^^^^^^^^^^ -* Requests for Changes are recorded and identified. -* Change Requests are analyzed, dependencies and relationships to work products or other Change - Requests are identified, and the impact is estimated. -* Change Requests are approved before implementation and prioritized accordingly. -* Bidirectional traceability is established between Change Requests and affected work products. -* Implementation of Change Requests is confirmed. -* Change Requests are tracked to closure and status of Change Requests is communicated to - affected parties. -* Requests for Changes are properly documented. +* Change Requests are recorded and identified. +* Change Requests are analyzed, affected work products are identified, and the impact is estimated. +* Change Requests are approved before implementation. +* Change Requests are implemented and monitored. +* Changes Requests are tracked until closure and and communicated to affected parties. +* Change Requests and affected work products are bidirectionally traced. Approach ++++++++ @@ -59,27 +57,50 @@ Change Request Execution Contributions in general to the **S-CORE** project are described here (compare :need:`doc__contr_guideline`). -A Change Request is a specific contribution, and -it is the **ONLY** way to contribute new features/components or to modify the scope of existing -features/components in the **S-CORE** project. +A Change Request is a specific contribution, and it is the **ONLY** way to contribute new +features/components or to modify the scope of existing features/components in the **S-CORE** +project. Change Request Infrastructure and Types ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :need:`GitHub Issues (ISSUE) <doc__issue_guideline>` are used for managing Change Requests. -The tool is used to create, plan, control, and monitor Change Requests within **S-CORE**. +The tool is used to create, analyze, implement and monitor Change Requests within **S-CORE**. -:need:`GitHub Pull Requests (PR) <doc__pull_request_guideline>` are used for the implementation -of Change Requests. The tool is used to implement and verify Change Requests within **S-CORE**. +:need:`GitHub Pull Requests (PR) <doc__pull_request_guideline>` are used for the documentation and +implementation of Change Requests. The tool is used to document, implement and verify Change +Requests within **S-CORE**. -The next figure gives an overview, how Change Requests are realized in **S-CORE**. An ISSUE is -used to create a Change Request including required attributes as defined in +The next figure gives an overview, how Change Requests are realized in **S-CORE**. An ISSUE and PR +is used to create a Change Request including required attributes as defined in :need:`PROCESS_gd_req__change_attr_uid`. + +.. figure:: _assets/score_change_request_overview_simple.drawio.svg + :width: 100% + :align: center + :alt: Change Request Simple Overview + + Change Request Simple Overview + +Therefore the Change Template :need:`PROCESS_gd_temp__change_feature_request` or +:need:`PROCESS_gd_temp__change_component_request` shall be used. +In addition :need:`Impact Analysis Template <PROCESS_gd_temp__change_impact_analysis>` should be +used, if applicable. + +.. note:: + Parts of the template are automatically included in the ISSUE **Change Request**. + Use ISSUE **Change Request** to request a change in **S-CORE**. + + .. figure:: _assets/score_change_request_change.drawio.svg + :width: 100% + :align: center + :alt: Change Request Change + The ISSUE may be linked to other ISSUEs or SUB-ISSUEs, if required, to manage more complex Change -Requests. The implementation of a Change Request requires at least one PR linked to the ISSUE created -for the Change Request. +Requests. The implementation of a Change Request requires at least one PR linked to the ISSUE +created for the Change Request. -.. figure:: _assets/score_change_request_overview.drawio.svg +.. figure:: _assets/score_change_request_overview_complex.drawio.svg :width: 100% :align: center :alt: Change Request Overview @@ -119,27 +140,63 @@ Change Request Attributes :need:`[[title]] <PROCESS_gd_req__change_attr_uid>` is identical to the ISSUE number. -:need:`[[title]] <PROCESS_gd_req__change_attr_status>` is defined by the combination of the ISSUE state -and the states of the linked PRs. +:need:`[[title]] <PROCESS_gd_req__change_attr_status>` is defined by the combination of the ISSUE +state, the state in the Projects dashboard view and the PR status. + +.. list-table:: Change Status + :header-rows: 1 + :widths: 15,85,15,15 + + * - Status + - Issue status + - Projects dashboard status + - Linked PR status + * - open + - ``Open`` + - ``No Status`` + - ``Draft`` or ``Open`` + * - in review + - ``Open`` + - ``Todo`` + - ``Draft`` or ``Open`` + * - in implementation + - ``Open`` + - ``In Progress`` + - ``Draft`` or ``Open`` + * - closed + - ``Closed`` + - ``Done`` + - ``Merged`` + * - rejected + - ``Closed as not planned`` + - na + - na :need:`[[title]] <PROCESS_gd_req__change_attr_title>` is identical to the ISSUE title. -:need:`[[title]] <PROCESS_gd_req__change_attr_impact_description>` is defined in the linked PR or part of the -description. +:need:`[[title]] <PROCESS_gd_req__change_attr_impact_description>` is initially provided in the +Description and Impact analysis part of the ISSUE. Further detailed analysis results are part of +the linked PR, provided as part of the feature/request templates. + +Further information about detailed implementation can be provided in the Realize part of the ISSUE. + +:need:`[[title]] <PROCESS_gd_req__change_attr_impact_safety>`, +:need:`[[title]] <PROCESS_gd_req__change_attr_impact_security>` are provided in the Safety or +Security relevance part of the ISSUE. -:need:`[[title]] <PROCESS_gd_req__change_attr_impact_safety>` is defined in the linked PR or part of the -description. +Combinations of them are allowed. If nothing is selected, Quality is relevant by default. -:need:`[[title]] <PROCESS_gd_req__change_attr_impact_security>` is defined in the linked PR or part of the -description. +Use the ASIL classification part of the ISSUE to document the ASIL level concerned, e.g. ASIL_B. -:need:`[[title]] <PROCESS_gd_req__change_attr_types>` is defined by label of a ISSUE and part of the -description. +:need:`[[title]] <PROCESS_gd_req__change_attr_types>` is provided in the Change Request Type +part of the ISSUE, further in the linked PR for feature or component request. -:need:`[[title]] <PROCESS_gd_req__change_attr_affected_wp>` is defined in the linked PR or part of the -description. +:need:`[[title]] <PROCESS_gd_req__change_attr_affected_wp>` is initially provided in the +Affected work products part of the ISSUE. Further detailed affected work products are part of the +linked PR or other ISSUEs. -:need:`[[title]] <PROCESS_gd_req__change_attr_milestone>` is defined by the Milestone of a ISSUE. +:need:`[[title]] <PROCESS_gd_req__change_attr_milestone>` is provided in the Expected Implementation +Version part of the ISSUE. Optionally the Milestone part of the ISSUE can be set. .. _change_mgmt_workflow: @@ -147,45 +204,56 @@ description. Change Request Workflow ^^^^^^^^^^^^^^^^^^^^^^^ -In General, every Change Request follows the following steps: +In general, every Change Request follows the following steps: -* 1. Create the Change Request -* 2. Review the Change Request -* 3. Approve the Change Request +(color is referring to the following figure: Problem Resolution Simple Workflow Overview) +* 1. Create the Change Request (grey color) +* 2. Analyze the Change Request (blue color) +* 3. Initiate the implementation of the Change Request and track it to closure (yellow color) +* 4. Close Change Request (purple color) + +:need:`PROCESS_gd_guidl__change_change_request` can give additional help. **To 1. Create the Change Request:** An ISSUE is the **ONLY** way to create and manage a Change Request in **S-CORE**. -A PR is the **ONLY** way to implement a Change Request in **S-CORE**, +A PR is the **ONLY** way to document and implement a Change Request in **S-CORE**, thus an ISSUE must be linked at least to one or more PRs. The figure below shows the workflow for the simplest case of a Change Request. -An ISSUE with the label according to the Change Request type is created in status ``OPEN``. -The title of the ISSUE reflects the potential change. The description of the ISSUE may give a brief -description of the requested change or modification. Further add here the -:need:`Impact Analysis Template <PROCESS_gd_temp__change_impact_analysis>` and fill it out accordingly. +An ISSUE with the with the type ``Enhancement`` is created in status ``Open``. +The title of the ISSUE reflects the potential change. Further fill out the provided template +content accordingly. -The details are part of the Feature/Component Request work product. The Feature/Component Request -is provided by a PR, which is linked to the ISSUE in status ``DRAFT``. +The description of the ISSUE may give a brief description and impact analysis of the requested +change. The details are part of the Feature/Component Request and Impact Analysis provided by a PR, +which is linked to the ISSUE in status ``Draft`` or ``Open``. For a new Feature/Component Request the provided templates :need:`Feature Request<PROCESS_gd_temp__change_feature_request>`, -:need:`Component Request<PROCESS_gd_temp__change_component_request>` must be used. For a modification of an existing -Feature/Component, update the existing work products. +or :need:`Component Request<PROCESS_gd_temp__change_component_request>` must be used. For a +modification of an existing Feature/Component, update the existing work products. +Further add here the :need:`Impact Analysis Template <PROCESS_gd_temp__change_impact_analysis>` +and fill it out accordingly, if applicable. + +The description of the ISSUE may give a brief description of the affected work products and also +details about the intended realization for the change. +The linked PR in status ``Draft``, which contains the Feature/Component Requests, may contain also +more details about the affected work products or realization and verification proposals. -The linked PR in status ``DRAFT``, which contains the Feature/Component Requests, may contain also -other required affected and changed work products or implementation and verification proposals. +Planning is done by setting the **Expected Implementation Version**. Optionally the Milestone of +the ISSUE can be set. -Planning is done by setting the milestone of the ISSUE accordingly. +Change request status: ``open`` is implemented as ISSUE status ``Open`` and Projects status +``No Status``. The linked PR status is either ``Draft`` or ``Open``. -As long as the :need:`Contributor <PROCESS_rl__contributor>` wants to modify the content of the Change -Request, the linked PR is kept in status ``DRAFT``. +To trigger the next step: Change request status: ``in review`` +keep the ISSUE status ``Open`` and set the Projects status ``Todo``. -Change request status: ``draft`` is implemented as -ISSUE status ``OPEN`` and PR status ``DRAFT``. +To reject the change request: Change request status: ``rejected`` +set the ISSUE status to ``Closed as not planned``. -To trigger the next step the PR status is changed from ``DRAFT`` to ``OPEN``. .. figure:: _assets/score_change_request_workflow_simple.drawio.svg :width: 100% @@ -195,99 +263,60 @@ To trigger the next step the PR status is changed from ``DRAFT`` to ``OPEN``. Change Request Simple Workflow Overview -**To 2. Review the Change Request:** +**To 2. Analyze the Change Request:** -The Change Request is reviewed from the :need:`Committer <PROCESS_rl__committer>` and the -review results are resolved by the :need:`Contributor <PROCESS_rl__contributor>`. The review results -are documented in the PR. As long as the information is not sufficient, the related PR is kept in -status ``OPEN``. +The Change Request is reviewed and analyzed from the :need:`Committer <PROCESS_rl__committer>` and the +review results are resolved by the :need:`Contributor <PROCESS_rl__contributor>`. The results +are documented in the ISSUE and/or linked PR. As long as the information is not sufficient, the +related ISSUE is kept in status ``Open`` and Projects status ``Todo``, means ``in review``. -:need:`PROCESS_gd_chklst__change_cr_review` can help to verify whether the information is complete. +If the information is sufficient and it is decided to implement the change request, the +ISSUE status is kept ``Open`` and the Projects status is set to ``In Progress``. -The realization parts of the Change Request are reviewed according the checklists of the affected -work products. Verification of the realization parts must be successful. -If the verification is not sufficient, the related PR is kept in status ``OPEN`` or may changed -back to ``DRAFT`` (compare :need:`doc__issue_guideline`). +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. -Change request status: ``in review`` is implemented as -ISSUE status ``OPEN`` and PR status ``OPEN``. +:need:`PROCESS_gd_chklst__change_cr_review` can help to verify whether the information is complete. +Otherwise, if the change requested is not accepted, the change request is rejected. To reject the +Change Request: Change Request status: ``rejected`` set the ISSUE status to ``Closed as not planned``. -**To 3. Approve the Change Request:** -:need:`Technical Lead <PROCESS_rl__technical_lead>` or :need:`Module Lead <PROCESS_rl__module_lead>` decides finally, -if the Change Request is accepted or rejected. -:need:`Committer <PROCESS_rl__committer>` checks finally if the Change Request is completed and the -required verification measures are executed and successfully passed. +**To 3. Initiate the implementation of the Change Request and track it to closure:** -If ``approved``, the status of the concerned PRs change to ``MERGED``, -otherwise, if rejected, PR status changes to ``CLOSED``. +:need:`Contributor <PROCESS_rl__contributor>` starts all required activities to implement the +change request. These may include further planning activities by creating ISSUEs and required PRs. +All additional ISSUEs or PRs created to implement are linked to the Change Request ISSUE to enable +monitoring of the activities. -If ``approved`` the status of the ISSUE is ``CLOSED``. This is also the case for rejected Change -Requests. +All activities defined are tracked until closure, means that all linked ISSUEs or PRs are closed or +merged, respectively. +If all are closed or merged :need:`Contributor <PROCESS_rl__contributor>` sets Projects status to +``Done`` to trigger the final review from the :need:`Committer <PROCESS_rl__committer>` to close +the Change Request. -The figure below shows the workflow for a complex case of a Change Request. +The Change Request may also rejected in this phase, then the ISSUE status is set to +``Closed as not planned``. -The ISSUE is linked to SUB-ISSUES, and each SUB-ISSUE is linked to a PR. In principle the Change -Request workflows applies for all SUB-ISSUEs independently. Finally the ISSUE must be closed -manually. -.. figure:: _assets/score_change_request_workflow_complex_1.drawio.svg - :width: 100% - :align: center - :alt: Change Request Complex Workflow Overview Case 1 +**To 4. Close Change Request :** - Change Request Complex Workflow Overview Case 1 +:need:`Committer <PROCESS_rl__committer>` checks finally if the change request is completely +implemented. In this case all linked ISSUEs or PRs are closed or merged, respectively. -The figure below shows the workflow for another complex case of a Change Request. +Especially the verification measures must be checked for their effectiveness and the argumentation +is convincing. -Here the Change Request has an impact on work products in different repositories, e.g. the -**S-CORE** repository, contains feature work products and a Module repository, contains -Component work products. -The ISSUE is linked to SUB-ISSUES in the **S-CORE** repository, and the SUB-ISSUE is linked to a PR. -But in addition the ISSUE is now linked to another ISSUE in the Module repository, also linked -to a PR. In principle the Change Request workflows applies for all SUB-ISSUEs, ISSUES in -Module repository independently. Finally the ISSUE in the **S-CORE** repository must be closed -manually. +:need:`PROCESS_gd_chklst__change_cr_review` can help to verify whether it can be closed. +The realization parts of the Change Request are reviewed according the checklists of the affected +work products. Verification of the realization parts must be successful. -.. figure:: _assets/score_change_request_workflow_complex_2.drawio.svg - :width: 100% - :align: center - :alt: Change Request Complex Workflow Overview Case 2 +If this is the case the ISSUE status is set to ``Closed``, otherwise the Projects status is set +back to ``In Progress``. - Change Request Complex Workflow Overview Case 2 Change 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:`PROCESS_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:`PROCESS_wp__platform_mgmt` - - :need:`PROCESS_wf__platform_cr_mt_platform_mgmt_plan` - - :ndf:`copy('status', need_id='PROCESS_wf__platform_cr_mt_platform_mgmt_plan')` - - <Link to issue> - - :doc:`index` - - :ndf:`copy('status', need_id='doc__platform_mgt_plan')` - - * - :need:`PROCESS_wp__process_definition` - - :need:`PROCESS_wf__def_app_process_definition` - - :ndf:`copy('status', need_id='PROCESS_wf__def_app_process_definition')` - - `Process community issues <https://github.com/orgs/eclipse-score/projects/7>`_ - - `Process description <https://eclipse-score.github.io/process_description/main/index.html>`_ - - <automated> +not applicable From 479daa4ee9ba45c0b570ce1976e6732ec2b27d2f Mon Sep 17 00:00:00 2001 From: "markus.schu" <markus.schu@accenture.com> Date: Tue, 23 Sep 2025 19:18:34 +0200 Subject: [PATCH 102/109] update CODEOWNER Process Community is responsible for ISSUE_TEMPLATES Change-Id: I757c4c1672cbc3c05fab0568072bb2fcdad623cb --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index bdd2eecae1..35d78ae2ea 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -11,6 +11,7 @@ # All special files go to infrastructure as well .* @AlexanderLanin @dcalavrezo-qorix +.github/ISSUE_TEMPLATE/ @pahmann @PhilipPartsch @masc2023 @aschemmel-tech .github/CODEOWNERS @antonkri @FScholPer @qor-lb @johannes-esr /docs/ @pahmann @PhilipPartsch @masc2023 @aschemmel-tech From 89afa2e1203bfdf3abf5b2abeeb0020c8b05f7c4 Mon Sep 17 00:00:00 2001 From: Alexander Lanin <Alexander.Lanin@etas.com> Date: Wed, 24 Sep 2025 11:45:35 +0200 Subject: [PATCH 103/109] bump version to 0.4.0 and update score_docs_as_code dependency to 1.3.0 (#1796) --- MODULE.bazel | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 5208cade05..8a8863f0bb 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -13,7 +13,7 @@ module( name = "score_platform", - version = "0.3.0", + version = "0.4.0", compatibility_level = 0, ) @@ -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 = "1.2.0") +bazel_dep(name = "score_docs_as_code", version = "1.3.0") bazel_dep(name = "score_process", version = "1.1.2") From ebbcdccae6d56f354755cb628ca115525bf2afa4 Mon Sep 17 00:00:00 2001 From: Nicolae Dicu <nicolae.dicu.ext@qorix.ai> Date: Thu, 25 Sep 2025 09:26:55 +0200 Subject: [PATCH 104/109] ci: Check Docs-as-Code version consistency (#1802) --- .github/scripts/check_doc_tool_version.py | 79 +++++++++++++++++++++++ .github/workflows/docs.yml | 30 +++++++++ docs/score_tools/doc_as_code.rst | 2 +- 3 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 .github/scripts/check_doc_tool_version.py diff --git a/.github/scripts/check_doc_tool_version.py b/.github/scripts/check_doc_tool_version.py new file mode 100644 index 0000000000..77681ce4e1 --- /dev/null +++ b/.github/scripts/check_doc_tool_version.py @@ -0,0 +1,79 @@ +# ******************************************************************************* +# 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 +# ******************************************************************************* + +#!/usr/bin/env python3 +"""Docs-as-Code version consistency checker.""" + +import argparse +import re +import sys +from pathlib import Path + +def main(): + parser = argparse.ArgumentParser(description="Check Doc-as-Code version consistency") + parser.add_argument( + "--doc", + type=Path, + help="Path to the documentation file (default: docs/score_tools/doc_as_code.rst)" + ) + parser.add_argument( + "--dac-module-name", + default="score_docs_as_code", + help="Module name to search for in MODULE.bazel (default: score_docs_as_code)" + ) + args = parser.parse_args() + + ROOT = Path(__file__).resolve().parents[2] + MODULE = ROOT / "MODULE.bazel" + DOC = args.doc if args.doc else ROOT / "docs/score_tools/doc_as_code.rst" + + if not DOC.exists() or not MODULE.exists(): + raise SystemExit(f"Missing {DOC} or {MODULE}. Nothing to compare.") + + # Parse MODULE.bazel + module_bazel = MODULE.read_text(encoding="utf-8") + module_bazel_match = re.search( + rf'bazel_dep\(\s*name\s*=\s*"{re.escape(args.dac_module_name)}",\s*version\s*=\s*"([^"\s]+)"', + module_bazel, + ) + module_bazel_version = module_bazel_match.group(1) if module_bazel_match else "" + + # Parse doc_as_code.rst + doc_as_code_rst = DOC.read_text(encoding="utf-8") + doc_match = re.search(r':version:\s*(\S+)', doc_as_code_rst) + doc_version_raw = doc_match.group(1) if doc_match else "" + doc_version = doc_version_raw.lstrip("vV") if doc_version_raw else "" + + # Compare versions + mismatch = not module_bazel_version or not doc_version or module_bazel_version != doc_version + + comment = "" + if mismatch: + comment = "\n".join( + [ + "Warning: Doc-as-Code version mismatch detected.", + "", + f"- MODULE.bazel version: {module_bazel_version or '(not found)'}", + f"- doc_as_code.rst :version:: {doc_version_raw or '(not found)'}", + "", + "Please align the documentation with the Bazel dependency.", + ] + ) + + if comment: + print(comment) + + sys.exit(1 if mismatch else 0) + +if __name__ == "__main__": + main() diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 1e203e3ae7..bfd2e61765 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -49,6 +49,36 @@ jobs: with: ref: ${{ github.head_ref || github.event.pull_request.head.ref || github.ref }} repository: ${{ github.event.pull_request.head.repo.full_name || github.repository }} + - name: Verify Doc-as-Code version + id: doc_version + run: | + if python3 .github/scripts/check_doc_tool_version.py \ + --doc docs/score_tools/doc_as_code.rst \ + --dac-module-name score_docs_as_code + then + echo "Doc-as-Code version matching. Everything is fine." + echo "mismatch=False" >> "$GITHUB_OUTPUT" + else + echo "mismatch=True" >> "$GITHUB_OUTPUT" + fi + + - name: Find Comment + uses: peter-evans/find-comment@v3 + id: fc + with: + issue-number: ${{ github.event.pull_request.number }} + comment-author: 'github-actions[bot]' + body-includes: Docs-as-Code version mismatch detected + + - name: Warn in PR if docs-as-code version mismatch + if: ${{ github.event_name == 'pull_request_target' && steps.doc_version.outputs.mismatch == 'True' && steps.fc.outputs.comment-id == '' }} + uses: peter-evans/create-or-update-comment@v4 + with: + issue-number: ${{github.event.pull_request.number}} + body: | + ⚠️ **Docs-as-Code version mismatch detected** + Please check the CI build logs for details and align the documentation version with the Bazel dependency. + - name: Setup Bazel uses: bazel-contrib/setup-bazel@0.9.1 - name: Install Graphviz diff --git a/docs/score_tools/doc_as_code.rst b/docs/score_tools/doc_as_code.rst index 95984fca38..0951ba4bed 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: v0.4.4 + :version: v1.3.0 :tcl: LOW :safety_affected: YES :security_affected: YES From d4db600ae59b282792d9da23bf46ad22591c68a7 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres <frank.scholter_peres@mercedes-benz.com> Date: Tue, 23 Sep 2025 09:20:46 +0200 Subject: [PATCH 105/109] added additional requirements --- .../communication/docs/requirements/index.rst | 136 ++++++++++++++++++ 1 file changed, 136 insertions(+) diff --git a/docs/features/communication/docs/requirements/index.rst b/docs/features/communication/docs/requirements/index.rst index eaed4cf5ba..1875000dda 100644 --- a/docs/features/communication/docs/requirements/index.rst +++ b/docs/features/communication/docs/requirements/index.rst @@ -401,6 +401,139 @@ Multi-binding support The association of a service instance and the appropriate binding shall be specified in the deployment configuration. +Cross-VM Extensions +^^^^^^^^^^^^^^^^^^^ +.. 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). + + Dynamic deployment at runtime ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -490,3 +623,6 @@ Safety Impact .. needextend:: docname is not None and "communication/ipc/requirements" in docname :+tags: ipc + + + From 8544e29b9b5ff50f0b7f167cc706a5ac1bad90b9 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres <frank.scholter_peres@mercedes-benz.com> Date: Tue, 23 Sep 2025 09:37:10 +0200 Subject: [PATCH 106/109] fixed wrong ids --- .../communication/docs/requirements/index.rst | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/features/communication/docs/requirements/index.rst b/docs/features/communication/docs/requirements/index.rst index 1875000dda..bc2161d1e0 100644 --- a/docs/features/communication/docs/requirements/index.rst +++ b/docs/features/communication/docs/requirements/index.rst @@ -404,7 +404,7 @@ Multi-binding support Cross-VM Extensions ^^^^^^^^^^^^^^^^^^^ .. feat_req:: One-way data sharing into a VM - :id: feat_req__crossvm__one_way_sharing + :id: feat_req__com__one_way_sharing :reqtype: Functional :security: NO :safety: QM @@ -414,7 +414,7 @@ Cross-VM Extensions 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 + :id: feat_req__com__readonly_vm :reqtype: Functional :security: NO :safety: QM @@ -424,7 +424,7 @@ Cross-VM Extensions The consumer (VM) shall have read-only access to the shared data. .. feat_req:: Consistent data-sets - :id: feat_req__crossvm__consistent_data + :id: feat_req__com__consistent_data :reqtype: Functional :security: NO :safety: QM @@ -434,7 +434,7 @@ Cross-VM Extensions 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 + :id: feat_req__com__lock_free_access :reqtype: Functional :security: NO :safety: QM @@ -444,7 +444,7 @@ Cross-VM Extensions Consistent access to data must be lock-free. .. feat_req:: Producer time stamps - :id: feat_req__crossvm__producer_timestamps + :id: feat_req__com__producer_timestamps :reqtype: Functional :security: NO :safety: QM @@ -454,7 +454,7 @@ Cross-VM Extensions Producer time stamps shall be available for related data-sets. .. feat_req:: Streamed data based on shared queues - :id: feat_req__crossvm__streamed_data + :id: feat_req__com__streamed_data :reqtype: Functional :security: NO :safety: QM @@ -464,7 +464,7 @@ Cross-VM Extensions 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 + :id: feat_req__com__configurable_queues :reqtype: Functional :security: NO :safety: QM @@ -474,7 +474,7 @@ Cross-VM Extensions 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 + :id: feat_req__com__lock_free_queue :reqtype: Functional :security: NO :safety: QM @@ -484,7 +484,7 @@ Cross-VM Extensions Queues shall support lock-free access to data elements. .. feat_req:: Bi-directional communication - :id: feat_req__crossvm__bi_directional_comm + :id: feat_req__com__bi_directional_comm :reqtype: Functional :security: NO :safety: QM @@ -494,7 +494,7 @@ Cross-VM Extensions The system shall support bi-directional communication via writable data elements by the client. .. feat_req:: Asynchronous support - :id: feat_req__crossvm__async_support + :id: feat_req__com__async_support :reqtype: Functional :security: NO :safety: QM @@ -504,7 +504,7 @@ Cross-VM Extensions The system shall provide asynchronous bi-directional support via multiple queues. .. feat_req:: Shared memory chunks - :id: feat_req__crossvm__shared_memory + :id: feat_req__com__shared_memory :reqtype: Functional :security: NO :safety: QM @@ -514,7 +514,7 @@ Cross-VM Extensions 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 + :id: feat_req__com__data_notifications :reqtype: Functional :security: NO :safety: QM @@ -524,7 +524,7 @@ Cross-VM Extensions Notifications for data updates shall be available (virtual IRQs in a VM). .. feat_req:: Configurable notifications - :id: feat_req__crossvm__config_notifications + :id: feat_req__com__config_notifications :reqtype: Functional :security: NO :safety: QM From 0f40283cb044fbfa2f0add753083d14813367a79 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres <frank.scholter_peres@mercedes-benz.com> Date: Tue, 23 Sep 2025 09:58:42 +0200 Subject: [PATCH 107/109] changed stackholder requirements --- .../communication/docs/requirements/index.rst | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/features/communication/docs/requirements/index.rst b/docs/features/communication/docs/requirements/index.rst index bc2161d1e0..2134b69a09 100644 --- a/docs/features/communication/docs/requirements/index.rst +++ b/docs/features/communication/docs/requirements/index.rst @@ -408,7 +408,7 @@ Cross-VM Extensions :reqtype: Functional :security: NO :safety: QM - :satisfies: stkh_req__communication__vm + :satisfies: stkh_req__communication__inter_process :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). @@ -418,7 +418,7 @@ Cross-VM Extensions :reqtype: Functional :security: NO :safety: QM - :satisfies: stkh_req__communication__vm + :satisfies: stkh_req__communication__inter_process :status: valid The consumer (VM) shall have read-only access to the shared data. @@ -428,7 +428,7 @@ Cross-VM Extensions :reqtype: Functional :security: NO :safety: QM - :satisfies: stkh_req__communication__vm + :satisfies: stkh_req__communication__inter_process :status: valid The system shall support consistent data-sets, allowing the consumer to obtain a consistent version of related data items. @@ -438,7 +438,7 @@ Cross-VM Extensions :reqtype: Functional :security: NO :safety: QM - :satisfies: stkh_req__communication__vm + :satisfies: stkh_req__communication__inter_process :status: valid Consistent access to data must be lock-free. @@ -448,7 +448,7 @@ Cross-VM Extensions :reqtype: Functional :security: NO :safety: QM - :satisfies: stkh_req__communication__vm + :satisfies: stkh_req__communication__inter_process :status: valid Producer time stamps shall be available for related data-sets. @@ -458,7 +458,7 @@ Cross-VM Extensions :reqtype: Functional :security: NO :safety: QM - :satisfies: stkh_req__communication__vm + :satisfies: stkh_req__communication__inter_process :status: valid The system shall support streamed data based on shared queues (stream of events or data). @@ -468,7 +468,7 @@ Cross-VM Extensions :reqtype: Functional :security: NO :safety: QM - :satisfies: stkh_req__communication__vm + :satisfies: stkh_req__communication__inter_process :status: valid Queues shall be configurable by the client (VM), including the number of elements and buffer allocation. @@ -478,7 +478,7 @@ Cross-VM Extensions :reqtype: Functional :security: NO :safety: QM - :satisfies: stkh_req__communication__vm + :satisfies: stkh_req__communication__inter_process :status: valid Queues shall support lock-free access to data elements. @@ -488,7 +488,7 @@ Cross-VM Extensions :reqtype: Functional :security: NO :safety: QM - :satisfies: stkh_req__communication__vm + :satisfies: stkh_req__communication__inter_process :status: valid The system shall support bi-directional communication via writable data elements by the client. @@ -498,7 +498,7 @@ Cross-VM Extensions :reqtype: Functional :security: NO :safety: QM - :satisfies: stkh_req__communication__vm + :satisfies: stkh_req__communication__inter_process :status: valid The system shall provide asynchronous bi-directional support via multiple queues. @@ -508,7 +508,7 @@ Cross-VM Extensions :reqtype: Functional :security: NO :safety: QM - :satisfies: stkh_req__communication__vm + :satisfies: stkh_req__communication__inter_process :status: valid The system shall support multiple chunks of shared memory to allow required access control. @@ -518,7 +518,7 @@ Cross-VM Extensions :reqtype: Functional :security: NO :safety: QM - :satisfies: stkh_req__communication__vm + :satisfies: stkh_req__communication__inter_process :status: valid Notifications for data updates shall be available (virtual IRQs in a VM). @@ -528,7 +528,7 @@ Cross-VM Extensions :reqtype: Functional :security: NO :safety: QM - :satisfies: stkh_req__communication__vm + :satisfies: stkh_req__communication__inter_process :status: valid Notifications shall be configurable by consumers of data (using flags or watermarks in shared memory from client to producer). From d6a9e1f45e7df3e20c3a94e7487c9d87d16a4e70 Mon Sep 17 00:00:00 2001 From: Alexander Lanin <Alexander.Lanin@etas.com> Date: Fri, 26 Sep 2025 10:44:03 +0200 Subject: [PATCH 108/109] improve DR-002 executive summary (#1799) --- docs/design_decisions/DR-002-infra.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/docs/design_decisions/DR-002-infra.md b/docs/design_decisions/DR-002-infra.md index 55b5c6b14e..62d938237f 100644 --- a/docs/design_decisions/DR-002-infra.md +++ b/docs/design_decisions/DR-002-infra.md @@ -27,10 +27,19 @@ The concept described here turns a collection of separate repositories into a sy ### Proposed Approach - Every change in any repository is tested **in combination with the rest of the system**, not just in isolation. - There are **two testing layers**: - - a **fast feedback loop** (lightweight tests that run on every pull request), - - and a **deeper validation** (heavier tests run after merges or on a schedule). + - a **fast feedback loop** (lightweight tests that run on every pull request BEFORE merge in any repository), + - and a **deeper validation** (heavier tests run after merges or on a schedule BEFORE release in any repository). - This setup guarantees that developers can trust the system as a whole to consistently work. +### Typical workflow + +* Component PRs are created. + * Run component local verification. + * Run integration testing (quick). +* Post merge: + * Run integration test (full). +* Only after successful integration testing (full) can a release be created. + ### Benefits - Problems across repositories are caught early. - Developers spend less time coordinating merges (“merge after me” scenarios disappear). @@ -38,6 +47,8 @@ The concept described here turns a collection of separate repositories into a sy Note: this concept is easily extendable to support multiple versions of S-CORE. But that's currently not required. +See Martin Fowler's [continuous integration](https://martinfowler.com/articles/continuousIntegration.html) article for a deeper dive into the topic. + --- ## Introduction From 64eb8acf8436c60f1a6daaf6bc67763797792838 Mon Sep 17 00:00:00 2001 From: Nicolae Dicu <nicolae.dicu.ext@qorix.ai> Date: Mon, 29 Sep 2025 09:49:54 +0200 Subject: [PATCH 109/109] ci: fix docs workflow (#1819) Fix dac version check issue on merge to main. Version check should run only on PR. Signed-off-by: Nicolae Dicu <nicolae.dicu.ext@qorix.ai> --- .github/workflows/docs.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index bfd2e61765..7002bc07ef 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -49,7 +49,9 @@ jobs: with: ref: ${{ github.head_ref || github.event.pull_request.head.ref || github.ref }} repository: ${{ github.event.pull_request.head.repo.full_name || github.repository }} + - name: Verify Doc-as-Code version + if: ${{ github.event_name == 'pull_request_target' }} id: doc_version run: | if python3 .github/scripts/check_doc_tool_version.py \ @@ -63,6 +65,7 @@ jobs: fi - name: Find Comment + if: ${{ github.event_name == 'pull_request_target' }} uses: peter-evans/find-comment@v3 id: fc with: