From a578a5e6543661f8c12c1e7356737c672a4ce1e6 Mon Sep 17 00:00:00 2001 From: Piotr Korkus Date: Tue, 27 Oct 2026 12:48:14 +0100 Subject: [PATCH 01/31] initial release note --- .../releases/release_note_score_v0_10.rst | 327 ++++++++++++++++++ 1 file changed, 327 insertions(+) create mode 100644 docs/s_core_v_1/releases/release_note_score_v0_10.rst diff --git a/docs/s_core_v_1/releases/release_note_score_v0_10.rst b/docs/s_core_v_1/releases/release_note_score_v0_10.rst new file mode 100644 index 00000000000..fdf3c8a3741 --- /dev/null +++ b/docs/s_core_v_1/releases/release_note_score_v0_10.rst @@ -0,0 +1,327 @@ +.. + # ******************************************************************************* + # Copyright (c) 2026 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +S-CORE Platform v0.10 release note +================================== + +.. document:: S-CORE v0.10 release note + :id: doc__score_v010_release_note + :status: valid + :safety: QM + :security: YES + :realizes: wp__platform_sw_release_note + :version: 1 + +| **Platform Release:** S-CORE +| **Release Tag:** v0.10.0 +| **Origin Release Tag**: v0.9.0 +| **Release Date:** 2026-11-02 + + +Overview +^^^^^^^^ + +This document provides an overview of the changes, improvements, and bug fixes +included in the software platform release version v0.10.0 as compared to the +previous platform release (v0.9.0). + +The v0.10 release replaces the resolved-dependency override mechanism of v0.9 +with a two-stage DR-008 test workflow, in which every integrated module is +tested with its own test suite against the unified toolchain configuration of +the reference integration. It adds an SBOM to the build, introduces +showcase-based platform integration tests linked to stakeholder requirements, +extends requirement coverage with module-owned tests, deduplicates the QNX and +Linux image definitions, and updates all integrated modules to their latest +known-good state. + +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 project, being a non-profit and open +source organization, can not take over any liability for its content. + +Changes to the Platform +^^^^^^^^^^^^^^^^^^^^^^^ + +New Features +------------ + +Integration Strategy (DR-008) Test Workflow +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The DR-008 implementation was reworked into a two-stage test workflow: + +- **Stage 1** builds and tests the reference integration with all modules as + pinned in ``known_good.json``. +- **Stage 2** runs the test suite of each target software module on its own, + with the known-good versions injected via ``--override_module`` and the + toolchains and platforms shared through ``bazel_common/unified.bazelrc`` and + ``bazel_common/unified_toolchains.MODULE.bazel``. + +The new ``scripts/module_tests.py`` and the ``module_tests.yml`` workflow make +this available for pull requests. Under ``bazel coverage`` the unified +configuration uses clang (LLVM) as C++ toolchain, while builds stay on GCC. +Module-specific exclusions are documented in the new ``metadata.test_notes`` +field of ``known_good.json``. + +The resolved-dependency override mechanism introduced in v0.9 +(``scripts/known_good/resolved_dependencies.py``) was removed in favour of this +workflow. + +Software Bill of Materials (SBOM) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The reference integration now generates an SBOM via +`score_sbom `_ (``0.1.1``). All target +software modules are tracked and the SBOM is uploaded as a CI build artifact. + +Platform Integration Tests +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +A new ``platform_integration_tests/`` package runs the ``//showcases`` demo +applications for Communication, Kyron, Lifecycle, Logging and Time as ITF +tests. They are linked to the platform stakeholder requirements, which are now +reported in a dedicated "Stakeholder Requirements" chapter of the platform +verification report. + +Improvements +------------ + +Requirement Coverage from Module Tests +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The Lifecycle integration tests, the Logging component tests and the Persistency +component integration tests are now executed by the reference integration, so +their ``PartiallyVerifies``/``FullyVerifies`` links appear in the verification +reports. The Logging integration tests were re-enabled after fixing the +datarouter configuration packaging. + +Reference Images +~~~~~~~~~~~~~~~~ + +- ``score_rules_imagefs`` was updated from ``0.0.1`` to ``0.1.0``, migrating the + image definitions to ``rules_pkg`` ``pkg_files``. +- QNX and Linux image definitions were deduplicated into shared packages + (``//images/common/apps``, ``//images/qnx_common/build``, + ``//images/qnx_common/configs``). + +Documentation +~~~~~~~~~~~~~ + +- Documentation is now generated from ``known_good.json`` + (``bazel_common/docs_bundles.bzl``); the Time documentation bundle was + enabled. +- The verification report was restructured: the former platform verification + report page became the status dashboard, module verification reports + (Lifecycle, Logging, Persistency, ...) are linked from a common index, and + unit test and coverage summaries are nested under the Platform Verification + Report. + +CI +~~ + +- The documentation build runs as a separate, fail-fast workflow. +- Bazel cache keys rotate on module bumps; the test cache is trusted on push + and fresh runs are gated on tags. +- Failing module tests are reported by module name. +- Dashboard documentation links are branch-aware. + +Incompatible Changes +-------------------- + +.. warning:: + + The resolved-dependency override mechanism introduced in v0.9 + (``scripts/known_good/resolved_dependencies.py``) and the ``rust_coverage`` + package were removed. Users relying on them need to switch to the DR-008 + test workflow (``scripts/module_tests.py``) and the unified configuration + in ``bazel_common/unified.bazelrc``. + +S-CORE Platform scope +^^^^^^^^^^^^^^^^^^^^^ + +- **Version:** ``6d65a262c232`` (commit) +- **Release notes**: `S-CORE platform release notes + `_ + +Integrated Software Modules +--------------------------- + +Baselibs +~~~~~~~~ + +- ... + +Communication +~~~~~~~~~~~~~ + +- ... + +Persistency +~~~~~~~~~~~ + +- ... + +Lifecycle +~~~~~~~~~ + +- ... + +Logging +~~~~~~~ + +- ... + +Time +~~~~ + +- ... + +Configuration Management +~~~~~~~~~~~~~~~~~~~~~~~~ + +- ... + +Kyron +~~~~~ + +- ... + +Reference integration +~~~~~~~~~~~~~~~~~~~~~ + +- **Version:** ``v0.10.0`` +- **Source / tag:** `Reference integration releases + `_ + +- Added the two-stage DR-008 test workflow and removed the resolved-dependency + override mechanism. +- Added SBOM generation. +- Added showcase-based platform integration tests. +- Executed Lifecycle, Logging and Persistency module tests for requirement + coverage. +- Deduplicated QNX/Linux image definitions. + +Reference QNX image ++++++++++++++++++++ + +- Image definitions migrated to ``score_rules_imagefs`` ``0.1.0`` and + deduplicated between ``qnx_x86_64`` and ``qnx_aarch64``. + +Reference Red Hat AutoSD Linux image (Experimental) ++++++++++++++++++++++++++++++++++++++++++++++++++++ + +- Updated to a newer AutoSD OCI image. + +Reference Elektrobit corbos Linux for Safety Applications Linux image (Experimental) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +- No functional changes in this release. + +Associated Infrastructure Modules +--------------------------------- + +Process description +~~~~~~~~~~~~~~~~~~~ + +- ... + + +Docs-as-code +~~~~~~~~~~~~ + +- ... + + +Tooling +~~~~~~~ + +- ... + + +Tools +~~~~~ + +- ... + +Platform +~~~~~~~~ + +- ... + +ITF (Integration Testing Framework) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- ... + +Test Scenarios +~~~~~~~~~~~~~~ + +- ... + +Crates +~~~~~~ + +- ... + +Bazel CPP Toolchain +~~~~~~~~~~~~~~~~~~~ + +- ... + +Bazel Platforms +~~~~~~~~~~~~~~~ + +- ... + +Compatibility +^^^^^^^^^^^^^ + +- **Dependencies:** See `Incompatible Changes`_. + +Performed Verification +^^^^^^^^^^^^^^^^^^^^^^ + +- See latest verification: :need:`doc__platform_verification_report_latest`. + +Known Issues/Vulnerabilities and Bug Fixes +------------------------------------------ + +- See release notes of every module separately. +- Several modules are integrated from commit hashes instead of published + registry releases. +- Some module tests are excluded or relaxed under the clang coverage toolchain + (Time, Baselibs, Lifecycle); see ``metadata.test_notes`` in + ``known_good.json``. +- The reference integration carries integration patches for Baselibs, + Communication, Configuration Management, Lifecycle, Logging, Persistency, + Platform, Time and ``rules_rust``. See the ``patches/`` directory for details. + +Upgrade Instructions +-------------------- + +- Increase to newest bazel registry versions: + https://eclipse-score.github.io/bazel_registry_ui +- Versions can be found under: + https://github.com/eclipse-score/reference_integration/blob/v0.10.0/known_good.json + +Contact Information +------------------- + +For any questions or support, please contact the *Project leads* or raise an +issue/discussion. +https://projects.eclipse.org/projects/automotive.score From 9934dfb2f60c099250234f2dc10fa30467e4fb49 Mon Sep 17 00:00:00 2001 From: "Schu, Markus" Date: Tue, 27 Oct 2026 13:03:05 +0100 Subject: [PATCH 02/31] add process_description release --- docs/s_core_v_1/releases/release_note_score_v0_10.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/s_core_v_1/releases/release_note_score_v0_10.rst b/docs/s_core_v_1/releases/release_note_score_v0_10.rst index fdf3c8a3741..a7d072dda3b 100644 --- a/docs/s_core_v_1/releases/release_note_score_v0_10.rst +++ b/docs/s_core_v_1/releases/release_note_score_v0_10.rst @@ -238,8 +238,9 @@ Associated Infrastructure Modules Process description ~~~~~~~~~~~~~~~~~~~ -- ... - +- **Version:** ``2.2.2`` (previously ``2.1.2``) +- **Release notes**: `Process description releases + `_ Docs-as-code ~~~~~~~~~~~~ From cb89c10a49e1058ca6e4f01495530be30db5441b Mon Sep 17 00:00:00 2001 From: Piotr Korkus Date: Wed, 28 Oct 2026 10:41:09 +0100 Subject: [PATCH 03/31] Bump test scenarios to v0.5.0 and depending modules to newest main updated modules: - kyron - persistency - test scenarios --- MODULE.bazel.lock | 38 +++++----- .../score_modules_target_sw.MODULE.bazel | 4 +- .../score_modules_tooling.MODULE.bazel | 5 +- .../persistency/test_combined_requirements.py | 74 +++++++++---------- .../test_scenarios/cpp/BUILD | 4 +- .../internals/persistency/kvs_build_helpers.h | 42 +++++++---- .../internals/persistency/kvs_instance.cpp | 42 ++++++----- .../src/internals/persistency/kvs_instance.h | 2 +- .../persistency/supported_datatypes.cpp | 6 +- .../scenarios/persistency/utf8_defaults.cpp | 32 ++++---- .../test_scenarios/rust/BUILD | 2 +- .../persistency/supported_datatypes.rs | 6 +- .../scenarios/persistency/utf8_defaults.rs | 30 ++++---- known_good.json | 11 ++- .../003-undev-deps-for-root-module.patch | 25 ++++--- 15 files changed, 168 insertions(+), 155 deletions(-) diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 2e2835f4fe3..0540baff444 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -25,7 +25,9 @@ "https://bcr.bazel.build/modules/apple_support/1.22.1/MODULE.bazel": "90bd1a660590f3ceffbdf524e37483094b29352d85317060b2327fff8f3f4458", "https://bcr.bazel.build/modules/apple_support/1.23.1/MODULE.bazel": "53763fed456a968cf919b3240427cf3a9d5481ec5466abc9d5dc51bc70087442", "https://bcr.bazel.build/modules/apple_support/1.24.1/MODULE.bazel": "f46e8ddad60aef170ee92b2f3d00ef66c147ceafea68b6877cb45bd91737f5f8", - "https://bcr.bazel.build/modules/apple_support/1.24.1/source.json": "cf725267cbacc5f028ef13bb77e7f2c2e0066923a4dab1025e4a0511b1ed258a", + "https://bcr.bazel.build/modules/apple_support/2.8.0/MODULE.bazel": "c45f5176057092afba0be6c48a9ea02101666802f8be536947e099e94757f8ed", + "https://bcr.bazel.build/modules/apple_support/2.9.1/MODULE.bazel": "fb209b83ed172af587419acb3340389cfe3260669e5f1c05e1ac3974aca614e0", + "https://bcr.bazel.build/modules/apple_support/2.9.1/source.json": "247d9f86d94c546533fb01e6e18b018486f9a6dff5faccae8838ef12e659b2a7", "https://bcr.bazel.build/modules/aspect_bazel_lib/1.31.2/MODULE.bazel": "7bee702b4862612f29333590f4b658a5832d433d6f8e4395f090e8f4e85d442f", "https://bcr.bazel.build/modules/aspect_bazel_lib/1.38.0/MODULE.bazel": "6307fec451ba9962c1c969eb516ebfe1e46528f7fa92e1c9ac8646bef4cdaa3f", "https://bcr.bazel.build/modules/aspect_bazel_lib/1.42.2/MODULE.bazel": "2e0d8ab25c57a14f56ace1c8e881b69050417ff91b2fb7718dc00d201f3c3478", @@ -49,7 +51,6 @@ "https://bcr.bazel.build/modules/aspect_rules_js/2.3.8/MODULE.bazel": "74bf20a7a6bd5f2be09607fdb4196cfd6f203422ea271752ec2b1afe95426101", "https://bcr.bazel.build/modules/aspect_rules_js/2.3.8/source.json": "411ec9d79d6f5fe8a083359588c21d01a5b48d88a2cbd334a4c90365015b7836", "https://bcr.bazel.build/modules/aspect_rules_lint/0.12.0/MODULE.bazel": "e767c5dbfeb254ec03275a7701b5cfde2c4d2873676804bc7cb27ddff3728fed", - "https://bcr.bazel.build/modules/aspect_rules_lint/1.0.3/MODULE.bazel": "ed0fe929647ba21d2041e14ea3d757133ca306b72d4998e8a3d0d2f515196765", "https://bcr.bazel.build/modules/aspect_rules_lint/2.0.0/MODULE.bazel": "1f4c81edd9af0c54e65dedbe36653fc63dc9a91605313d54d5ab371f853d693c", "https://bcr.bazel.build/modules/aspect_rules_lint/2.3.0/MODULE.bazel": "4d36bce3c1347bb4fed5906877dce0e683cb207f4032711aff32334003bcf835", "https://bcr.bazel.build/modules/aspect_rules_lint/2.5.0/MODULE.bazel": "24f49acb3b8375fa138ba6ab53bcf517ae92529770a04ab04d47c958ff47b63e", @@ -72,7 +73,6 @@ "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d", "https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a", "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", - "https://bcr.bazel.build/modules/bazel_features/1.2.0/MODULE.bazel": "122b2b606622afbaa498913d54f52d9bcd2d19a5edd1bd6d6c5aa17441c4d5f9", "https://bcr.bazel.build/modules/bazel_features/1.20.0/MODULE.bazel": "8b85300b9c8594752e0721a37210e34879d23adc219ed9dc8f4104a4a1750920", "https://bcr.bazel.build/modules/bazel_features/1.21.0/MODULE.bazel": "675642261665d8eea09989aa3b8afb5c37627f1be178382c320d1b46afba5e3b", "https://bcr.bazel.build/modules/bazel_features/1.23.0/MODULE.bazel": "fd1ac84bc4e97a5a0816b7fd7d4d4f6d837b0047cf4cbd81652d616af3a6591a", @@ -212,7 +212,6 @@ "https://bcr.bazel.build/modules/boringssl/0.20241024.0/MODULE.bazel": "b540cff73d948cb79cb0bc108d7cef391d2098a25adabfda5043e4ef548dbc87", "https://bcr.bazel.build/modules/boringssl/0.20251124.0/MODULE.bazel": "1e107f2b52cc5e002924bc3b33bb60516f96f91b51eb523127df9ea9a944a3b4", "https://bcr.bazel.build/modules/boringssl/0.20251124.0/source.json": "2f325a76db6c6e14c4db923a26aa9a4bfbbd03e61b9256311f460c18bfba6013", - "https://bcr.bazel.build/modules/buildifier_prebuilt/6.1.2/MODULE.bazel": "2ef4962c8b0b6d8d21928a89190755619254459bc67f870dc0ccb9ba9952d444", "https://bcr.bazel.build/modules/buildifier_prebuilt/6.4.0/MODULE.bazel": "37389c6b5a40c59410b4226d3bb54b08637f393d66e2fa57925c6fcf68e64bf4", "https://bcr.bazel.build/modules/buildifier_prebuilt/7.3.1/MODULE.bazel": "537faf0ad9f5892910074b8e43b4c91c96f1d5d86b6ed04bdbe40cf68aa48b68", "https://bcr.bazel.build/modules/buildifier_prebuilt/8.2.0.2/MODULE.bazel": "a9b689711d5b69f9db741649b218c119b9fdf82924ba390415037e09798edd03", @@ -404,8 +403,10 @@ "https://bcr.bazel.build/modules/rules_cc/0.2.14/MODULE.bazel": "353c99ed148887ee89c54a17d4100ae7e7e436593d104b668476019023b58df8", "https://bcr.bazel.build/modules/rules_cc/0.2.16/MODULE.bazel": "9242fa89f950c6ef7702801ab53922e99c69b02310c39fb6e62b2bd30df2a1d4", "https://bcr.bazel.build/modules/rules_cc/0.2.17/MODULE.bazel": "1849602c86cb60da8613d2de887f9566a6d354a6df6d7009f9d04a14402f9a84", - "https://bcr.bazel.build/modules/rules_cc/0.2.22/MODULE.bazel": "94df4328edef9e44d38de5e73b037cd348e75e7ae55f4e21bf07878c41a31ebb", - "https://bcr.bazel.build/modules/rules_cc/0.2.22/source.json": "b2d6d6f9c332ce269ad75b89c6f3168d809a66173c9040210fb9bcc733ab42fa", + "https://bcr.bazel.build/modules/rules_cc/0.2.20/MODULE.bazel": "f5c07bce5ddcb99be21a0812ff5aadb439e688b7449c6542152363b2fd859c1a", + "https://bcr.bazel.build/modules/rules_cc/0.2.25/MODULE.bazel": "4a3d4f3606d3b3190be495dbc497acca552807d1d5540661ef0d1658472882e3", + "https://bcr.bazel.build/modules/rules_cc/0.2.26/MODULE.bazel": "a9f7b7f4a52747910965bddb1f58fc1fef50604ed1980ebdd16ea6f446d92249", + "https://bcr.bazel.build/modules/rules_cc/0.2.26/source.json": "bf9ff315da6055c1e374d627012cc51947a05b3560674af7d69fbedbb4fde6ef", "https://bcr.bazel.build/modules/rules_cc/0.2.4/MODULE.bazel": "1ff1223dfd24f3ecf8f028446d4a27608aa43c3f41e346d22838a4223980b8cc", "https://bcr.bazel.build/modules/rules_cc/0.2.8/MODULE.bazel": "f1df20f0bf22c28192a794f29b501ee2018fa37a3862a1a2132ae2940a23a642", "https://bcr.bazel.build/modules/rules_diff/1.0.0/MODULE.bazel": "1739509d8db9a6cd7d3584822340d3dfe1f9f27e62462fbca60aa061d88741b2", @@ -476,7 +477,6 @@ "https://bcr.bazel.build/modules/rules_multirun/0.9.0/MODULE.bazel": "32d628ef586b5b23f67e55886b7bc38913ea4160420d66ae90521dda2ff37df0", "https://bcr.bazel.build/modules/rules_multirun/0.9.0/source.json": "e882ba77962fa6c5fe68619e5c7d0374ec9a219fb8d03c42eadaf6d0243771bd", "https://bcr.bazel.build/modules/rules_multitool/0.11.0/MODULE.bazel": "8d9dda78d2398e136300d3ef4fbcc89ede7c32c158d8c016fa7d032df41c4aaf", - "https://bcr.bazel.build/modules/rules_multitool/0.4.0/MODULE.bazel": "15517987d5c00c9e7faab41fbe22ee67a350b6eabcc1e08baded5c6d9025897f", "https://bcr.bazel.build/modules/rules_multitool/1.9.0/MODULE.bazel": "8a042b0dbf35e4aaa94c28ad69efa75c9e673e9ea4bd5c0fb70bab75ef9c636b", "https://bcr.bazel.build/modules/rules_multitool/1.9.0/source.json": "d9a01604a8b5c4a0e9430824dd34ca5b1b3f5b25277b755e8f3ae91f2c9362a3", "https://bcr.bazel.build/modules/rules_nodejs/5.8.2/MODULE.bazel": "6bc03c8f37f69401b888023bf511cb6ee4781433b0cb56236b2e55a21e3a026a", @@ -496,7 +496,6 @@ "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", "https://bcr.bazel.build/modules/rules_proto/6.0.0-rc1/MODULE.bazel": "1e5b502e2e1a9e825eef74476a5a1ee524a92297085015a052510b09a1a09483", - "https://bcr.bazel.build/modules/rules_proto/6.0.0-rc2/MODULE.bazel": "e17f94f8a347e2c808517b65d74988839d2d62daceb50073e44060193b785eb1", "https://bcr.bazel.build/modules/rules_proto/6.0.0/MODULE.bazel": "b531d7f09f58dce456cd61b4579ce8c86b38544da75184eadaf0a7cb7966453f", "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", "https://bcr.bazel.build/modules/rules_proto/7.0.2/MODULE.bazel": "bf81793bd6d2ad89a37a40693e56c61b0ee30f7a7fdbaf3eabbf5f39de47dea2", @@ -564,7 +563,6 @@ "https://bcr.bazel.build/modules/toolchain_utils/1.0.2/MODULE.bazel": "9b8be503a4fcfd3b8b952525bff0869177a5234d5c35dc3e566b9f5ca2f755a1", "https://bcr.bazel.build/modules/toolchains_llvm/1.8.0/MODULE.bazel": "68259b66e5fb84f94fa37125ad476c3eb8edf602a34bf58377cde9a16dd8fa98", "https://bcr.bazel.build/modules/toolchains_llvm/1.8.0/source.json": "70d80fe5b626a3fadf812af41dda4a028640a1184f5a3c7e6cb20130d93ed783", - "https://bcr.bazel.build/modules/toolchains_protoc/0.2.1/MODULE.bazel": "2f08433ff5e659069b3a1abfee2377d68f510f2de1da50678ed992c455b4ff91", "https://bcr.bazel.build/modules/upb/0.0.0-20211020-160625a/MODULE.bazel": "6cced416be2dc5b9c05efd5b997049ba795e5e4e6fafbe1624f4587767638928", "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", "https://bcr.bazel.build/modules/upb/0.0.0-20230516-61a97ef/MODULE.bazel": "c0df5e35ad55e264160417fd0875932ee3c9dda63d9fccace35ac62f45e1b6f9", @@ -610,6 +608,8 @@ "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/apple_support/1.22.1/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/apple_support/1.23.1/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/apple_support/1.24.1/MODULE.bazel": "not found", + "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/apple_support/2.8.0/MODULE.bazel": "not found", + "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/apple_support/2.9.1/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/aspect_bazel_lib/1.31.2/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/aspect_bazel_lib/1.38.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/aspect_bazel_lib/1.42.2/MODULE.bazel": "not found", @@ -630,7 +630,6 @@ "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/aspect_rules_js/2.0.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/aspect_rules_js/2.3.8/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/aspect_rules_lint/0.12.0/MODULE.bazel": "not found", - "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/aspect_rules_lint/1.0.3/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/aspect_rules_lint/2.0.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/aspect_rules_lint/2.3.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/aspect_rules_lint/2.5.0/MODULE.bazel": "not found", @@ -649,7 +648,6 @@ "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bazel_features/1.17.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bazel_features/1.18.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bazel_features/1.19.0/MODULE.bazel": "not found", - "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bazel_features/1.2.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bazel_features/1.20.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bazel_features/1.21.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bazel_features/1.23.0/MODULE.bazel": "not found", @@ -738,7 +736,6 @@ "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/boringssl/0.20240913.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/boringssl/0.20241024.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/boringssl/0.20251124.0/MODULE.bazel": "not found", - "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/buildifier_prebuilt/6.1.2/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/buildifier_prebuilt/6.4.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/buildifier_prebuilt/7.3.1/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/buildifier_prebuilt/8.2.0.2/MODULE.bazel": "not found", @@ -885,7 +882,9 @@ "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.2.14/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.2.16/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.2.17/MODULE.bazel": "not found", - "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.2.22/MODULE.bazel": "not found", + "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.2.20/MODULE.bazel": "not found", + "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.2.25/MODULE.bazel": "not found", + "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.2.26/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.2.4/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.2.8/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_diff/1.0.0/MODULE.bazel": "not found", @@ -949,7 +948,6 @@ "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_license/1.0.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_multirun/0.9.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_multitool/0.11.0/MODULE.bazel": "not found", - "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_multitool/0.4.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_multitool/1.9.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_nodejs/5.8.2/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_nodejs/6.2.0/MODULE.bazel": "not found", @@ -965,7 +963,6 @@ "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_proto/4.0.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_proto/6.0.0-rc1/MODULE.bazel": "not found", - "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_proto/6.0.0-rc2/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_proto/6.0.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_proto/6.0.2/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_proto/7.0.2/MODULE.bazel": "not found", @@ -1009,8 +1006,6 @@ "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_swift/1.16.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_swift/1.18.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_swift/2.1.1/MODULE.bazel": "not found", - "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_format_checker/0.1.1/MODULE.bazel": "1acc254faa90e9f97b79ac69af25b6c21c561f8d6079914f6352b9b20d26bd37", - "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_format_checker/0.1.1/source.json": "e3d10be878d1a007967b75a5c6d9c3ec3d47c320685904b7f31c689b3cbcdb3a", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_itf/0.6.0/MODULE.bazel": "84fe2438bde5db32cbcfca5db1194a56fd753f69e5466cf8e46aada7f209e613", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_itf/0.6.0/source.json": "59e6efe70c81dbda18631020035bcedc1d92ee86bcae5965989ee5126aa78c92", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_process/2.0.2/MODULE.bazel": "6d2b227bb6880e9f6871cc8cf94c83399e35c188424f7e9b826262de8149ed43", @@ -1025,6 +1020,8 @@ "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_rust_policies/0.0.5/source.json": "22c8bf0a5cbf7c7b06f774f3f66498e0bc14346a8b2208f7427a8fbb78a42547", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_sbom/0.1.1/MODULE.bazel": "f399cccb3e0a2f413d265f642fda2490f001f5a5ab83fe10acd1d0840f7d4b1c", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_sbom/0.1.1/source.json": "aba932cfdf7a6cc2882fe8cf8cdb2f92ff9b3bbbd8933ba1677c28e548618170", + "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_test_scenarios/0.5.0/MODULE.bazel": "a8699c4cfa3d49c4c7fde97742d95fb5c3f06f6a12f174c571fd1c696649ca12", + "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_test_scenarios/0.5.0/source.json": "d18b6ff6600a440be036ad481d1596ec033e302f08ea503c1ffa1bdb37e69859", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_toolchains_rust/0.10.0/MODULE.bazel": "535296e6cdef55a506c580ca2ce541aa9ddefb354de1a24ab2bd4addc939282b", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_toolchains_rust/0.10.0/source.json": "8bda773be264da16d2a82a03ebb737421dd4a35855f1e9a5d03d9722d84c1df5", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/stardoc/0.5.0/MODULE.bazel": "not found", @@ -1043,7 +1040,6 @@ "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/tar.bzl/0.7.0/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/toolchain_utils/1.0.2/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/toolchains_llvm/1.8.0/MODULE.bazel": "not found", - "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/toolchains_protoc/0.2.1/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/upb/0.0.0-20211020-160625a/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "not found", "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/upb/0.0.0-20230516-61a97ef/MODULE.bazel": "not found", @@ -1541,7 +1537,7 @@ }, "@@bazel_jar_jar+//internal:non_module_deps.bzl%non_module_deps": { "general": { - "bzlTransitiveDigest": "HfYvHyph4US1Rb9jKW7AUfDbE5p9915R85CJ0c14mrk=", + "bzlTransitiveDigest": "WKp1gL89DpGSSx+oIwtE0toTaqU5pfTzmQSNhxgCEwk=", "usagesDigest": "P1uSZ4XnqOp90Mkh0A4Nrjx12Bgz/iceROnSbTsawGk=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -2169,7 +2165,7 @@ }, "@@rules_apple+//apple:apple.bzl%provisioning_profile_repository_extension": { "general": { - "bzlTransitiveDigest": "NcCruFgaVG8TOGmWY57IFfvqi/kgV8TWUht9jzdbxII=", + "bzlTransitiveDigest": "lgof385rXHmmk4IC53d7qCeKZlZunQ4c6SX3i40TjMI=", "usagesDigest": "vsJl8Rw5NL+5Ag2wdUDoTeRF/5klkXO8545Iy7U1Q08=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -11148,7 +11144,7 @@ }, "@@rules_rust+//crate_universe/private:internal_extensions.bzl%cu_nr": { "general": { - "bzlTransitiveDigest": "gJFTSrkFabveIiWVE5fBJ7+WVJC4WdpWiFteWxRjbic=", + "bzlTransitiveDigest": "NRlprWw35DfgCebgqn1TtCp+nk0JTpyOzUUmi+3dlk8=", "usagesDigest": "1ieIYuafZ1pmP+ncVvISMfB3Em0hv9LCmCRwIH7gL8E=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, diff --git a/bazel_common/score_modules_target_sw.MODULE.bazel b/bazel_common/score_modules_target_sw.MODULE.bazel index 88b152bf7d1..9b254e54d7d 100644 --- a/bazel_common/score_modules_target_sw.MODULE.bazel +++ b/bazel_common/score_modules_target_sw.MODULE.bazel @@ -43,7 +43,7 @@ git_override( bazel_dep(name = "score_persistency") git_override( module_name = "score_persistency", - commit = "961c0a0989755a1e0fe8de55e83c0a44e2e20b56", + commit = "a804b85f67381378b2250abaa91e0a3a6046e994", patch_strip = 1, patches = [ "//patches/persistency:003-undev-deps-for-root-module.patch", @@ -54,7 +54,7 @@ git_override( bazel_dep(name = "score_kyron") git_override( module_name = "score_kyron", - commit = "90fb90258f49f17a504d41262634d43608f28ccc", + commit = "52d4bef3d1822f82199d72e58e815b9e43406fe6", remote = "https://github.com/eclipse-score/kyron.git", ) diff --git a/bazel_common/score_modules_tooling.MODULE.bazel b/bazel_common/score_modules_tooling.MODULE.bazel index c0f401f18a7..5fc32bac29d 100644 --- a/bazel_common/score_modules_tooling.MODULE.bazel +++ b/bazel_common/score_modules_tooling.MODULE.bazel @@ -60,10 +60,9 @@ git_override( ) bazel_dep(name = "score_test_scenarios") -git_override( +single_version_override( module_name = "score_test_scenarios", - commit = "fec712d490ff5d46fae91332bafac4777b300026", - remote = "https://github.com/eclipse-score/testing_tools.git", + version = "0.5.0", ) bazel_dep(name = "score_docs_as_code") diff --git a/feature_integration_tests/test_cases/tests/persistency/test_combined_requirements.py b/feature_integration_tests/test_cases/tests/persistency/test_combined_requirements.py index ecb12666948..b829ef3c80e 100644 --- a/feature_integration_tests/test_cases/tests/persistency/test_combined_requirements.py +++ b/feature_integration_tests/test_cases/tests/persistency/test_combined_requirements.py @@ -36,7 +36,7 @@ # --------------------------------------------------------------------------- -# Scenario 1: Mixed value types with UTF-8 keys in one snapshot +# Scenario 1: Mixed value types with punctuated ASCII keys in one snapshot # --------------------------------------------------------------------------- @@ -52,10 +52,10 @@ class TestAllTypesWithUtf8Keys(PersistencyScenario): """ Verify that KVS can store multiple value types simultaneously under both - ASCII and UTF-8 encoded key names, and that all of them are physically + ASCII and printable-ASCII key names with spaces and punctuation, and that all of them are physically present in the single persisted snapshot file. - This combines key-encoding support (UTF-8) with value-type coverage + This combines key-encoding support (printable ASCII) with value-type coverage (i32, f64, bool, str, null) in one observable storage outcome. """ @@ -85,11 +85,11 @@ def test_value_types_persisted(self, results: ScenarioResult, temp_dir: Path) -> assert snapshot["ascii_i32"]["t"] == "i32" assert snapshot["ascii_i32"]["v"] == -321 - assert snapshot["emoji_f64 🎯"]["t"] == "f64" - assert isclose(snapshot["emoji_f64 🎯"]["v"], 3.14, abs_tol=1e-4) + assert snapshot["punct_f64 #%"]["t"] == "f64" + assert isclose(snapshot["punct_f64 #%"]["v"], 3.14, abs_tol=1e-4) - assert snapshot["greek_bool αβγ"]["t"] == "bool" - assert snapshot["greek_bool αβγ"]["v"] is True + assert snapshot["punct_bool ~^"]["t"] == "bool" + assert snapshot["punct_bool ~^"]["v"] is True assert snapshot["ascii_str"]["t"] == "str" assert snapshot["ascii_str"]["v"] == "hello" @@ -200,7 +200,7 @@ def test_default_values_accessible(self, results: ScenarioResult, logs_info_leve # --------------------------------------------------------------------------- -# Scenario 3: UTF-8 keys in defaults file + selective override +# Scenario 3: Punctuated ASCII keys in defaults file + selective override # --------------------------------------------------------------------------- @@ -215,21 +215,21 @@ def test_default_values_accessible(self, results: ScenarioResult, logs_info_leve ) class TestUtf8KeysWithDefaults(PersistencyScenario): """ - Verify that UTF-8 encoded key names work correctly as keys in both the + Verify that printable-ASCII key names with spaces and punctuation work correctly as keys in both the defaults file and the KVS snapshot. - The defaults file contains three keys with UTF-8 names (ASCII, emoji, - Greek script). The scenario overrides only the emoji key. Python verifies: - - the emoji key appears in the snapshot with the override value - - the ASCII and Greek default-only keys are absent from the snapshot + The defaults file contains three keys (plain, punctuation, + space). The scenario overrides only the punctuation key. Python verifies: + - the punctuation key appears in the snapshot with the override value + - the plain and space default-only keys are absent from the snapshot This combines key-encoding (support_datatype_keys) with default value provisioning (default_values + default_value_file) in one storage outcome. """ _KEY_ASCII = "utf8_ascii_key" - _KEY_EMOJI = "utf8_emoji 🔑" - _KEY_GREEK = "utf8_greek κλμ" + _KEY_PUNCT = "ascii_punct_key !?" + _KEY_SPACE = "ascii_space key" _DEFAULT_VALUE = 42.0 _OVERRIDE_VALUE = 777.0 @@ -239,14 +239,14 @@ def scenario_name(self) -> str: @pytest.fixture(scope="class") def defaults_file(self, temp_dir: Path) -> Path: - """Create defaults using UTF-8 key names.""" + """Create defaults using printable-ASCII key names.""" return create_kvs_defaults_file( temp_dir, 1, { self._KEY_ASCII: ("f64", self._DEFAULT_VALUE), - self._KEY_EMOJI: ("f64", self._DEFAULT_VALUE), - self._KEY_GREEK: ("f64", self._DEFAULT_VALUE), + self._KEY_PUNCT: ("f64", self._DEFAULT_VALUE), + self._KEY_SPACE: ("f64", self._DEFAULT_VALUE), }, ) @@ -264,21 +264,21 @@ def test_config(self, temp_dir: Path, defaults_file: Path) -> dict[str, Any]: def test_emoji_override_persisted(self, results: ScenarioResult, temp_dir: Path) -> None: """ - The explicitly overridden UTF-8 emoji key must appear in the snapshot - with the override value, confirming that UTF-8 key names survive the + The explicitly overridden punctuation key must appear in the snapshot + with the override value, confirming that punctuated key names survive the full round-trip through the defaults file and snapshot storage. """ assert results.return_code == ResultCode.SUCCESS snapshot = read_kvs_snapshot(temp_dir, 1) - assert self._KEY_EMOJI in snapshot, ( - f"Overridden UTF-8 emoji key '{self._KEY_EMOJI}' must be present in snapshot" + assert self._KEY_PUNCT in snapshot, ( + f"Overridden punctuation key '{self._KEY_PUNCT}' must be present in snapshot" ) - assert isclose(snapshot[self._KEY_EMOJI]["v"], self._OVERRIDE_VALUE, abs_tol=1e-4) + assert isclose(snapshot[self._KEY_PUNCT]["v"], self._OVERRIDE_VALUE, abs_tol=1e-4) def test_default_only_utf8_keys_absent(self, results: ScenarioResult, temp_dir: Path) -> None: """ - UTF-8 keys that were not explicitly overridden must remain absent from + Keys that were not explicitly overridden must remain absent from the snapshot, demonstrating that defaults do not pollute persisted storage. """ assert results.return_code == ResultCode.SUCCESS @@ -287,8 +287,8 @@ def test_default_only_utf8_keys_absent(self, results: ScenarioResult, temp_dir: assert self._KEY_ASCII not in snapshot, ( f"Default-only ASCII key '{self._KEY_ASCII}' must be absent from snapshot" ) - assert self._KEY_GREEK not in snapshot, ( - f"Default-only Greek key '{self._KEY_GREEK}' must be absent from snapshot" + assert self._KEY_SPACE not in snapshot, ( + f"Default-only space key '{self._KEY_SPACE}' must be absent from snapshot" ) def test_snapshot_hash_matches_content(self, results: ScenarioResult, temp_dir: Path) -> None: @@ -298,7 +298,7 @@ def test_snapshot_hash_matches_content(self, results: ScenarioResult, temp_dir: def test_utf8_default_values_accessible(self, results: ScenarioResult, logs_info_level: Any) -> None: """ - Verify that default values behind UTF-8 ASCII and Greek keys are accessible + Verify that default values behind plain and space keys are accessible via get_value even though they were never explicitly written. Checks structured log fields emitted by the scenario after flush. @@ -307,13 +307,13 @@ def test_utf8_default_values_accessible(self, results: ScenarioResult, logs_info log_ascii = logs_info_level.find_log("key", value="utf8_ascii_key") assert log_ascii is not None, "Expected log entry for default utf8_ascii_key" assert isclose(float(log_ascii.value), self._DEFAULT_VALUE, abs_tol=1e-4) - log_greek = logs_info_level.find_log("key", value="utf8_greek κλμ") - assert log_greek is not None, "Expected log entry for default utf8_greek κλμ" - assert isclose(float(log_greek.value), self._DEFAULT_VALUE, abs_tol=1e-4) + log_space = logs_info_level.find_log("key", value="ascii_space key") + assert log_space is not None, "Expected log entry for default ascii_space key" + assert isclose(float(log_space.value), self._DEFAULT_VALUE, abs_tol=1e-4) # --------------------------------------------------------------------------- -# Scenario 4: UTF-8 key in defaults file + get_value without set_value +# Scenario 4: Punctuated ASCII key in defaults file + get_value without set_value # --------------------------------------------------------------------------- @@ -325,16 +325,16 @@ def test_utf8_default_values_accessible(self, results: ScenarioResult, logs_info ) class TestUtf8DefaultValueGet(PersistencyScenario): """ - Verify that get_value retrieves the correct default for a UTF-8 emoji key + Verify that get_value retrieves the correct default for a punctuation key that was provisioned in the defaults file but never explicitly set. - The scenario reads the default via the UTF-8 key, writes the result to an + The scenario reads the default via the punctuation key, writes the result to an ASCII probe key, and flushes. Python checks the probe key equals the expected default — combining feat_req__persistency__default_value_get with feat_req__persistency__support_datatype_keys in one storage outcome. """ - _GET_KEY = "probe 🔍" + _GET_KEY = "probe key ~!" _GET_DEFAULT_VALUE = 42.0 @pytest.fixture(scope="class") @@ -343,7 +343,7 @@ def scenario_name(self) -> str: @pytest.fixture(scope="class") def defaults_file(self, temp_dir: Path) -> Path: - """Provision a default value behind a UTF-8 emoji key.""" + """Provision a default value behind a punctuation key.""" return create_kvs_defaults_file( temp_dir, 1, @@ -364,8 +364,8 @@ def test_config(self, temp_dir: Path, defaults_file: Path) -> dict[str, Any]: def test_utf8_default_value_readable(self, results: ScenarioResult, temp_dir: Path) -> None: """ - The ASCII probe key written by the scenario must equal the UTF-8 key's - default, confirming that get_value works correctly with UTF-8 default keys. + The ASCII probe key written by the scenario must equal the punctuation key's + default, confirming that get_value works correctly with punctuated default keys. """ assert results.return_code == ResultCode.SUCCESS snapshot = read_kvs_snapshot(temp_dir, 1) diff --git a/feature_integration_tests/test_scenarios/cpp/BUILD b/feature_integration_tests/test_scenarios/cpp/BUILD index 3f06998b7f6..68022e7d46b 100644 --- a/feature_integration_tests/test_scenarios/cpp/BUILD +++ b/feature_integration_tests/test_scenarios/cpp/BUILD @@ -25,7 +25,7 @@ cc_binary( deps = [ "@score_baselibs//score/json", "@score_baselibs//score/mw/log:backend_stub_testutil", - "@score_persistency//:kvs_cpp", - "@score_test_scenarios//test_scenarios_cpp", + "@score_persistency//score/kvs", + "@score_test_scenarios//score/test_scenarios_cpp", ], ) diff --git a/feature_integration_tests/test_scenarios/cpp/src/internals/persistency/kvs_build_helpers.h b/feature_integration_tests/test_scenarios/cpp/src/internals/persistency/kvs_build_helpers.h index e0f65444aa8..46a7b41a3e9 100644 --- a/feature_integration_tests/test_scenarios/cpp/src/internals/persistency/kvs_build_helpers.h +++ b/feature_integration_tests/test_scenarios/cpp/src/internals/persistency/kvs_build_helpers.h @@ -16,8 +16,8 @@ #include "kvs_parameters.h" -#include -#include +#include "score/kvs/kvs.h" +#include "score/kvs/kvs_builder.h" #include #include @@ -91,35 +91,49 @@ inline std::string format_double_python(double v) { } /** - * @brief Convert an optional KvsDefaults mode to the boolean flag expected by KvsBuilder. + * @brief Convert an optional KvsDefaults mode to the flag expected by KvsBuilder. * - * Returns true if the mode is Required, false if Optional or Ignored, or - * std::nullopt if no mode was provided (omit the flag from the builder call). + * Returns std::nullopt if no mode was provided (omit the flag from the builder call). * * @param mode Optional KvsDefaults value to convert. - * @return Converted boolean flag or nullopt. + * @return Converted flag or nullopt. */ -inline std::optional to_need_flag(const std::optional& mode) { +inline std::optional to_need_flag(const std::optional& mode) { if (!mode.has_value()) { return std::nullopt; } - return *mode == KvsDefaults::Required; + switch (*mode) { + case KvsDefaults::Required: + return score::mw::per::kvs::OpenNeedDefaults::Required; + case KvsDefaults::Optional: + return score::mw::per::kvs::OpenNeedDefaults::Optional; + case KvsDefaults::Ignored: + default: + return score::mw::per::kvs::OpenNeedDefaults::Ignored; + } } /** - * @brief Convert an optional KvsLoad mode to the boolean flag expected by KvsBuilder. + * @brief Convert an optional KvsLoad mode to the flag expected by KvsBuilder. * - * Returns true if the mode is Required, false if Optional or Ignored, or - * std::nullopt if no mode was provided (omit the flag from the builder call). + * Returns std::nullopt if no mode was provided (omit the flag from the builder call). * * @param mode Optional KvsLoad value to convert. - * @return Converted boolean flag or nullopt. + * @return Converted flag or nullopt. */ -inline std::optional to_need_flag(const std::optional& mode) { +inline std::optional to_need_flag(const std::optional& mode) { if (!mode.has_value()) { return std::nullopt; } - return *mode == KvsLoad::Required; + switch (*mode) { + case KvsLoad::Required: + return score::mw::per::kvs::OpenNeedKvs::Required; + case KvsLoad::Optional: + return score::mw::per::kvs::OpenNeedKvs::Optional; + case KvsLoad::Ignored: + default: + return score::mw::per::kvs::OpenNeedKvs::Ignored; + } } /** diff --git a/feature_integration_tests/test_scenarios/cpp/src/internals/persistency/kvs_instance.cpp b/feature_integration_tests/test_scenarios/cpp/src/internals/persistency/kvs_instance.cpp index 703699da627..d6cf1979e89 100644 --- a/feature_integration_tests/test_scenarios/cpp/src/internals/persistency/kvs_instance.cpp +++ b/feature_integration_tests/test_scenarios/cpp/src/internals/persistency/kvs_instance.cpp @@ -13,7 +13,7 @@ #include "kvs_instance.h" -#include +#include "score/kvs/kvs_builder.h" #include #include @@ -154,26 +154,34 @@ std::optional snapshot_path(const KvsParameters& params) { return dir + "/kvs_" + std::to_string(params.instance_id.value) + "_0.json"; } -std::optional to_need_flag(const std::optional& mode) { +std::optional to_need_flag(const std::optional& mode) { if (!mode.has_value()) { return std::nullopt; } - if (*mode == KvsDefaults::Required) { - return true; + switch (*mode) { + case KvsDefaults::Required: + return score::mw::per::kvs::OpenNeedDefaults::Required; + case KvsDefaults::Optional: + return score::mw::per::kvs::OpenNeedDefaults::Optional; + case KvsDefaults::Ignored: + default: + return score::mw::per::kvs::OpenNeedDefaults::Ignored; } - // Optional and Ignored are mapped to not-required for C++ KvsBuilder API. - return false; } -std::optional to_need_flag(const std::optional& mode) { +std::optional to_need_flag(const std::optional& mode) { if (!mode.has_value()) { return std::nullopt; } - if (*mode == KvsLoad::Required) { - return true; + switch (*mode) { + case KvsLoad::Required: + return score::mw::per::kvs::OpenNeedKvs::Required; + case KvsLoad::Optional: + return score::mw::per::kvs::OpenNeedKvs::Optional; + case KvsLoad::Ignored: + default: + return score::mw::per::kvs::OpenNeedKvs::Ignored; } - // Optional and Ignored are mapped to not-required for C++ KvsBuilder API. - return false; } } // namespace @@ -185,16 +193,12 @@ std::optional> KvsInstance::create(const KvsParamet using namespace score::mw::per::kvs; try { - if (params.snapshot_max_count.has_value() && - params.snapshot_max_count.value() != static_cast(KVS_MAX_SNAPSHOTS)) { - std::cerr << "Unsupported snapshot_max_count for C++ KVS API: requested " - << params.snapshot_max_count.value() << ", supported " << KVS_MAX_SNAPSHOTS - << std::endl; - return std::nullopt; - } - KvsBuilder builder{score::mw::per::kvs::InstanceId{params.instance_id.value}}; + if (params.snapshot_max_count.has_value()) { + builder = builder.snapshot_max_count(static_cast(*params.snapshot_max_count)); + } + if (const auto defaults = to_need_flag(params.defaults)) { builder = builder.need_defaults_flag(*defaults); } diff --git a/feature_integration_tests/test_scenarios/cpp/src/internals/persistency/kvs_instance.h b/feature_integration_tests/test_scenarios/cpp/src/internals/persistency/kvs_instance.h index 74654474e6b..4597784e437 100644 --- a/feature_integration_tests/test_scenarios/cpp/src/internals/persistency/kvs_instance.h +++ b/feature_integration_tests/test_scenarios/cpp/src/internals/persistency/kvs_instance.h @@ -16,7 +16,7 @@ #include "kvs_parameters.h" -#include +#include "score/kvs/kvs.h" #include #include #include diff --git a/feature_integration_tests/test_scenarios/cpp/src/scenarios/persistency/supported_datatypes.cpp b/feature_integration_tests/test_scenarios/cpp/src/scenarios/persistency/supported_datatypes.cpp index 3265c80fa27..04e082a4a73 100644 --- a/feature_integration_tests/test_scenarios/cpp/src/scenarios/persistency/supported_datatypes.cpp +++ b/feature_integration_tests/test_scenarios/cpp/src/scenarios/persistency/supported_datatypes.cpp @@ -71,7 +71,7 @@ class AllValueTypes : public Scenario { } }; -/// Write five values with mixed types under both ASCII and UTF-8 key names, +/// Write five values with mixed types under both plain and punctuated ASCII key names, /// then flush and normalize. Python reads the single snapshot and verifies /// every key is present with the correct type tag and value. class AllTypesUtf8 : public Scenario { @@ -91,8 +91,8 @@ class AllTypesUtf8 : public Scenario { }; check(kvs.set_value("ascii_i32", KvsValue(static_cast(-321))), "ascii_i32"); - check(kvs.set_value(u8"emoji_f64 🎯", KvsValue(3.14)), u8"emoji_f64 🎯"); - check(kvs.set_value(u8"greek_bool αβγ", KvsValue(true)), u8"greek_bool αβγ"); + check(kvs.set_value("punct_f64 #%", KvsValue(3.14)), "punct_f64 #%"); + check(kvs.set_value("punct_bool ~^", KvsValue(true)), "punct_bool ~^"); check(kvs.set_value("ascii_str", KvsValue("hello")), "ascii_str"); check(kvs.set_value("ascii_null", KvsValue(nullptr)), "ascii_null"); diff --git a/feature_integration_tests/test_scenarios/cpp/src/scenarios/persistency/utf8_defaults.cpp b/feature_integration_tests/test_scenarios/cpp/src/scenarios/persistency/utf8_defaults.cpp index b75244c0947..bd9cc6982d9 100644 --- a/feature_integration_tests/test_scenarios/cpp/src/scenarios/persistency/utf8_defaults.cpp +++ b/feature_integration_tests/test_scenarios/cpp/src/scenarios/persistency/utf8_defaults.cpp @@ -21,10 +21,10 @@ namespace { -/// Open a KVS whose defaults file was created with UTF-8 encoded key names. -/// Override only the emoji key and flush. Python verifies: -/// - the emoji key appears in the snapshot with the override value -/// - the ASCII and Greek keys are absent (never explicitly written) +/// Open a KVS whose defaults file was created with printable-ASCII key names with spaces and punctuation. +/// Override only the punctuation key and flush. Python verifies: +/// - the punctuation key appears in the snapshot with the override value +/// - the plain and space keys are absent (never explicitly written) /// /// Combines feat_req__persistency__support_datatype_keys, /// feat_req__persistency__default_values, and @@ -44,8 +44,8 @@ class Utf8Defaults : public Scenario { } auto kvs = *kvs_opt; - // Override only the emoji key; ascii and greek keys remain as defaults. - if (!kvs->set_value(u8"utf8_emoji 🔑", 777.0)) { + // Override only the punctuation key; plain and space keys remain as defaults. + if (!kvs->set_value("ascii_punct_key !?", 777.0)) { throw std::runtime_error("Failed to set value"); } @@ -53,20 +53,20 @@ class Utf8Defaults : public Scenario { throw std::runtime_error("Failed to flush KVS"); } - // Log default values for ascii and greek keys so Python can assert they are accessible. + // Log default values for plain and space keys so Python can assert they are accessible. auto val_ascii = kvs->get_default_value_f64("utf8_ascii_key"); if (!val_ascii.has_value()) { throw std::runtime_error("Failed to read default value for 'utf8_ascii_key'"); } - auto val_greek = kvs->get_default_value_f64(u8"utf8_greek κλμ"); - if (!val_greek.has_value()) { - throw std::runtime_error(u8"Failed to read default value for 'utf8_greek κλμ'"); + auto val_space = kvs->get_default_value_f64("ascii_space key"); + if (!val_space.has_value()) { + throw std::runtime_error("Failed to read default value for 'ascii_space key'"); } kvs_build_helpers::log_info( "\"key\":\"utf8_ascii_key\",\"value\":" + kvs_build_helpers::format_double_python(val_ascii.value()), "cpp_test_scenarios::scenarios::persistency::utf8_defaults"); kvs_build_helpers::log_info( - u8"\"key\":\"utf8_greek \u03ba\u03bb\u03bc\",\"value\":" + kvs_build_helpers::format_double_python(val_greek.value()), + "\"key\":\"ascii_space key\",\"value\":" + kvs_build_helpers::format_double_python(val_space.value()), "cpp_test_scenarios::scenarios::persistency::utf8_defaults"); if (!KvsInstance::normalize_snapshot_file_to_rust_envelope(params)) { @@ -75,7 +75,7 @@ class Utf8Defaults : public Scenario { } }; -/// Read a default value whose key is a UTF-8 emoji string without ever calling +/// Read a default value whose key is a punctuation string without ever calling /// set_value on it. Write the retrieved value to an ASCII result key and flush. /// Python verifies the result key equals the expected default, combining /// feat_req__persistency__default_value_get with @@ -95,13 +95,13 @@ class Utf8DefaultValueGet : public Scenario { } auto kvs = *kvs_opt; - // Read the default via a UTF-8 emoji key — never explicitly set. - auto default_result = kvs->get_default_value_f64(u8"probe 🔍"); + // Read the default via a punctuation key — never explicitly set. + auto default_result = kvs->get_default_value_f64("probe key ~!"); if (!default_result.has_value()) { - throw std::runtime_error(u8"Failed to read default value for 'probe 🔍'"); + throw std::runtime_error("Failed to read default value for 'probe key ~!'"); } - // Persist to an ASCII result key so Python can verify without UTF-8 key lookup. + // Persist to an ASCII result key so Python can verify without special-character key lookup. if (!kvs->set_value("result_key", default_result.value())) { throw std::runtime_error("Failed to set result_key"); } diff --git a/feature_integration_tests/test_scenarios/rust/BUILD b/feature_integration_tests/test_scenarios/rust/BUILD index b23163de7cf..2eae1aa03a7 100644 --- a/feature_integration_tests/test_scenarios/rust/BUILD +++ b/feature_integration_tests/test_scenarios/rust/BUILD @@ -26,6 +26,6 @@ rust_binary( "@score_crates//:tracing", "@score_crates//:tracing_subscriber", "@score_persistency//score/kvs/rust_kvs", - "@score_test_scenarios//test_scenarios_rust", + "@score_test_scenarios//score/test_scenarios_rust", ], ) diff --git a/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/supported_datatypes.rs b/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/supported_datatypes.rs index 89dfea07f99..99f0a679950 100644 --- a/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/supported_datatypes.rs +++ b/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/supported_datatypes.rs @@ -68,7 +68,7 @@ impl Scenario for AllValueTypes { } } -/// Write five values with mixed types under both ASCII and UTF-8 key names, +/// Write five values with mixed types under both plain and punctuated ASCII key names, /// then flush. Python reads the single snapshot and verifies every key is /// present with the correct type tag and value — combining key-encoding and /// value-type requirements in one observable storage outcome. @@ -86,9 +86,9 @@ impl Scenario for AllTypesUtf8 { kvs.set_value("ascii_i32", KvsValue::I32(-321)) .map_err(|e| format!("{e:?}"))?; - kvs.set_value("emoji_f64 🎯", KvsValue::F64(3.14)) + kvs.set_value("punct_f64 #%", KvsValue::F64(3.14)) .map_err(|e| format!("{e:?}"))?; - kvs.set_value("greek_bool αβγ", KvsValue::Boolean(true)) + kvs.set_value("punct_bool ~^", KvsValue::Boolean(true)) .map_err(|e| format!("{e:?}"))?; kvs.set_value("ascii_str", KvsValue::String("hello".to_string())) .map_err(|e| format!("{e:?}"))?; diff --git a/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/utf8_defaults.rs b/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/utf8_defaults.rs index 99f17eeaa0f..5ff09a2d2d0 100644 --- a/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/utf8_defaults.rs +++ b/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/utf8_defaults.rs @@ -24,10 +24,10 @@ fn parse_params(input: &str) -> Result { KvsParameters::from_value(&v["kvs_parameters_1"]).map_err(|e| e.to_string()) } -/// Open a KVS whose defaults file was created with UTF-8 encoded key names. -/// Override only the emoji key and flush. Python verifies: -/// - the emoji key appears in the snapshot with the override value -/// - the ASCII and Greek keys are absent from the snapshot (never explicitly written) +/// Open a KVS whose defaults file was created with printable-ASCII key names with spaces and punctuation. +/// Override only the punctuation key and flush. Python verifies: +/// - the punctuation key appears in the snapshot with the override value +/// - the plain and space keys are absent from the snapshot (never explicitly written) /// /// Combines feat_req__persistency__support_datatype_keys, /// feat_req__persistency__default_values, and @@ -43,22 +43,22 @@ impl Scenario for Utf8Defaults { let params = parse_params(input)?; let kvs = kvs_instance(params).map_err(|e| format!("{e:?}"))?; - // Override only the emoji key; ASCII and Greek keys are intentionally left as defaults. - kvs.set_value("utf8_emoji 🔑", 777.0_f64) + // Override only the punctuation key; plain and space keys are intentionally left as defaults. + kvs.set_value("ascii_punct_key !?", 777.0_f64) .map_err(|e| format!("{e:?}"))?; kvs.flush().map_err(|e| format!("{e:?}"))?; - // Log default values for ASCII and Greek keys so Python can assert accessibility. + // Log default values for plain and space keys so Python can assert accessibility. let val_ascii: f64 = get_default_value_f64(&kvs, "utf8_ascii_key") .map_err(|e| format!("Failed to read default utf8_ascii_key: {e:?}"))?; - let val_greek: f64 = get_default_value_f64(&kvs, "utf8_greek κλμ") - .map_err(|e| format!("Failed to read default utf8_greek κλμ: {e:?}"))?; + let val_space: f64 = get_default_value_f64(&kvs, "ascii_space key") + .map_err(|e| format!("Failed to read default ascii_space key: {e:?}"))?; info!(key = "utf8_ascii_key", value = val_ascii, source = "default"); - info!(key = "utf8_greek κλμ", value = val_greek, source = "default"); + info!(key = "ascii_space key", value = val_space, source = "default"); Ok(()) } } -/// Read a default value whose key is a UTF-8 emoji string without ever calling +/// Read a default value whose key is a punctuation string without ever calling /// set_value on it. Write the retrieved value to an ASCII result key and flush. /// Python verifies the result key equals the expected default, combining /// feat_req__persistency__default_value_get with @@ -73,10 +73,10 @@ impl Scenario for Utf8DefaultValueGet { fn run(&self, input: &str) -> Result<(), String> { let params = parse_params(input)?; let kvs = kvs_instance(params).map_err(|e| format!("{e:?}"))?; - // Read the default value via a UTF-8 emoji key — never explicitly set. - let default_val: f64 = get_default_value_f64(&kvs, "probe 🔍") - .map_err(|e| format!("Failed to read UTF-8 default value: {e:?}"))?; - // Persist to an ASCII result key so Python can verify without UTF-8 key lookup. + // Read the default value via a punctuation key — never explicitly set. + let default_val: f64 = get_default_value_f64(&kvs, "probe key ~!") + .map_err(|e| format!("Failed to read punctuation default value: {e:?}"))?; + // Persist to an ASCII result key so Python can verify without special-character key lookup. kvs.set_value("result_key", default_val).map_err(|e| format!("{e:?}"))?; kvs.flush().map_err(|e| format!("{e:?}"))?; Ok(()) diff --git a/known_good.json b/known_good.json index 783251ea4e3..1c28a99d9c8 100644 --- a/known_good.json +++ b/known_good.json @@ -93,7 +93,6 @@ "@score_logging//score/mw/log/flags:KRemote_Logging=False" ], "exclude_test_targets": [ - "//score/kvs/tests:bm_kvs_cpp", "//score/kvs/tests/integration_test_scenarios/...", "//score/kvs/tests/test_cases/..." ], @@ -106,11 +105,10 @@ ], "test_args": [ "--config=per-x86_64-linux", - "//:test_kvs_cpp", - "//score/kvs/rust_kvs:tests" + "//:unit_tests" ] }, - "hash": "961c0a0989755a1e0fe8de55e83c0a44e2e20b56" + "hash": "a804b85f67381378b2250abaa91e0a3a6046e994" }, "score_kyron": { "repo": "https://github.com/eclipse-score/kyron.git", @@ -126,7 +124,7 @@ "//src/..." ] }, - "hash": "90fb90258f49f17a504d41262634d43608f28ccc" + "hash": "52d4bef3d1822f82199d72e58e815b9e43406fe6" }, "score_lifecycle": { "repo": "https://github.com/eclipse-score/lifecycle.git", @@ -301,7 +299,8 @@ "score_test_scenarios": { "repo": "https://github.com/eclipse-score/testing_tools.git", "docs": false, - "hash": "fec712d490ff5d46fae91332bafac4777b300026" + "version": "0.5.0", + "pin_version": true }, "score_docs_as_code": { "repo": "https://github.com/eclipse-score/docs-as-code.git", diff --git a/patches/persistency/003-undev-deps-for-root-module.patch b/patches/persistency/003-undev-deps-for-root-module.patch index d2d798e4e91..1dcc654ab59 100644 --- a/patches/persistency/003-undev-deps-for-root-module.patch +++ b/patches/persistency/003-undev-deps-for-root-module.patch @@ -1,26 +1,27 @@ diff --git a/MODULE.bazel b/MODULE.bazel -index 2649521..6c17327 100644 +index 55960da5a..5f2244350 100644 --- a/MODULE.bazel +++ b/MODULE.bazel -@@ -38,13 +38,13 @@ bazel_dep(name = "score_coverage", version = "0.3.1", dev_dependency = True) - bazel_dep(name = "aspect_rules_lint", version = "2.7.2", dev_dependency = True) +@@ -47,14 +47,14 @@ bazel_dep(name = "score_coverage", version = "0.4.2", dev_dependency = True) + # Bump once score_rust_policies supports aspect_rules_lint >= 2.6. + bazel_dep(name = "aspect_rules_lint", version = "2.5.2", dev_dependency = True) bazel_dep(name = "buildifier_prebuilt", version = "8.5.1.3", dev_dependency = True) - bazel_dep(name = "google_benchmark", version = "1.9.5", dev_dependency = True) --bazel_dep(name = "googletest", version = "1.17.0.bcr.2", dev_dependency = True) -+bazel_dep(name = "googletest", version = "1.17.0.bcr.2") - bazel_dep(name = "score_bazel_cpp_toolchains", version = "1.0.3", dev_dependency = True) +-bazel_dep(name = "googletest", version = "1.18.0", dev_dependency = True) ++bazel_dep(name = "googletest", version = "1.18.0") + bazel_dep(name = "score_bazel_cpp_toolchains", version = "1.0.5", dev_dependency = True) + bazel_dep(name = "score_cpp_policies", version = "0.1.2", dev_dependency = True) -bazel_dep(name = "score_sbom", version = "0.1.1", dev_dependency = True) -bazel_dep(name = "score_rules_imagefs", version = "0.1.0", dev_dependency = True) +bazel_dep(name = "score_sbom", version = "0.1.1") +bazel_dep(name = "score_rules_imagefs", version = "0.1.0") bazel_dep(name = "score_rust_policies", version = "0.0.5", dev_dependency = True) bazel_dep(name = "score_toolchains_rust", version = "0.10.0", dev_dependency = True) --bazel_dep(name = "score_tools", version = "0.0.3", dev_dependency = True) -+bazel_dep(name = "score_tools", version = "0.0.3") +-bazel_dep(name = "score_tools", version = "0.0.4", dev_dependency = True) ++bazel_dep(name = "score_tools", version = "0.0.4") - # Pinned past v0.0.3 for the `$(locations)` fix in score_pytest. - git_override( -@@ -62,7 +62,7 @@ python.toolchain( + # Python toolchain configuration + PYTHON_VERSION = "3.12" +@@ -65,7 +65,7 @@ python.toolchain( python_version = PYTHON_VERSION, ) From bd7fbb84f8cc75e25f65a545725b0c2642298fdb Mon Sep 17 00:00:00 2001 From: Anton Krivoborodov <63401640+antonkri@users.noreply.github.com> Date: Wed, 28 Oct 2026 16:23:02 +0100 Subject: [PATCH 04/31] Add release-note agent and skill; add v0.10 release note draft (#414) * Add release-note agent, skill and generator; add v0.10 release note draft Signed-off-by: Anton Krivoborodov * Format release-note scripts with ruff Signed-off-by: Anton Krivoborodov * Remove session-specific details from release-note skill and agent Signed-off-by: Anton Krivoborodov * Release note: list removed files as evidence, correct v0.10 content Signed-off-by: Anton Krivoborodov * Release note: take the release date from the S-CORE milestone Signed-off-by: Anton Krivoborodov * Release note: show draft or final state on top of the note Signed-off-by: Anton Krivoborodov * Release note: set the final state explicitly with --final Signed-off-by: Anton Krivoborodov * Add release-note prompt with draft/final parameter Signed-off-by: Anton Krivoborodov * Release note: address review findings (release selection by tag commit, one ref for all evidence, alias normalisation) Signed-off-by: Anton Krivoborodov * Release note: run on the release candidate branch; drop the v0.10 note from this PR Signed-off-by: Anton Krivoborodov * Release note: generate an architecture diagram with every skeleton run The generator renders docs/s_core_v_1/releases/_assets/architecture_vX_Y.svg from scratch (scripts/release_note/architecture_diagram.py) and embeds it in the Overview: platform/infrastructure/tooling modules, the integrated software modules with their components (Sphinx-Needs comp/mod from needs.json, --needs) and the target images. Same inputs give a byte-identical SVG. Skill and agent document the diagram as a generated part. * Release note: take the diagram components from the checkout's needs.json The generator builds //:needs_json_file with Bazel and reads bazel-bin/needs.json, so the components match the module pins of the checked-out release branch instead of the published main docs. A failing build stops the run; --needs only reproduces a diagram from a kept file. Removes the unused diagram path without components. * Release note: list commits without PR of the release branch as evidence The evidence of this repository covers the range origin tag -> checked-out release branch, but only squash-merged PRs ("(#N)") were listed, so commits pushed directly to the release candidate branch were dropped. collect_changes.py now lists them with their changed files (commits that only touch the release notes are skipped). The skill classifies them like PRs and, on refresh, adds items for new evidence while keeping the reviewed narrative. --------- Signed-off-by: Anton Krivoborodov (cherry picked from commit 9f60b91730a9f06ccad74ba14ae7ead769958c14) --- .github/agents/release-note.agent.md | 59 ++ .github/prompts/release-note.prompt.md | 19 + .github/skills/release-note/SKILL.md | 295 +++++++++ scripts/release_note/architecture_diagram.py | 356 +++++++++++ scripts/release_note/collect_changes.py | 418 +++++++++++++ scripts/release_note/generate_release_note.py | 587 ++++++++++++++++++ 6 files changed, 1734 insertions(+) create mode 100644 .github/agents/release-note.agent.md create mode 100644 .github/prompts/release-note.prompt.md create mode 100644 .github/skills/release-note/SKILL.md create mode 100644 scripts/release_note/architecture_diagram.py create mode 100644 scripts/release_note/collect_changes.py create mode 100644 scripts/release_note/generate_release_note.py diff --git a/.github/agents/release-note.agent.md b/.github/agents/release-note.agent.md new file mode 100644 index 00000000000..9a88edcc284 --- /dev/null +++ b/.github/agents/release-note.agent.md @@ -0,0 +1,59 @@ +--- +description: "Creates the S-CORE platform release note docs/s_core_v_1/releases/release_note_score_vX_Y.rst. Use when: preparing a release note for an upcoming platform release, regenerating one from known_good.json, or reviewing the module tables of an existing note. Module tables, platform scope and images are generated from known_good.json and the repository; the 'Changes to the Platform' chapter is written from this repository's PRs and the modules' own release notes (platform-level new features and breaking changes only)." +name: Release Note +argument-hint: "release tag and origin tag, e.g. 'v0.10.0 from v0.9.0' (add 'final' for the final note)" +tools: [read, edit, search, execute, todo, web] +user-invocable: true +--- + +You are the **Release Note** author. Your single job is to produce a platform +release note for `reference_integration` that follows the format defined in +the `release-note` skill. + +You **orchestrate**; the **"how" lives in `.github/skills/release-note/SKILL.md`**. +Read it first and follow it exactly. + +## Constraints + +- DO NOT type module names, versions or links into the tables by hand; they + come from `scripts/release_note/generate_release_note.py`. +- DO NOT invent changes. Every statement must trace back to a merged PR or + closed issue of this repository, the `--changes` table, or a module's own + GitHub release notes (all via `collect_changes.py`). +- List only platform-level new features and breaking changes (see the skill); + module internals stay in the module release notes, which the note links. +- DO NOT edit generated parts (status banner, Overview, headings and icons, + tables, architecture diagram SVG); only replace the `AI-FILL` markers. The + diagram is regenerated from scratch with every skeleton run. +- Pass `--final` only when the user explicitly asks for the final note; + otherwise the note is a draft (see the skill, "Draft and final"). +- DO NOT overwrite an existing `release_note_score_*.rst` without the user + asking for it; for comparisons write to a different path. +- DO NOT commit or push. +- ALWAYS surface generator warnings (missing tags, unreleased pins, missing + milestone) to the user. + +## Workflow + +1. Resolve `release` and `origin` tags from the argument. The release date + comes from the milestone `v.` in eclipse-score/score (the + generator reads it); do not ask for it and do not pass `--date`. +2. Prepare: work on the release candidate branch of the release (ask for it if + the current branch is `main`); `git pull` and `git fetch --tags`. Do not + pass `--known-good-ref`; both scripts read the checked-out branch. +3. Run the generator to create the skeleton (this also builds the checkout's + `needs.json` with Bazel and renders the architecture diagram) and the + `--changes` table. Do not pass `--needs`. +4. Run `collect_changes.py` and classify into platform-level new features and + breaking changes as described in the skill (use the impact hints). +5. Replace both `.. AI-FILL:` markers (New Features, Breaking Changes). +6. Make sure the new note is part of the `toctree` in + `docs/s_core_v_1/releases/releases.rst`. +7. Run the validation checks from the skill. +8. Report: output path and diagram path, state (draft or final), generator + warnings, modules with unreleased pins, modules shown with "no components + documented" in the diagram, + items left out although they looked relevant, and anything you could not + verify. + +The skill section "Run from scratch" has the exact commands. diff --git a/.github/prompts/release-note.prompt.md b/.github/prompts/release-note.prompt.md new file mode 100644 index 00000000000..25ed3683a1b --- /dev/null +++ b/.github/prompts/release-note.prompt.md @@ -0,0 +1,19 @@ +--- +description: "Create or refresh the S-CORE platform release note as draft or final." +name: "release-note" +argument-hint: "release=v0.10.0 origin=v0.9.0 state=draft|final" +agent: "Release Note" +--- +Create the platform release note for release `${input:release:Release tag, e.g. v0.10.0}` +compared to the previous release `${input:origin:Origin tag, e.g. v0.9.0}`. + +State: `${input:state:draft or final}` + +- `draft`: run the generator without `--final`. +- `final`: run the generator with `--final`. +- Any other value: stop and ask for `draft` or `final`. + +Follow the workflow of the agent and the [release-note skill](../skills/release-note/SKILL.md). +If the note file already exists, refresh it as described in the skill: regenerate +everything outside "Changes to the Platform" and keep the reviewed narrative, +unless I ask for a full rewrite. diff --git a/.github/skills/release-note/SKILL.md b/.github/skills/release-note/SKILL.md new file mode 100644 index 00000000000..61f45c2c4e1 --- /dev/null +++ b/.github/skills/release-note/SKILL.md @@ -0,0 +1,295 @@ +--- +name: release-note +description: "How-to reference for creating the S-CORE platform release note (docs/s_core_v_1/releases/release_note_score_vX_Y.rst). Defines the document format, the data sources (known_good.json, merged PRs and removed files of this repository, module GitHub releases), the generator script for the deterministic parts and the rules for the AI-written narrative sections. Use when preparing, regenerating or reviewing a platform release note. The release-note agent orchestrates the run; this skill holds the 'how'." +argument-hint: "release tag, e.g. v0.10.0 (and optionally origin tag)" +--- + +# Platform Release Note — the "how" + +Format basis: the official template `wp__platform_sw_release_note` +(`process_description/process/folder_templates/platform/docs/release/release_note.rst`), +adapted as described below. The **[release-note agent](../../agents/release-note.agent.md)** +runs the procedure; this skill holds the rules. + +## Document format + +| Section | Source | Written by | +|---|---|---| +| Status banner directly below the title: **DRAFT** (`.. warning::`, title suffix "(DRAFT)", `:status: draft`) or **FINAL** (`.. note::` with link to the release tag, `:status: valid`) | `--final` | script | +| Header (`document` directive, Platform Name, Release Tag, Origin Release Tag, Release Date) | CLI args; Release Date = due date of the milestone `v.` in [eclipse-score/score](https://github.com/eclipse-score/score/milestones) | script | +| Overview (fixed intro sentence) | release and origin tag | script | +| Architecture diagram (figure in the Overview, SVG in `docs/s_core_v_1/releases/_assets/architecture_vX_Y.svg`) | `known_good.json` (release and origin), `images/`, components from `needs.json` | script (`architecture_diagram.py`) | +| Disclaimer | fixed text | script | +| Changes to the Platform: New Features / Breaking Changes (platform-level only) | `collect_changes.py` (this repo's PRs, modules' own release notes, impact hints), `--changes` table | AI | +| Reference Integration scope: Version, Source / tag, Release notes, Platform Verification Report (bullets) | release tag | script | +| Integrated Software Modules (table incl. `score_platform` first; extra column Module verification report) | `known_good.json` group `target_sw` + `score_platform` | script | +| Associated Infrastructure Modules (table) | `known_good.json` group `tooling` (without `score_platform`) | script | +| Images (subchapter after the two module tables; table: Name, Tarball, How-to, Description) | release assets, README/runner docs at the tag | script | +| Known Issues, Upgrade Instructions (registry hint, hint for commit pins, link to `known_good.json` at the tag), Contact | fixed text | script | + +The scope section describes this repository (reference_integration) and holds +links only; no change narrative. Changes of this repository and of the images +go into **Changes to the Platform**. + +Every chapter heading carries an icon (emoji); the mapping is `ICONS` in the +script. When adding a chapter, add its icon there instead of typing it into the +heading (the script also lengthens the underline for the double-width emoji). +The title and the `~~~` item subsections have no icon. + +Module tables have the columns **Name** (link to the repo at the pinned +tag/commit), **Version**, **Release notes** (link to the GitHub release of that +tag). The Integrated Software Modules table has a fourth column **Module +verification report**: a `:doc:` link taken from +`docs/verification_report/modules/index.rst` (always the latest report in the +current docs tree), `---` where the module has none (e.g. the platform). Every +empty table cell is written as `---`. +Never write module versions or links by hand. + +Image table: the image catalogue (`IMAGES` in the script) lists name, +`images/`, description and how-to candidates. An image is listed only if +`images/` exists at the release ref. Tarball is a release asset whose name +contains the image directory name, else `---`. How-to is the first candidate that exists at the ref, else `---`. +When an image is added or renamed in `images/`, update `IMAGES`. + +## Draft and final + +A note has one of two states. The release note is part of the release and is +finalised before the tag is created, so the state is set explicitly: + +- **Draft** (default) while the release is in progress: the note shows the + current state of the release branch. Title suffix "(DRAFT)", a warning + banner on top and `:status: draft`. +- **Final** with `--final`, only when the user says the note is final (content + frozen for the release). No title suffix, a note banner with the link to the + release tag and `:status: valid`. + +To make a draft final, refresh it with `--final` as described in "Run from +scratch" and keep the reviewed narrative. + +## Generator + +```bash +# Skeleton (known_good.json is read from the release tag if it exists, else the checked-out release branch) +python3 scripts/release_note/generate_release_note.py --release vX.Y.0 --origin vX.W.0 \ + --output docs/s_core_v_1/releases/release_note_score_vX_Y.rst + +# Module version changes origin -> release (input for the narrative) +python3 scripts/release_note/generate_release_note.py --release vX.Y.0 --origin vX.W.0 --changes +``` + +Behaviour worth knowing: + +- Tags are resolved with `git ls-remote --tags` on every module repo. A + `version` pin maps to `v` or ``; a `hash` pin maps to a tag only if + one points exactly at that commit, otherwise the row shows ` (unreleased)`, + links the commit and has no release-notes link. +- The Release Date is always the due date of the milestone `v.` + (for `vX.Y.0`: milestone `vX.Y`) in eclipse-score/score. Do not pass `--date`; + it only exists as an override when the user asks for a different date. If + the milestone or its due date is missing, the script warns and writes `TBD`; + report this instead of guessing a date. +- Warnings (`no tag for version ...`) on stderr mean a broken link. Fix the + `known_good.json` pin or report it, never silence it. +- Modules with `"enabled": false` are skipped. +- Unknown `known_good.json` groups abort the run; extend `SECTIONS` then. +- The two narrative sections (New Features, Breaking Changes) are emitted as + `.. AI-FILL: ` comments. + +## Architecture diagram + +Every skeleton run renders the diagram from scratch +(`scripts/release_note/architecture_diagram.py`, called by the generator) to +`docs/s_core_v_1/releases/_assets/architecture_v_.svg` and embeds +it with `.. figure::` in the Overview. The SVG is a generated file: never edit +it by hand and never keep an old one; regenerate it with the skeleton. + +Content: + +- Header: release, DRAFT/FINAL badge (`--final`), release date, origin and key + figures (software modules, components, infrastructure modules, images). +- Left column over the full height: platform, infrastructure and tooling + modules (`score_platform` + group `tooling`). +- Right: the integrated software modules as tiles side by side (no layering), + each with version, the version in the origin release ("was ...") and its + components as chips; below them the target images (same catalogue as the + image table, dashed = experimental). +- Colour bar: green = released tag, orange = commit pin; NEW = not in the origin + release. + +Components come from the Sphinx-Needs of the `needs.json` of the **checked-out +branch**: the generator runs `bazel build //:needs_json_file` (Bazel caches it +and rebuilds only when the docs inputs changed; the first run takes a few +minutes) and reads `bazel-bin/needs.json`. These are the module docs at the +pins of the checkout, so components, versions and images describe the same +state. It takes every `comp` need whose source lies in +`modules//`, plus the `includes` of the module's `mod` need (a `mod` +need outside the module docs, for example in `score_platform`, is matched by its +title). Modules without such needs show "no components documented"; report +them, do not add components by hand. If the Bazel build fails, the generator +stops; fix the build instead of falling back to another `needs.json`. +`--needs ` skips the build and is only for reproducing a diagram from a +kept `needs.json`. + +The diagram is a pure function of its inputs: `known_good.json` at the release +ref and at the origin tag, `images/` at the release ref, the `needs.json` of the +checkout, the milestone date and the state (`--final`). There is no randomness, +no timestamp and no layout state; the same inputs give a byte-identical SVG. To +check, run the generator twice to a scratch output and `cmp` the SVG. +Run it on the checked-out release branch without `--known-good-ref`; with +another ref the components would still come from the checkout. +Colours follow the S-CORE docs theme (header `#2D1942`); change them only in +`architecture_diagram.py`. + +## Run from scratch (any release, also for not yet tagged ones) + +The procedure is identical for existing and new releases; only the inputs differ. +In chat, the prompt `/release-note` (`.github/prompts/release-note.prompt.md`) +asks for release, origin and state (`draft` or `final`) and starts the agent. + +1. **Inputs.** `release` and `origin` tag and the output file + `docs/s_core_v_1/releases/release_note_score_v_.rst`. The + release date is taken from the milestone (see above). +2. **Prepare.** Check out the release candidate branch of the release and + update it (`git pull`, `git fetch --tags`). The note is created and + committed only there; it reaches `main` when the release branch is merged + back after the release. Never add a release note on `main` directly, it + would conflict with that merge. Both scripts read the checked-out state by + default; the release branch must be pushed, because the collector compares + commits through the GitHub API. Set `GITHUB_TOKEN` for the GitHub API calls + (anonymous access is rate limited); never print it. +3. **Skeleton.** Run the generator (see above); it also builds the + `needs.json` of the checkout with Bazel and writes the architecture diagram + (see "Architecture diagram"). Check the stderr warnings. +4. **Evidence.** Run `collect_changes.py` with the same `--release` and + `--origin`, plus the `--changes` table. Runtime is a few minutes. +5. **Narrative.** Replace the two `AI-FILL` markers (New Features, Breaking + Changes) with the rules below. Nothing else in the file is written by hand. +6. **Index.** Make sure the new note is part of the `toctree` in + `docs/s_core_v_1/releases/releases.rst` on the release branch. +7. **Validate** (checklist below) and report. + +An existing note is never overwritten unless the user asks for it; to compare, +write to another path. To refresh the tables of an existing draft (for example +after pin bumps, or to make it final with `--final`), generate to +another path and replace everything outside "Changes to the Platform"; keep the +reviewed narrative. The diagram SVG is always overwritten by the run, so it +matches the refreshed tables. Then run `collect_changes.py` again and add items +for evidence that is not covered yet (new PRs or direct commits on the release +branch); keep the reviewed items unless their evidence changed. + +Re-running with the same inputs gives the same tables and chapter structure. +The narrative may be worded differently, but it has to name the same items as +long as the evidence did not change. + +## Writing the narrative (AI-FILL) + +"Changes to the Platform" has exactly two chapters: **New Features** and +**Breaking Changes**. It lists **platform-level** changes only. The release note +already links the release notes of every module, so module internals are not +repeated here. + +What is platform-level: + +1. Module set: newly integrated, removed or renamed modules and major version + jumps (from the `--changes` table of `generate_release_note.py`). +2. Changes of this repository (reference_integration): new or changed images and + platforms, Bazel/toolchain updates, build and integration mechanisms, new + demos, documentation or process deliverables. +3. Cross-module changes: the same change in several modules (for example a + dependency that all modules replace). Identical PR titles in several repos, + or a module's release note, point to them. +4. Breaking changes of a module **with impact on integrators or other modules**, + for example a removed flag that `known_good.json` still sets. Breaking changes + without such impact stay in the module's own release note. + +Evidence: + +```bash +python3 scripts/release_note/collect_changes.py --release vX.Y.0 --origin vX.W.0 --output changes.md +``` + +The evidence of this repository covers the commit range from the origin tag to +the checked-out release branch (not `main`). The output has one section for +the merged PRs and closed issues of this repository, one for the **commits +without PR** in that range (commits pushed directly to the release candidate +branch, with their changed files; commits that only touch +`docs/s_core_v_1/releases/` are skipped), one for the files of this repository +that were removed or renamed +(per directory, without `docs/` and `patches/`), and one section per changed +module with the **breaking** and **new-feature** parts of the module's own +GitHub release notes. For every +breaking part the script lists "impact hints": places in this repository that +mention a flag, label or symbol named there. `--module ` restricts the run, +`--module-prs` adds the merged PRs of a module (slow, only for a deep dive), +`--include-infra` adds the infrastructure modules. + +Classification: + +- Impact hints are leads, not verdicts. A hint is only meaningful if the hit really + uses what the module removed or changed (for example a flag set in + `known_good.json` or `.bazelrc` that the release note says was removed). A hit + that merely shares a name (a different configuration with a similar name) is a + false alarm; ignore it. +- **Breaking**: + - this repository: a removed or renamed script, target, configuration file or + mechanism, in particular one that an earlier release note announced. The + "removed or renamed files" section points to them; read the PR that removed + them. + - a module: a removed or renamed module, target, flag or public API, or + changed behaviour requiring action, as stated in the module's release note + ("breaking" section). List it if this repository uses it (impact hint) or + if it is a public API that applications use directly; say which of the two + applies. Changes of internals stay in the module's release note. +- **New feature**: new module, platform, image, integration capability or + deliverable; or a module feature that is visible across the platform. +- Anything else is omitted. When unsure, omit it and name it in the final report. +- PR labels like `breaking` or `feature` are not used consistently; decide from + title, description and the module's release note. +- Commits without PR are classified like PRs; read the commit (`git show`) + because the subject is often short. Pure pin bumps are already covered by the + `--changes` table and the module sections. + +Rules: + +- Only state facts found in the evidence. No invented features, dates or versions. + Read the PR description before describing a PR; the title alone is not enough + (a PR may replace something instead of extending it). +- One `~~~` subsection per item with a short noun-phrase title, written for + integrators; link to the PR, issue, commit (for commits without PR) or the + module's release note as RST links + (`` `text `__ ``). Name new scripts, targets or settings that + integrators use. +- Order of the items: module set, integration and build, images and platforms, + tests, documentation; breaking changes of this repository before those of + the modules (one subsection per module, in table order). +- Breaking changes end with "Action required: ...". +- Remove **Breaking Changes** only if there is none; never leave an `AI-FILL` + marker behind (`grep -n AI-FILL ` must be empty). +- Report items you left out although they looked relevant, and modules without + GitHub releases in the range. + +Known limits of the evidence: + +- Only some modules (for example Baselibs) structure their GitHub release notes + with "Breaking changes" and "New features" sections. For the others the + collector prints "No breaking/new-feature sections found"; there is then no + module-level evidence, and you must say so in the report instead of guessing. +- Hash-pinned modules (` (unreleased)`) have releases only up to their + latest tag; changes after it are not covered by release notes. +- Impact hints search `known_good.json`, `.bazelrc`, `bazel_common`, `patches`, + `images`, `showcases` and the integration tests; they do not understand code. + +## Validation + +- `grep -n "AI-FILL" ` is empty. +- The Overview contains the `.. figure::` of the diagram and the SVG + `docs/s_core_v_1/releases/_assets/architecture_v_.svg` was + written by this run (it is committed together with the note). +- The new note is part of the `toctree` in `releases.rst`. +- Every `~~~` item and every bullet names a PR, issue, commit or release note link. +- Every new module of the `--changes` table and every removed mechanism of this + repository is either in the note or named in the report. +- No stderr warnings of the generator; `(unreleased)` rows are named in the report. +- The scope links point to the release tag. +- Docs build: `bazel run --lockfile_mode=error //:docs_shim -- --github_user=eclipse-score --github_repo=reference_integration` + (heavy; optional locally, CI runs it). diff --git a/scripts/release_note/architecture_diagram.py b/scripts/release_note/architecture_diagram.py new file mode 100644 index 00000000000..62f15c32712 --- /dev/null +++ b/scripts/release_note/architecture_diagram.py @@ -0,0 +1,356 @@ +# ******************************************************************************* +# Copyright (c) 2026 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +"""Architecture diagram (SVG) of the reference integration for the platform release note. + +Rendered by generate_release_note.py together with the skeleton; never edited by hand. +Modules and images come from known_good.json and the repository, components from the +Sphinx-Needs ``comp``/``mod`` needs of the needs.json of the docs build. +""" + +from __future__ import annotations + +import json +import re +from pathlib import Path +from xml.sax.saxutils import escape + +import generate_release_note as grn + +W = 1280 +M = 40 +NAVY = "#0b1f3a" +INK = "#1d2b3f" +MUTED = "#5b6b80" +FAINT = "#9aa8bb" +RELEASED = "#0f9d8a" +UNRELEASED = "#e39a2d" +NEW = "#6d4aff" +# Header bar of the S-CORE docs theme (--pst-color-secondary in docs-as-code score.css) +HEADER = "#2d1942" +HEADER_TEXT = "#d8cce6" +HEADER_FAINT = "#a996bf" +FONT = "Inter, 'Segoe UI', Helvetica, Arial, sans-serif" +MONO = "'JetBrains Mono', Menlo, Consolas, monospace" + +# images/ -> (operating system, architecture) +IMAGE_LABELS = { + "linux_x86_64": ("Linux", "x86_64"), + "qnx_x86_64": ("QNX 8.0", "x86_64"), + "qnx_aarch64": ("QNX 8.0", "aarch64"), + "autosd": ("Red Hat AutoSD", "x86_64"), + "ebclfsa_aarch64": ("EB corbos Linux", "aarch64"), +} + + +def text_width(s: str, size: float, weight: int = 400) -> float: + return len(s) * size * (0.64 if weight >= 600 else 0.56) + + +def fit(s: str, size: float, weight: int, available: float, min_size: float = 11) -> tuple[str, float]: + while size > min_size and text_width(s, size, weight) > available: + size -= 0.5 + while len(s) > 4 and text_width(s, size, weight) > available: + s = s[:-2] + "\u2026" + return s, size + + +def wrap(s: str, size: float, weight: int, available: float) -> tuple[list[str], float]: + """Split a too-long name into two balanced lines instead of shrinking it.""" + if text_width(s, size, weight) <= available or " " not in s: + label, size = fit(s, size, weight, available) + return [label], size + words = s.split() + cut = min(range(1, len(words)), key=lambda i: max(len(" ".join(words[:i])), len(" ".join(words[i:])))) + lines = [" ".join(words[:cut]), " ".join(words[cut:])] + size = min(fit(line, size, weight, available)[1] for line in lines) + return [fit(line, size, weight, available)[0] for line in lines], size + + +def text(x, y, s, size=14, weight=400, fill=INK, anchor="start", family=FONT, extra=""): + return ( + f'{escape(s)}' + ) + + +def pill(x_right, y, label, color, h=18): + w = 12 + 7 * len(label) + return f'' + text( + x_right - w / 2, y + h / 2 + 4, label, 10, 700, "#fff", "middle", extra='letter-spacing="0.8"' + ) + + +def card_base(x, y, w, h, accent): + return [ + f'', + f'', + f'', + ] + + +def row_card(x, y, w, h, entry: grn.Entry, is_new: bool): + accent = RELEASED if entry.tag else UNRELEASED + out = card_base(x, y, w, h, accent) + version = entry.tag or entry.pin[:7] + name = re.sub(r"\s*\(.*\)$", "", entry.name) + label, size = fit(name, 13, 600, w - 40 - text_width(version, 11) - (42 if is_new else 0)) + out.append(text(x + 18, y + h / 2 + 5, label, size, 600)) + if is_new: + out.append(pill(x + 18 + text_width(label, size, 600) + 41, y + (h - 18) / 2, "NEW", NEW)) + out.append(text(x + w - 12, y + h / 2 + 4, version, 11, 400, MUTED, "end", family=MONO)) + return "\n".join(out) + + +def section(x, y, w, h, title_lines, subtitle="", stacked=False): + """stacked: subtitle goes below the title (narrow columns) instead of right-aligned.""" + out = [f''] + for i, line in enumerate(title_lines): + out.append(text(x + 24, y + 30 + i * 18, line.upper(), 12, 700, MUTED, extra='letter-spacing="1.8"')) + if subtitle and stacked: + out.append(text(x + 24, y + 30 + len(title_lines) * 18 + 4, subtitle, 12, 400, MUTED)) + elif subtitle: + out.append(text(x + w - 24, y + 30, subtitle, 12, 400, MUTED, "end")) + return "".join(out) + + +CHIP_H, CHIP_GAP = 22, 6 + + +def load_components(path: Path, entries: list[grn.Entry]) -> dict[str, list[str]]: + """Module key -> component titles, from the Sphinx-Needs `comp` and `mod` needs of a needs.json.""" + data = json.loads(path.read_text()) + versions = data["versions"] + needs = versions.get(data.get("current_version", ""), next(iter(versions.values())))["needs"] + found: dict[str, dict[str, str]] = {e.key: {} for e in entries} + + def owner(need: dict) -> grn.Entry | None: + docname = need.get("docname") or "" + return next((e for e in entries if docname.startswith(f"modules/{e.key}/")), None) + + for need in needs.values(): + if need["type"] == "comp" and (e := owner(need)): + found[e.key][need["id"]] = need["title"] + elif need["type"] == "mod": + # module descriptions can also live in score_platform, so fall back to the title + e = owner(need) or next((e for e in entries if e.name == need["title"]), None) + for ref in need.get("includes", []) if e else []: + if comp := needs.get(ref.split("[")[0]): + found[e.key][comp["id"]] = comp["title"] + return {key: sorted(comps.values(), key=lambda t: (t.lower(), t)) for key, comps in found.items()} + + +def chip_lines(labels: list[str], available: float) -> list[list[tuple[str, float]]]: + lines: list[list[tuple[str, float]]] = [] + line: list[tuple[str, float]] = [] + used = 0.0 + for label in labels: + label = fit(label, 11, 500, available - 16)[0] + width = text_width(label, 11, 500) + 16 + if line and used + CHIP_GAP + width > available: + lines.append(line) + line, used = [], 0.0 + used += (CHIP_GAP if line else 0) + width + line.append((label, width)) + return lines + [line] if line else lines + + +def component_layout(entry: grn.Entry, w: float, is_new: bool, note: str, comps: list[str]): + """Name lines, name size, y offset of the chips and the minimum tile height.""" + lines, size = wrap(entry.name, 16, 700, w - 34 - (52 if is_new else 0)) + chips_y = 30 + (len(lines) - 1) * (size + 5) + 22 + (14 if note else 0) + 14 + n = len(chip_lines(comps, w - 34)) + block = n * CHIP_H + (n - 1) * CHIP_GAP if n else 20 + return lines, size, chips_y, chips_y + block + 16 + 28 + + +def component_tile(x, y, w, h, entry: grn.Entry, is_new: bool, note: str, comps: list[str]): + accent = RELEASED if entry.tag else UNRELEASED + out = card_base(x, y, w, h, accent) + lines, size, chips_y, _ = component_layout(entry, w, is_new, note, comps) + for i, line in enumerate(lines): + out.append(text(x + 20, y + 30 + i * (size + 5), line, size, 700, NAVY)) + vy = y + 30 + (len(lines) - 1) * (size + 5) + 22 + out.append(text(x + 20, vy, entry.tag or entry.pin[:7], 13, 700, INK if entry.tag else accent, family=MONO)) + if note: + out.append(text(x + 20, vy + 14, note, 10, 400, FAINT, family=MONO)) + cy = y + chips_y + for line in chip_lines(comps, w - 34): + cx = x + 20 + for label, cw in line: + out.append( + f'' + ) + out.append(text(cx + cw / 2, cy + 15, label, 11, 500, INK, "middle")) + cx += cw + CHIP_GAP + cy += CHIP_H + CHIP_GAP + if not comps: + out.append(text(x + 20, cy + 14, "no components documented", 11, 400, FAINT, extra='font-style="italic"')) + out.append( + f'' + ) + repo = entry.repo_url.rstrip("/").rsplit("/", 1)[-1] + out.append(text(x + 20, y + h - 11, fit(repo, 10, 400, w - 34)[0], 10, 400, FAINT, family=MONO)) + if is_new: + out.append(pill(x + w - 10, y + 10, "NEW", NEW)) + return "\n".join(out) + + +def component_rows(sw: list[grn.Entry], components: dict[str, list[str]], inner_w: float, gap: float, history, origin): + """Justified rows of up to 4 column units; modules with many components span 2 or 4 units.""" + rows: list[list[tuple[grn.Entry, int]]] = [[]] + for e in sw: + n = len(components.get(e.key, [])) + units = 4 if n > 8 else 2 if n > 3 else 1 + if sum(u for _, u in rows[-1]) + units > 4: + rows.append([]) + rows[-1].append((e, units)) + layout = [] + for row in rows: + total = sum(u for _, u in row) + unit_w = (inner_w - gap * (len(row) - 1)) / total + tiles, height = [], 0.0 + for e, units in row: + is_new, previous = history(e) + note = f"was {previous}" if previous else ("" if is_new else f"unchanged since {origin}") + w = unit_w * units + comps = components.get(e.key, []) + height = max(height, component_layout(e, w, is_new, note, comps)[3]) + tiles.append((e, w, is_new, note, comps)) + layout.append((tiles, height)) + return layout + + +def render( + release: str, + origin: str, + date: str, + final: bool, + groups: dict[str, list[grn.Entry]], + origin_groups: dict[str, list[grn.Entry]], + ref: str | None, + ref_label: str, + components: dict[str, list[str]], +) -> str: + old = {grn.KEY_ALIASES.get(e.key, e.key): e for es in origin_groups.values() for e in es} + + def history(e: grn.Entry) -> tuple[bool, str | None]: + o = old.get(grn.KEY_ALIASES.get(e.key, e.key)) + if o is None: + return True, None + return False, (o.tag or o.pin[:7]) if o.pin != e.pin else None + + sw = [e for e in groups["target_sw"] if e.key != grn.PLATFORM_MODULE] + infra = [e for e in groups["target_sw"] if e.key == grn.PLATFORM_MODULE] + groups["tooling"] + + images = [ + (IMAGE_LABELS.get(directory, (name, directory)), "(Experimental)" in name) + for name, directory, _, _ in grn.IMAGES + if grn._exists(ref, f"images/{directory}") + ] + new_count = sum(history(e)[0] for e in sw + infra) + + parts: list[str] = [] + + # Header with key figures + short = ".".join(release.removeprefix("v").split(".")[:2]) + parts.append(f'') + title = f"S-CORE Platform v{short}" + parts.append(text(M, 54, title, 32, 800, "#ffffff")) + parts.append(text(M, 86, "Reference integration architecture", 16, 400, HEADER_TEXT)) + state, color = ("FINAL", RELEASED) if final else ("DRAFT", UNRELEASED) + parts.append(pill(M + text_width(title, 32, 800) + 20 + 12 + 7 * len(state), 30, state, color, 24)) + figures = [ + (str(len(sw)), "software modules"), + (str(sum(map(len, components.values()))), "components"), + (str(len(infra)), "infrastructure modules"), + (str(len(images)), "target images"), + ] + x = W - M + for value, label in reversed(figures): + w = max(text_width(label, 11) + 8, 70) + parts.append(text(x, 62, value, 28, 800, "#ffffff", "end")) + parts.append(text(x, 82, label, 11, 400, HEADER_TEXT, "end")) + x -= w + 26 + when = f"released {date}" if final else f"planned {date}" + parts.append(text(M, 114, f"{release} \u00b7 {when} \u00b7 compared to {origin}", 12, 400, HEADER_FAINT)) + top = 156.0 + side_x, side_w = float(M), 300.0 + right_x = side_x + side_w + 20 + right_w = W - M - right_x + + # Body height: the taller of the infrastructure sidebar and the right column + row_h, row_gap, rows_top = 38, 8, 92 + side_h = rows_top + len(infra) * row_h + (len(infra) - 1) * row_gap + 24 + gap, images_h = 16, 128 + comp_rows = component_rows(sw, components, right_w - 48, gap, history, origin) + right_min = 56 + sum(h for _, h in comp_rows) + (len(comp_rows) - 1) * gap + 24 + 20 + images_h + body_h = max(side_h, right_min) + + # Left sidebar along the full body: platform, infrastructure & tooling + parts.append( + section(side_x, top, side_w, body_h, ["Platform, infrastructure", "& tooling"], f"{len(infra)} modules", True) + ) + for i, e in enumerate(infra): + y = top + rows_top + i * (row_h + row_gap) + parts.append(row_card(side_x + 20, y, side_w - 40, row_h, e, history(e)[0])) + + # Integrated software modules: justified rows of tiles with their components + modules_h = body_h - 20 - images_h + parts.append(section(right_x, top, right_w, modules_h, ["Integrated software modules"], f"{len(sw)} modules")) + extra = (body_h - right_min) / len(comp_rows) + y = top + 56 + for tiles, h in comp_rows: + x = right_x + 24 + for e, w, is_new, note, comps in tiles: + parts.append(component_tile(x, y, w, h + extra, e, is_new, note, comps)) + x += w + gap + y += h + extra + gap + + # Target images below the modules + y = top + body_h - images_h + parts.append(section(right_x, y, right_w, images_h, ["Target images"], "dashed: experimental")) + iw = (right_w - 48 - 14 * (len(images) - 1)) / max(len(images), 1) + for i, ((os_name, arch), experimental) in enumerate(images): + x = right_x + 24 + i * (iw + 14) + dash = ' stroke-dasharray="5 4"' if experimental else "" + parts.append( + f'' + ) + label, size = fit(os_name, 14, 700, iw - 16) + parts.append(text(x + iw / 2, y + 73, label, size, 700, NAVY, "middle")) + parts.append(text(x + iw / 2, y + 92, arch, 11, 400, MUTED, "middle", family=MONO)) + y = top + body_h + 20 + + # Legend + x = float(M) + for color, label in ((RELEASED, "released (tag)"), (UNRELEASED, "unreleased (commit pin)")): + parts.append(f'') + parts.append(text(x + 22, y + 14, label, 12, 400, MUTED)) + x += 40 + text_width(label, 12) + parts.append(pill(x + 40, y, "NEW", NEW)) + parts.append(text(x + 48, y + 14, f"new since {origin} ({new_count})", 12, 400, MUTED)) + x += 48 + text_width(f"new since {origin} ({new_count})", 12) + 24 + parts.append(text(x, y + 14, f"was \u2026 = version in {origin}", 12, 400, MUTED, family=FONT)) + parts.append( + text(W - M, y + 14, f"generated from known_good.json @ {ref_label}", 11, 400, FAINT, "end", family=MONO) + ) + y += 36 + + return ( + f'' + f'' + "\n".join(parts) + "" + ) diff --git a/scripts/release_note/collect_changes.py b/scripts/release_note/collect_changes.py new file mode 100644 index 00000000000..bb577817cb8 --- /dev/null +++ b/scripts/release_note/collect_changes.py @@ -0,0 +1,418 @@ +# ******************************************************************************* +# Copyright (c) 2026 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +"""Collect the evidence for the platform-level "Changes to the Platform" chapter. + +Platform-level means: changes of this repository (reference_integration), and +module changes that matter for integrators. The latter come from the modules' own +release notes (their "breaking" and "new features" sections) together with hints +where this repository uses an affected flag, label or target. Detailed per-module +PR lists are only produced on request (``--module-prs``). + +Examples: + python3 scripts/release_note/collect_changes.py --release v0.9.0 --origin v0.8.0 --output changes.md + python3 scripts/release_note/collect_changes.py --release v0.10.0 --origin v0.9.0 --module-prs --module score_logging +""" + +from __future__ import annotations + +import argparse +import json +import os +import re +import subprocess +import urllib.error +import urllib.parse +import urllib.request +from dataclasses import dataclass, field +from pathlib import Path +from typing import Any + +import generate_release_note as grn + +API = "https://api.github.com" + +BOT_AUTHORS = ("[bot]", "dependabot", "renovate", "eclipse-score-bot") +NOISE_TITLE = re.compile(r"^(chore|build|ci)\(deps\)|\bbump\b|update dependency|^update .* to v?\d", re.I) +BREAKING_TITLE = re.compile(r"^\w+(\([^)]*\))?!:|\bbreaking\b", re.I) +FEATURE_TITLE = re.compile(r"^(feat|feature)(\([^)]*\))?:|^add(ed)?\b|^introduce|^implement|^support", re.I) +CLOSES = re.compile(r"\b(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?)\s+#(\d+)", re.I) +RELEASE_NOTES_DIR = "docs/s_core_v_1/releases/" + + +def api(path: str, params: dict[str, Any] | None = None) -> Any: + url = f"{API}{path}" + (f"?{urllib.parse.urlencode(params)}" if params else "") + request = urllib.request.Request(url, headers={"Accept": "application/vnd.github+json"}) + if token := os.environ.get("GITHUB_TOKEN") or os.environ.get("GITHUB_PAT"): + request.add_header("Authorization", f"Bearer {token}") + with urllib.request.urlopen(request, timeout=60) as response: + return json.load(response) + + +def paged(path: str, params: dict[str, Any] | None = None, key: str | None = None) -> list[Any]: + items: list[Any] = [] + for page in range(1, 30): + data = api(path, {**(params or {}), "per_page": 100, "page": page}) + batch = data[key] if key else data + items += batch + if len(batch) < 100: + break + return items + + +@dataclass +class Issue: + number: int + title: str + labels: list[str] + url: str + + +@dataclass +class PullRequest: + number: int + title: str + labels: list[str] + author: str + url: str + body: str + issues: list[Issue] = field(default_factory=list) + + @property + def is_noise(self) -> bool: + return any(b in self.author.lower() for b in BOT_AUTHORS) or bool(NOISE_TITLE.search(self.title)) + + @property + def kind(self) -> str: + labels = " ".join(self.labels).lower() + " " + " ".join(l for i in self.issues for l in i.labels).lower() + if "breaking" in labels or BREAKING_TITLE.search(self.title) or "BREAKING CHANGE" in self.body: + return "breaking" + if re.search(r"feature|enhancement|\bfeat\b", labels) or FEATURE_TITLE.search(self.title): + return "feature" + return "other" + + +def repo_slug(repo_url: str) -> str: + return repo_url.removeprefix("https://github.com/") + + +def ref_date(slug: str, ref: str) -> str: + return api(f"/repos/{slug}/commits/{ref}")["commit"]["committer"]["date"] + + +def merged_pulls(slug: str, start: str, end: str) -> list[dict]: + """Closed PRs merged in [start, end]; sorted by update time so paging stops once PRs predate the window.""" + found: list[dict] = [] + for page in range(1, 60): + batch = api( + f"/repos/{slug}/pulls", + {"state": "closed", "sort": "updated", "direction": "desc", "per_page": 100, "page": page}, + ) + found += [p for p in batch if p.get("merged_at") and start <= p["merged_at"] <= end] + if len(batch) < 100 or batch[-1]["updated_at"] < start: + break + return found + + +def load_issue(slug: str, number: int) -> Issue | None: + try: + data = api(f"/repos/{slug}/issues/{number}") + except urllib.error.HTTPError: + return None + return Issue(number, data["title"], [l["name"] for l in data["labels"]], data["html_url"]) + + +def collect_prs(slug: str, base: str, head: str) -> list[PullRequest]: + prs = [] + for data in sorted(merged_pulls(slug, ref_date(slug, base), ref_date(slug, head)), key=lambda p: p["merged_at"]): + pr = PullRequest( + data["number"], + data["title"], + [l["name"] for l in data["labels"]], + data["user"]["login"], + data["html_url"], + data.get("body") or "", + ) + for issue_number in dict.fromkeys(int(n) for n in CLOSES.findall(pr.body)): + if issue := load_issue(slug, issue_number): + pr.issues.append(issue) + prs.append(pr) + return prs + + +def collect_prs_by_commits(slug: str, base: str, head: str) -> list[PullRequest]: + """PRs of a small repository via the commit range (squash commits end in "(#N)").""" + numbers: dict[int, None] = {} + for commit in paged(f"/repos/{slug}/compare/{base}...{head}", key="commits"): + subject = commit["commit"]["message"].splitlines()[0] + if match := re.search(r"\(#(\d+)\)\s*$", subject): + numbers.setdefault(int(match.group(1))) + prs = [] + for number in numbers: + try: + data = api(f"/repos/{slug}/pulls/{number}") + except urllib.error.HTTPError: + continue + pr = PullRequest( + number, + data["title"], + [l["name"] for l in data["labels"]], + data["user"]["login"], + data["html_url"], + data.get("body") or "", + ) + for issue_number in dict.fromkeys(int(n) for n in CLOSES.findall(pr.body)): + if issue := load_issue(slug, issue_number): + pr.issues.append(issue) + prs.append(pr) + return prs + + +def closed_issues(slug: str, base: str, head: str, linked: set[int]) -> list[Issue]: + start, end = ref_date(slug, base), ref_date(slug, head) + issues = paged(f"/repos/{slug}/issues", {"state": "closed", "since": start}) + return [ + Issue(i["number"], i["title"], [l["name"] for l in i["labels"]], i["html_url"]) + for i in issues + if "pull_request" not in i and start <= i["closed_at"] <= end and i["number"] not in linked + ] + + +def _line(pr: PullRequest, with_body: bool) -> str: + labels = f" [{', '.join(pr.labels)}]" if pr.labels else "" + text = f"- #{pr.number} {pr.title}{labels} ({pr.url})" + for issue in pr.issues: + issue_labels = f" [{', '.join(issue.labels)}]" if issue.labels else "" + text += f"\n - closes #{issue.number} {issue.title}{issue_labels} ({issue.url})" + if with_body and pr.body.strip(): + excerpt = re.sub(r"\s+", " ", re.sub(r"", "", pr.body, flags=re.S)).strip()[:240] + if excerpt: + text += f"\n - body: {excerpt}" + return text + + +def render_module(name: str, slug: str, base: str, head: str, own_repo: bool = False) -> str: + """own_repo: this repository; every PR is listed (version bumps and tooling updates are platform-level here).""" + prs = collect_prs_by_commits(slug, base, head) if own_repo else collect_prs(slug, base, head) + relevant = prs if own_repo else [p for p in prs if not p.is_noise] + out = [ + f"## {name}: {base} -> {head} ({slug}, {len(prs)} merged PRs, {len(prs) - len(relevant)} bot/dependency PRs omitted)", + "", + ] + for kind, title in ( + ("breaking", "Breaking candidates"), + ("feature", "Feature candidates"), + ("other", "Other merged PRs"), + ): + group = [p for p in relevant if p.kind == kind] + out += [f"### {title} ({len(group)})"] + [_line(p, with_body=kind != "other") for p in group] + [""] + linked = {i.number for p in prs for i in p.issues} + extra = closed_issues(slug, base, head, linked) + out += [f"### Closed issues in the release window, not linked to a PR ({len(extra)})"] + out += [ + f"- #{i.number} {i.title}" + (f" [{', '.join(i.labels)}]" if i.labels else "") + f" ({i.url})" for i in extra + ] + return "\n".join(out) + "\n" + + +SECTION_HEADING = re.compile(r"^(#{2,4})\s+(.*?)\s*$", re.M) +WANTED_SECTION = re.compile(r"breaking|deprecat|incompatible|new feature|features", re.I) +IMPACT_PATHS = [ + "known_good.json", + ".bazelrc", + "bazel_common", + "patches", + "images", + "showcases", + "MODULE.bazel", + "feature_integration_tests", + "platform_integration_tests", +] + + +def release_sections(body: str) -> list[tuple[str, str]]: + """(heading, text) of the breaking / new-feature sections of a GitHub release body.""" + marks = list(SECTION_HEADING.finditer(body)) + sections = [] + for i, mark in enumerate(marks): + if WANTED_SECTION.search(mark.group(2)): + end = marks[i + 1].start() if i + 1 < len(marks) else len(body) + sections.append((mark.group(2), body[mark.end() : end].strip())) + return sections + + +def impact_hints(text: str, module_key: str) -> list[str]: + """Lines in this repository that mention an identifier named in backticks and belong to the module.""" + short = module_key.removeprefix("score_") + hints = [] + seen: set[tuple[str, str]] = set() + for token in dict.fromkeys(re.findall(r"`([^`\s]{8,})`", text)): + if not re.search(r"[/:_.-]", token): + continue # plain words like `result` match everywhere + needles = {token, re.split(r"[:/]", token)[-1]} if re.search(r"[:/]", token) else {token} + for needle in (n for n in needles if len(n) >= 8): + result = subprocess.run( + ["git", "grep", "-n", "-F", "-I", needle, "--", *IMPACT_PATHS], + cwd=grn.REPO_ROOT, + capture_output=True, + text=True, + ) + for line in result.stdout.splitlines(): + path = line.split(":", 1)[0] + if ( + short in line.lower() and (needle, path) not in seen + ): # one hint per file, line must concern this module + seen.add((needle, path)) + hints.append(f"`{needle}` is used in {line[:160]}") + return hints[:8] + + +def in_range(slug: str, old_ref: str, tag: str, new_ref: str) -> bool: + """True if the tag commit is after old_ref and contained in new_ref (excludes other maintenance branches).""" + after_old = api(f"/repos/{slug}/compare/{old_ref}...{tag}")["status"] == "ahead" + return after_old and api(f"/repos/{slug}/compare/{tag}...{new_ref}")["status"] in ("ahead", "identical") + + +def render_release_notes(name: str, slug: str, old: grn.Entry, new: grn.Entry) -> str: + start = ref_date(slug, old.ref) + # A release published before the old pin cannot contain later commits; the range itself is decided by the tag commit. + releases = [ + r + for r in paged(f"/repos/{slug}/releases") + if r.get("published_at") + and r["published_at"] > start + and not r["draft"] + and in_range(slug, old.ref, r["tag_name"], new.ref) + ] + out = [f"## {name}: {old.version_label} -> {new.version_label} ({slug}), module release notes", ""] + if not releases: + out += ["No GitHub releases in this range.", ""] + for release in sorted(releases, key=lambda r: r["published_at"]): + out += [f"### {release['tag_name']} ({release['published_at'][:10]}, {release['html_url']})", ""] + sections = release_sections(release.get("body") or "") + if not sections: + out += ["No breaking/new-feature sections found in the release text.", ""] + for heading, text in sections: + out += [f"#### {heading}", text, ""] + if re.search(r"breaking|deprecat|incompatible", heading, re.I): + out += [f"- impact hint: {hint}" for hint in impact_hints(text, new.key)] + [""] + return "\n".join(out) + + +def render_direct_commits(base: str, head: str) -> str: + """Commits of this repository without a PR, e.g. pushed directly to the release candidate branch.""" + log = grn._git("log", "--no-merges", "--reverse", "--format=%H%x09%s", f"{base}..{head}") + out = [] + for sha, subject in (line.split("\t", 1) for line in log.splitlines()): + if re.search(r"\(#\d+\)\s*$", subject): + continue # squash-merged PR, listed above + files = grn._git("diff-tree", "--no-commit-id", "--name-only", "-r", sha).split() + if all(f.startswith(RELEASE_NOTES_DIR) for f in files): + continue # the release note itself + shown = ", ".join(files[:10]) + (f" (+{len(files) - 10} more)" if len(files) > 10 else "") + url = f"https://github.com/eclipse-score/{grn.RELEASE_REPO}/commit/{sha}" + out.append(f"- {sha[:10]} {subject} ({url})\n - files: {shown}") + heading = f"## Reference integration: commits without PR {base} -> {head[:10]} ({len(out)})" + return "\n".join([heading, "", *out] if out else [heading, "", "None."]) + "\n" + + +def render_removed_files(base: str, head: str) -> str: + """Files of this repository deleted or renamed between the two refs, per directory (breaking candidates).""" + result = subprocess.run( + ["git", "diff", "--name-status", "-M", "--diff-filter=DR", base, head, "--", ".", ":!docs", ":!patches"], + cwd=grn.REPO_ROOT, + capture_output=True, + text=True, + check=True, + ) + groups: dict[str, int] = {} + for parts in (line.split("\t") for line in result.stdout.splitlines()): + old_dir = os.path.dirname(parts[1]) or "." + label = ( + f"renamed {old_dir} -> {os.path.dirname(parts[2]) or '.'}" + if parts[0].startswith("R") + else f"removed from {old_dir}" + ) + if parts[0].startswith("R") and label.endswith(f"-> {old_dir}"): + label = f"renamed within {old_dir}" + groups[label] = groups.get(label, 0) + 1 + out = [f"## Reference integration: removed or renamed files {base} -> {head} (without docs/ and patches/)", ""] + out += [f"- {label} ({count} files)" for label, count in groups.items()] or ["None."] + return "\n".join(out) + "\n" + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + parser.add_argument("--release", required=True) + parser.add_argument("--origin", required=True) + parser.add_argument( + "--module", action="append", help="Restrict module sections to these known_good keys (repeatable)" + ) + parser.add_argument( + "--module-prs", + action="store_true", + help="Also list the merged PRs of each changed module (slow, large modules have hundreds)", + ) + parser.add_argument("--include-infra", action="store_true", help="Also cover the Associated Infrastructure Modules") + parser.add_argument( + "--known-good-ref", + help="Git ref for known_good.json and the evidence of this repository (default: release tag if it exists, else HEAD; must be pushed)", + ) + parser.add_argument("--output", type=Path) + args = parser.parse_args() + + ref = args.known_good_ref or (args.release if grn._tag_exists(args.release) else "HEAD") + current = {e.key: (g, e) for g, es in grn.collect(grn.load_known_good(ref)).items() for e in es} + previous = {e.key: e for es in grn.collect(grn.load_known_good(args.origin)).values() for e in es} + + sections = [] + ref_slug = f"eclipse-score/{grn.RELEASE_REPO}" + # One commit for all evidence of this repository, the same one known_good.json is read from. + head = grn._git("rev-parse", f"{ref}^{{commit}}").strip() + sections.append(render_module("Reference integration", ref_slug, args.origin, head, own_repo=True)) + sections.append(render_direct_commits(args.origin, head)) + sections.append(render_removed_files(args.origin, head)) + + renamed_from = {new: old for old, new in grn.KEY_ALIASES.items()} + for key, (group, entry) in current.items(): + if args.module and key not in args.module: + continue + if group == "tooling" and not args.include_infra: + continue + old = previous.get(key) or previous.get(renamed_from.get(key, "")) + slug = repo_slug(entry.repo_url) + if old is None: + sections.append(f"## {entry.name}: newly integrated at {entry.version_label} ({slug})\n") + continue + if old.key != key: + sections.append(f"## {entry.name}: RENAMED from `{old.key}` to `{key}` (breaking for integrators)\n") + if old.pin != entry.pin: + sections.append(render_release_notes(entry.name, slug, old, entry)) + if args.module_prs: + sections.append(render_module(entry.name, slug, old.ref, entry.ref)) + for key, old in previous.items(): + if ( + key not in current + and not (key in grn.KEY_ALIASES and grn.KEY_ALIASES[key] in current) + and (not args.module or key in args.module) + ): + sections.append(f"## {old.name}: removed from the platform (was {old.version_label})\n") + + text = "\n".join(sections) + if args.output: + args.output.write_text(text) + else: + print(text) + + +if __name__ == "__main__": + main() diff --git a/scripts/release_note/generate_release_note.py b/scripts/release_note/generate_release_note.py new file mode 100644 index 00000000000..b8341d5035f --- /dev/null +++ b/scripts/release_note/generate_release_note.py @@ -0,0 +1,587 @@ +# ******************************************************************************* +# Copyright (c) 2026 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +"""Generate the deterministic skeleton of an S-CORE platform release note. + +Everything that can be derived from ``known_good.json`` (platform scope and the +module tables) is rendered here. Narrative sections are emitted as +``.. AI-FILL: ...`` comments that the release-note agent replaces. + +Examples: + # Skeleton for an already tagged release (known_good.json is read from the tag) + python3 scripts/release_note/generate_release_note.py --release v0.8.0 --origin v0.7.0 + + # Skeleton for an upcoming release, run on its release candidate branch (known_good.json of the checkout) + python3 scripts/release_note/generate_release_note.py --release v0.10.0 --origin v0.9.0 + + # Module version changes between the two releases + python3 scripts/release_note/generate_release_note.py --release v0.8.0 --origin v0.7.0 --changes + +The release date is the due date of the milestone ``v.`` in the +eclipse-score/score repository. + +The skeleton embeds an architecture diagram that is rendered from scratch on every +run (``architecture_diagram.py``) to ``docs/s_core_v_1/releases/_assets/architecture_v_.svg``. +Its components come from the needs.json of the checkout, built with ``bazel build //:needs_json_file``. +""" + +from __future__ import annotations + +import argparse +import json +import os +import re +import subprocess +import sys +import urllib.request +from dataclasses import dataclass +from pathlib import Path + +REPO_ROOT = Path(__file__).resolve().parents[2] +ORG_URL = "https://github.com/eclipse-score" +RELEASE_REPO = "reference_integration" +# Repository whose milestones v. carry the planned platform release dates. +MILESTONE_REPO = "score" + +# known_good.json group -> section title; score_platform is moved from "tooling" to "target_sw". +PLATFORM_MODULE = "score_platform" +SECTIONS = { + "target_sw": "Integrated Software Modules", + "tooling": "Associated Infrastructure Modules", +} + +# Module verification reports are linked from the current docs tree (same convention as the platform report). +VERIFICATION_INDEX = "docs/verification_report/modules/index.rst" +EMPTY_CELL = "---" +# Architecture diagram of the note; components come from the Sphinx-Needs of the checkout's docs. +DIAGRAM_DIR = "docs/s_core_v_1/releases/_assets" +NEEDS_TARGET = "//:needs_json_file" +# Old module names in earlier known_good.json versions -> current name used in the docs tree. +KEY_ALIASES = {"score_lifecycle_health": "score_lifecycle", "score_process": "score_process_description"} + +# (name, images/, description, how-to candidates [(path, heading or None)] tried in order) +IMAGES = [ + ( + "Reference Linux x86_64 image", + "linux_x86_64", + "Linux x86_64 Docker image bundling the S-CORE showcases.", + [("README.md", "Run showcases"), ("README.md", "Operating system integrations")], + ), + ( + "Reference QNX x86_64 image", + "qnx_x86_64", + "QNX x86_64 image, run in QEMU.", + [("runners/qemu_x86_64/README.md", None)], + ), + ( + "Reference QNX aarch64 image", + "qnx_aarch64", + "QNX 8.0 aarch64 image, run in QEMU or on Raspberry Pi 4/5.", + [("README.md", "Build and deploy showcases on Raspberry Pi (QNX aarch64)")], + ), + ( + "Reference Red Hat AutoSD Linux image (Experimental)", + "autosd", + "Red Hat AutoSD x86_64 image.", + [("README.md", "Operating system integrations")], + ), + ( + "Reference Elektrobit corbos Linux for Safety Applications image (Experimental)", + "ebclfsa_aarch64", + "Elektrobit corbos Linux for Safety Applications (aarch64) image.", + [("images/ebclfsa_aarch64/README.md", None)], + ), +] + +DISPLAY_NAMES = { + "score_baselibs": "Baselibs", + "score_baselibs_rust": "Baselibs Rust", + "score_communication": "Communication", + "score_persistency": "Persistency", + "score_logging": "Logging", + "score_time": "Time", + "score_config_management": "Configuration Management", + "score_orchestrator": "Orchestrator", + "score_kyron": "Kyron", + "score_lifecycle": "Lifecycle", + "score_lifecycle_health": "Lifecycle & Health Management", + "score_process": "Process description", + "score_process_description": "Process description", + "score_docs_as_code": "Docs-as-code", + "score_tooling": "Tooling", + "score_tools": "Tools", + "score_platform": "Platform", + "score_itf": "ITF (Integration Testing Framework)", + "score_test_scenarios": "Test Scenarios", + "score_crates": "Crates", + "score_bazel_cpp_toolchains": "Bazel CPP Toolchain", + "score_bazel_platforms": "Bazel Platforms", +} + + +@dataclass +class Entry: + key: str + name: str + repo_url: str + tag: str | None # release tag the pin resolves to, None if unreleased + ref: str # tag or commit used for the source link + pin: str # version or hash as written in known_good.json + verification_doc: str | None = None # absolute Sphinx doc path of the module verification report + + @property + def source_url(self) -> str: + return f"{self.repo_url}/tree/{self.ref}" + + @property + def release_notes_url(self) -> str | None: + return f"{self.repo_url}/releases/tag/{self.tag}" if self.tag else None + + @property + def version_label(self) -> str: + return self.tag if self.tag else f"{self.pin[:7]} (unreleased)" + + +def _git(*args: str) -> str: + return subprocess.run(["git", *args], cwd=REPO_ROOT, check=True, capture_output=True, text=True).stdout + + +def _tag_exists(tag: str) -> bool: + cmd = ["git", "rev-parse", "-q", "--verify", f"refs/tags/{tag}"] + return subprocess.run(cmd, cwd=REPO_ROOT, stdout=subprocess.DEVNULL).returncode == 0 + + +def load_known_good(ref: str | None) -> dict: + text = _git("show", f"{ref}:known_good.json") if ref else (REPO_ROOT / "known_good.json").read_text() + return json.loads(text) + + +def remote_tags(repo: str, cache: dict[str, dict[str, str]]) -> dict[str, str]: + """Map tag name -> commit sha (peeled for annotated tags).""" + if repo not in cache: + out = subprocess.run( + ["git", "ls-remote", "--tags", repo], check=True, capture_output=True, text=True, timeout=60 + ).stdout + tags: dict[str, str] = {} + for line in out.splitlines(): + sha, ref = line.split("\t") + name = ref.removeprefix("refs/tags/") + if name.endswith("^{}"): + tags[name[:-3]] = sha + else: + tags.setdefault(name, sha) + cache[repo] = tags + return cache[repo] + + +def _version_key(tag: str) -> tuple[int, ...]: + return tuple(int(p) for p in re.findall(r"\d+", tag)) + + +def resolve(key: str, module: dict, cache: dict[str, dict[str, str]]) -> Entry: + repo = module["repo"] + repo_url = repo.removesuffix(".git") + tags = remote_tags(repo, cache) + name = DISPLAY_NAMES.get(key) or key.removeprefix("score_").replace("_", " ").title() + + version = module.get("version") + if version: + tag = next((c for c in (f"v{version}", version) if c in tags), None) + if tag is None: + print(f"warning: {key}: no tag for version {version} in {repo}", file=sys.stderr) + tag = f"v{version}" + return Entry(key, name, repo_url, tag, tag, version) + + commit = module["hash"] + matches = sorted((t for t, c in tags.items() if c == commit), key=_version_key) + tag = matches[-1] if matches else None + return Entry(key, name, repo_url, tag, tag or commit, commit) + + +def verification_docs() -> dict[str, str]: + """Map module key -> Sphinx doc path, parsed from the module verification report index.""" + text = (REPO_ROOT / VERIFICATION_INDEX).read_text() + return {m.group(2): m.group(1) for m in re.finditer(r":doc:`[^`<]*<(/modules/(\w+)/[^>\s]+)>`", text)} + + +def collect(known_good: dict) -> dict[str, list[Entry]]: + cache: dict[str, dict[str, str]] = {} + reports = verification_docs() + result: dict[str, list[Entry]] = {} + for group, modules in known_good["modules"].items(): + if group not in SECTIONS: + raise SystemExit(f"error: unknown known_good group '{group}', extend SECTIONS") + result[group] = [resolve(k, m, cache) for k, m in modules.items() if m.get("enabled", True)] + for entries in result.values(): + for e in entries: + e.verification_doc = reports.get(KEY_ALIASES.get(e.key, e.key)) + + platform = next((e for e in result.get("tooling", []) if e.key == PLATFORM_MODULE), None) + if platform: + result["tooling"].remove(platform) + result.setdefault("target_sw", []).insert(0, platform) + return result + + +def render_table(entries: list[Entry], with_verification: bool = False) -> str: + widths = "25 15 25 35" if with_verification else "30 25 45" + rows = [ + "", + ".. list-table::", + " :header-rows: 1", + f" :widths: {widths}", + "", + " * - Name", + " - Version", + " - Release notes", + ] + if with_verification: + rows.append(" - Module verification report") + for e in entries: + notes = f"`Release notes <{e.release_notes_url}>`__" if e.release_notes_url else EMPTY_CELL + rows += [ + f" * - `{e.name} <{e.source_url}>`__", + f" - ``{e.version_label}``", + f" - {notes}", + ] + if with_verification: + rows.append( + f" - :doc:`Verification report <{e.verification_doc}>`" + if e.verification_doc + else f" - {EMPTY_CELL}" + ) + return "\n".join(rows) + + +def _exists(ref: str | None, path: str) -> bool: + if ref is None: + return (REPO_ROOT / path).exists() + return ( + subprocess.run(["git", "cat-file", "-e", f"{ref}:{path}"], cwd=REPO_ROOT, capture_output=True).returncode == 0 + ) + + +def _anchors(ref: str | None, path: str) -> set[str]: + text = _git("show", f"{ref}:{path}") if ref else (REPO_ROOT / path).read_text() + anchors = set() + for line in text.splitlines(): + if line.startswith("#"): + slug = re.sub(r"[^\w\- ]", "", line.lstrip("# ").strip().lower()) + anchors.add(slug.replace(" ", "-")) + return anchors + + +def _howto(ref: str | None, release: str, candidates: list[tuple[str, str | None]]) -> str | None: + for path, heading in candidates: + if not _exists(ref, path): + continue + base = f"{ORG_URL}/{RELEASE_REPO}/blob/{release}/{path}" + if heading is None: + return base + slug = re.sub(r"[^\w\- ]", "", heading.lower()).replace(" ", "-") + if slug in _anchors(ref, path): + return f"{base}#{slug}" + return None + + +def _github_get(path: str) -> object: + request = urllib.request.Request(f"https://api.github.com{path}", headers={"Accept": "application/vnd.github+json"}) + if token := os.environ.get("GITHUB_TOKEN") or os.environ.get("GITHUB_PAT"): + request.add_header("Authorization", f"Bearer {token}") + with urllib.request.urlopen(request, timeout=30) as response: + return json.load(response) + + +def milestone_date(release: str) -> str: + """Due date of the milestone v. in the S-CORE repository, e.g. v0.10.0 -> milestone v0.10.""" + title = "v" + ".".join(release.removeprefix("v").split(".")[:2]) + milestones = _github_get(f"/repos/eclipse-score/{MILESTONE_REPO}/milestones?state=all&per_page=100") + due = next((m["due_on"] for m in milestones if m["title"] == title and m["due_on"]), None) + if due is None: + print(f"warning: no milestone {title} with a due date in eclipse-score/{MILESTONE_REPO}", file=sys.stderr) + return "TBD" + return due[:10] + + +def release_assets(release: str) -> list[dict]: + try: + return _github_get(f"/repos/eclipse-score/{RELEASE_REPO}/releases/tags/{release}").get("assets", []) + except OSError: + return [] # release not published yet + + +def render_images(release: str, ref: str | None) -> str: + assets = release_assets(release) + rows = [ + "", + ".. list-table::", + " :header-rows: 1", + " :widths: 30 15 15 40", + "", + " * - Name", + " - Tarball", + " - How-to", + " - Description", + ] + for name, directory, description, candidates in IMAGES: + if not _exists(ref, f"images/{directory}"): + continue + asset = next((a for a in assets if directory in a["name"]), None) + howto = _howto(ref, release, candidates) + rows += [ + f" * - {name}", + f" - `{asset['name']} <{asset['browser_download_url']}>`__" if asset else f" - {EMPTY_CELL}", + f" - `How-to <{howto}>`__" if howto else f" - {EMPTY_CELL}", + f" - {description}", + ] + return "\n".join(rows) + + +# Chapter icons; emoji are double-width, so the underline gets extra length. +ICONS = { + "Overview": "📋", + "Disclaimer": "📜", + "Changes to the Platform": "🔄", + "New Features": "✨", + "Breaking Changes": "💥", + "Reference Integration scope": "🎯", + "Integrated Software Modules": "🧩", + "Associated Infrastructure Modules": "🔧", + "Images": "💿", + "Known Issues/Vulnerabilities and Bug Fixes": "🐞", + "Upgrade Instructions": "🚀", + "Contact Information": "📧", +} + + +def _heading(text: str, char: str) -> str: + icon = ICONS.get(text) + if icon: + text = f"{icon} {text}" + return f"{text}\n{char * (len(text) + 2)}" + + +def status_banner(release: str, date: str, status: str) -> str: + if status == "draft": + return f""" +.. warning:: + + **DRAFT - release in progress.** {release} is not released yet (planned for + {date}). This note shows the current state of the integration and changes + until the release is published. +""" + return f""" +.. note:: + + **FINAL.** This is the release note of release + `{release} <{ORG_URL}/{RELEASE_REPO}/releases/tag/{release}>`__ ({date}). +""" + + +def diagram_name(release: str) -> str: + return "architecture_v" + "_".join(release.removeprefix("v").split(".")[:2]) + ".svg" + + +def render(release: str, origin: str, date: str, status: str, groups: dict[str, list[Entry]], ref: str | None) -> str: + short = ".".join(release.removeprefix("v").split(".")[:2]) + doc_id = "v" + short.replace(".", "") + title = f"S-CORE Platform v{short} release note" + (" (DRAFT)" if status == "draft" else "") + release_url = f"{ORG_URL}/{RELEASE_REPO}" + + header = """.. + # ******************************************************************************* + # Copyright (c) 2026 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* +""" + parts = [ + header, + _heading(title, "="), + status_banner(release, date, status), + f""" +.. document:: S-CORE v{short} release note + :id: doc__score_{doc_id}_release_note + :status: {status} + :safety: QM + :security: YES + :realizes: wp__platform_sw_release_note + :version: 1 + +| **Platform Name:** S-CORE +| **Release Tag:** {release} +| **Origin Release Tag:** {origin} +| **Release Date:** {date} + +""", + _heading("Overview", "^"), + f""" +This document provides an overview of the changes, improvements, and bug fixes +included in the software platform release version {release} as compared to the +previous platform release ({origin}). + +.. figure:: /{DIAGRAM_DIR.removeprefix("docs/")}/{diagram_name(release)} + :width: 100% + :alt: S-CORE v{short} reference integration architecture + + Modules, components and images of the reference integration {release}. + +""", + _heading("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 project, being a non-profit and open +source organization, can not take over any liability for its content. + +""", + _heading("Changes to the Platform", "^"), + "\n" + _heading("New Features", "-"), + "\n.. AI-FILL: New Features - platform-level only (see skill): one subsection (~~~) per item, each with links to PR, issue or module release note.\n", + _heading("Breaking Changes", "-"), + "\n.. AI-FILL: Breaking Changes - only changes with impact on integrators (see skill), with migration hint; remove the chapter if none.\n", + _heading("Reference Integration scope", "^"), + f""" +- **Version:** ``{release}`` +- **Source / tag:** `Reference integration <{release_url}/tree/{release}>`__ +- **Release notes:** `Reference integration release notes <{release_url}/releases/tag/{release}>`__ +- **Platform Verification Report:** :need:`doc__platform_verification_report_latest` + +""", + ] + + for group, title_text in SECTIONS.items(): + parts += [_heading(title_text, "-"), render_table(groups[group], with_verification=group == "target_sw") + "\n"] + parts += [_heading("Images", "-"), render_images(release, ref) + "\n"] + + unreleased = any(e.tag is None for entries in groups.values() for e in entries) + unreleased_hint = ( + "\n- Modules shown as *(unreleased)* are pinned to a commit and have no registry version; " + "use the commit from ``known_good.json``." + if unreleased + else "" + ) + + parts += [ + _heading("Known Issues/Vulnerabilities and Bug Fixes", "-"), + "\n- See the release notes of the individual modules.\n", + _heading("Upgrade Instructions", "-"), + f""" +- Increase to the newest Bazel registry versions: https://eclipse-score.github.io/bazel_registry_ui{unreleased_hint} +- The module versions of this release are listed in `known_good.json <{release_url}/blob/{release}/known_good.json>`__. + +""", + _heading("Contact Information", "-"), + """ +For any questions or support, please contact the *Project leads* or raise an issue/discussion. +https://projects.eclipse.org/projects/automotive.score +""", + ] + return "\n".join(parts) + + +def render_changes(origin: dict[str, list[Entry]], current: dict[str, list[Entry]]) -> str: + old = {KEY_ALIASES.get(e.key, e.key): e for entries in origin.values() for e in entries} + new = {KEY_ALIASES.get(e.key, e.key): e for entries in current.values() for e in entries} + lines = ["| Module | Previous | Current |", "|---|---|---|"] + for key in sorted(old.keys() | new.keys()): + o, n = old.get(key), new.get(key) + renamed = f" **renamed from `{o.key}`**" if o and n and o.key != n.key else "" + if o and n and o.pin == n.pin and not renamed: + continue + lines.append( + f"| {(n or o).name} (`{key}`){renamed} | {o.version_label if o else 'new'} | {n.version_label if n else 'removed'} |" + ) + return "\n".join(lines) + + +def build_needs() -> Path: + """needs.json of the checked-out docs; Bazel rebuilds it only when the docs inputs changed.""" + print(f"building {NEEDS_TARGET} ...", file=sys.stderr) + subprocess.run(["bazel", "build", NEEDS_TARGET], cwd=REPO_ROOT, check=True, stdout=sys.stderr) + return REPO_ROOT / "bazel-bin" / "needs.json" + + +def write_diagram(args: argparse.Namespace, date: str, groups: dict[str, list[Entry]], ref: str | None) -> None: + import architecture_diagram + + software = [e for e in groups["target_sw"] if e.key != PLATFORM_MODULE] + components = architecture_diagram.load_components(args.needs or build_needs(), software) + label = _git("rev-parse", "--short", f"{ref or 'HEAD'}^{{commit}}").strip() + svg = architecture_diagram.render( + args.release, + args.origin, + date, + args.final, + groups, + collect(load_known_good(args.origin)), + ref, + label, + components, + ) + path = REPO_ROOT / DIAGRAM_DIR / diagram_name(args.release) + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(svg + "\n") + print(f"wrote {path.relative_to(REPO_ROOT)}", file=sys.stderr) + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + parser.add_argument("--release", required=True, help="Release tag, e.g. v0.10.0") + parser.add_argument("--origin", required=True, help="Previous release tag, e.g. v0.9.0") + parser.add_argument( + "--known-good-ref", + help="Git ref to read known_good.json from (default: release tag if it exists, else working tree)", + ) + parser.add_argument( + "--date", + help="Override the release date YYYY-MM-DD (default: due date of the milestone in eclipse-score/score)", + ) + # The note is part of the release and is finalised before the tag exists, so the state cannot be derived. + parser.add_argument("--final", action="store_true", help="Final release note (default: draft)") + parser.add_argument("--changes", action="store_true", help="Print module version changes instead of the skeleton") + parser.add_argument("--output", type=Path, help="Write to file instead of stdout") + parser.add_argument( + "--needs", + type=Path, + help=f"needs.json for the components of the architecture diagram (default: bazel build {NEEDS_TARGET})", + ) + args = parser.parse_args() + + ref = args.known_good_ref or (args.release if _tag_exists(args.release) else None) + groups = collect(load_known_good(ref)) + + if args.changes: + text = render_changes(collect(load_known_good(args.origin)), groups) + else: + date = args.date or milestone_date(args.release) + status = "valid" if args.final else "draft" + text = render(args.release, args.origin, date, status, groups, ref) + write_diagram(args, date, groups, ref) + + if args.output: + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(text + "\n") + else: + print(text) + + +if __name__ == "__main__": + main() From 54621439e306123da18de841ce8da9e559b9b482 Mon Sep 17 00:00:00 2001 From: Anton Krivoborodov <63401640+antonkri@users.noreply.github.com> Date: Thu, 29 Oct 2026 11:13:43 +0100 Subject: [PATCH 05/31] Replace Overall Status with a Release-wide Progress Overview next to the release notes (#392) * Reduce Overall Status to per-module stacked progress charts The Overall Status page predated the Platform and Module Verification Reports and duplicated them: five large per-PA module tables, needpie process-status rows and rollout bars, all maintained by hand through a seven-file agent skill. Those reports are now the authoritative source for per-module status, so the page is cut down to the one thing they do not provide: progress across releases. What the page keeps is the four release-over-release charts (requirements, architecture, implementation, verification). Each bar is now stacked by module instead of a single aggregate block, so the composition of a release is visible at a glance, and a v0.10 (forecast) column shows the current state of the pinned modules. The section labels overall_status_pa2..pa5 are preserved because pi1/pi2/pi3.rst link to them. The data is no longer hand-maintained. scripts/overall_status/ collect_metrics.py walks the reference_integration release tags, reads each tag's known_good.json, resolves the module pins and counts requirements, architecture elements, lines of code and test definitions directly from the module sources into overall_status_data.json. generate_progress_charts.py renders the SVGs from that file and offers --check so CI can detect stale charts. Recounting every release from source changes previously published figures. Three reasons, all corrections: TRLC requirements were not parsed before (Communication and Config Management were badly undercounted), test counts were CI executions rather than test definitions, and lines of code were estimated from file sizes instead of counted. The page states that the numbers are source-derived and will not match CI dashboards. The skill collapses from seven files to one and the agent is rewritten around the two scripts. * Split verification chart into unit and integration tests The combined "tests per release" chart mixed two very different things: unit tests, which number in the thousands and are dominated by Baselibs and Communication, and component/feature integration tests, which number in the hundreds. The integration tests were invisible as a sliver at the top of the bar. collect_metrics.py now buckets a test definition by its path: anything under a directory named component, integration, integration_test(s), integration_testing or itf counts as an integration test, everything else as a unit test. Rendered as pa5_unit_test_progress.svg and pa5_integration_test_progress.svg; the combined pa5_verification_progress.svg is removed. The integration count also includes reference_integration's own feature tests under feature_integration_tests/ and platform_integration_tests/, attributed to the module under test via the path segment below them (RI_ALIASES). Without them Persistency would read as zero integration tests while actually having the most. reference_integration is measured from this checkout rather than a clone, and only its test count is taken - its lines of code stay out of the implementation chart, which counts module sources. Two presentation fixes: the slots within a bar are now ordered by size with the largest at the bottom, and MODULE_COLORS is documented as the single colour source shared by every chart, so a module is recognisable by the same colour throughout the page. * Move Overall Status to the releases as Release-wide Progress Overview The roadmap page overall_status.rst is replaced by docs/s_core_v_1/releases/progress_overview.rst, listed first in the releases toctree before the release notes. Data file, scripts (scripts/progress_overview), skill and agent (progress-overview) and the chart labels are renamed accordingly; the roadmap, PI pages, integration process docs and the v0.8 note link to it. collect_metrics.py orders the release tags by version (v0.10.0 after v0.9.0) and names the forecast column after the next release milestone of eclipse-score/score instead of a hard-coded label. Removes CSS for the old status tables that is no longer used. * Refresh the release-wide progress overview data (2026-10-29) Recollected all columns with collect_metrics.py on the branch merged with latest main and regenerated the charts. The release columns are unchanged; the v0.10 forecast column moves from 289 to 292 integration tests. (cherry picked from commit 75f2b3c26db14df83d2b472f55a494e6a441e8d7) --- .github/agents/overall-status.agent.md | 109 -- .github/agents/progress-overview.agent.md | 59 + .github/skills/overall-status/SKILL.md | 65 - .../overall-status/references/common.md | 917 ------------- .../references/pa1-change-management.md | 202 --- .../references/pa2-requirements.md | 76 -- .../references/pa3-architecture.md | 76 -- .../references/pa4-implementation.md | 85 -- .../references/pa5-verification.md | 217 --- .github/skills/progress-overview/SKILL.md | 107 ++ docs/_assets/custom.css | 90 +- docs/_assets/pa2_impl_progress.svg | 230 ++-- docs/_assets/pa3_arch_progress.svg | 199 +-- docs/_assets/pa4_impl_progress.svg | 202 ++- .../_assets/pa5_integration_test_progress.svg | 108 ++ docs/_assets/pa5_unit_test_progress.svg | 137 ++ docs/_assets/pa5_verification_progress.svg | 152 --- docs/conf.py | 2 +- docs/integration_process/reference.rst | 6 +- docs/integration_process/step_7_reporting.rst | 14 +- .../s_core_v_1/releases/progress_overview.rst | 104 ++ .../releases/progress_overview_data.json | 569 ++++++++ .../releases/release_note_score_v0_8.rst | 2 +- docs/s_core_v_1/releases/releases.rst | 7 +- docs/s_core_v_1/roadmap/overall_status.rst | 1159 ----------------- docs/s_core_v_1/roadmap/pi1.rst | 19 +- docs/s_core_v_1/roadmap/pi2.rst | 6 +- docs/s_core_v_1/roadmap/pi3.rst | 4 +- docs/s_core_v_1/roadmap/planning_approach.rst | 2 +- docs/s_core_v_1/roadmap/roadmap.rst | 1 - scripts/progress_overview/collect_metrics.py | 461 +++++++ .../generate_progress_charts.py | 171 +++ 32 files changed, 2165 insertions(+), 3393 deletions(-) delete mode 100644 .github/agents/overall-status.agent.md create mode 100644 .github/agents/progress-overview.agent.md delete mode 100644 .github/skills/overall-status/SKILL.md delete mode 100644 .github/skills/overall-status/references/common.md delete mode 100644 .github/skills/overall-status/references/pa1-change-management.md delete mode 100644 .github/skills/overall-status/references/pa2-requirements.md delete mode 100644 .github/skills/overall-status/references/pa3-architecture.md delete mode 100644 .github/skills/overall-status/references/pa4-implementation.md delete mode 100644 .github/skills/overall-status/references/pa5-verification.md create mode 100644 .github/skills/progress-overview/SKILL.md create mode 100644 docs/_assets/pa5_integration_test_progress.svg create mode 100644 docs/_assets/pa5_unit_test_progress.svg delete mode 100644 docs/_assets/pa5_verification_progress.svg create mode 100644 docs/s_core_v_1/releases/progress_overview.rst create mode 100644 docs/s_core_v_1/releases/progress_overview_data.json delete mode 100644 docs/s_core_v_1/roadmap/overall_status.rst create mode 100644 scripts/progress_overview/collect_metrics.py create mode 100644 scripts/progress_overview/generate_progress_charts.py diff --git a/.github/agents/overall-status.agent.md b/.github/agents/overall-status.agent.md deleted file mode 100644 index 8b21532269c..00000000000 --- a/.github/agents/overall-status.agent.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -description: "Main actor that updates or regenerates the Feature and Process Status table in docs/s_core_v_1/roadmap/overall_status.rst. Use when: refreshing the overall status / feature status tracker, regenerating the table after a known_good.json ref bump, adding a module row, or updating the per-PA progress charts. Derives completion status from eclipse-score GitHub repos (Baselibs, Communication, Logging, Persistency, Time, Config Management, Lifecycle, Security/Crypto, Some/IP)." -name: Overall Status -argument-hint: "optional: module name or 'all'" -tools: [read, edit, search, execute, todo] -model: "Claude Opus 4.8 (copilot)" -user-invocable: true ---- - -You are the **Overall Status** maintainer. Your single job is to update or -regenerate the Feature and Process Status table in -`docs/s_core_v_1/roadmap/overall_status.rst` so it faithfully reflects the -live state of the pinned `eclipse-score` repositories. - -> **Preferred model.** This agent is best run with **Claude Opus 4.8** — the -> multi-repo counting, plausibility gating and RST/SVG editing benefit from -> its stronger long-context reasoning. The `model` field in the frontmatter -> expresses this preference; if Opus 4.8 is unavailable, any capable model -> may be used as a fallback. - -You **orchestrate**; the **"how" lives in the `overall-status` skill**. Read -the relevant skill file at each phase and follow it exactly — do not invent -counting rules, path filters or formatting from memory. - -## Skill map (read these — do not duplicate their content here) - -- Shared engine: `.github/skills/overall-status/references/common.md` -- PA1 Change Management: `.github/skills/overall-status/references/pa1-change-management.md` -- PA2 Requirements: `.github/skills/overall-status/references/pa2-requirements.md` -- PA3 Architecture: `.github/skills/overall-status/references/pa3-architecture.md` -- PA4 Implementation: `.github/skills/overall-status/references/pa4-implementation.md` -- PA5 Verification: `.github/skills/overall-status/references/pa5-verification.md` -- Index / overview: `.github/skills/overall-status/SKILL.md` - -## Constraints - -- DO NOT add a row for **Orchestrator** — it is never tracked. -- DO NOT drop a module or change a column that already exists (the sanity - check in Common Step 5a must pass). -- DO NOT use `blob/main` URLs for repos pinned in `known_good.json` — counts - come from the pinned 40-char SHA, so links must point at the same SHA. -- DO NOT downgrade a curated cell on a hunch — follow the plausibility gate - (Common Step 5b): `✅`/`🔄` → `❌` is almost always a filter bug, stop and - investigate. -- DO NOT count `aou_req` toward Feature Req, and never double-count - Communication vs. Some/IP (`'some_ip_gateway' not in p` guard). -- DO NOT leave a stale **data collection date** — always bump it. -- ONLY edit `overall_status.rst` and the per-PA SVGs under `docs/_assets/`; - the pie-chart rows and `Process Status` rubrics stay unchanged unless the - sphinx-needs tag changes. - -## Workflow - -Maintain a todo list. Run the **Common** setup once, then one phase per -Process Area, then validate and write. - -### Phase 0 — Common setup - -Read `references/common.md`. Execute: -1. **Step 0** — resolve pinned refs from `known_good.json` - (`score_platform` lives in `tooling`, everything else in `target_sw`). -2. **Step 1** — fetch the recursive git tree for every repo at its pinned ref. -3. Load the counting helpers (Steps 2–3) and the formatting rules (C4). - -Scope the run by the optional argument: a module name limits work to that -row; `all` (or no argument) refreshes every module. - -### Phases 1–5 — one per Process Area - -For each PA, read its reference file, then compute every cell for every -tracked module: - -| Phase | Read | Produce | -|---|---|---| -| PA1 | `references/pa1-change-management.md` | `CR approved` from Feature Request issues (label∪keyword union, milestone scope, Project V2 status, manual overrides) | -| PA2 | `references/pa2-requirements.md` | `Feature Req`, `Component Req` (split rendering), `Req. Inspection` via path filters | -| PA3 | `references/pa3-architecture.md` | `Feature Arch`, `Component Arch`, `Arch. Inspection` | -| PA4 | `references/pa4-implementation.md` | `SW Dev Plan`, `Code` (LOC), `Detailed Design`, `Impl. Inspection` | -| PA5 | `references/pa5-verification.md` | `Unit Tests`, `C0/C1 Cov`, `Comp. IT`, `Feat. IT`, `Static`, `Dynamic`, `Module Ver. Rpt` + platform report admonition | - -Aggregate two-repo modules (Baselibs, Logging, Persistency, Lifecycle) by -**summing** both sources. Apply every source link per Common C4.2. - -### Phase 6 — Validate (gate before writing) - -Run Common Step 5: structural check (same modules, same columns) and the -per-cell plausibility diff against the current RST. Stop and investigate any -🛑/⚠️ transition. - -### Phase 7 — Write the RST - -Per Common Step 6: update each PA table, each per-table **Rollout status** -`raw:: html` block, and the **data collection date** admonition (UTC, -`YYYY-MM-DD`). Keep cross-reference labels `overall_status_pa1…pa5`. - -### Phase 8 — Refresh progress charts - -Per Common C6: recompute the four-release totals and update the bars/labels -in the per-PA SVGs under `docs/_assets/`. Use the curated table sums for the -PA5 `now` column. - -## Output - -When done, report: -- which modules/PAs were refreshed and the data collection date set; -- any 🛑/⚠️ plausibility transitions you investigated and how you resolved them; -- whether the SVGs were updated and any >10 % method divergence noted; -- a reminder to build the docs (a clean Sphinx build with no - `undefined label` warnings is the success criterion). diff --git a/.github/agents/progress-overview.agent.md b/.github/agents/progress-overview.agent.md new file mode 100644 index 00000000000..c61a127ab9c --- /dev/null +++ b/.github/agents/progress-overview.agent.md @@ -0,0 +1,59 @@ +--- +description: "Refreshes the Release-wide Progress Overview (per-release progress charts) on docs/s_core_v_1/releases/progress_overview.rst. Use when: a release shipped, known_good.json was bumped, a module was added, or the charts look stale. Recounts every release from the pinned module sources via scripts/progress_overview/collect_metrics.py and regenerates the stacked-bar SVGs." +name: Progress Overview +argument-hint: "optional: release name, e.g. v1.0" +tools: [read, edit, search, execute, todo] +--- + +You maintain the **Release-wide Progress Overview** charts in +`docs/s_core_v_1/releases/progress_overview.rst`. + +The page is deliberately thin: five charts showing how the platform grew across +releases, plus links to the verification reports. Per-module and per-component +detail lives in the **Platform Verification Report** and the **Module +Verification Reports** under `docs/verification_report/` — those are generated +from the build's needs data and are authoritative. Do not reintroduce tables +here. + +The **"how" lives in the `progress-overview` skill** +(`.github/skills/progress-overview/SKILL.md`). Read it and follow it; do not +invent counting rules or hand-edit SVGs from memory. + +## Workflow + +Maintain a todo list. + +1. Read the skill. +2. Check `GITHUB_PAT` is set; the collector needs it for tag and pin lookups. +3. Nothing to rename for a new target release: the forecast label comes from + the next release milestone in eclipse-score/score (see the skill). +4. Run `python3 scripts/progress_overview/collect_metrics.py` (recounts every + column, ~5 min, clones to `/tmp`). +5. Run `python3 scripts/progress_overview/generate_progress_charts.py`. +6. Bump the data-collection date in `progress_overview.rst` to `data_collected`. +7. Verify with `--check` and a docs build without `undefined label` warnings. +8. Sanity-check the result: a module collapsing to near zero between two + columns is almost always an unresolved pin or a moved path, not real + progress. Investigate before accepting it. + +## Constraints + +- The data file and the SVGs are generated output. Fix the collector, not its + results. +- DO NOT append a single column by hand. Re-collect all of them so every column + used the same counter. +- DO NOT drop the labels `progress_overview_requirements`, + `progress_overview_architecture`, `progress_overview_implementation` and + `progress_overview_verification`; + `pi1.rst`, `pi2.rst` and `pi3.rst` link to them. +- DO NOT add per-module status tables, pie charts or rollout bars back to the + page — that information now belongs to the verification reports. +- DO NOT reconcile these numbers against CI dashboards. They are source-derived + by design and will differ. +- DO NOT give a module a chart-specific colour. `MODULE_COLORS` applies to every + chart so a colour is recognisable across the whole page. + +## Output + +Report which metrics moved, any module whose count changed sharply and why, +the date you set, and remind the user to rebuild the docs. diff --git a/.github/skills/overall-status/SKILL.md b/.github/skills/overall-status/SKILL.md deleted file mode 100644 index 465e5a223d6..00000000000 --- a/.github/skills/overall-status/SKILL.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -name: overall-status -description: "How-to reference for the Feature and Process Status table in docs/s_core_v_1/roadmap/overall_status.rst. Explains the counting model, status criteria, RST formatting, path filters and progress-chart workflow used to derive completion status from eclipse-score GitHub repos (Baselibs, Communication, Logging, Persistency, Time, Config Management, Lifecycle, Security/Crypto, Some/IP). Use when updating, regenerating or reviewing the overall status / feature status tracker. The overall-status agent orchestrates the run; this skill holds the 'how'." -argument-hint: "optional: module name or 'all'" ---- - -# Feature and Process Status Tracker — the "how" - -This skill is the **methodology** for refreshing the table in -`docs/s_core_v_1/roadmap/overall_status.rst` from live `eclipse-score` GitHub -repositories pinned via `known_good.json`. - -The **[overall-status agent](../../agents/overall-status.agent.md)** is the -main actor: it is started to update or regenerate the table and executes the -procedure end-to-end. This skill supplies the detailed rules the agent reads -at each phase. - -The content is split into a **Common** part (shared engine) and one file per -**Process Area** (PA-specific data), so each concern stays self-contained. - ---- - -## When to use - -- Update / refresh the overall status (feature & process status) table. -- Regenerate the table from scratch after a `known_good.json` ref bump. -- Add a new module row, or review the table for plausibility. -- Update the per-PA progress SVG charts. - -## Structure — Common + Process Areas - -| Scope | File | What it contains | -|---|---|---| -| **Common** | [references/common.md](./references/common.md) | Scope & modules, repos & pinned refs, counting model, RST formatting rules, the shared procedure (Steps 0–7), the progress-graphics workflow, and limitations | -| **PA1** | [references/pa1-change-management.md](./references/pa1-change-management.md) | `CR approved` — Feature Request issue lookup (labels, milestone scope, Project V2 status, manual overrides); the PA1-only modules Diagnostic Services & NM | -| **PA2** | [references/pa2-requirements.md](./references/pa2-requirements.md) | `Feature Req` · `Component Req` · `Req. Inspection` — directive types, split rendering, path filters | -| **PA3** | [references/pa3-architecture.md](./references/pa3-architecture.md) | `Feature Arch` · `Component Arch` · `Arch. Inspection` — directive types, path filters | -| **PA4** | [references/pa4-implementation.md](./references/pa4-implementation.md) | `SW Dev Plan` · `Code` (LOC) · `Detailed Design` · `Impl. Inspection` | -| **PA5** | [references/pa5-verification.md](./references/pa5-verification.md) | `Unit Tests` · `C0/C1 Cov` · `Comp. IT` · `Feat. IT` · `Static` · `Dynamic` · `Module Ver. Rpt`; coverage CI keys, static/dynamic CI table, platform verification report | - -## Scope at a glance - -Tracked modules (one row each, in order): -`Baselibs · Communication · Logging · Persistency · Time · Config Mgmt · -Lifecycle · Security/Crypto · Diagnostic Services · NM · Some/IP`. -**Orchestrator** is never tracked. - -| PA | Title | sphinx-needs tag | Columns | -|---|---|---|---| -| PA1 | Change Management | `change_management` | CR approved | -| PA2 | Requirements Engineering | `requirements_engineering` | Feature Req · Component Req · Req. Inspection | -| PA3 | Architecture Design | `architecture_design` | Feature Arch · Component Arch · Arch. Inspection | -| PA4 | Implementation | `implementation` | SW Dev Plan · Code · Detailed Design · Impl. Inspection | -| PA5 | Verification | `verification` | Unit Tests · C0/C1 Cov · Comp. IT · Feat. IT · Static · Dynamic · Module Ver. Rpt | - -## Quickstart - -1. Read [references/common.md](./references/common.md) and run **Step 0–1** - (resolve pinned refs, fetch repo trees). -2. For each Process Area, read its file and compute the cells using the - Common counting model + the PA's path filters / criteria. -3. Run the **sanity checks** (Common Step 5) before writing. -4. Write the RST (Common Step 6) — update every PA table, the per-table - **Rollout status** row, and the **data collection date**. -5. Refresh the per-PA progress SVGs (Common C6). diff --git a/.github/skills/overall-status/references/common.md b/.github/skills/overall-status/references/common.md deleted file mode 100644 index 7d4d77d614e..00000000000 --- a/.github/skills/overall-status/references/common.md +++ /dev/null @@ -1,917 +0,0 @@ -# Common Reference — shared engine for all Process Areas - -This file holds everything that is **not** specific to a single Process Area: -scope, repositories, the counting model, RST formatting rules, the shared -procedure, the progress-graphics workflow and the known limitations. - -Per-PA details live in the sibling files: - -| PA | File | Topic | -|----|------|-------| -| PA1 | [pa1-change-management.md](./pa1-change-management.md) | CR approved (Feature Request issues) | -| PA2 | [pa2-requirements.md](./pa2-requirements.md) | Feature/Component Req + Req. Inspection | -| PA3 | [pa3-architecture.md](./pa3-architecture.md) | Feature/Component Arch + Arch. Inspection | -| PA4 | [pa4-implementation.md](./pa4-implementation.md) | SW Dev Plan, Code/LOC, Detailed Design, Impl. Inspection | -| PA5 | [pa5-verification.md](./pa5-verification.md) | Tests, Coverage, Static/Dynamic, Module Ver. Report | - ---- - -## C1. Scope & modules - -Tracked modules (one table row each, in this order): - -``` -Baselibs · Communication · Logging · Persistency · Time · Config Mgmt -Lifecycle · Security/Crypto · Diagnostic Services · NM · Some/IP -``` - -Excluded: **Orchestrator** — never add a row for it. - -Five process areas, each with its own table: - -| PA | Title | sphinx-needs tag | Columns | -|---|---|---|---| -| PA1 | Change Management | `change_management` | CR approved | -| PA2 | Requirements Engineering | `requirements_engineering` | Feature Req · Component Req · Req. Inspection | -| PA3 | Architecture Design | `architecture_design` | Feature Arch · Component Arch · Arch. Inspection | -| PA4 | Implementation | `implementation` | SW Dev Plan · Code · Detailed Design · Impl. Inspection | -| PA5 | Verification | `verification` | Unit Tests · C0/C1 Cov · Comp. IT · Feat. IT · Static · Dynamic · Module Ver. Rpt | - -> **PA1-only modules: Diagnostic Services and NM.** Both have a row in every -> PA table for layout consistency, but only the PA1 column carries real data. -> Full handling is documented in [pa1-change-management.md](./pa1-change-management.md); -> their PA2–PA5 cells render `❌ Open` and they contribute `0` to the per-PA -> progress charts (see [C6](#c6-progress-graphics-per-pa-svg-charts)) and are -> excluded from the coverage weighted mean (see [C7](#c7-limitations)). - ---- - -## C2. Repos and pinned refs - -Each module has content in **`eclipse-score/score`** (feature-level) and in its -**own repo** (component-level). Always query both. - -| Module | `known_good.json` key | Own repo | Score-side path | -|---|---|---|---| -| Baselibs | `score_baselibs` | `eclipse-score/baselibs` | `docs/{features,modules}/baselibs/**` | -| Communication | `score_communication` | `eclipse-score/communication` | `docs/{features,modules}/communication/**` | -| Logging | `score_logging` | `eclipse-score/logging` | `docs/features/analysis-infra/logging/**`, `docs/modules/logging/**` | -| Persistency | `score_persistency` | `eclipse-score/persistency` (`docs/persistency/kvs/**`) | `docs/features/persistency/**` | -| Time | — | `eclipse-score/inc_time` | `docs/features/time/**` | -| Config Mgmt | — | `eclipse-score/config_management` | `docs/features/configuration/**` | -| Lifecycle | `score_lifecycle_health` | `eclipse-score/lifecycle` (`docs/module/health_monitor/**`) | `docs/features/lifecycle/**` | -| Security/Crypto | — | `eclipse-score/inc_security_crypto` | `docs/features/security_crypto/**` | -| Some/IP | — | `eclipse-score/inc_someip_gateway` | `docs/features/communication/some_ip_gateway/**` | - -> **No row for Diagnostic Services or NM** — see [C1](#c1-scope--modules). They -> are PA1-only; PA2–PA5 cells render `❌ Open` until their own repos / -> `known_good.json` keys exist, at which point a row must be added here **and** -> in the relevant PA path-filter table. - -> `eclipse-score/score` itself is pinned under key **`score_platform`** in the -> **`tooling`** section of `known_good.json` (not `target_sw`). Use the helper -> `pinned_ref()` in [Step 0](#step-0--resolve-pinned-refs). - -> **TRLC files** (`.trlc`) are not parsed by this skill. `eclipse-score/communication` -> keeps real component requirements in -> `score/mw/com/requirements/component_requirements/component_requirements_ipc.trlc`; -> render them in the cell as `0/0 comp_req [TRLC]` plus a link. - ---- - -## C3. Counting model - -For each deliverable column a set of allowed directive types is defined -(see [C3.1](#c31-allowed-directive-types-per-deliverable)). For every RST file -under the deliverable's path filter, count the `.. ::` directive blocks -whose immediately-following indented `:status:` field equals `valid` -(= **valid**) and the total number of such blocks regardless of status -(= **total**). Sum both numbers across all files. - -The cell renders as: - -| Condition | Output | -|---|---| -| total = 0 | `❌ Open` | -| valid = total > 0 | `✅ Available (valid/total)` | -| 0 ≤ valid < total | `🔄 NN% (valid/total)`, `NN = floor(100 · valid / total)` | - -> valid = 0 with total > 0 renders as `🔄 0% (0/total)`, **never** `❌ Open`. -> `❌ Open` means *no files / no directives found at all*. - -### C3.1 Allowed directive types per deliverable - -| Deliverable | Directive types in `A` | PA | -|---|---|---| -| Feature Requirements | `feat_req` | PA2 | -| Component Requirements | `comp_req`, `aou_req` | PA2 | -| Feature Architecture | `feat`, `feat_arc`, `feat_arc_sta`, `feat_arc_dyn` | PA3 | -| Component Architecture | `comp`, `comp_arc`, `comp_arc_sta`, `comp_arc_dyn`, `logic_arc_int`, `logic_arc_int_op`, `real_arc_int`, `real_arc_int_op` | PA3 | -| Detailed Design | `dd`, `dd_sta`, `dd_dyn` | PA4 | -| Req./Arch./Impl. Inspection | document-level `:status:` of each `chklst_*.rst` (one per file) | PA2/3/4 | - -Never counted as Req/Arch directives: `stkh_req`, `tool_req`, `document`, -`needtable`, `needpie`, `needextend`, `figure`, `uml`, `note`, `attention`, -`toctree`, `grid`. AoUs (`aou_req`) count for **Component** Req only, never for -Feature Req. - -### C3.2 Component Requirements split rendering - -Component Requirements counts both `comp_req` and `aou_req` but **renders them -split** so the reader sees what fraction is real component requirements vs. -Assumptions of Use (rendered by `comp_req_cell()`, see -[Step 3](#step-3--render-cells)): - -``` -✅ Available (84/84 comp_req + 32/32 AoU) -✅ Available (0/0 comp_req [TRLC] + 33/33 AoU) ← Communication: comp_req live in .trlc -✅ Available (35/35 comp_req) ← no AoUs -🔄 0% (0/1 comp_req + 0/1 AoU) ← mixed, none valid -``` - -If both subtotals are zero → `❌ Open`. - -### C3.3 Inspections - -Each `chklst_*.rst` file contains a single `.. document::` directive whose -indented `:status:` field is treated as the document status. Each file -contributes `(1, 1)` if `:status: valid`, else `(0, 1)`. Files without any -`:status:` field contribute `(0, 0)`. - -> **Lines of Code (PA4 Code column)** is a counting variant that uses byte -> size instead of directive blocks. It is documented with the PA4 deliverables -> in [pa4-implementation.md](./pa4-implementation.md), and shares the `is_src` -> filter defined in [C6.2](#c62-metrics--what-each-chart-sums). - ---- - -## C4. RST formatting rules - -### C4.0 Cross-reference labels (mandatory) - -Each `Process Area N — …` heading **must** be preceded by an explicit -target label so that `pi1.rst`, `pi2.rst`, `pi3.rst` (and any future -release-gate page) can link back via `:ref:\`overall_status_paN\``: - -```rst -.. _overall_status_pa2: - -Process Area 2 — Requirements Engineering ------------------------------------------ -``` - -Required labels: `overall_status_pa1`, `overall_status_pa2`, -`overall_status_pa3`, `overall_status_pa4`, `overall_status_pa5`. -Omitting any of them produces Sphinx `WARNING: undefined label` -messages from the PI release-gate pages — a clean build is the -success criterion. - -### C4.1 Cell layout - -Status emoji + label on the **first line**; everything else (counts, links, -notes) goes on a **line-block** (`| `) after a blank line. - -> **Pluralisation.** When emitting test counts, write `1 test` (singular) -> and `N tests` (plural). A naive `f"{n} tests"` will produce the wrong -> `1 tests` for Logging Feat. IT and any other 1-test cell: -> -> ```python -> def plur(n, s="test"): -> return f"{n} {s}" if n == 1 else f"{n} {s}s" -> ``` - -```rst - - ✅ Available (37/37) - - | `feature-level `__ - | `abi-compatible-data-types `__ -``` - -```rst - - 🔄 - - | **C0:** 92.3% - | **C1:** 60.3% (cpp) - | **Rust line:** 74.4% -``` - -> **PA5 test counts on a new line.** For the **Unit Tests**, **Comp. IT** -> and **Feat. IT** columns, the test count goes on its **own line-block -> line** below the status — never on the same line as `✅ Available`: -> -> ```rst -> - ✅ Available -> -> | 5376 tests -> ``` -> -> Do **not** emit `✅ Available (5376 tests)` on a single line. The -> `(valid/total)` parenthetical form ([C3](#c3-counting-model), -> requirements/AoU columns) is unaffected. - -> **Line-blocks inside table cells render flush-left.** Sphinx wraps an -> indented `| ...` continuation in a `
` -> which by default carries a left border + tinted background — visually -> noisy inside a status table. `docs/_assets/custom.css` neutralises this -> for `table … blockquote` and `table … .line-block` (zero margin/padding, -> `border: none`, `background: transparent`). Do **not** add per-cell -> raw-HTML wrappers to fight the styling — let the CSS rule do it. - -When mentioning `:status: invalid` in prose, **always use double backticks**: -`` ``:status: invalid`` `` (single backticks are RST hyperlink syntax → parse warning). - -### C4.2 Source links — mandatory - -Every Req / Arch / Detailed-Design / Code / Inspection cell that is **not** -`❌ Open` **MUST** carry one or more source links directly below the count -line. Rules: - -- One bullet per source RST file or per logical group (e.g. per module - subfolder). **List every matching source** — Feature Req, Component Req, - Feature Arch, Component Arch, Detailed Design, **and** Inspection cells - use no link cap. Earlier revisions capped non-Inspection cells at ~4 - links; that rule is obsolete because the truncated cells (e.g. Baselibs - with 10 components) hid components from the reader. -- **Link labels MUST be the component (or feature) name**, derived from - the URL path. This applies to **all** cells with source links — - Feature Req, Component Req, Feature Arch, Component Arch, - Detailed Design, **and** Inspection cells. Do **not** use the bare - filename (`index`, `requirements`, `aou_req`, `mw-fr_logging_req`, - `chklst_req_inspection`, …) as the label. -- Algorithm to derive the label from a path: - 1. drop the filename; - 2. drop trailing segments `requirements` / `architecture` / - `detailed_design` / `docs` / `component_requirements` / - `feature_requirements`; - 3. use the last remaining path segment. - - Examples: - - | Path | Label | - |---|---| - | `docs/features/baselibs/docs/requirements/index.rst` | `baselibs` | - | `docs/modules/baselibs/concurrency/docs/requirements/index.rst` | `concurrency` | - | `docs/features/communication/ipc/docs/requirements/index.rst` | `ipc` | - | `docs/persistency/kvs/requirements/index.rst` | `kvs` | - | `docs/module/health_monitor/requirements/index.rst` | `health_monitor` | - | `score/mw/com/requirements/component_requirements/component_requirements_ipc.trlc` | `com` | - | `docs/features/baselibs/docs/requirements/chklst_req_inspection.rst` | `baselibs` | - | `docs/modules/baselibs/concurrency/docs/requirements/chklst_req_inspection.rst` | `concurrency` | - -- Inspection cells (`Req. Inspection`, `Arch. Inspection`, - `Impl. Inspection`) link the underlying `chklst_*_inspection.rst` files, - not the parent index — readers want to click directly into the checklist - whose `:status:` drives the cell. -- URLs **MUST** point to the pinned ref (40-char SHA from `known_good.json`), - not `blob/main` — counts come from the pinned ref, and `main` may have been - restructured. For repos not in `known_good.json` (`inc_time`, - `config_management`, `inc_security_crypto`, `inc_someip_gateway`), - `blob/main` is acceptable. -- For Communication `comp_req` link the `.trlc` file marked `[TRLC]`. -- **PA4 Code cell** links the **repository root** (e.g. - `https://github.com/eclipse-score/baselibs`). The link label MUST be the - repository name (last URL segment), **not** the literal word `repo` — - e.g. `baselibs`, `communication`, `inc_time`, `config_management`, - `inc_security_crypto`, `inc_someip_gateway`. -- **PA5 Static Analysis cell** is **status-only** — do NOT add links to - CI workflow files or `quality/static_analysis` directories under the - status. Same rule as Dynamic Analysis (see - [pa5-verification.md](./pa5-verification.md)). -- **PA5 Platform Verification Report** is a **single project-wide - deliverable** — it does **not** get a per-module column. Render it as - a prominent admonition immediately after the PA5 list-table (styled - via `.platform-ver-report` in `docs/_assets/custom.css` — larger font, - blue accent, so it can't be missed): - - ```rst - .. admonition:: Platform Verification Report - :class: important platform-ver-report - - `platform_ver_report - / - docs/score_releases/verification/platform_ver_report.rst>`__ - — 🔄 **Draft** (single project-wide deliverable) - ``` - - Update the status emoji + label to match the report's current - `:status:` field (✅ **Valid** / 🔄 **Draft**). Do **not** revert this - to a plain `**bold paragraph**` — the admonition class is what makes - it visually prominent. - -### C4.2.1 Per-link status markers — Inspection & Report cells (mandatory) - -Inspection cells (`Req. Inspection`, `Arch. Inspection`, `Impl. Inspection`) -and the **Module Verification Report** cells routinely list many source -links (Baselibs alone has 10 checklists per inspection column). A reader -cannot tell which checklist is finished from the aggregate `3/10` count -alone. Therefore **every source link in these cells MUST be prefixed with a -status marker** derived from the *linked* file's document-level `:status:` -(the same `:status:` that drives the cell count — see -[C3.3](#c33-inspections)): - -| Linked file `:status:` | Marker | -|---|---| -| `valid` | ✅ | -| `draft` | 🔄 | -| `invalid` | ❌ | -| missing / no `:status:`| ⚠️ (investigate — usually a wrong path) | - -Format — the marker sits **between** the line-block bar and the backtick: - -```rst - - 🔄 30% (3/10) - - | ✅ `baselibs <…/docs/requirements/chklst_req_inspection.rst>`__ - | ✅ `bitmanipulation <…/docs/requirements/chklst_req_inspection.rst>`__ - | 🔄 `concurrency <…/docs/requirements/chklst_req_inspection.rst>`__ -``` - -Hard rules: -- Applies to **every** cell whose links point at `chklst_*_inspection.rst` - files (`Req./Arch./Impl. Inspection`) **and** at - `module_verification_report.rst` / `platform_ver_report.rst` files. -- The marker reflects the **document-level** `:status:` of the *linked* - file (parse with `count_checklist_status`, see - [Step 2](#step-2--count-directives)), **not** the aggregate cell status. -- Self-check: the number of ✅ markers in a cell **MUST equal** the `valid` - numerator of that cell (e.g. `3/10` ⇒ exactly three ✅). A mismatch means - a stale marker or a wrong link. -- Requirements / Architecture / Detailed-Design / Code cells (which link - `index.rst` requirement/architecture files, **not** checklists) do **not** - get per-link markers — only inspection and report links do. -- Markers are additive to the existing link rules ([C4.2](#c42-source-links--mandatory)): - keep the component-name label, the pinned-ref URL and the no-cap listing. - -Helper (renders one marked inspection/report link): - -```python -INSP_MARK = {"valid": "✅", "draft": "🔄", "invalid": "❌"} - -def insp_link(label, url, status): - """status is the document :status: of the linked chklst_*/report file, - from count_checklist_status()'s underlying :status: match.""" - return f"| {INSP_MARK.get(status, '⚠️')} `{label} <{url}>`__" -``` - -### C4.3 Per-PA progress figures - -Each Process Area embeds one SVG figure under `docs/_assets/`: - -| PA | File | `:width:` | -|-----|-----------------------------------|------------| -| PA2 | `pa2_impl_progress.svg` | `720px` | -| PA3 | `pa3_arch_progress.svg` | `720px` | -| PA4 | `pa4_impl_progress.svg` | `720px` | -| PA5 | `pa5_verification_progress.svg` | `1080px` | - -The PA5 verification figure is rendered at **1.5× the standard width** -(`1080px` instead of `720px`) because it carries four series across four -release columns and a 720px render makes the per-module test counts hard -to read. All other PAs keep the default 720px width. - -```rst -.. figure:: /_assets/pa5_verification_progress.svg - :alt: PA5 verification progress - :width: 1080px - - Test counts and coverage across the 11 PA2 modules per release - (v0.5.0-beta → v0.6.0 → v0.7.0 → current main). -``` - -### C4.4 Pie chart row (Process Status) - -Each PA section starts with a pie chart row. The section is introduced by a -**Process Status** rubric that uses the `status-heading` class for an -enlarged appearance (styles in `docs/_assets/custom.css`): - -```rst -.. rubric:: Process Status - :class: status-heading - -.. list-table:: - :header-rows: 1 - :class: compact-overview-table - - * - Process req. status - - ISO 26262 std_req status - - Req. verification status - * - - - .. rst-class:: small-pie-cell - - .. needpie:: - :labels: Valid, Draft, Invalid, Other - :colors: LimeGreen, Gold, LightCoral, LightGray - - type == 'gd_req' and is_external == False and status == 'valid' and '' in tags - type == 'gd_req' and is_external == False and status == 'draft' and '' in tags - type == 'gd_req' and is_external == False and status == 'invalid' and '' in tags - type == 'gd_req' and is_external == False and status not in ['valid', 'draft', 'invalid'] and '' in tags - - - - .. rst-class:: small-pie-cell - - .. needpie:: - :labels: Ok, Recommendation, Open, Action, Deviation, N/A, Other - :colors: LimeGreen, LightBlue, Gold, Orange, LightCoral, LightGray, Silver - :filter-func: needs_filters.std_req_status_for_area() - - - - .. rst-class:: small-pie-cell - - .. needpie:: - :labels: Automated, Waiting for automation, Inspection list, Other - :colors: LimeGreen, Gold, LightBlue, LightGray - :filter-func: needs_filters.area_verification_status() -``` - -Hard rules: -- `.. needpie::` does **not** support `:title:` (build error). -- Each cell needs `.. rst-class:: small-pie-cell` before its `.. needpie::`. -- Pie chart sizing is governed by `_assets/custom.css` (class - `compact-overview-table`, fluid 33% per column, `!important` img override). - Do not add explicit pixel sizes. - -### C4.5 Rollout status row - -Directly above the module tracker table, render a **single-line row** with -a label, percentage, an inline progress bar and a detail text. This -replaces the older `.. rubric:: Implementation status: ...` line. Use a -`raw:: html` block so the progress bar and the text sit on the same line: - -```rst -.. raw:: html - -
- Rollout status: - 🔄 - NN% -
- X/Y deliverables complete -
-``` - -- `X` = number of `✅ Available` cells in the table. -- `Y` = number of cells in the table excluding the leftmost stub column. -- `NN` = `floor(100 * X / Y)`, clamped to `[0, 100]`. Use the **same** - value in both the `impl-status-percent` span and the - `style="width:NN%"` of `impl-status-fill`. -- If `Y == 0`, render `NN = 0` (empty bar) and `0/0 deliverables complete`. -- Keep the wording **"Rollout status"** — not "Implementation status" - (the term "implementation" is reserved for actual code). -- Styling lives in `docs/_assets/custom.css` (`.impl-status-row`, - `.impl-status-bar`, `.impl-status-fill`). Do not inline additional - styles beyond the `width:NN%` on the fill div. -- The `Process Status` rubric above the pie row uses the - `:class: status-heading` option (see [C4.4](#c44-pie-chart-row-process-status) - above) so both headings have the same enlarged appearance. - ---- - -## C5. Procedure (shared steps) - -The per-PA cell criteria and path filters live in each PA file. The steps -below are the shared machinery used across all PAs. - -### Step 0 — Resolve pinned refs - -```python -import json, base64, subprocess, re - -def gh_raw(api_path, jq="."): - r = subprocess.run(["gh", "api", api_path, "--jq", jq], - capture_output=True, text=True) - assert r.returncode == 0, f"gh api failed: {r.stderr}" - return r.stdout.strip() - -def gh_json_file(api_path): - return json.loads(base64.b64decode(gh_raw(api_path, ".content")).decode()) - -known_good = gh_json_file( - "repos/eclipse-score/reference_integration/contents/known_good.json") - -def pinned_ref(module_key): - """`score_platform` lives in `tooling`; everything else in `target_sw`.""" - all_mods = {**known_good["modules"]["target_sw"], - **known_good["modules"]["tooling"]} - entry = all_mods.get(module_key) - return entry["hash"] if entry else "main" - -REFS = { - "score": pinned_ref("score_platform"), - "baselibs": pinned_ref("score_baselibs"), - "communication": pinned_ref("score_communication"), - "logging": pinned_ref("score_logging"), - "persistency": pinned_ref("score_persistency"), - "lifecycle": pinned_ref("score_lifecycle_health"), - "inc_time": "main", - "config_management": "main", - "inc_security_crypto": "main", -} -``` - -### Step 1 — Fetch repo trees - -```python -def get_tree(repo, ref): - out = subprocess.run( - ["gh", "api", f"repos/{repo}/git/trees/{ref}?recursive=1", - "--jq", ".tree[].path"], - capture_output=True, text=True) - paths = [p for p in out.stdout.strip().split("\n") if p] - assert paths, f"empty tree for {repo}@{ref}" - return paths -``` - -### Step 2 — Count directives - -```python -DIRECTIVE_TYPES = { - "feat_req": ("feat_req",), - "comp_req": ("comp_req", "aou_req"), - "feat_arc": ("feat", "feat_arc", "feat_arc_sta", "feat_arc_dyn"), - "comp_arc": ("comp", "comp_arc", "comp_arc_sta", "comp_arc_dyn", - "logic_arc_int", "logic_arc_int_op", - "real_arc_int", "real_arc_int_op"), - "dd": ("dd", "dd_sta", "dd_dyn"), -} - -def fetch_file(repo, path, ref): - r = subprocess.run( - ["gh", "api", f"repos/{repo}/contents/{path}?ref={ref}", "--jq", ".content"], - capture_output=True, text=True) - if r.returncode != 0 or not r.stdout.strip(): - return "" - return base64.b64decode(r.stdout.strip()).decode(errors="replace") - -def count_directives_with_status(content, allowed): - """Return (valid, total) for `.. ::` blocks where type ∈ allowed, - using the *indented* :status: field of each block. Document-level - :status: at column 0 is ignored.""" - pat = re.compile(r'^\.\.\s+(' + '|'.join(allowed) + r')::', re.MULTILINE) - valid = total = 0 - for m in pat.finditer(content): - tail = content[m.end():] - nxt = re.search(r'^\.\.\s+\w', tail, re.MULTILINE) - block = tail[:nxt.start()] if nxt else tail - st = re.search(r'^\s+:status:\s+(\w+)', block, re.MULTILINE) - total += 1 - if st and st.group(1) == 'valid': - valid += 1 - return valid, total - -def count_checklist_status(content): - """Status of the `.. document::` directive in a chklst_*.rst file. - The :status: is indented inside the directive body, not at column 0.""" - m = re.search(r'^\.\.\s+document::', content, re.MULTILINE) - if not m: - return 0, 0 - tail = content[m.end():] - nxt = re.search(r'^\.\.\s+\w', tail, re.MULTILINE) - block = tail[:nxt.start()] if nxt else tail - st = re.search(r'^\s+:status:\s+(\w+)', block, re.MULTILINE) - if not st: - return 0, 0 - return (1 if st.group(1) == 'valid' else 0), 1 - -def count_files(repo, paths, ref, path_filter, kind): - """kind ∈ {'feat_req','comp_req','feat_arc','comp_arc','dd','chklst'}.""" - matched = [p for p in paths if path_filter(p)] - tv = tt = 0 - for path in matched: - content = fetch_file(repo, path, ref) - if kind == 'chklst': - v, t = count_checklist_status(content) - else: - v, t = count_directives_with_status(content, DIRECTIVE_TYPES[kind]) - tv += v; tt += t - return tv, tt -``` - -### Step 3 — Render cells - -```python -def cell(v, t): - if t == 0: return "❌ Open" - if v == t: return f"✅ Available ({v}/{t})" - return f"🔄 {v*100//t}% ({v}/{t})" - -def comp_req_cell(contents, *, trlc=False): - cv = ct = av = at = 0 - for c in contents: - v, t = count_directives_with_status(c, ('comp_req',)); cv+=v; ct+=t - v, t = count_directives_with_status(c, ('aou_req',)); av+=v; at+=t - if ct == 0 and at == 0: return "❌ Open" - parts = [] - if ct or trlc: parts.append(f"{cv}/{ct} comp_req" + (" [TRLC]" if trlc else "")) - if at: parts.append(f"{av}/{at} AoU") - body = " + ".join(parts) - tot_v, tot_t = cv + av, ct + at - if tot_v == tot_t: return f"✅ Available ({body})" - return f"🔄 {tot_v*100//tot_t}% ({body})" -``` - -### Step 4 — Path filters - -The concrete per-module path filters live in each PA file (PA2/PA3/PA4). -The following cross-cutting rules apply to **all** of them: - -> **Component-level data may live in two repos at once.** Baselibs and -> Logging keep `comp_arc` directives both in `eclipse-score/score` -> (`modules//**`) **and** in their own repo (`docs//**`). -> Always query both filters and **sum** the `(valid, total)` tuples; never -> drop one source. The same is true for Persistency `kvs` (uses both -> `score/kvs/docs/` and the older `docs/persistency/kvs/`). -> Some/IP keeps `comp_req` partly in `docs/requirements/component/**` and -> partly in `docs/tc8_conformance/requirements.rst` — combine both. - -> **Lifecycle is the most complex module** — feature-level lives in -> `eclipse-score/score`, component-level (`docs/module/health_monitor/**`) in -> `eclipse-score/lifecycle`. Always query both and aggregate. - -> **Communication vs. Some/IP — never double-count.** Some/IP and -> Communication are **separate** modules even though Some/IP lives at -> `docs/features/communication/some_ip_gateway/**` inside the score repo. -> Whenever a path filter for Communication includes `'features/communication' -> in p` (or its `modules/` counterpart), it **MUST also exclude** -> `some_ip_gateway`: -> -> ```python -> def is_comm(p): -> return ('features/communication' in p -> and 'some_ip_gateway' not in p) -> ``` -> -> Some/IP gets its own filter that requires `some_ip_gateway` in the path -> plus its own repo `eclipse-score/inc_someip_gateway` for component-level -> data. The rule applies to **every** PA. - -### Step 5 — Sanity checks (run **before** writing the RST) - -#### 5a Structural — same modules, same columns - -```python -def parse_rst_structure(rst_path): - text = open(rst_path).read() - parts = re.split(r'Process Area (\d+) —', text)[1:] - out = {} - for i in range(0, len(parts) - 1, 2): - pa, body = f"PA{parts[i].strip()}", parts[i+1] - hdr = re.search(r'\* - \*\*Module\*\*(.*?)(?=\n \* -\s+\w)', body, re.DOTALL) - cols = [c.strip() for c in re.findall(r'\*\*([^*]+)\*\*', hdr.group(0) if hdr else "") if c.strip() != 'Module'] - mods = [m.strip() for m in re.findall(r'\n \* - ((?![\*\s])[\w][^\n]+)', body)] - out[pa] = {'modules': mods, 'columns': cols} - return out -``` - -Stop and investigate if: -- a module present before is missing now, or -- a column changed. - -#### 5b Plausibility — diff each cell - -| Old → New | Action | -|---|---| -| `✅` → `❌` or `🔄 NN%` → `❌` | 🛑 stop — almost certainly a filter bug | -| `✅` → `🔄` | ⚠️ investigate (regression) | -| `🔄 NN%` → `🔄 MM%`, MM 50 % | ⚠️ filter likely too strict | - -### Step 6 — Write the RST - -Update each PA's module table and the **Rollout status** `raw:: html` -block above it (see [C4.5](#c45-rollout-status-row)). Source links as in -[C4.2](#c42-source-links--mandatory). Pie-chart row and the `Process Status` -rubric stay unchanged unless the sphinx-needs tag changes. - -**Always update the data collection date** at the top of -`docs/s_core_v_1/roadmap/overall_status.rst` to the date the refresh was -performed (UTC, ISO format `YYYY-MM-DD`). The date lives in an -`important` admonition directly below the page title: - -```rst -Overall Status -============== - -.. important:: - - **Data collected on: YYYY-MM-DD** -``` - -If the admonition is missing, add it. Never leave a stale date — every -regeneration must bump it, even if no module values changed. - -### Step 7 — Adding a new module - -1. Append to [C1](#c1-scope--modules) module list and - [C2](#c2-repos-and-pinned-refs) repo table (with key + path filter). -2. Add a row to every PA table and the matching path filters in the PA files. -3. Re-run [Step 6](#step-6--write-the-rst). - ---- - -## C6. Progress graphics (per-PA SVG charts above each table) - -Above the module-tracker table of **PA2, PA3, PA4 and PA5** sits a `figure::` -that renders an inline SVG showing how the totals evolved across the four -most recent releases (`v0.5.0-beta → v0.6.0 → v0.7.0 → current main`). -Files live in `docs/_assets/`: - -| PA | File | Bars | -|---|---|---| -| PA2 | `pa2_impl_progress.svg` | Feature Req (`#1f77b4`), Component Req (`#ff7f0e`) | -| PA3 | `pa3_arch_progress.svg` | Feature Arch (`#1f77b4`), Component Arch (`#ff7f0e`) | -| PA4 | `pa4_impl_progress.svg` | Estimated LOC (`#1f77b4`) | -| PA5 | `pa5_verification_progress.svg`| 3 panels: Unit Tests, Integration Tests (Component `#ff7f0e` + Feature `#9467bd`), Coverage now (`#17becf`) | - -Each figure embeds in RST as - -```rst -.. figure:: /_assets/.svg - :alt: ... - :width: 720px - - -``` - -### C6.1 Release pinning - -Resolve the four release SHAs once via the GitHub tag refs (annotated tags -must be dereferenced): - -```python -def resolve_tag(repo, tag): - d = json.loads(gh_raw(f"repos/{repo}/git/refs/tags/{tag}")) - sha = d["object"]["sha"] - if d["object"]["type"] == "tag": - d2 = json.loads(gh_raw(f"repos/{repo}/git/tags/{sha}")) - sha = d2["object"]["sha"] - return sha -``` - -For each release tag of `eclipse-score/reference_integration`, fetch its -`known_good.json` and read the per-module hash. Schemas differ: - -- v0.5 / v0.6: `modules..{hash,version}` flat -- v0.7+: `modules.{target_sw,tooling}..hash` -- v0.7.0 itself only carries `version` for some entries → fall back to - `resolve_tag(, "v"+version)`. - -`now` is the per-module SHA from `known_good.json` on the **`main` branch of -`eclipse-score/reference_integration`** (not the working tree). Fetch it via -`gh api repos/eclipse-score/reference_integration/contents/known_good.json` — -this keeps the charts reproducible regardless of local uncommitted changes -or temporary ref bumps in the workspace. - -Module repos used for the charts: - -``` -score: eclipse-score/score (key: score_platform / "score") -baselibs: eclipse-score/baselibs (key: score_baselibs) -communication: eclipse-score/communication (key: score_communication) -logging: eclipse-score/logging (key: score_logging) -persistency: eclipse-score/persistency (key: score_persistency) -lifecycle: eclipse-score/lifecycle (key: score_lifecycle_health) -inc_time: eclipse-score/inc_time (only "now") -config_management: eclipse-score/config_management (only "now") -inc_security_crypto: eclipse-score/inc_security_crypto (only "now") -inc_someip_gateway: eclipse-score/inc_someip_gateway (only "now") -``` - -### C6.2 Metrics — what each chart sums - -All four charts sum across the **11 PA2 modules** (Baselibs, Communication, -Logging, Persistency, Time, Config Mgmt, Lifecycle, Security/Crypto, -Diagnostic Services, NM, Some/IP). Modules whose data isn't in a release -contribute 0. The Communication-vs-Some/IP separation rule of -[Step 4](#step-4--path-filters) applies to **every** chart metric. - -| Chart | Metric | Source | -|---|---|---| -| PA2 — Feature Req | sum of `count_directives_with_status(..., DIRECTIVE_TYPES["feat_req"])` totals (denominator) | per-module `path_filter` from PA2 | -| PA2 — Component Req | analogous, `comp_req` + `aou_req` | per-module `path_filter` | -| PA3 — Feature Arch | analogous, `DIRECTIVE_TYPES["feat_arc"]` | per-module under `architecture` | -| PA3 — Component Arch | analogous, `DIRECTIVE_TYPES["comp_arc"]` | per-module under `architecture` | -| PA4 — LOC | `sum(blob.size for path in tree if is_src(path)) / 30` (rounded) | each module's own repo at the release SHA | -| PA5 — Unit Tests (historical) | count of `TEST(`, `TEST_F(`, `TEST_P(`, `TYPED_TEST(`, `TYPED_TEST_P(` macros plus Rust `#[test]` and Python `^def test_` in files matching `is_test_path` | each module's own repo | -| PA5 — Comp. IT (historical) | same counters in files where path contains `integration` | each module's own repo | -| PA5 — Feat. IT (historical) | same counters in `feature_integration_tests/` and `platform_integration_tests/` | `eclipse-score/reference_integration` at the release tag | -| PA5 — Unit / Comp. IT / Feat. IT (**now** column) | **column sum** of the corresponding cells in the PA5 RST table (the `| N tests` line-block annotations) | parsed from `overall_status.rst` | -| PA5 — C0/C1 now | weighted mean of per-module C0 and C1 from the current PA5 RST table, weights = unit-test count per module | parsed from `overall_status.rst` | - -> **PA5 test counts: table is the source of truth for "now".** -> The four releases use **two different sources** for the test-count bars: -> - `v0.5.0-beta`, `v0.6.0`, `v0.7.0` → macro-based regex over module repo -> sources (Best-Effort, no curated table available for past tags). -> - `now` → **sum of the `| N tests` line-block annotations in the PA5 RST table** -> (`Unit Tests`, `Comp. Integration Tests`, `Feature Integration Tests` -> columns), because the curated table is what users see. -> -> The two methods diverge for several reasons that are NOT bugs: -> 1. Some/IP integration tests are named `stress_tests/` not `integration*`, -> so the historical regex misses them; the table includes them. -> 2. Feature-Integration counts in the table are **per module** (i.e. how -> many of the cross-module `reference_integration` tests exercise that -> module), not the total `feature_integration_tests/` tree size — so -> the table sum (≈7) is much smaller than the tree-walk total (≈59). -> 3. Some modules have CI test-run counts in the table that don't match -> `TEST(...)` macro counts (parameterized tests count as one macro but -> many runs). -> -> Practical rule: when updating the SVG, run both the C6 recipe **and** -> sum the `| N tests` line-block cells from the RST. Use the recipe values for the -> three release bars and the **table sum** for `now`. Note the divergence -> in the caption / commit message if it's >10 %. - -> **Charts count TOTAL, not valid-only.** -> The progress bars must use the **total** count of directives (denominator -> from [C3](#c3-counting-model)) — i.e. every `feat_req` / `comp_req` / -> `feat_arc` / `comp_arc` block irrespective of `:status:`. This is -> intentional and differs from the per-cell tracker logic in the tables, -> which renders `valid/total`. Rationale: the charts visualise *scope growth* -> across releases, not validation maturity. Drafts and invalids count. -> -> Practical consequence: use `count_directives_with_status(...)[1]` (returns total only), -> **never** the full return value of `count_directives_with_status(...)` for chart numbers. This is -> particularly important for Lifecycle, whose feature-level requirements -> were largely `:status: draft` or `:status: invalid` in v0.5/v0.6 — a -> valid-only counter would report 0 instead of ~92. - -LOC source-file filter (shared with the PA4 Code cell, see -[pa4-implementation.md](./pa4-implementation.md)): - -```python -SRC_EXT = (".cpp", ".cc", ".cxx", ".c", ".h", ".hpp", ".hh", ".rs", ".py") -def is_src(p): - pl = p.lower() - if not pl.endswith(SRC_EXT): return False - if pl.startswith("docs/") or "/docs/" in pl: return False - if pl.startswith("third_party/") or "/third_party/" in pl: return False - if pl.startswith("bazel-"): return False - return True - -def is_test_path(p): - pl = p.lower() - if any(pl.startswith(x) or "/"+x in "/"+pl - for x in ("docs/","third_party/","bazel-",".git/")): - return False - return any(t in pl for t in - ("_test.","/test/","/tests/","_tests.","gtest","unit_test","unittest")) -``` - -### C6.3 Generating / updating the SVGs - -The SVGs are hand-written (no toolchain). Workflow: - -1. Compute totals (one Python script per chart, using `gh api` with the - on-disk cache `/tmp/status_cache/`). Write `/tmp/release_totals.json`, - `/tmp/release_totals_pa3_pa4.json`, `/tmp/release_totals_pa5.json`. -2. Update the bar `y`/`height` values and the printed numbers inside the - existing SVG. The chart frames stay fixed; only the bars and labels - change. -3. Bar heights use linear scale anchored at the panel's plot area. For PA2 - `viewBox="0 0 720 320"` with plot area `x=70..690, y=50..260` (height - 210 px), max value 400 → `y = 260 − value · 0.525`, - `height = 260 − y`. PA3 uses max 240 (`× 0.875`), PA4 uses max 900 000 - (`× 0.0002333`), PA5 panels: Unit `× 0.021`, Integration `× 2.1`, - Coverage `× 2.1`. - -When a metric goes out of the chart's current range, raise the y-axis max -and rescale **all four bars** of that panel; do not crop. - -### C6.4 Caption discipline - -Caption template per chart: - -> ` across the 11 PA2 modules per release -> (v0.5.0-beta → v0.6.0 → v0.7.0 → current main).` - -Always write "across the 11 PA2 modules" (not "across all modules") — the -charts intentionally exclude orchestrator, baselibs_rust, score_platform, -docs_as_code, kyron and other repos that don't appear in the PA tables. - ---- - -## C7. Limitations - -- Test coverage of requirements (link analysis) is not detected — needs - `needs.json`. -- Per-module CI workflows are zero-tolerance; "passing on `main` ⇒ 0 findings" - is the only signal used for static / dynamic analysis. -- Central CodeQL finding counts require the GitHub Security tab. -- Feature-Integration-Test heuristic is path-based and weak — confirm - manually. -- TRLC content is not parsed; cells reference the `.trlc` file via link only. -- PA4 LOC bars are an estimate (`tree blob bytes ÷ 30`) since `gh api` - exposes blob sizes but not line counts; expect ±10 % vs `cloc`. -- PA5 historical coverage is not available — only the current snapshot. -- PA5 test-count bars use **two sources**: the three release bars come - from a TEST-macro regex over module repos (Best-Effort), the `now` bar - is the **column sum of the RST table cells**. Expect divergences of - 10–20 % between the methods (parameterized tests, naming conventions - like Some/IP `stress_tests/`, per-module cross-feature attribution). - Lifecycle has only C0; modules without coverage in CI (Time, Config Mgmt, - Security/Crypto, Some/IP, NM, Diagnostic Services) are excluded from the - weighted mean. diff --git a/.github/skills/overall-status/references/pa1-change-management.md b/.github/skills/overall-status/references/pa1-change-management.md deleted file mode 100644 index 08c4c18b0d3..00000000000 --- a/.github/skills/overall-status/references/pa1-change-management.md +++ /dev/null @@ -1,202 +0,0 @@ -# Process Area 1 — Change Management - -| Property | Value | -|---|---| -| sphinx-needs tag | `change_management` | -| Cross-reference label | `overall_status_pa1` | -| Columns | CR approved | -| Progress figure | _none_ (PA1 is issue-based, not file-based) | - -PA1 "CR approved" tracks **Feature Request** issues in `eclipse-score/score` -(not RST directives). There are therefore **no path filters** for this PA — -the data comes from the GitHub issues API and the org-level Project V2 board. - -For shared conventions (cell layout, source links, rollout-status row, pie -chart row), see [common.md](./common.md#c4-rst-formatting-rules). - ---- - -## PA1-only modules: Diagnostic Services and NM - -Both modules have a row in **every** PA table for layout consistency, but only -the **PA1 column carries real data**: they are tracked via `feature_request` -issues in `eclipse-score/score` (see the keyword map below). They have **no own -repository** and **no `known_good.json` key** yet, so -[common.md C2](./common.md#c2-repos-and-pinned-refs) and the per-PA path-filter -tables have no rows for them and their PA2–PA5 cells render as `❌ Open` (zero -directives, zero files). They still contribute `0` to the per-PA progress charts -(see [common.md C6.2](./common.md#c62-metrics--what-each-chart-sums)) and are -excluded from the coverage weighted mean (see -[common.md C7](./common.md#c7-limitations)). - ---- - -## Status criteria - -| Deliverable | `✅ Available` | `🔄 …` | `❌ Open` | -|---|---|---|---| -| **PA1** CR approved | At least one matching `feature_request` issue **scoped to milestone v0.5 or v1.0** has Status `Accepted` (or `Done`) in Project V2 #4 "Feature Requests / Modification" (see below); cell lists every matching FR with its individual project status and milestone tag | At least one in-scope FR in `In Progress`/`In Review`/`Ready for Review`/`Changes Requested`/`Draft`/`POC Needed` and none Accepted | No matching FR in scope, or all matching FRs `Rejected` | - ---- - -## Feature Request issue lookup - -PA1 "CR approved" tracks **Feature Request** issues in `eclipse-score/score`. -The label name is **`feature_request`** (lowercase, with underscore). Use -`state=all` (some FRs are still open) and combine the topical -`ft:` label with a title-keyword pass; **always union both result -sets** (deduplicated by issue number) so that older FRs which pre-date the -`ft:*` label scheme are still attributed to a module — see the attribution -note below. - -**Milestone scope.** Only Feature Requests targeted at the **v0.5** or -**v1.0** release milestones are counted. The GitHub milestone titles that -currently qualify are: - -- `SCORE v0.5 Feature Complete` -- `S-CORE v0.5 Certifiable` -- `v1.0` - -The match is performed by substring on the milestone title with whitespace -stripped (`"0.5" in title` or `"1.0" in title`, case-insensitive). FRs with -no milestone, or with any other milestone (`v0.6`…`v0.10`), are excluded -from PA1 — even if they carry a matching `ft:*` label. Each rendered FR is -tagged with its short milestone in square brackets (e.g. `[v1.0]`, -`[v0.5 Certifiable]`). - -The issues fetch must therefore include the milestone field in the jq -projection. - -For each issue, fetch its **`Status`** field from the org-level project -**"Feature Requests / Modification"** (Project V2, id -`PVT_kwDOCy9hX84Auo7w`, number `#4`). The PA1 cell renders **one entry per -Feature Request**, each annotated with its individual project status — not a -single aggregate "Available". The cell headline is the **best** status -across all FRs for that module (so a module with at least one Accepted FR -still shows ✅ in summaries). - -```python -# 1. List feature requests via the issue label (incl. milestone). -# `--paginate` must be a separate CLI flag — embedding it in the URL -# string sends it as a query parameter and silently truncates results -# at 100 issues. -def fetch_frs(): - out = subprocess.run( - ["gh", "api", "--paginate", - "repos/eclipse-score/score/issues?state=all" - "&labels=feature_request&per_page=100", - "--jq", - '.[] | [(.number|tostring), .title,' - ' ((.labels // []) | map(.name) | join(",")),' - ' ((.milestone.title // ""))] | @tsv'], - capture_output=True, text=True, timeout=120) - assert out.returncode == 0, f"gh api failed: {out.stderr}" - return [tuple(line.split("\t")) for line in out.stdout.splitlines() if line] - -def in_scope(milestone: str) -> bool: - s = milestone.lower().replace(" ", "") - return ("0.5" in s) or ("1.0" in s) - -# 2. Pull Status per issue from Project V2 #4 -PROJECT_FR_ID = "PVT_kwDOCy9hX84Auo7w" -def fetch_fr_project_status() -> dict[str, str]: - q = ('query($endCursor:String){node(id:"' + PROJECT_FR_ID + '"){' - '... on ProjectV2{items(first:100, after:$endCursor){' - 'pageInfo{hasNextPage endCursor} ' - 'nodes{content{... on Issue{number repository{nameWithOwner}}} ' - 'fieldValues(first:20){nodes{... on ProjectV2ItemFieldSingleSelectValue' - '{name field{... on ProjectV2SingleSelectField{name}}}}}}}}}}') - out = subprocess.run( - ["gh","api","graphql","--paginate","-f", "query="+q, - "--jq", - '.data.node.items.nodes[] | ' - 'select(.content.repository.nameWithOwner=="eclipse-score/score") | ' - '[(.content.number|tostring), ' - '((.fieldValues.nodes[]|select(.field.name=="Status")|.name) // "—")] | @tsv'], - capture_output=True, text=True, timeout=120) - return dict(line.split("\t",1) for line in out.stdout.splitlines() if "\t" in line) -``` - -Status-field options (from project schema) and the recommended emoji / -ranking the cell uses to pick the headline: - -| Project Status | Emoji | Rank | -|---------------------|:-----:|:----:| -| `Accepted` / `Done` | ✅ | 0 | -| `In Progress` | 🔄 | 1 | -| `In Review` | 🔄 | 1 | -| `Ready for Review` | 🔄 | 1 | -| `Changes Requested` | 🔄 | 1 | -| `Draft` | 📝 | 2 | -| `POC Needed` | 🧪 | 3 | -| `Rejected` | ❌ | 4 | -| _not in project_ | ❔ | 5 | - -Cell layout (RST): - -```rst - - ✅ Accepted - - | `#914 `__ — ✅ Accepted [v1.0] — Feature Request for SOME/IP Gateway - | `#549 `__ — ✅ Accepted [v0.5 Certifiable] — Feature request: common libraries for IPC and Logging -``` - -Each FR line is `\`#NNN \`__ — [] — `. -The issue title is taken verbatim from the GitHub `.title` field (already -fetched by `fetch_frs()`). - -Module attribution mapping. **Always** combine the label-based hits and -the title-keyword hits (deduplicated by issue number) — do **not** treat -the keyword set as a fallback that only fires when the `ft:*` query is -empty. Older feature requests pre-date the `ft:*` label scheme and only -match by title keyword (e.g. `#69 "Feature Request for IPC"` for -Communication carries `feature_request` + `community:architecture` + -`planned-for:0.5` but no `ft:communication`); skipping the keyword pass -when `ft:*` already produced hits causes such issues to silently disappear -from PA1. - -```python -FT_LABEL = { - "Baselibs": "ft:baselibs", - "Communication": "ft:communication", - "Logging": "ft:logging", - "Persistency": "ft:persistency", - "Config Mgmt": "ft:config_management", - "Lifecycle": "ft:health&lifecycle", - "Security/Crypto": "ft:security&crypto", -} -KW_FALLBACK = { - "Baselibs": ["baselib", "common librar", "abi compatible", "json parser"], - "Communication": ["ipc", "streaming", "record and replay"], - "Logging": ["logging"], - "Persistency": ["persistency", " kvs"], - # Leading space is intentional: avoids matching "runtime", "realtime", - # "datetime" etc. Do NOT "fix" by stripping it. - "Time": [" time"], - "Some/IP": ["some/ip", "someip", "some_ip"], - "Diagnostic Services": ["diagnos"], - "NM": ["network management"], -} -``` - -Render up to ~6 hits per cell. If a module has zero matches, render -`❌ Open`. The older label `contribution request` exists too but tracks -formal contribution intent, not feature scope — **do not** use it for PA1. - -> **Manual overrides — apply *after* the automated label∪keyword union -> has produced its hit set:** -> -> - **`#549` "common libraries for IPC and Logging"** is rendered **only -> under Baselibs**, even though its title contains both "IPC" and -> "Logging" (which would otherwise match Communication and Logging). -> Drop `#549` from the Communication and Logging cells. -> - **`#757` "Feature request for qualified json-parser"** belongs to -> **Baselibs** (label `ft:baselibs`). It has **no GitHub milestone**, -> so the standard milestone filter (`"0.5"|"1.0" in title`) excludes -> it; force-include it for Baselibs and render it without the `[…]` -> milestone bracket. -> - **Communication scope is local IPC only.** Drop `#914` (SOME/IP -> Gateway → Some/IP module) and `#917` (ABI compatible datatypes → -> Baselibs) from the Communication cell, even though their title -> keywords (`some/ip`, `abi compatible`) or labels could attribute -> them. Communication renders only `#69 — Feature Request for IPC`. diff --git a/.github/skills/overall-status/references/pa2-requirements.md b/.github/skills/overall-status/references/pa2-requirements.md deleted file mode 100644 index 52e9736becf..00000000000 --- a/.github/skills/overall-status/references/pa2-requirements.md +++ /dev/null @@ -1,76 +0,0 @@ -# Process Area 2 — Requirements Engineering - -| Property | Value | -|---|---| -| sphinx-needs tag | `requirements_engineering` | -| Cross-reference label | `overall_status_pa2` | -| Columns | Feature Req · Component Req · Req. Inspection | -| Progress figure | `pa2_impl_progress.svg` (`720px`) | - -This PA counts sphinx-needs directive blocks per -[common.md C3](./common.md#c3-counting-model). For shared conventions (cell -layout, source links, rollout-status row, pie chart row, progress figure -embedding) see [common.md C4](./common.md#c4-rst-formatting-rules). - ---- - -## Status criteria - -| Deliverable | `✅ Available` | `🔄 …` | `❌ Open` | -|---|---|---|---| -| **Feature Req** | `valid = total` per [C3](./common.md#c3-counting-model) | files exist, not all valid | no `feat_req` directives in `docs/features//**` | -| **Component Req** | `valid = total` per [C3.2](./common.md#c32-component-requirements-split-rendering) | mixed | no `comp_req`/`aou_req` directives, and no TRLC stand-in | -| **Req. Inspection** | every `chklst_req_inspection.rst` has `:status: valid` | mixed | no checklists | - ---- - -## Directive types & counting - -| Column | `count_files` kind | Directive types | -|---|---|---| -| Feature Req | `feat_req` | `feat_req` | -| Component Req | `comp_req` | `comp_req`, `aou_req` (rendered split via `comp_req_cell`, see [C3.2](./common.md#c32-component-requirements-split-rendering)) | -| Req. Inspection | `chklst` | document `:status:` of each `chklst_req_inspection.rst` (see [C3.3](./common.md#c33-inspections)) | - -- AoUs (`aou_req`) count for **Component** Req only, never for Feature Req. -- **Communication** keeps real component requirements in - `score/mw/com/requirements/component_requirements/component_requirements_ipc.trlc` - (`.trlc`, not parsed) — render the Component Req cell as - `0/0 comp_req [TRLC]` plus a link to the `.trlc` file (see - [C4.2](./common.md#c42-source-links--mandatory)). -- **Per-link status markers (Req. Inspection):** prefix every - `chklst_req_inspection.rst` link with ✅/🔄/❌ by its document `:status:` - (count of ✅ must equal the `valid` numerator) — see - [common.md C4.2.1](./common.md#c421-per-link-status-markers--inspection--report-cells-mandatory). - ---- - -## Path filters - -Cross-cutting rules (two-repo aggregation, Communication-vs-Some/IP -separation, Lifecycle complexity) are in -[common.md Step 4](./common.md#step-4--path-filters). The per-module filters -for the **Feature Req** and **Component Req** columns: - -| Module | Deliverable | Repo | Filter (`lambda p: ...`) | -|---|---|---|---| -| Baselibs | Feat. Req | score | `'features/baselibs' in p and 'requirements' in p and p.endswith('.rst') and 'chklst' not in p` | -| Baselibs | Comp. Req | score | `'modules/baselibs' in p and 'requirements' in p and p.endswith('.rst') and 'chklst' not in p` | -| Baselibs | Req. Inspection | score | `'baselibs' in p and 'chklst_req_inspection' in p` | -| Communication | Feat. Req | score | `'features/communication' in p and 'requirements' in p and 'some_ip_gateway' not in p and …` | -| Communication | Comp. Req | score | `'modules/communication' in p and 'requirements' in p and 'some_ip_gateway' not in p and …` | -| Logging | Feat. Req | score | `('features/logging' in p or 'features/analysis-infra/logging' in p) and 'requirements' in p and …` | -| Logging | Comp. Req | score | `'modules/logging' in p and 'requirements' in p and …` | -| Persistency | Feat. Req | score | `'features/persistency' in p and 'requirements' in p and …` | -| Persistency | Comp. Req | persistency | `'kvs' in p and 'requirements' in p and …` | -| Lifecycle | Feat. Req | score | `'features/lifecycle' in p and 'requirements' in p and …` *(must walk subfolders)* | -| Lifecycle | Comp. Req | lifecycle | `'module' in p and 'requirements' in p and …` | -| Time / Config Mgmt / Sec.Crypto | Feat. Req | score | `'features/' in p and 'requirements' in p and …` | - -> Standard `path_filter` tail for directive counting: -> `… and p.endswith('.rst') and 'chklst' not in p`. Inspection filters use -> `'chklst_req_inspection' in p` instead. - -> **Some/IP** keeps `comp_req` partly in `docs/requirements/component/**` -> and partly in `docs/tc8_conformance/requirements.rst` (own repo -> `eclipse-score/inc_someip_gateway`) — combine both. diff --git a/.github/skills/overall-status/references/pa3-architecture.md b/.github/skills/overall-status/references/pa3-architecture.md deleted file mode 100644 index 483b8718230..00000000000 --- a/.github/skills/overall-status/references/pa3-architecture.md +++ /dev/null @@ -1,76 +0,0 @@ -# Process Area 3 — Architecture Design - -| Property | Value | -|---|---| -| sphinx-needs tag | `architecture_design` | -| Cross-reference label | `overall_status_pa3` | -| Columns | Feature Arch · Component Arch · Arch. Inspection | -| Progress figure | `pa3_arch_progress.svg` (`720px`) | - -This PA counts sphinx-needs directive blocks per -[common.md C3](./common.md#c3-counting-model). For shared conventions (cell -layout, source links, rollout-status row, pie chart row, progress figure -embedding) see [common.md C4](./common.md#c4-rst-formatting-rules). - ---- - -## Status criteria - -| Deliverable | `✅ Available` | `🔄 …` | `❌ Open` | -|---|---|---|---| -| **Feature Arch** | `valid = total` per [C3](./common.md#c3-counting-model) | mixed | no matching directives | -| **Component Arch** | `valid = total` per [C3](./common.md#c3-counting-model) | mixed | no matching directives | -| **Arch. Inspection** | every `chklst_arc_inspection.rst` valid | mixed | no checklists | - ---- - -## Directive types & counting - -| Column | `count_files` kind | Directive types | -|---|---|---| -| Feature Arch | `feat_arc` | `feat`, `feat_arc`, `feat_arc_sta`, `feat_arc_dyn` | -| Component Arch | `comp_arc` | `comp`, `comp_arc`, `comp_arc_sta`, `comp_arc_dyn`, `logic_arc_int`, `logic_arc_int_op`, `real_arc_int`, `real_arc_int_op` | -| Arch. Inspection | `chklst` | document `:status:` of each `chklst_arc_inspection.rst` (see [C3.3](./common.md#c33-inspections)) | - -Never counted as Arch directives: `stkh_req`, `tool_req`, `document`, -`needtable`, `needpie`, `needextend`, `figure`, `uml`, `note`, `attention`, -`toctree`, `grid`. - -- **Per-link status markers (Arch. Inspection):** prefix every - `chklst_arc_inspection.rst` link with ✅/🔄/❌ by its document `:status:` - (count of ✅ must equal the `valid` numerator) — see - [common.md C4.2.1](./common.md#c421-per-link-status-markers--inspection--report-cells-mandatory). - ---- - -## Path filters - -Cross-cutting rules (two-repo aggregation, Communication-vs-Some/IP -separation, Lifecycle complexity) are in -[common.md Step 4](./common.md#step-4--path-filters). The per-module filters -for the **Feature Arch** and **Component Arch** columns: - -| Module | Deliverable | Repo | Filter (`lambda p: ...`) | -|---|---|---|---| -| Baselibs | Feat. Arch | score | `'features/baselibs' in p and 'architecture' in p and p.endswith('.rst') and 'chklst' not in p` | -| Baselibs | Comp. Arch | score | `'modules/baselibs' in p and 'architecture' in p and p.endswith('.rst') and 'chklst' not in p` | -| Baselibs | Arch. Inspection | score | `'baselibs' in p and 'chklst_arc_inspection' in p` | -| Communication | Feat. Arch | score | `'features/communication' in p and 'architecture' in p and 'some_ip_gateway' not in p and …` | -| Communication | Comp. Arch | score | `'modules/communication' in p and 'architecture' in p and 'some_ip_gateway' not in p and …` | -| Logging | Feat. Arch | score | `('features/logging' in p or 'features/analysis-infra/logging' in p) and 'architecture' in p and …` | -| Logging | Comp. Arch | score | `'modules/logging' in p and 'architecture' in p and …` | -| Persistency | Feat. Arch | score | `'features/persistency' in p and 'architecture' in p and …` | -| Persistency | Comp. Arch | persistency | `'kvs' in p and 'architecture' in p and …` | -| Lifecycle | Feat. Arch | score | `'features/lifecycle' in p and 'architecture' in p and …` *(must walk subfolders)* | -| Lifecycle | Comp. Arch | lifecycle | `'module' in p and 'architecture' in p and …` | -| Time / Config Mgmt / Sec.Crypto | Feat. Arch | score | `'features/' in p and 'architecture' in p and …` | - -> Standard `path_filter` tail for directive counting: -> `… and p.endswith('.rst') and 'chklst' not in p`. Inspection filters use -> `'chklst_arc_inspection' in p` instead. - -> **Component-level architecture may live in two repos at once.** Baselibs and -> Logging keep `comp_arc` directives both in `eclipse-score/score` -> (`modules//**`) **and** in their own repo (`docs//**`) — query -> both filters and **sum** the `(valid, total)` tuples. The same is true for -> Persistency `kvs`. diff --git a/.github/skills/overall-status/references/pa4-implementation.md b/.github/skills/overall-status/references/pa4-implementation.md deleted file mode 100644 index 87a2e44b911..00000000000 --- a/.github/skills/overall-status/references/pa4-implementation.md +++ /dev/null @@ -1,85 +0,0 @@ -# Process Area 4 — Implementation - -| Property | Value | -|---|---| -| sphinx-needs tag | `implementation` | -| Cross-reference label | `overall_status_pa4` | -| Columns | SW Dev Plan · Code · Detailed Design · Impl. Inspection | -| Progress figure | `pa4_impl_progress.svg` (`720px`) | - -This PA mixes a project-wide file check (SW Dev Plan), a byte-based LOC -estimate (Code), directive counting (Detailed Design) and checklist status -(Impl. Inspection). For shared conventions see -[common.md C4](./common.md#c4-rst-formatting-rules). - ---- - -## Status criteria - -| Deliverable | `✅ Available` | `🔄 …` | `❌ Open` | -|---|---|---|---| -| **SW Dev Plan** | `eclipse-score/score` has `docs/platform_management_plan/software_development.rst` (project-wide; same status in every row) | — | file absent | -| **Code** | source files exist outside `docs/` | — | none found | -| **Detailed Design** | `valid = total` per [C3](./common.md#c3-counting-model) over `dd*` directives | mixed | none | -| **Impl. Inspection** | every `chklst_impl_inspection.rst` / `chklst_dd_inspection.rst` valid | mixed | no checklists | - ---- - -## Directive types & counting - -| Column | `count_files` kind | Directive types / method | -|---|---|---| -| SW Dev Plan | — | presence check of `docs/platform_management_plan/software_development.rst` in `eclipse-score/score`; project-wide → identical status in every row | -| Code | — | LOC estimate (see below) | -| Detailed Design | `dd` | `dd`, `dd_sta`, `dd_dyn` | -| Impl. Inspection | `chklst` | document `:status:` of each `chklst_impl_inspection.rst` / `chklst_dd_inspection.rst` (see [C3.3](./common.md#c33-inspections)) | - -- **Per-link status markers (Impl. Inspection):** prefix every - `chklst_impl_inspection.rst` / `chklst_dd_inspection.rst` link with - ✅/🔄/❌ by its document `:status:` (count of ✅ must equal the `valid` - numerator) — see - [common.md C4.2.1](./common.md#c421-per-link-status-markers--inspection--report-cells-mandatory). - -### Lines of Code (Code column) - -LOC counts every line in source files (`.cpp .h .c .rs .py`) outside `docs/`, -`third_party/`, and `bazel-*/`, then rounds to the nearest 100. - -> **Method.** The per-cell tracker uses the **same byte-÷-30 approximation** -> as the SVG charts (`sum(blob.size for path in tree if is_src(path)) / 30`, -> see [common.md C6.2](./common.md#c62-metrics--what-each-chart-sums)). The -> `is_src` filter in C6.2 is authoritative for what counts as a source file -> (extensions and the `docs/`, `third_party/`, `bazel-*/` exclusions). Expect -> ±10 % vs. `cloc` (see [common.md C7](./common.md#c7-limitations)). - -```rst - - ✅ Available (~12,500 LOC) ` >`__ -``` - -The link label MUST be the bare repository name (e.g. `baselibs`, -`communication`, `inc_time`), not the literal word `repo`. The **Code cell** -links the **repository root** (see -[common.md C4.2](./common.md#c42-source-links--mandatory)). - ---- - -## Path filters - -Cross-cutting rules are in -[common.md Step 4](./common.md#step-4--path-filters). The per-module filters -for the **Detailed Design** column (`Code` uses the repo root + `is_src`; SW -Dev Plan is a single project-wide file): - -| Module | Deliverable | Repo | Filter (`lambda p: ...`) | -|---|---|---|---| -| Baselibs | Detailed Design | score | `'modules/baselibs' in p and 'detailed_design' in p and p.endswith('.rst') and 'chklst' not in p` | -| Baselibs | Impl. Inspection | score | `'baselibs' in p and ('chklst_impl_inspection' in p or 'chklst_dd_inspection' in p)` | -| Communication | Detailed Design | score | `'modules/communication' in p and 'detailed_design' in p and 'some_ip_gateway' not in p and …` | -| Logging | Detailed Design | score / logging | `'modules/logging' in p and 'detailed_design' in p and …` (query both repos, sum) | -| Persistency | Detailed Design | persistency | `'kvs' in p and 'detailed_design' in p and …` | -| Lifecycle | Detailed Design | lifecycle | `'module' in p and 'detailed_design' in p and …` | -| Time / Config Mgmt / Sec.Crypto | Detailed Design | score | `'features/' in p and 'detailed_design' in p and …` | - -> Standard `path_filter` tail for directive counting: -> `… and p.endswith('.rst') and 'chklst' not in p`. Inspection filters match -> `'chklst_impl_inspection' in p or 'chklst_dd_inspection' in p`. diff --git a/.github/skills/overall-status/references/pa5-verification.md b/.github/skills/overall-status/references/pa5-verification.md deleted file mode 100644 index de8183ca0bf..00000000000 --- a/.github/skills/overall-status/references/pa5-verification.md +++ /dev/null @@ -1,217 +0,0 @@ -# Process Area 5 — Verification - -| Property | Value | -|---|---| -| sphinx-needs tag | `verification` | -| Cross-reference label | `overall_status_pa5` | -| Columns | Unit Tests · C0/C1 Cov · Comp. IT · Feat. IT · Static · Dynamic · Module Ver. Rpt | -| Progress figure | `pa5_verification_progress.svg` (`1080px` — 1.5× standard width) | - -This PA combines test discovery, CI coverage data, static/dynamic analysis CI -status and the module verification report. For shared conventions see -[common.md C4](./common.md#c4-rst-formatting-rules). - ---- - -## Status criteria - -| Deliverable | `✅ Available` | `🔄 …` | `❌ Open` | -|---|---|---|---| -| **Unit Tests** | repo has `_test.cpp` / `_test.py` / `tests/` | — | none | -| **C0/C1 Coverage** | C0 = C1 = 100 % | data exists (any %) | not in `reference_integration` CI | -| **Comp. Integration Tests** | tests in module's own repo | — | none | -| **Static Analysis** | zero-tolerance per-module CI workflow passes on `main` (clang-tidy / Clippy) | tools configured but no CI enforcement | no static-analysis config | -| **Dynamic Analysis** | zero-tolerance sanitizer CI passes on `main` | — | no sanitizer CI | -| **Module Ver. Report** | `verification/module_verification_report.rst` `:status: valid` and contains data | `:status: draft` | absent or template only | -| **Platform Ver. Report** | _no column_ — the platform verification report exists **once** for the entire platform; do not render it as a per-module column. Add it as a **bold one-liner immediately after the PA5 table** (see [Platform Verification Report](#platform-verification-report)). | | | - -- **Per-link status marker (Module Ver. Report):** prefix the - `module_verification_report.rst` link with ✅/🔄/❌ by its document - `:status:` — see - [common.md C4.2.1](./common.md#c421-per-link-status-markers--inspection--report-cells-mandatory). - -> **Static / Dynamic Analysis cells render the status only, no source-code -> link.** The PA5 link discipline of -> [common.md C4.2](./common.md#c42-source-links--mandatory) does not apply to -> these two columns: there is no canonical per-module artefact to point at (CI -> workflows live in the org-wide `.github` repo, not per module). - ---- - -## Test-count rendering - -For the **Unit Tests**, **Comp. IT** and **Feat. IT** columns, the test count -goes on its **own line-block line** below the status — never on the same line -as `✅ Available` (see -[common.md C4.1](./common.md#c41-cell-layout)). Use `plur()` for correct -singular/plural (`1 test` vs `N tests`). - ---- - -## Test-counting pitfalls (read before touching Unit / Comp. IT numbers) - -Test discovery is the **most error-prone** part of PA5. Verified failure -modes (each has produced a wrong number in the past — Logging was `340` -unit / `❌` comp when the truth is `650` / `8`): - -1. **Count all components of a module, not just one subtree.** Two-component - modules keep tests in several roots — e.g. Logging has **both** - `score/datarouter/**` (~324 cases) **and** `score/mw/log/**` (~326). - Missing one silently halves the count. Always walk the *whole* repo tree. -2. **Rust inline unit tests live in `src/`, not in `tests/`.** Counting only - files under a `test/`-style path (the old `is_test_path`) **misses every - `#[cfg(test)] mod tests { #[test] … }`** in `src/*.rs`. Lifecycle has - **235** such inline tests, all in `src/`. Count `#[test]` / - `#[tokio::test]` in **all** `.rs` files (outside `docs/`, `third_party/`, - `bazel-*`). -3. **Unit vs. Component/Integration is per-repo convention, not one rule.** - There is no single reliable heuristic; classify with the module's own - convention: - - | Module | Component/Integration tests live in | Count | - |---|---|---| - | Logging | `score/test/component/**` (Bazel `tags=["integration"]`, ITF `py_*_itf_test`) | 8 | - | Persistency | `tests/test_cases/tests/test_cit_*.py` (**CIT** = Component Integration Test) | 44 | - | Baselibs | `score/os/utils/test/mqueueintegration_test.cpp` | 13 | - | Communication | `score/mw/com/test/**/integration_test/*.py` | 63 | - | Time | `score/**/tests/integration_tests/**` | 4 | - | Security/Crypto | `tests/integration_tests/integration_test.py` | 11 | - | Some/IP | `tests/integration_test/**` + `quality/integration_testing/**` | 21 | - - A **Rust `tests/` directory is a *crate integration* test**, but a - C++ component's `tests/` subfolder (e.g. `futurecpp/tests/`) is that - component's **unit** tests — do **not** blanket-classify `tests/` as - integration. -4. **Two different "test count" metrics exist — do not mix them.** - - *Test-case declarations* — count of `TEST*(` / `#[test]` / `def test_` - macros (Logging 650, Baselibs ~5.7k). - - *Executed test cases* — the same expanded over `TYPED_TEST` types and - parametrised instances (Baselibs `25833`). Bazel CI reports *test - **targets*** (`Executed N tests` ≈ 297), a **third** number. - - The current table predominantly uses the **executed-case** metric. When a - single cell is corrected, match the metric already used in that column; - do **not** silently switch the whole column to a different metric. - -> **When in doubt, verify a suspicious cell manually** against the repo at -> the pinned ref (fetch the test files, count) before overwriting — a -> `✅ Available` test cell dropping to `❌ Open` is almost always a discovery -> bug, not a real regression (see the plausibility gate in -> [common.md Step 5b](./common.md#5b-plausibility--diff-each-cell)). - ---- - -## Coverage CI keys - -Coverage data is read from the latest successful run of workflow id -`234977097` (`Code Quality & Documentation`), job `test_and_docs`, in -`eclipse-score/reference_integration`. - -| Tracker module | CPP key | Rust key | -|---|---|---| -| Baselibs | `score_baselibs_cpp` | `score_baselibs_rust_rust` | -| Communication | `score_communication_cpp` | — | -| Logging | `score_logging_cpp` | `score_logging_rust` | -| Persistency | `score_persistency_cpp` | `score_persistency_rust` | -| Lifecycle | `score_lifecycle_health_cpp` | `score_lifecycle_health_rust` | -| Time / Config Mgmt / Security/Crypto | not in CI | — | - -```bash -RUN_ID=$(gh api "repos/eclipse-score/reference_integration/actions/workflows/234977097/runs?per_page=10" \ - --jq '[.workflow_runs[] | select(.conclusion=="success")][0].id') -JOB_ID=$(gh api "repos/eclipse-score/reference_integration/actions/runs/$RUN_ID/jobs" \ - --jq '.jobs[] | select(.name=="test_and_docs") | .id') -gh api "repos/eclipse-score/reference_integration/actions/jobs/$JOB_ID/logs" \ - | grep -A50 "COVERAGE ANALYSIS SUMMARY" -``` - -The log emits a single Python-dict dump after the -`=== QR: COVERAGE ANALYSIS SUMMARY ===` banner, e.g. - -```text -{'score_baselibs_cpp': {'branches': '60.3%', 'exit_code': 0, 'functions': '85.4%', 'lines': '92.3%'}, - 'score_logging_rust': {'branches': 'NA', 'exit_code': 0, 'functions': '99.5%', 'lines': '74.4%'}, - ...} -``` - -Parse it with this regex (works for both cpp and rust keys; either field may be `'NA'`): - -```python -COV_RE = re.compile( - r"'(score_[a-z_]+)':\s*\{[^}]*'branches':\s*'([^']*)'" - r"[^}]*'functions':\s*'([^']*)'" - r"[^}]*'lines':\s*'([^']*)'") -``` - -C0 = line coverage, C1 = branch coverage. Rust coverage reports **line only**. -Modules not yet integrated into the `reference_integration` CI render `❌ Open` -(currently: Time, Config Mgmt, Security/Crypto, Some/IP — update list each -regen). - ---- - -## Static / dynamic analysis CI table - -> **Reader notes (rendered in the RST as `.. note::` blocks placed -> immediately after the PA5 `Rollout status` row and before -> the PA5 list-table — keep them in sync when regenerating):** -> -> 1. **C0/C1 Coverage source.** Coverage data comes from the -> `reference_integration` CI (*Code Quality & Documentation* workflow, -> `bazel coverage --config=ferrocene-coverage`). C0 = line coverage, -> C1 = branch coverage. Rust coverage reports **line only**. Modules -> not yet integrated into the `reference_integration` CI render -> `❌ Open` (currently: Time, Config Mgmt, Security/Crypto, Some/IP — -> update list each regen). -> 2. **Static / Dynamic semantics.** Static = per-module clang-tidy -> (C++) / Clippy (Rust) workflows; Dynamic = sanitizer workflows -> (`--config=asan_ubsan_lsan`, `--config=tsan`). All listed workflows -> are **zero-tolerance** → a passing `main` ⇒ `✅ 0 findings`. -> Central CodeQL runs in -> `reference_integration/.github/workflows/codeql-multiple-repo-scan.yml` -> (finding counts require the GitHub Security tab). - -| Module | Static | Dynamic | -|---|---|---| -| Baselibs | ✅ `lint.yml` (clang-tidy) | ✅ `sanitizers_linux.yml` (ASan/UBSan/LSan) | -| Communication | 🔄 Configured (no CI) | ✅ ASan/UBSan/LSan + TSan | -| Logging | ❌ | ❌ | -| Persistency | ✅ `clippy.yml` | ❌ | -| Time | ❌ | ❌ | -| Config Mgmt | ✅ `static-analysis.yml` (clang-tidy) | ❌ | -| Lifecycle | ✅ `lint_clippy.yml` | ❌ | -| Security/Crypto | ❌ | ❌ | - -Central CodeQL runs in `reference_integration/.github/workflows/codeql-multiple-repo-scan.yml`. - -> **Link discipline:** The **Static** column renders the workflow YAML -> as a line-block link below the status emoji (so reviewers can click -> through to the actual configuration). The **Dynamic** column renders -> the **status only** (no link) — the dynamic-analysis CI is more -> heterogeneous (multiple sanitizer runs per repo, sometimes split across -> several workflow files) and listing one representative file would be -> misleading. Keep this asymmetry when regenerating. - ---- - -## Platform Verification Report - -The platform verification report is a **single project-wide deliverable** — it -does **not** get a per-module column. Render it as a prominent admonition -immediately after the PA5 list-table (styled via `.platform-ver-report` in -`docs/_assets/custom.css`): - -```rst -.. admonition:: Platform Verification Report - :class: important platform-ver-report - - `platform_ver_report - / - docs/score_releases/verification/platform_ver_report.rst>`__ - — 🔄 **Draft** (single project-wide deliverable) -``` - -Update the status emoji + label to match the report's current `:status:` field -(✅ **Valid** / 🔄 **Draft**). Do **not** revert this to a plain -`**bold paragraph**` — the admonition class is what makes it visually -prominent. See [common.md C4.2](./common.md#c42-source-links--mandatory). diff --git a/.github/skills/progress-overview/SKILL.md b/.github/skills/progress-overview/SKILL.md new file mode 100644 index 00000000000..42cfa961200 --- /dev/null +++ b/.github/skills/progress-overview/SKILL.md @@ -0,0 +1,107 @@ +--- +name: progress-overview +description: "How-to reference for the Release-wide Progress Overview (docs/s_core_v_1/releases/progress_overview.rst): per-release progress charts next to the release notes. Explains the two scripts (collect_metrics.py, generate_progress_charts.py), the counting model, the forecast column and the module/colour mapping. Use when refreshing the progress overview after a release, a known_good.json ref bump, or when adding a module. The progress-overview agent orchestrates the run; this skill holds the 'how'." +argument-hint: "optional: release name, e.g. v1.0" +--- + +# Release-wide Progress Overview — the "how" + +`docs/s_core_v_1/releases/progress_overview.rst` is a **thin page** in the +Releases section, next to the release notes: an intro, five +`figure::` directives and links to the verification reports. It carries no +per-module tables — those were replaced by the **Platform Verification Report** +and the per-module **Module Verification Reports** +(`docs/verification_report/`), which are generated from the needs data of the +documentation build and are the authoritative source for the *current* state. + +The only thing this page owns is the **multi-release trend**. Refreshing it is +two commands. + +## Files + +| File | Role | +|---|---| +| `scripts/progress_overview/collect_metrics.py` | counts every release from the module sources, writes the data file | +| `docs/s_core_v_1/releases/progress_overview_data.json` | generated data; safe to hand-tune, but a re-collect overwrites it | +| `scripts/progress_overview/generate_progress_charts.py` | renders the five SVGs; never hand-edit the SVGs | +| `docs/_assets/pa{2,3,4,5}_*.svg` | generated output | +| `docs/s_core_v_1/releases/progress_overview.rst` | only the *data collection date* changes on a refresh | + +## Procedure + +```bash +export GITHUB_PAT=... # for tag / pin lookups +python3 scripts/progress_overview/collect_metrics.py # ~5 min, clones to /tmp +python3 scripts/progress_overview/generate_progress_charts.py +``` + +Then bump the date in the `.. important::` admonition of `progress_overview.rst` +to the `data_collected` value, and verify with +`python3 scripts/progress_overview/generate_progress_charts.py --check`. + +The first run clones ~11 bare repositories (~1.8 GB) into +`/tmp/progress_overview_repos`; later runs only fetch. Use `--cache` to relocate. + +## How the columns are built + +One column per `reference_integration` release tag, ordered by version (a +pre-release such as `v0.5.0-beta` before its final release, `v0.10.0` after +`v0.9.0`), plus a trailing forecast column: + +- **Release columns** — the tag's `known_good.json` gives each module's pin. + Entries carrying only a `version` are resolved to `v` in the module's + own repository. Modules that were never pinned (Security/Crypto, Some/IP) fall + back to the commit on `main` as of the release date. +- **Forecast column** (` (forecast)`) — the **working tree's** + `known_good.json`, i.e. today's state, labelled as the projection for the next + release. The next release is read from the milestones of + [eclipse-score/score](https://github.com/eclipse-score/score/milestones): the + lowest `v.` milestone after the latest release tag (after + `v0.9.0` it is `v0.10`, after `v0.10.0` it is `v1.0`). Never hard-code it; if + the milestone is missing the collector stops, create the milestone instead. + +Every bar is stacked by module. `MODULE_COLORS` is the single source of truth +for the colour of a module and is shared by every chart, so a module keeps its +colour throughout the page; it also fixes the legend order. Within a bar the +slots are sorted by size, largest at the bottom. Modules contributing `0` are +dropped from the stack and the legend. + +## Counting model + +Per module, metrics are summed over **its own repository** plus the matching +feature paths in `eclipse-score/score` (`SCORE_PATHS` fragments, which cover +both the old `modules/` and the current `features/` layout). +Communication excludes `some_ip_gateway`, which is its own module. + +| Metric | Counted as | +|---|---| +| `req` | `.. feat_req::` / `.. comp_req::` / `.. aou_req::` in `.rst`, plus `CompReq` / `FeatReq` / `AoU` / `ExternalCompReq` / `AssumedSystemReq` objects in `.trlc` | +| `arc` | `.. feat*::` / `.. comp*::` / `.. logic_arc_int*::` / `.. real_arc_int*::` in `.rst` | +| `loc` | newlines in `.cpp .cc .cxx .c .h .hpp .hh .rs .py`, excluding `docs/`, `third_party/`, `bazel-*` | +| `unit_tests` | test definitions (`TEST(` / `TEST_F(` / `TEST_P(` / `TYPED_TEST(` / `TYPED_TEST_P(` / Rust `#[test]` / Python `def test_`) outside an `INT_TEST_DIRS` directory | +| `int_tests` | the same patterns **inside** a directory named `component`, `integration`, `integration_test(s)`, `integration_testing`, `itf`, `feature_integration_tests` or `platform_integration_tests` | + +The integration count also includes `reference_integration`'s own feature tests. +Those are read from this checkout (not from a clone) at the release tag, and the +module is taken from the path segment below `feature_integration_tests/` or +`platform_integration_tests/` via `RI_ALIASES`. Only the test count is taken +from there — never the lines of code, which belong to the modules. + +Counts are **totals**, irrespective of `:status:` — the charts visualise scope +growth, not validation maturity. `chklst_*.rst` files are excluded. + +## Rules + +- Keep the cross-reference labels `progress_overview_requirements`, + `progress_overview_architecture`, `progress_overview_implementation` and + `progress_overview_verification` — `pi1.rst`, `pi2.rst` and `pi3.rst` link to them. +- The page is listed first in the toctree of `releases.rst`, before the release + notes (`release_note_*` glob). +- Never hand-edit an SVG; regenerate it. +- Re-collect **all** columns rather than appending one by hand. The value of the + series is that every column used the same counter. +- Adding a module means one entry in `MODULES` (repo, `known_good` keys, score + path fragments), one in `MODULE_COLORS` and one in `RI_ALIASES`. +- These numbers are source-derived and will **not** match CI dashboards. Test + counts are test definitions, not parameterised CI runs; expect the CI unit + test total to be several times larger. Say so if a reader compares them. diff --git a/docs/_assets/custom.css b/docs/_assets/custom.css index 7c4765e8d9f..bce680a555d 100644 --- a/docs/_assets/custom.css +++ b/docs/_assets/custom.css @@ -168,7 +168,7 @@ body.wide-content-page .bd-content .bd-article-container { } /* --------------------------------------------------------------------------- - * RST line-blocks inside list-tables (used in overall_status.rst PA cells): + * RST line-blocks inside list-tables: * Sphinx wraps the indented "| ..." continuation in a
, which * adds a left border and a tinted background. Inside a status table we want * those secondary lines (test counts, coverage values, links) to look like @@ -205,91 +205,3 @@ table .line-block .line { border: none !important; background: transparent !important; } - -/* --------------------------------------------------------------------------- - * Platform Verification Report admonition (overall_status.rst PA5): - * make this single project-wide deliverable visually prominent. - * ---------------------------------------------------------------------------*/ - -.admonition.platform-ver-report { - font-size: 1.15rem; - border-left: 6px solid #1a5fa8; - background-color: #eef4fb; - padding: 0.8rem 1rem; - margin: 1.2rem 0; -} - -.admonition.platform-ver-report > .admonition-title { - font-size: 1.25rem; - font-weight: 700; - color: #1a5fa8; - margin-bottom: 0.3rem; -} - -.admonition.platform-ver-report p { - margin: 0; - font-size: 1.1rem; -} - -/* --------------------------------------------------------------------------- - * Process / Implementation status headings (overall_status.rst): - * make rubric headings visually larger, and render the implementation - * status as a single inline row with a progress bar. - * ---------------------------------------------------------------------------*/ - -p.rubric.status-heading, -.rubric.status-heading { - font-size: 1.35rem; - font-weight: 700; - margin-top: 1.2rem; - margin-bottom: 0.6rem; - color: #1a5fa8; -} - -.impl-status-row { - display: flex; - flex-wrap: wrap; - align-items: center; - gap: 0.6rem; - font-size: 1.35rem; - font-weight: 700; - color: #1a5fa8; - margin: 1.2rem 0 0.8rem 0; -} - -.impl-status-row .impl-status-label { - white-space: nowrap; -} - -.impl-status-row .impl-status-icon { - font-size: 1.25rem; -} - -.impl-status-row .impl-status-percent { - min-width: 3.5rem; - text-align: right; -} - -.impl-status-row .impl-status-bar { - flex: 1 1 200px; - min-width: 160px; - max-width: 360px; - height: 14px; - background-color: #e3e8ef; - border: 1px solid #c0c8d4; - border-radius: 7px; - overflow: hidden; -} - -.impl-status-row .impl-status-fill { - height: 100%; - background: linear-gradient(90deg, #1a5fa8 0%, #4a90d9 100%); - border-radius: 6px 0 0 6px; -} - -.impl-status-row .impl-status-detail { - font-size: 1rem; - font-weight: 500; - color: #444; - white-space: nowrap; -} diff --git a/docs/_assets/pa2_impl_progress.svg b/docs/_assets/pa2_impl_progress.svg index 182eb13e681..e2753d39cde 100644 --- a/docs/_assets/pa2_impl_progress.svg +++ b/docs/_assets/pa2_impl_progress.svg @@ -1,88 +1,154 @@ - - PA2 Implementation — total Feature and Component Requirements per release - - - PA2 Implementation — total requirements per release (sum of all modules) - - - - - - - - - - - - - - - + + Requirements per release (feature + component) + Requirements per release (feature + component) + + + + + + + + + + - 0 - 100 - 200 - 300 - 400 - 500 - 600 - 700 - 800 + 0 + 200 + 400 + 600 + 800 + 1,000 + 1,200 + 1,400 - - - - - - - - 313 - 80 - v0.5.0-beta - - - - - - - 315 - 160 - v0.6.0 - - - - - - - 316 - 186 - v0.7.0 - - - - - - - 341 - 607 - v0.8 - - - - - - - 297 - 783 - v0.9 - - - + + Communication: 452 + 452 + Lifecycle: 95 + 95 + Persistency: 75 + 75 + Baselibs: 58 + Logging: 46 + Security/Crypto: 42 + Diagnostic Services: 22 + Time: 15 + Config Mgmt: 13 + Some/IP: 5 + 823 + v0.5.0-beta + + Communication: 458 + 458 + Baselibs: 103 + 103 + Lifecycle: 96 + 96 + Persistency: 75 + 75 + Config Mgmt: 51 + Logging: 46 + Security/Crypto: 42 + Diagnostic Services: 22 + Time: 15 + Some/IP: 5 + 913 + v0.6.0 + + Communication: 454 + 454 + Baselibs: 153 + 153 + Lifecycle: 96 + 96 + Config Mgmt: 80 + 80 + Persistency: 77 + 77 + Logging: 46 + Security/Crypto: 42 + Diagnostic Services: 22 + Time: 15 + Some/IP: 14 + 999 + v0.7.0 + + Communication: 553 + 553 + Baselibs: 161 + 161 + Lifecycle: 96 + 96 + Persistency: 76 + 76 + Config Mgmt: 74 + 74 + Logging: 68 + Security/Crypto: 55 + Diagnostic Services: 22 + Time: 15 + Some/IP: 14 + 1,134 + v0.8.0 + + Communication: 550 + 550 + Baselibs: 205 + 205 + Lifecycle: 100 + 100 + Config Mgmt: 83 + 83 + Persistency: 76 + 76 + Logging: 69 + 69 + Security/Crypto: 60 + Time: 27 + Diagnostic Services: 22 + Some/IP: 14 + 1,206 + v0.9.0 + + Communication: 551 + 551 + Baselibs: 208 + 208 + Lifecycle: 100 + 100 + Persistency: 85 + 85 + Config Mgmt: 83 + 83 + Logging: 69 + 69 + Security/Crypto: 60 + Time: 27 + Diagnostic Services: 22 + Some/IP: 14 + 1,219 + v0.10 (forecast) - - Feature Requirements - - Component Requirements + + Baselibs + + Communication + + Logging + + Persistency + + Time + + Config Mgmt + + Lifecycle + + Security/Crypto + + Diagnostic Services + + Some/IP diff --git a/docs/_assets/pa3_arch_progress.svg b/docs/_assets/pa3_arch_progress.svg index 883cf42b22e..a9be16b3faa 100644 --- a/docs/_assets/pa3_arch_progress.svg +++ b/docs/_assets/pa3_arch_progress.svg @@ -1,80 +1,131 @@ - - PA3 Architecture Design — total Feature and Component Architecture items per release - - - PA3 Architecture Design — total architecture items per release (sum of all modules) - - - - - - - - - - - + + Architecture elements per release (feature + component) + Architecture elements per release (feature + component) + + + + + + + + + + + - 0 - 80 - 160 - 240 - 320 + 0 + 50 + 100 + 150 + 200 + 250 + 300 + 350 + 400 - - - - - - - - 16 - 83 - v0.5.0-beta - - - - - - - 19 - 151 - v0.6.0 - - - - - - - 21 - 203 - v0.7.0 - - - - - - - 23 - 204 - v0.8 - - - - - - - 29 - 309 - v0.9 - - - + + Baselibs: 69 + 69 + Lifecycle: 46 + 46 + Communication: 15 + Persistency: 13 + Logging: 3 + 146 + v0.5.0-beta + + Baselibs: 118 + 118 + Lifecycle: 52 + 52 + Communication: 17 + Persistency: 15 + Logging: 4 + 206 + v0.6.0 + + Baselibs: 169 + 169 + Lifecycle: 52 + 52 + Communication: 20 + 20 + Persistency: 15 + Logging: 7 + Some/IP: 2 + 265 + v0.7.0 + + Baselibs: 172 + 172 + Security/Crypto: 55 + 55 + Lifecycle: 52 + 52 + Persistency: 23 + 23 + Communication: 20 + 20 + Logging: 10 + Some/IP: 6 + 338 + v0.8.0 + + Baselibs: 207 + 207 + Security/Crypto: 56 + 56 + Lifecycle: 53 + 53 + Persistency: 23 + 23 + Communication: 20 + 20 + Logging: 10 + Some/IP: 6 + Time: 5 + Config Mgmt: 1 + Diagnostic Services: 1 + 382 + v0.9.0 + + Baselibs: 209 + 209 + Security/Crypto: 57 + 57 + Lifecycle: 53 + 53 + Communication: 20 + 20 + Persistency: 16 + Logging: 10 + Some/IP: 10 + Time: 5 + Config Mgmt: 1 + Diagnostic Services: 1 + 382 + v0.10 (forecast) - - Feature Architecture - - Component Architecture + + Baselibs + + Communication + + Logging + + Persistency + + Time + + Config Mgmt + + Lifecycle + + Security/Crypto + + Diagnostic Services + + Some/IP diff --git a/docs/_assets/pa4_impl_progress.svg b/docs/_assets/pa4_impl_progress.svg index e41e9d40f99..86228a2604a 100644 --- a/docs/_assets/pa4_impl_progress.svg +++ b/docs/_assets/pa4_impl_progress.svg @@ -1,70 +1,144 @@ - - PA4 Implementation — estimated total Lines of Code per release - - - PA4 Implementation — estimated total Lines of Code per release - - - - - - - - - - - - + + Lines of code per release + Lines of code per release + + + + + + + + + + + + - 0 - 200k - 400k - 600k - 800k - 1000k + 0 + 100,000 + 200,000 + 300,000 + 400,000 + 500,000 + 600,000 + 700,000 + 800,000 + 900,000 - - - - - - - 569,578 - v0.5.0-beta - - - - - - 650,743 - v0.6.0 - - - - - - 689,601 - v0.7.0 - - - - - - 881,800 - v0.8 - - - - - - 1,060,000 - v0.9 - - + + Baselibs: 237,092 + 237,092 + Communication: 137,712 + 137,712 + Logging: 38,428 + Kyron: 32,359 + Lifecycle: 29,408 + Persistency: 13,205 + Config Mgmt: 11,325 + Some/IP: 2,801 + Time: 45 + 502,375 + v0.5.0-beta + + Baselibs: 235,880 + 235,880 + Communication: 159,545 + 159,545 + Logging: 42,057 + Kyron: 34,214 + Lifecycle: 33,424 + Persistency: 15,437 + Config Mgmt: 13,435 + Some/IP: 2,882 + Time: 45 + Security/Crypto: 45 + 536,964 + v0.6.0 + + Baselibs: 243,742 + 243,742 + Communication: 175,053 + 175,053 + Logging: 40,511 + Lifecycle: 39,823 + Kyron: 34,226 + Time: 20,469 + Some/IP: 17,652 + Persistency: 15,712 + Config Mgmt: 14,458 + Security/Crypto: 45 + 601,691 + v0.7.0 + + Baselibs: 269,746 + 269,746 + Communication: 191,617 + 191,617 + Lifecycle: 42,368 + Logging: 42,289 + Security/Crypto: 38,902 + Kyron: 34,249 + Some/IP: 28,584 + Time: 22,815 + Persistency: 15,761 + Config Mgmt: 14,917 + 701,248 + v0.8.0 + + Baselibs: 266,570 + 266,570 + Communication: 250,134 + 250,134 + Security/Crypto: 63,123 + 63,123 + Lifecycle: 53,917 + 53,917 + Logging: 42,866 + Kyron: 34,249 + Some/IP: 27,034 + Time: 23,536 + Persistency: 15,724 + Config Mgmt: 15,059 + 792,212 + v0.9.0 + + Baselibs: 272,674 + 272,674 + Communication: 255,766 + 255,766 + Security/Crypto: 75,293 + 75,293 + Lifecycle: 54,338 + 54,338 + Logging: 44,149 + Kyron: 34,245 + Some/IP: 32,003 + Time: 25,260 + Persistency: 16,078 + Config Mgmt: 15,059 + 824,865 + v0.10 (forecast) - - Estimated LOC = sum of source-file bytes / 30 (.cpp .cc .cxx .c .h .hpp .hxx .rs .py .proto .fbs) - + + Baselibs + + Communication + + Logging + + Persistency + + Time + + Config Mgmt + + Lifecycle + + Kyron + + Security/Crypto + + Some/IP diff --git a/docs/_assets/pa5_integration_test_progress.svg b/docs/_assets/pa5_integration_test_progress.svg new file mode 100644 index 00000000000..9c3f5ceb2a6 --- /dev/null +++ b/docs/_assets/pa5_integration_test_progress.svg @@ -0,0 +1,108 @@ + + Component and feature integration tests per release + Component and feature integration tests per release + + + + + + + + + + + + + 0 + 50 + 100 + 150 + 200 + 250 + 300 + 350 + + + Communication: 2 + Some/IP: 1 + 3 + v0.5.0-beta + + Communication: 30 + 30 + Persistency: 3 + Some/IP: 1 + 34 + v0.6.0 + + Communication: 42 + 42 + Persistency: 3 + Lifecycle: 3 + Some/IP: 1 + 49 + v0.7.0 + + Communication: 62 + 62 + Persistency: 50 + 50 + Lifecycle: 28 + 28 + Some/IP: 21 + 21 + Security/Crypto: 11 + Logging: 8 + 180 + v0.8.0 + + Communication: 86 + 86 + Lifecycle: 58 + 58 + Persistency: 50 + 50 + Some/IP: 22 + 22 + Security/Crypto: 10 + Logging: 8 + Baselibs: 6 + 240 + v0.9.0 + + Communication: 112 + 112 + Lifecycle: 59 + 59 + Persistency: 50 + 50 + Security/Crypto: 35 + 35 + Logging: 14 + Some/IP: 11 + Baselibs: 9 + Time: 1 + Kyron: 1 + 292 + v0.10 (forecast) + + + Baselibs + + Communication + + Logging + + Persistency + + Time + + Lifecycle + + Kyron + + Security/Crypto + + Some/IP + + diff --git a/docs/_assets/pa5_unit_test_progress.svg b/docs/_assets/pa5_unit_test_progress.svg new file mode 100644 index 00000000000..97df1b183cf --- /dev/null +++ b/docs/_assets/pa5_unit_test_progress.svg @@ -0,0 +1,137 @@ + + Unit tests per release + Unit tests per release + + + + + + + + + + + + + + 0 + 2,000 + 4,000 + 6,000 + 8,000 + 10,000 + 12,000 + 14,000 + 16,000 + + + Baselibs: 5,334 + 5,334 + Communication: 2,357 + 2,357 + Logging: 623 + Kyron: 452 + Persistency: 374 + Config Mgmt: 153 + Time: 4 + Some/IP: 4 + 9,301 + v0.5.0-beta + + Baselibs: 5,241 + 5,241 + Communication: 2,457 + 2,457 + Logging: 661 + Kyron: 455 + Persistency: 386 + Config Mgmt: 177 + Lifecycle: 37 + Time: 4 + Security/Crypto: 4 + Some/IP: 4 + 9,426 + v0.6.0 + + Baselibs: 5,417 + 5,417 + Communication: 2,623 + 2,623 + Logging: 638 + Kyron: 455 + Persistency: 386 + Time: 307 + Lifecycle: 266 + Some/IP: 263 + Config Mgmt: 183 + Security/Crypto: 4 + 10,542 + v0.7.0 + + Baselibs: 5,952 + 5,952 + Communication: 2,933 + 2,933 + Logging: 671 + Lifecycle: 468 + Kyron: 455 + Persistency: 386 + Some/IP: 368 + Time: 353 + Config Mgmt: 194 + Security/Crypto: 75 + 11,855 + v0.8.0 + + Baselibs: 5,730 + 5,730 + Communication: 3,929 + 3,929 + Lifecycle: 753 + Logging: 681 + Kyron: 455 + Persistency: 386 + Time: 374 + Some/IP: 345 + Security/Crypto: 273 + Config Mgmt: 194 + 13,120 + v0.9.0 + + Baselibs: 5,942 + 5,942 + Communication: 3,964 + 3,964 + Lifecycle: 752 + Logging: 698 + Kyron: 455 + Some/IP: 433 + Time: 417 + Persistency: 400 + Security/Crypto: 320 + Config Mgmt: 194 + 13,575 + v0.10 (forecast) + + + Baselibs + + Communication + + Logging + + Persistency + + Time + + Config Mgmt + + Lifecycle + + Kyron + + Security/Crypto + + Some/IP + + diff --git a/docs/_assets/pa5_verification_progress.svg b/docs/_assets/pa5_verification_progress.svg deleted file mode 100644 index dfdeb09722d..00000000000 --- a/docs/_assets/pa5_verification_progress.svg +++ /dev/null @@ -1,152 +0,0 @@ - - PA5 Verification — tests per release and current code coverage - - - PA5 Verification — test counts per release and current code coverage (sum of all 12 tracked modules) - - - - - Unit Tests - - - - - - - - - - - - 0 - 10k - 20k - 30k - - - - - 8399 - v0.5.0-beta - - - 8409 - v0.6.0 - - - 8718 - v0.7.0 - - - 30701 - v0.8 - - - 28989 - v0.9 - - - - - Integration Tests - - - - - - - - - - - - - - 0 - 100 - 200 - 300 - 400 - 500 - - - - - - v0.5.0-beta - 15 - 3 - - - - v0.6.0 - 43 - 13 - - - - v0.7.0 - 63 - 12 - - - - v0.8 - 192 - 54 - - - - v0.9 - 464 - 52 - - - - - Component - - Feature - - - - - - Code Coverage (now, weighted by # tests) - - - - - - - - - - - - 0% - 30% - 60% - 90% - - - - 100% - - - - - 93.1% - C0 (line) - - - 60.6% - C1 (branch) - - - - - v0.5.0-beta–v0.7.0: static GTEST/Rust/Python test-macro counts • v0.8–v0.9: reference-CI test-run counts (incl. parameterized expansions; Security/Crypto and Some/IP are not in the reference CI) — methods diverge, see note • Coverage: C++ line/branch coverage weighted by unit-test count - - diff --git a/docs/conf.py b/docs/conf.py index a1c839df8bd..185c8d4d33f 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -74,7 +74,7 @@ def _patch_needpie_suppress_legend() -> None: "secondary_sidebar_items": { "**": ["page-toc"], "feature_and_process_status": [], - "s_core_v_1/roadmap/overall_status": [], + "s_core_v_1/releases/progress_overview": [], }, "show_toc_level": 2, "navigation_with_keys": False, diff --git a/docs/integration_process/reference.rst b/docs/integration_process/reference.rst index 75a31518c1d..95e8703d59d 100644 --- a/docs/integration_process/reference.rst +++ b/docs/integration_process/reference.rst @@ -140,9 +140,9 @@ The consolidated outputs published by the integration. They are built by - Per-module Rust line coverage (C0/C1) for modules declaring ``rust``. - `rust_coverage/BUILD `_ → ``bazel run //rust_coverage:rust_coverage_`` - * - Overall feature & process status - - Feature/process completion dashboard derived from the pinned module repos. - - `docs/s_core_v_1/roadmap/overall_status.rst `_ + * - Release-wide progress overview + - Per-release progress charts, current release split by module. + - `docs/s_core_v_1/releases/progress_overview.rst `_ * - Integration status dashboard - Live build/health overview of the integration. - `status_dashboard.html <../status_dashboard.html>`_ diff --git a/docs/integration_process/step_7_reporting.rst b/docs/integration_process/step_7_reporting.rst index f41ca81aee1..8d9c00c3936 100644 --- a/docs/integration_process/step_7_reporting.rst +++ b/docs/integration_process/step_7_reporting.rst @@ -122,9 +122,13 @@ Verification & status reports ----------------------------- The consolidated reports live under -`docs/verification_report `_ and the roadmap / -status trackers under -`docs/s_core_v_1/roadmap `_ (e.g. -``overall_status.rst``). Add your module to the relevant tables/rows so it shows -up in the platform verification report and the feature/process status overview. +`docs/verification_report `_, the roadmap under +`docs/s_core_v_1/roadmap `_ +and the release-wide progress overview next to the release notes under +`docs/s_core_v_1/releases `_. +Your module appears in the platform and module +verification reports as soon as its documentation is part of the build; add it +to ``scripts/progress_overview/collect_metrics.py`` to give it a colour slot in +the per-release progress charts of +``docs/s_core_v_1/releases/progress_overview.rst``. The full catalogue of reports is under :ref:`reports`. diff --git a/docs/s_core_v_1/releases/progress_overview.rst b/docs/s_core_v_1/releases/progress_overview.rst new file mode 100644 index 00000000000..d998f2f5a99 --- /dev/null +++ b/docs/s_core_v_1/releases/progress_overview.rst @@ -0,0 +1,104 @@ +.. + # ******************************************************************************* + # Copyright (c) 2026 Contributors to the Eclipse Foundation + # + # See the NOTICE file(s) distributed with this work for additional + # information regarding copyright ownership. + # + # This program and the accompanying materials are made available under the + # terms of the Apache License Version 2.0 which is available at + # https://www.apache.org/licenses/LICENSE-2.0 + # + # SPDX-License-Identifier: Apache-2.0 + # ******************************************************************************* + +:hide-toc: + +Release-wide Progress Overview +============================== + +.. important:: + + **Data collected on: 2026-10-29** + +This page shows how the S-CORE platform grew across releases. Each chart +aggregates one metric over all tracked modules; every bar is split into colour +slots, one slot per contributing module. + +The last column, marked **(forecast)** and named after the next release +milestone, is not a released state — it is today's state of the modules pinned +in ``known_good.json``, shown as the projection for the next release. + +For the **current** state — per-module and per-component requirements, +architecture, traceability, coverage and work-product status — use the +verification reports, which are generated from the needs data of this +documentation build: + +* :doc:`Platform Verification Report ` + — feature-level requirements, architecture and inspection statistics. +* :doc:`Module Verification Reports ` + — per module: components, component requirements, architectural elements, + requirements traceability, test coverage and verification work products. + +.. note:: + + All columns are recounted from the module sources pinned by each release, so + the series is internally comparable. The counts are source-derived and + therefore differ from CI figures — test counts are test *definitions*, not + parameterised CI runs. Treat the numbers as indicative; the verification + reports are the authoritative source. + +.. _progress_overview_requirements: + +Requirements +------------ + +.. figure:: /_assets/pa2_impl_progress.svg + :alt: Requirements per release, split by module + :width: 880px + + Feature and component requirements across the tracked modules per release. + +.. _progress_overview_architecture: + +Architecture +------------ + +.. figure:: /_assets/pa3_arch_progress.svg + :alt: Architecture elements per release, split by module + :width: 880px + + Feature and component architecture elements across the tracked modules per + release. + +.. _progress_overview_implementation: + +Implementation +-------------- + +.. figure:: /_assets/pa4_impl_progress.svg + :alt: Lines of code per release, split by module + :width: 880px + + Lines of code across the tracked modules per release, excluding + documentation and third-party sources. + +.. _progress_overview_verification: + +Verification +------------ + +.. figure:: /_assets/pa5_unit_test_progress.svg + :alt: Unit tests per release, split by module + :width: 880px + + Unit test definitions across the tracked modules per release. + +.. figure:: /_assets/pa5_integration_test_progress.svg + :alt: Component and feature integration tests per release, split by module + :width: 880px + + Component and feature integration test definitions per release. Alongside + the integration tests kept in the module repositories this includes the + feature tests hosted in ``reference_integration`` itself, attributed to the + module under test. diff --git a/docs/s_core_v_1/releases/progress_overview_data.json b/docs/s_core_v_1/releases/progress_overview_data.json new file mode 100644 index 00000000000..4c1c473c2a4 --- /dev/null +++ b/docs/s_core_v_1/releases/progress_overview_data.json @@ -0,0 +1,569 @@ +{ + "data_collected": "2026-10-29", + "module_colors": { + "Baselibs": "#1f77b4", + "Communication": "#ff7f0e", + "Logging": "#2ca02c", + "Persistency": "#d62728", + "Time": "#9467bd", + "Config Mgmt": "#8c564b", + "Lifecycle": "#e377c2", + "Kyron": "#17becf", + "Security/Crypto": "#bcbd22", + "Diagnostic Services": "#aec7e8", + "NM": "#ffbb78", + "Some/IP": "#98df8a" + }, + "charts": { + "requirements": { + "file": "pa2_impl_progress.svg", + "title": "Requirements per release (feature + component)", + "axis_max": 1400, + "axis_step": 200, + "releases": [ + { + "name": "v0.5.0-beta", + "modules": { + "Baselibs": 58, + "Communication": 452, + "Logging": 46, + "Persistency": 75, + "Time": 15, + "Config Mgmt": 13, + "Lifecycle": 95, + "Kyron": 0, + "Security/Crypto": 42, + "Diagnostic Services": 22, + "NM": 0, + "Some/IP": 5 + } + }, + { + "name": "v0.6.0", + "modules": { + "Baselibs": 103, + "Communication": 458, + "Logging": 46, + "Persistency": 75, + "Time": 15, + "Config Mgmt": 51, + "Lifecycle": 96, + "Kyron": 0, + "Security/Crypto": 42, + "Diagnostic Services": 22, + "NM": 0, + "Some/IP": 5 + } + }, + { + "name": "v0.7.0", + "modules": { + "Baselibs": 153, + "Communication": 454, + "Logging": 46, + "Persistency": 77, + "Time": 15, + "Config Mgmt": 80, + "Lifecycle": 96, + "Kyron": 0, + "Security/Crypto": 42, + "Diagnostic Services": 22, + "NM": 0, + "Some/IP": 14 + } + }, + { + "name": "v0.8.0", + "modules": { + "Baselibs": 161, + "Communication": 553, + "Logging": 68, + "Persistency": 76, + "Time": 15, + "Config Mgmt": 74, + "Lifecycle": 96, + "Kyron": 0, + "Security/Crypto": 55, + "Diagnostic Services": 22, + "NM": 0, + "Some/IP": 14 + } + }, + { + "name": "v0.9.0", + "modules": { + "Baselibs": 205, + "Communication": 550, + "Logging": 69, + "Persistency": 76, + "Time": 27, + "Config Mgmt": 83, + "Lifecycle": 100, + "Kyron": 0, + "Security/Crypto": 60, + "Diagnostic Services": 22, + "NM": 0, + "Some/IP": 14 + } + }, + { + "name": "v0.10 (forecast)", + "modules": { + "Baselibs": 208, + "Communication": 551, + "Logging": 69, + "Persistency": 85, + "Time": 27, + "Config Mgmt": 83, + "Lifecycle": 100, + "Kyron": 0, + "Security/Crypto": 60, + "Diagnostic Services": 22, + "NM": 0, + "Some/IP": 14 + } + } + ] + }, + "architecture": { + "file": "pa3_arch_progress.svg", + "title": "Architecture elements per release (feature + component)", + "axis_max": 400, + "axis_step": 50, + "releases": [ + { + "name": "v0.5.0-beta", + "modules": { + "Baselibs": 69, + "Communication": 15, + "Logging": 3, + "Persistency": 13, + "Time": 0, + "Config Mgmt": 0, + "Lifecycle": 46, + "Kyron": 0, + "Security/Crypto": 0, + "Diagnostic Services": 0, + "NM": 0, + "Some/IP": 0 + } + }, + { + "name": "v0.6.0", + "modules": { + "Baselibs": 118, + "Communication": 17, + "Logging": 4, + "Persistency": 15, + "Time": 0, + "Config Mgmt": 0, + "Lifecycle": 52, + "Kyron": 0, + "Security/Crypto": 0, + "Diagnostic Services": 0, + "NM": 0, + "Some/IP": 0 + } + }, + { + "name": "v0.7.0", + "modules": { + "Baselibs": 169, + "Communication": 20, + "Logging": 7, + "Persistency": 15, + "Time": 0, + "Config Mgmt": 0, + "Lifecycle": 52, + "Kyron": 0, + "Security/Crypto": 0, + "Diagnostic Services": 0, + "NM": 0, + "Some/IP": 2 + } + }, + { + "name": "v0.8.0", + "modules": { + "Baselibs": 172, + "Communication": 20, + "Logging": 10, + "Persistency": 23, + "Time": 0, + "Config Mgmt": 0, + "Lifecycle": 52, + "Kyron": 0, + "Security/Crypto": 55, + "Diagnostic Services": 0, + "NM": 0, + "Some/IP": 6 + } + }, + { + "name": "v0.9.0", + "modules": { + "Baselibs": 207, + "Communication": 20, + "Logging": 10, + "Persistency": 23, + "Time": 5, + "Config Mgmt": 1, + "Lifecycle": 53, + "Kyron": 0, + "Security/Crypto": 56, + "Diagnostic Services": 1, + "NM": 0, + "Some/IP": 6 + } + }, + { + "name": "v0.10 (forecast)", + "modules": { + "Baselibs": 209, + "Communication": 20, + "Logging": 10, + "Persistency": 16, + "Time": 5, + "Config Mgmt": 1, + "Lifecycle": 53, + "Kyron": 0, + "Security/Crypto": 57, + "Diagnostic Services": 1, + "NM": 0, + "Some/IP": 10 + } + } + ] + }, + "implementation": { + "file": "pa4_impl_progress.svg", + "title": "Lines of code per release", + "axis_max": 900000, + "axis_step": 100000, + "releases": [ + { + "name": "v0.5.0-beta", + "modules": { + "Baselibs": 237092, + "Communication": 137712, + "Logging": 38428, + "Persistency": 13205, + "Time": 45, + "Config Mgmt": 11325, + "Lifecycle": 29408, + "Kyron": 32359, + "Security/Crypto": 0, + "Diagnostic Services": 0, + "NM": 0, + "Some/IP": 2801 + } + }, + { + "name": "v0.6.0", + "modules": { + "Baselibs": 235880, + "Communication": 159545, + "Logging": 42057, + "Persistency": 15437, + "Time": 45, + "Config Mgmt": 13435, + "Lifecycle": 33424, + "Kyron": 34214, + "Security/Crypto": 45, + "Diagnostic Services": 0, + "NM": 0, + "Some/IP": 2882 + } + }, + { + "name": "v0.7.0", + "modules": { + "Baselibs": 243742, + "Communication": 175053, + "Logging": 40511, + "Persistency": 15712, + "Time": 20469, + "Config Mgmt": 14458, + "Lifecycle": 39823, + "Kyron": 34226, + "Security/Crypto": 45, + "Diagnostic Services": 0, + "NM": 0, + "Some/IP": 17652 + } + }, + { + "name": "v0.8.0", + "modules": { + "Baselibs": 269746, + "Communication": 191617, + "Logging": 42289, + "Persistency": 15761, + "Time": 22815, + "Config Mgmt": 14917, + "Lifecycle": 42368, + "Kyron": 34249, + "Security/Crypto": 38902, + "Diagnostic Services": 0, + "NM": 0, + "Some/IP": 28584 + } + }, + { + "name": "v0.9.0", + "modules": { + "Baselibs": 266570, + "Communication": 250134, + "Logging": 42866, + "Persistency": 15724, + "Time": 23536, + "Config Mgmt": 15059, + "Lifecycle": 53917, + "Kyron": 34249, + "Security/Crypto": 63123, + "Diagnostic Services": 0, + "NM": 0, + "Some/IP": 27034 + } + }, + { + "name": "v0.10 (forecast)", + "modules": { + "Baselibs": 272674, + "Communication": 255766, + "Logging": 44149, + "Persistency": 16078, + "Time": 25260, + "Config Mgmt": 15059, + "Lifecycle": 54338, + "Kyron": 34245, + "Security/Crypto": 75293, + "Diagnostic Services": 0, + "NM": 0, + "Some/IP": 32003 + } + } + ] + }, + "unit_tests": { + "file": "pa5_unit_test_progress.svg", + "title": "Unit tests per release", + "axis_max": 16000, + "axis_step": 2000, + "releases": [ + { + "name": "v0.5.0-beta", + "modules": { + "Baselibs": 5334, + "Communication": 2357, + "Logging": 623, + "Persistency": 374, + "Time": 4, + "Config Mgmt": 153, + "Lifecycle": 0, + "Kyron": 452, + "Security/Crypto": 0, + "Diagnostic Services": 0, + "NM": 0, + "Some/IP": 4 + } + }, + { + "name": "v0.6.0", + "modules": { + "Baselibs": 5241, + "Communication": 2457, + "Logging": 661, + "Persistency": 386, + "Time": 4, + "Config Mgmt": 177, + "Lifecycle": 37, + "Kyron": 455, + "Security/Crypto": 4, + "Diagnostic Services": 0, + "NM": 0, + "Some/IP": 4 + } + }, + { + "name": "v0.7.0", + "modules": { + "Baselibs": 5417, + "Communication": 2623, + "Logging": 638, + "Persistency": 386, + "Time": 307, + "Config Mgmt": 183, + "Lifecycle": 266, + "Kyron": 455, + "Security/Crypto": 4, + "Diagnostic Services": 0, + "NM": 0, + "Some/IP": 263 + } + }, + { + "name": "v0.8.0", + "modules": { + "Baselibs": 5952, + "Communication": 2933, + "Logging": 671, + "Persistency": 386, + "Time": 353, + "Config Mgmt": 194, + "Lifecycle": 468, + "Kyron": 455, + "Security/Crypto": 75, + "Diagnostic Services": 0, + "NM": 0, + "Some/IP": 368 + } + }, + { + "name": "v0.9.0", + "modules": { + "Baselibs": 5730, + "Communication": 3929, + "Logging": 681, + "Persistency": 386, + "Time": 374, + "Config Mgmt": 194, + "Lifecycle": 753, + "Kyron": 455, + "Security/Crypto": 273, + "Diagnostic Services": 0, + "NM": 0, + "Some/IP": 345 + } + }, + { + "name": "v0.10 (forecast)", + "modules": { + "Baselibs": 5942, + "Communication": 3964, + "Logging": 698, + "Persistency": 400, + "Time": 417, + "Config Mgmt": 194, + "Lifecycle": 752, + "Kyron": 455, + "Security/Crypto": 320, + "Diagnostic Services": 0, + "NM": 0, + "Some/IP": 433 + } + } + ] + }, + "integration_tests": { + "file": "pa5_integration_test_progress.svg", + "title": "Component and feature integration tests per release", + "axis_max": 350, + "axis_step": 50, + "releases": [ + { + "name": "v0.5.0-beta", + "modules": { + "Baselibs": 0, + "Communication": 2, + "Logging": 0, + "Persistency": 0, + "Time": 0, + "Config Mgmt": 0, + "Lifecycle": 0, + "Kyron": 0, + "Security/Crypto": 0, + "Diagnostic Services": 0, + "NM": 0, + "Some/IP": 1 + } + }, + { + "name": "v0.6.0", + "modules": { + "Baselibs": 0, + "Communication": 30, + "Logging": 0, + "Persistency": 3, + "Time": 0, + "Config Mgmt": 0, + "Lifecycle": 0, + "Kyron": 0, + "Security/Crypto": 0, + "Diagnostic Services": 0, + "NM": 0, + "Some/IP": 1 + } + }, + { + "name": "v0.7.0", + "modules": { + "Baselibs": 0, + "Communication": 42, + "Logging": 0, + "Persistency": 3, + "Time": 0, + "Config Mgmt": 0, + "Lifecycle": 3, + "Kyron": 0, + "Security/Crypto": 0, + "Diagnostic Services": 0, + "NM": 0, + "Some/IP": 1 + } + }, + { + "name": "v0.8.0", + "modules": { + "Baselibs": 0, + "Communication": 62, + "Logging": 8, + "Persistency": 50, + "Time": 0, + "Config Mgmt": 0, + "Lifecycle": 28, + "Kyron": 0, + "Security/Crypto": 11, + "Diagnostic Services": 0, + "NM": 0, + "Some/IP": 21 + } + }, + { + "name": "v0.9.0", + "modules": { + "Baselibs": 6, + "Communication": 86, + "Logging": 8, + "Persistency": 50, + "Time": 0, + "Config Mgmt": 0, + "Lifecycle": 58, + "Kyron": 0, + "Security/Crypto": 10, + "Diagnostic Services": 0, + "NM": 0, + "Some/IP": 22 + } + }, + { + "name": "v0.10 (forecast)", + "modules": { + "Baselibs": 9, + "Communication": 112, + "Logging": 14, + "Persistency": 50, + "Time": 1, + "Config Mgmt": 0, + "Lifecycle": 59, + "Kyron": 1, + "Security/Crypto": 35, + "Diagnostic Services": 0, + "NM": 0, + "Some/IP": 11 + } + } + ] + } + } +} diff --git a/docs/s_core_v_1/releases/release_note_score_v0_8.rst b/docs/s_core_v_1/releases/release_note_score_v0_8.rst index 6fd445c49c0..8a2897232f3 100644 --- a/docs/s_core_v_1/releases/release_note_score_v0_8.rst +++ b/docs/s_core_v_1/releases/release_note_score_v0_8.rst @@ -177,7 +177,7 @@ Reference integration - Added a dedicated `Integration Process Guide `_ with a step-by-step onboarding path (module onboarding, platform integration, testing, reporting, and code quality checks). - Introduced the v1.0 roadmap and release-gate documentation in `Roadmap `_, including clearer milestone alignment across process areas. -- Established and continuously refreshed the `Overall Status `_ page to provide release-level visibility on cross-module progress and process-area metrics. +- Established and continuously refreshed the `Overall Status (now Release-wide Progress Overview) `_ page to provide release-level visibility on cross-module progress and process-area metrics. Reference QNX image diff --git a/docs/s_core_v_1/releases/releases.rst b/docs/s_core_v_1/releases/releases.rst index af111240b0a..24781d9b830 100644 --- a/docs/s_core_v_1/releases/releases.rst +++ b/docs/s_core_v_1/releases/releases.rst @@ -15,8 +15,13 @@ Releases ============ +.. toctree:: + :titlesonly: + + Release-wide Progress Overview + .. toctree:: :titlesonly: :glob: - * + release_note_* diff --git a/docs/s_core_v_1/roadmap/overall_status.rst b/docs/s_core_v_1/roadmap/overall_status.rst deleted file mode 100644 index d7421d8c4d8..00000000000 --- a/docs/s_core_v_1/roadmap/overall_status.rst +++ /dev/null @@ -1,1159 +0,0 @@ -.. - # ******************************************************************************* - # Copyright (c) 2026 Contributors to the Eclipse Foundation - # - # See the NOTICE file(s) distributed with this work for additional - # information regarding copyright ownership. - # - # This program and the accompanying materials are made available under the - # terms of the Apache License Version 2.0 which is available at - # https://www.apache.org/licenses/LICENSE-2.0 - # - # SPDX-License-Identifier: Apache-2.0 - # ******************************************************************************* - -:hide-toc: - -Overall Status -============== - -.. important:: - - **Data collected on: 2026-09-04** - -.. note:: - - This status overview is generated with AI assistance and is **not yet - fully accurate**. It is intended as a directional snapshot — the trend and - structure are correct, but individual figures and statuses may still be - off. Treat the numbers as indicative until the underlying data sources are - fully validated. - -This page tracks feature and process status across the SCORE platform modules. -It is regenerated from live `eclipse-score` GitHub repositories pinned via -``known_good.json``. - -.. admonition:: Changes in this snapshot - :class: tip - - * The progress charts now carry a fifth column, **v0.9** — this snapshot - is measured against the ``release_candidate_09`` pins, so the v0.8 - column holds the previously published release figures. - * **Kyron** is tracked as a module for the first time (12 module rows - instead of 11). It ships code, unit tests, Rust coverage, a Clippy gate - and a large component-integration suite, but has no requirements, - architecture or detailed-design documents yet. - * The ``score`` repository was **restructured**: component documentation - moved from ``docs/modules//`` into the individual module - repositories, and ``docs/features/analysis-infra/logging`` became - ``docs/features/log_and_trace/logging``. All path filters were rebuilt - against the pinned trees. - * Several modules migrated their requirements to **TRLC** - (Communication, Config Management). Where an RST set and a TRLC set - describe the same feature area, only the larger of the two is counted — - the duplicate is suppressed to avoid double counting. - * **Time** and **Config Management** are now pinned in ``known_good.json``, - so their source links point at a fixed commit instead of ``main``. - * **Security/Crypto** and **Some/IP** are *not* pinned in - ``known_good.json`` and therefore no longer part of the reference - integration CI. Their unit-test and coverage cells are marked - 🔄 *Module CI only* and link to the workflows in their own repositories. - * The PA2 feature-requirement total decreased (341 → 297) because the - Lifecycle feature requirements were consolidated during the - restructuring (92 → 32); the component-requirement total grew - strongly (607 → 783). - - -.. _overall_status_pa1: - -Process Area 1 — Change Management ----------------------------------- - -.. rubric:: Process Status - :class: status-heading - -.. list-table:: - :header-rows: 1 - :class: compact-overview-table - - * - Process req. status - - ISO 26262 std_req status - - Req. verification status - * - - - .. rst-class:: small-pie-cell - - .. needpie:: - :labels: Valid, Draft, Invalid, Other - :colors: LimeGreen, Gold, LightCoral, LightGray - - type == 'gd_req' and is_external == False and status == 'valid' and 'change_management' in tags - type == 'gd_req' and is_external == False and status == 'draft' and 'change_management' in tags - type == 'gd_req' and is_external == False and status == 'invalid' and 'change_management' in tags - type == 'gd_req' and is_external == False and status not in ['valid', 'draft', 'invalid'] and 'change_management' in tags - - - - .. rst-class:: small-pie-cell - - .. needpie:: - :labels: Ok, Recommendation, Open, Action, Deviation, N/A, Other - :colors: LimeGreen, LightBlue, Gold, Orange, LightCoral, LightGray, Silver - :filter-func: needs_filters.std_req_status_for_area(change_management) - - - - .. rst-class:: small-pie-cell - - .. needpie:: - :labels: Automated, Waiting for automation, Inspection list, Other - :colors: LimeGreen, Gold, LightBlue, LightGray - :filter-func: needs_filters.area_verification_status(change_management) - -.. raw:: html - -
- Rollout status: - 🔄 - 83% -
- 10/12 deliverables complete -
- - -.. list-table:: - :header-rows: 1 - - * - **Module** - - **CR approved** - * - Baselibs - - ✅ Accepted - - | `#549 `__ — ✅ Accepted [v0.5 Certifiable] — Feature request: common libraries for IPC and Logging - | `#757 `__ — ✅ Accepted — Feature request for qualified json-parser - | `#917 `__ — ✅ Accepted [v1.0] — Feature Request for ABI compatible datatypes - * - Communication - - ✅ Accepted - - | `#69 `__ — ✅ Accepted [v0.5 Certifiable] — Feature Request for IPC - * - Logging - - ✅ Accepted - - | `#68 `__ — ✅ Accepted [v0.5 Certifiable] — Feature Request for Logging - * - Persistency - - ✅ Accepted - - | `#95 `__ — ✅ Accepted [v0.5 Certifiable] — Feature Request for Persistency - * - Time - - ✅ Accepted - - | `#910 `__ — ✅ Accepted [v1.0] — Feature Request for Time - * - Config Mgmt - - ✅ Accepted - - | `#754 `__ — ✅ Accepted [v1.0] — Feature Request for Config Management - * - Lifecycle - - ✅ Accepted - - | `#909 `__ — ✅ Accepted [v1.0] — Feature Request for Health & Lifecycle - * - Kyron - - 🔄 In Progress - - | `#2029 `__ — 🔄 Open — Certified async-runtime - | `#2445 `__ — ✅ Accepted [v1.0] — Kyron — S-CORE Release v1.0 - | `#2894 `__ — ✅ Accepted [v0.8] — Kyron for S-CORE Release v0.8 - * - Security/Crypto - - ✅ Accepted - - | `#905 `__ — ✅ Accepted [v1.0] — Feature Request for Security & Crypto - * - Diagnostic Services - - ✅ Accepted - - | `#911 `__ — ✅ Accepted [v1.0] — Feature Request for Diagnostic Services & Fault Management - * - NM - - ❌ Open - * - Some/IP - - ✅ Accepted - - | `#914 `__ — ✅ Accepted [v1.0] — Feature Request for SOME/IP Gateway - -.. _overall_status_pa2: - -Process Area 2 — Requirements Engineering ------------------------------------------ - -.. rubric:: Process Status - :class: status-heading - -.. list-table:: - :header-rows: 1 - :class: compact-overview-table - - * - Process req. status - - ISO 26262 std_req status - - Req. verification status - * - - - .. rst-class:: small-pie-cell - - .. needpie:: - :labels: Valid, Draft, Invalid, Other - :colors: LimeGreen, Gold, LightCoral, LightGray - - type == 'gd_req' and is_external == False and status == 'valid' and 'requirements_engineering' in tags - type == 'gd_req' and is_external == False and status == 'draft' and 'requirements_engineering' in tags - type == 'gd_req' and is_external == False and status == 'invalid' and 'requirements_engineering' in tags - type == 'gd_req' and is_external == False and status not in ['valid', 'draft', 'invalid'] and 'requirements_engineering' in tags - - - - .. rst-class:: small-pie-cell - - .. needpie:: - :labels: Ok, Recommendation, Open, Action, Deviation, N/A, Other - :colors: LimeGreen, LightBlue, Gold, Orange, LightCoral, LightGray, Silver - :filter-func: needs_filters.std_req_status_for_area(requirements_engineering) - - - - .. rst-class:: small-pie-cell - - .. needpie:: - :labels: Automated, Waiting for automation, Inspection list, Other - :colors: LimeGreen, Gold, LightBlue, LightGray - :filter-func: needs_filters.area_verification_status(requirements_engineering) - -.. figure:: /_assets/pa2_impl_progress.svg - :alt: PA2 implementation progress - :width: 880px - - Total Feature and Component Requirements across the 12 tracked modules per release (v0.5.0-beta → v0.6.0 → v0.7.0 → v0.8 → v0.9). - -.. raw:: html - -
- Rollout status: - 🔄 - 50% -
- 18/36 deliverables complete -
- - -.. list-table:: - :header-rows: 1 - - * - **Module** - - **Feature Req** - - **Component Req** - - **Req. Inspection** - * - Baselibs - - ✅ Available (14/14) - - | `baselibs `__ (14) - - ✅ Available (136/136 comp_req + 32/32 AoU) - - | `abi_compatible_data_types `__ (23) - | `bitmanipulation `__ (6) - | `concurrency `__ (18) - | `containers `__ (5) - | `containers_rust `__ (16) - | `filesystem `__ (7) - | `flatbuffers `__ (6) - | `hash `__ (7) - | `json `__ (8) - | `vajson `__ (5) - | `safecpp `__ (6) - | `memory `__ (13) - | `result `__ (7) - | `static_reflection_with_serialization `__ (6) - | `utils `__ (3) - - 🔄 40% (4/10) - - | ✅ `baselibs `__ - | ✅ `bitmanipulation `__ - | 🔄 `concurrency `__ - | 🔄 `containers `__ - | 🔄 `filesystem `__ - | 🔄 `json `__ - | 🔄 `safecpp `__ - | ✅ `result `__ - | 🔄 `static_reflection_with_serialization `__ - | ✅ `utils `__ - * - Communication - - ✅ Available (64/64) - - | `message_passing `__ (11) [TRLC] - | `ipc `__ (4) - | `communication `__ (49) - - ✅ Available (363/363 comp_req + 38/38 AoU) - - | `message_passing `__ (29) [TRLC] - | `message_passing `__ (4) [TRLC] - | `ipc `__ (98) [TRLC] - | `ipc_fields `__ (17) [TRLC] - | `ipc_generic_proxy `__ (51) [TRLC] - | `ipc_generic_skeleton `__ (32) [TRLC] - | `ipc_methods `__ (3) [TRLC] - | `ipc_partial_restart `__ (11) [TRLC] - | `ipc_proxy `__ (40) [TRLC] - | `ipc_skeleton `__ (26) [TRLC] - | `ipc_tracing `__ (52) [TRLC] - | `message_passing `__ (1) [TRLC] - | `com `__ (37) [TRLC] - - ❌ Open - * - Logging - - ✅ Available (46/46) - - | `logging `__ (46) - - ✅ Available (39/39 comp_req + 5/5 AoU) - - | `log `__ (18) - | `datarouter `__ (6) - | `mw_log `__ (15) - | `log `__ (5) - - 🔄 0% (0/3) - - | 🔄 `mw_log `__ - | 🔄 `logging `__ - | 🔄 `log `__ - * - Persistency - - ✅ Available (37/37) - - | `persistency `__ (37) - - ✅ Available (35/35 comp_req) - - | `kvs `__ (35) - - ✅ Available (2/2) - - | ✅ `persistency `__ - | ✅ `kvs `__ - * - Time - - ✅ Available (15/15) - - | `time `__ (15) - - 🔄 0% (0/4 AoU) - - | `time `__ (2) - | `time_daemon `__ (2) - - 🔄 0% (0/4) - - | 🔄 `time `__ - | 🔄 `time_daemon `__ - | 🔄 `time_slave `__ - | 🔄 `ts_client `__ - * - Config Mgmt - - ✅ Available (20/20) - - | `config_management `__ (20) [TRLC] - - ✅ Available (47/47 comp_req + 1/1 AoU) - - | `config_daemon `__ (30) [TRLC] - | `config_provider `__ (17) [TRLC] - | `config_management `__ (1) [TRLC] - - ❌ Open - * - Lifecycle - - ✅ Available (32/32) - - | `lifecycle `__ (32) - - ✅ Available (64/64 comp_req + 1/1 AoU) - - | `health_monitor `__ (1) - | `launch_manager `__ (63) - - 🔄 0% (0/2) - - | 🔄 `health_monitor `__ - | 🔄 `launch_manager `__ - * - Kyron - - ❌ Open - - ❌ Open - - ❌ Open - * - Security/Crypto - - ✅ Available (41/41) - - | `security_crypto `__ (41) - - 🔄 70% (1/1 comp_req + 6/9 AoU) - - | `iav_primula `__ (1) - | `crypto `__ (3) - | `crypto `__ (2) - | `crypto `__ (2) - - 🔄 0% (0/2) - - | 🔄 `crypto `__ - | 🔄 `iav_primula `__ - * - Diagnostic Services - - ✅ Available (22/22) - - | `diagnostics `__ (22) - - ❌ Open - - ❌ Open - * - NM - - ❌ Open - - ❌ Open - - ❌ Open - * - Some/IP - - ✅ Available (6/6) - - | `tc8_conformance `__ (1) - | `some_ip_gateway `__ (5) - - ✅ Available (8/8 comp_req) - - | `tc8_conformance `__ (8) - - ❌ Open - -.. _overall_status_pa3: - -Process Area 3 — Architecture Design ------------------------------------- - -.. rubric:: Process Status - :class: status-heading - -.. list-table:: - :header-rows: 1 - :class: compact-overview-table - - * - Process req. status - - ISO 26262 std_req status - - Req. verification status - * - - - .. rst-class:: small-pie-cell - - .. needpie:: - :labels: Valid, Draft, Invalid, Other - :colors: LimeGreen, Gold, LightCoral, LightGray - - type == 'gd_req' and is_external == False and status == 'valid' and 'architecture_design' in tags - type == 'gd_req' and is_external == False and status == 'draft' and 'architecture_design' in tags - type == 'gd_req' and is_external == False and status == 'invalid' and 'architecture_design' in tags - type == 'gd_req' and is_external == False and status not in ['valid', 'draft', 'invalid'] and 'architecture_design' in tags - - - - .. rst-class:: small-pie-cell - - .. needpie:: - :labels: Ok, Recommendation, Open, Action, Deviation, N/A, Other - :colors: LimeGreen, LightBlue, Gold, Orange, LightCoral, LightGray, Silver - :filter-func: needs_filters.std_req_status_for_area(architecture_design) - - - - .. rst-class:: small-pie-cell - - .. needpie:: - :labels: Automated, Waiting for automation, Inspection list, Other - :colors: LimeGreen, Gold, LightBlue, LightGray - :filter-func: needs_filters.area_verification_status(architecture_design) - -.. figure:: /_assets/pa3_arch_progress.svg - :alt: PA3 architecture progress - :width: 880px - - Total Feature and Component Architecture elements across the 12 tracked modules per release (v0.5.0-beta → v0.6.0 → v0.7.0 → v0.8 → v0.9). - -.. raw:: html - -
- Rollout status: - 🔄 - 42% -
- 15/36 deliverables complete -
- - -.. list-table:: - :header-rows: 1 - - * - **Module** - - **Feature Arch** - - **Component Arch** - - **Arch. Inspection** - * - Baselibs - - ✅ Available (3/3) - - | `baselibs `__ (2) - | `baselibs `__ (1) - - 🔄 99% (197/198) - - | `abi_compatible_data_types `__ (1) - | `bitmanipulation `__ (12) - | `concurrency `__ (33) - | `containers `__ (9) - | `containers_rust `__ (27) - | `containers_rust `__ (1) - | `filesystem `__ (25) - | `flatbuffers `__ (1) - | `hash `__ (1) - | `json `__ (7) - | `vajson `__ (1) - | `safecpp `__ (23) - | `memory `__ (6) - | `result `__ (6) - | `static_reflection_with_serialization `__ (11) - | `utils `__ (6) - | `baselibs `__ (28) - - 🔄 80% (8/10) - - | ✅ `baselibs `__ - | ✅ `bitmanipulation `__ - | ✅ `concurrency `__ - | ✅ `containers `__ - | ✅ `filesystem `__ - | 🔄 `json `__ - | ✅ `safecpp `__ - | ✅ `result `__ - | 🔄 `static_reflection_with_serialization `__ - | ✅ `utils `__ - * - Communication - - ✅ Available (3/3) - - | `communication `__ (2) - | `ipc `__ (1) - - ✅ Available (17/17) - - | `communication `__ (1) - | `configuration `__ (1) - | `frontent `__ (10) - | `ipc_binding `__ (1) - | `message_passing `__ (3) - | `mock_binding `__ (1) - - ❌ Open - * - Logging - - ✅ Available (2/2) - - | `logging `__ (1) - | `logging `__ (1) - - ✅ Available (13/13) - - | `log `__ (2) - | `rust_bridge_design `__ (3) - | `datarouter `__ (1) - | `mw_log `__ (4) - | `logging `__ (3) - - 🔄 0% (0/2) - - | 🔄 `logging `__ - | 🔄 `log `__ - * - Persistency - - ✅ Available (9/9) - - | `persistency `__ (8) - | `persistency `__ (1) - - 🔄 40% (2/5) - - | `persistency `__ (1) - | `kvs `__ (3) - | `persistency `__ (1) - - 🔄 0% (0/2) - - | 🔄 `persistency `__ - | 🔄 `kvs `__ - * - Time - - ✅ Available (1/1) - - | `time `__ (1) - - ✅ Available (2/2) - - | `time `__ (1) - | `ts_client `__ (1) - - ❌ Open - * - Config Mgmt - - ✅ Available (1/1) - - | `config_mgmt `__ (1) - - ❌ Open - - ❌ Open - * - Lifecycle - - ✅ Available (7/7) - - | `health_monitor `__ (2) - | `lifecycle `__ (1) - | `launch_manager `__ (3) - | `lifecycle `__ (1) - - ✅ Available (45/45) - - | `launch_manager_configuration `__ (1) - | `health_monitor `__ (16) - | `launch_manager `__ (2) - | `lifecycle `__ (26) - - 🔄 0% (0/3) - - | 🔄 `lifecycle `__ - | 🔄 `health_monitor `__ - | 🔄 `launch_manager `__ - * - Kyron - - ❌ Open - - ❌ Open - - ❌ Open - * - Security/Crypto - - ✅ Available (1/1) - - | `security_crypto `__ (1) - - 🔄 16% (4/25) - - | `crypto `__ (21) - | `iav_primula `__ (4) - - 🔄 0% (0/3) - - | 🔄 `crypto `__ - | 🔄 `crypto `__ - | 🔄 `iav_primula `__ - * - Diagnostic Services - - ✅ Available (1/1) - - | `diagnostics `__ (1) - - ❌ Open - - ❌ Open - * - NM - - ❌ Open - - ❌ Open - - ❌ Open - * - Some/IP - - ✅ Available (1/1) - - | `inc_someip_gateway `__ (1) - - ✅ Available (4/4) - - | `inc_someip_gateway `__ (4) - - ❌ Open - -.. _overall_status_pa4: - -Process Area 4 — Implementation -------------------------------- - -.. rubric:: Process Status - :class: status-heading - -.. list-table:: - :header-rows: 1 - :class: compact-overview-table - - * - Process req. status - - ISO 26262 std_req status - - Req. verification status - * - - - .. rst-class:: small-pie-cell - - .. needpie:: - :labels: Valid, Draft, Invalid, Other - :colors: LimeGreen, Gold, LightCoral, LightGray - - type == 'gd_req' and is_external == False and status == 'valid' and 'implementation' in tags - type == 'gd_req' and is_external == False and status == 'draft' and 'implementation' in tags - type == 'gd_req' and is_external == False and status == 'invalid' and 'implementation' in tags - type == 'gd_req' and is_external == False and status not in ['valid', 'draft', 'invalid'] and 'implementation' in tags - - - - .. rst-class:: small-pie-cell - - .. needpie:: - :labels: Ok, Recommendation, Open, Action, Deviation, N/A, Other - :colors: LimeGreen, LightBlue, Gold, Orange, LightCoral, LightGray, Silver - :filter-func: needs_filters.std_req_status_for_area(implementation) - - - - .. rst-class:: small-pie-cell - - .. needpie:: - :labels: Automated, Waiting for automation, Inspection list, Other - :colors: LimeGreen, Gold, LightBlue, LightGray - :filter-func: needs_filters.area_verification_status(implementation) - -.. figure:: /_assets/pa4_impl_progress.svg - :alt: PA4 implementation progress - :width: 880px - - Estimated Lines of Code across the 12 tracked modules per release (v0.5.0-beta → v0.6.0 → v0.7.0 → v0.8 → v0.9). - -.. raw:: html - -
- Rollout status: - 🔄 - 46% -
- 22/48 deliverables complete -
- - -.. list-table:: - :header-rows: 1 - - * - **Module** - - **SW Dev Plan** - - **Code** - - **Detailed Design** - - **Impl. Inspection** - * - Baselibs - - ✅ Available - - | `software_development `__ - - ✅ Available (~322,600 LOC) - - | 1,667 source files — cpp 178,100, h 96,100, hpp 30,500, rs 16,100 - - 🔄 Draft (1 design doc(s), 0 ``dd`` elements) - - | `CADS `__ - - 🔄 0% (0/9) - - | 🔄 `bitmanipulation `__ - | 🔄 `concurrency `__ - | 🔄 `containers `__ - | 🔄 `filesystem `__ - | 🔄 `json `__ - | 🔄 `safecpp `__ - | 🔄 `result `__ - | 🔄 `static_reflection_with_serialization `__ - | 🔄 `utils `__ - * - Communication - - ✅ Available - - | `software_development `__ - - ✅ Available (~363,000 LOC) - - | 1,734 source files — cpp 245,400, h 82,000, py 22,300, rs 13,400 - - 🔄 Draft (1 design doc(s), 0 ``dd`` elements) - - | `lola `__ - - ❌ Open - * - Logging - - ✅ Available - - | `software_development `__ - - ✅ Available (~79,700 LOC) - - | 454 source files — cpp 56,100, h 20,200, py 1,800, rs 1,400 - - 🔄 Draft (2 design doc(s), 0 ``dd`` elements) - - | `log `__ - | `mw_log `__ - - 🔄 0% (0/2) - - | 🔄 `mw_log `__ - | 🔄 `log `__ - * - Persistency - - ✅ Available - - | `software_development `__ - - ✅ Available (~18,000 LOC) - - | 76 source files — rs 8,800, cpp 6,000, py 2,000, hpp 1,300 - - 🔄 Draft (1 design doc(s), 0 ``dd`` elements) - - | `kvs `__ - - 🔄 0% (0/1) - - | 🔄 `kvs `__ - * - Time - - ✅ Available - - | `software_development `__ - - ✅ Available (~26,600 LOC) - - | 239 source files — cpp 16,000, h 9,900, py 700 - - 🔄 Draft (4 design doc(s), 0 ``dd`` elements) - - | `time `__ - | `time_daemon `__ - | `time_slave `__ - | `ts_client `__ - - 🔄 0% (0/4) - - | 🔄 `time `__ - | 🔄 `time_daemon `__ - | 🔄 `time_slave `__ - | 🔄 `ts_client `__ - * - Config Mgmt - - ✅ Available - - | `software_development `__ - - ✅ Available (~23,300 LOC) - - | 156 source files — cpp 15,900, h 5,200, py 1,900, hpp 300 - - ❌ Open - - ❌ Open - * - Lifecycle - - ✅ Available - - | `software_development `__ - - ✅ Available (~68,200 LOC) - - | 367 source files — cpp 30,400, hpp 18,400, rs 10,400, py 6,200 - - 🔄 Draft (2 design doc(s), 0 ``dd`` elements) - - | `health_monitor `__ - | `launch_manager `__ - - 🔄 0% (0/2) - - | 🔄 `health_monitor `__ - | 🔄 `launch_manager `__ - * - Kyron - - ✅ Available - - | `software_development `__ - - ✅ Available (~38,600 LOC) - - | 166 source files — rs 32,100, py 6,500 - - ❌ Open - - ❌ Open - * - Security/Crypto - - ✅ Available - - | `software_development `__ - - ✅ Available (~82,700 LOC) - - | 375 source files — hpp 28,300, cpp 27,700, rs 23,800, h 2,100 - - 🔄 Draft (2 design doc(s), 0 ``dd`` elements) - - | `crypto `__ - | `iav_primula `__ - - 🔄 0% (0/2) - - | 🔄 `crypto `__ - | 🔄 `iav_primula `__ - * - Diagnostic Services - - ✅ Available - - | `software_development `__ - - ❌ Open - - ❌ Open - - ❌ Open - * - NM - - ✅ Available - - | `software_development `__ - - ❌ Open - - ❌ Open - - ❌ Open - * - Some/IP - - ✅ Available - - | `software_development `__ - - ✅ Available (~37,300 LOC) - - | 172 source files — cpp 22,400, hpp 10,600, py 2,500, h 1,600 - - ❌ Open - - ❌ Open - -.. _overall_status_pa5: - -Process Area 5 — Verification ------------------------------ - -.. rubric:: Process Status - :class: status-heading - -.. list-table:: - :header-rows: 1 - :class: compact-overview-table - - * - Process req. status - - ISO 26262 std_req status - - Req. verification status - * - - - .. rst-class:: small-pie-cell - - .. needpie:: - :labels: Valid, Draft, Invalid, Other - :colors: LimeGreen, Gold, LightCoral, LightGray - - type == 'gd_req' and is_external == False and status == 'valid' and 'verification' in tags - type == 'gd_req' and is_external == False and status == 'draft' and 'verification' in tags - type == 'gd_req' and is_external == False and status == 'invalid' and 'verification' in tags - type == 'gd_req' and is_external == False and status not in ['valid', 'draft', 'invalid'] and 'verification' in tags - - - - .. rst-class:: small-pie-cell - - .. needpie:: - :labels: Ok, Recommendation, Open, Action, Deviation, N/A, Other - :colors: LimeGreen, LightBlue, Gold, Orange, LightCoral, LightGray, Silver - :filter-func: needs_filters.std_req_status_for_area(verification) - - - - .. rst-class:: small-pie-cell - - .. needpie:: - :labels: Automated, Waiting for automation, Inspection list, Other - :colors: LimeGreen, Gold, LightBlue, LightGray - :filter-func: needs_filters.area_verification_status(verification) - -.. figure:: /_assets/pa5_verification_progress.svg - :alt: PA5 verification progress - :width: 1260px - - Test counts and coverage across the 12 tracked modules per release (v0.5.0-beta → v0.6.0 → v0.7.0 → v0.8 → v0.9). - -.. raw:: html - -
- Rollout status: - 🔄 - 42% -
- 35/84 deliverables complete -
- -.. note:: - - **C0/C1 Coverage** data is sourced from the ``reference_integration`` - CI (*Code Quality & Documentation* workflow, - ``bazel coverage --config=ferrocene-coverage``). C0 = line coverage, - C1 = branch coverage. Rust coverage reports line coverage only. - Modules that are not pinned in ``known_good.json`` and therefore not - built by the ``reference_integration`` CI (Security/Crypto, Some/IP) - are marked 🔄 *Module CI only* and link to their own repository - workflows instead. - -.. note:: - - **Static Code Analysis** is tracked per module via dedicated CI - workflows (clang-tidy for C++, Rust Clippy for Rust). All listed - workflows are *zero-tolerance* (CI fails on any finding), so a passing - ``main`` branch implies **0 open findings**. Additionally, CodeQL - runs centrally across all pinned repositories in - ``reference_integration`` (finding counts require the GitHub Security - tab). - - **Dynamic Code Analysis** is tracked via sanitizer CI workflows - (ASan/UBSan/LSan via ``--config=asan_ubsan_lsan``, TSan via - ``--config=tsan``). All listed workflows are zero-tolerance, so a - passing ``main`` branch implies **0 sanitizer findings**. - -.. note:: - - **Module Verification Report** additionally lists generated - traceability evidence where a module produces it. Communication builds - a *L.O.B.S.T.E.R. Traceability Report* (LOBSTER 1.0.6, pulled by - ``third_party/lobster/lobster.bzl``) from the ``dependable_element`` - Bazel rule in ``eclipse-score/tooling``. The report is assembled during - ``bazel build //docs/sphinx:sphinx_doc`` and published to GitHub Pages - by ``deploy_docs.yml`` — it is **not** checked into the repository, so - it does not appear in the pinned source tree. It currently covers the - ``message_passing`` dependable element only; there is no equivalent - report for LoLa / ``mw::com``. - - -.. list-table:: - :header-rows: 1 - - * - **Module** - - **Unit Tests** - - **C0/C1 Cov** - - **Comp. IT** - - **Feat. IT** - - **Static** - - **Dynamic** - - **Module Ver. Rpt** - * - Baselibs - - ✅ 23,976 tests - - | `reference CI run `__ - | 23,926 passed, 50 skipped - - 🔄 C0 94.9% / C1 61.7% (C++) - - | `reference CI run `__ - - ✅ 6 test cases - - | 3 files — ``examples/integration/`` - - ❌ Open - - ✅ 0 findings - - | `lint.yml `__ - - ✅ ASan, LSan, UBSan - - | `sanitizers_linux.yml `__ - - 🔄 Draft - - | `module_verification_report `__ - * - Communication - - ✅ 3,530 tests - - | `reference CI run `__ - - 🔄 C0 83.0% / C1 52.6% (C++) - - | `reference CI run `__ - - ✅ 111 test cases - - | 234 files — ``score/mw/com/test/``, ``score/mw/com/gateway/transport_layer/sample/test/``, ``quality/integration_testing/test/`` - - ❌ Open - - ✅ 0 findings - - | `nightly_quality.yml `__ - - ✅ ASan, LSan, TSan, UBSan - - | `build_and_test_host.yml `__ - - 🔄 Draft - - | `module_verification_report `__ - | ✅ `LOBSTER traceability report (message_passing) `__ — generated by `dependable_element_message_passing `__ - * - Logging - - ✅ 334 tests - - | `reference CI run `__ - - 🔄 C0 96.6% / C1 75.4% (C++), C0 39.9% (Rust) - - | `reference CI run `__ - - ✅ 8 test cases - - | 11 files — ``score/test/component/`` - - ✅ 2 test cases - - | ``feature_integration_tests/`` - - ✅ 0 findings - - | `clang_tidy.yml `__ - - ✅ ASan, LSan, TSan, UBSan - - | `sanitizers.yml `__ - - 🔄 Draft - - | `module_verification_report `__ - * - Persistency - - ✅ 95 tests - - | `reference CI run `__ - - 🔄 C0 94.7% / C1 63.0% (C++), C0 92.7% (Rust) - - | `reference CI run `__ - - ✅ 44 test cases - - | 9 files — ``score/kvs/tests/test_cases/tests/`` - - ✅ 50 test cases - - | ``feature_integration_tests/`` - - ✅ 0 findings - - | `clippy.yml `__ - - ❌ Open - - ✅ Available - - | `module_verification_report `__ - * - Time - - ✅ 335 tests - - | `reference CI run `__ - - 🔄 C0 90.3% / C1 61.4% (C++) - - | `reference CI run `__ - - ✅ 7 test cases - - | 5 files — ``score/`` - - ❌ Open - - 🔄 clang-tidy ✅, CodeQL ❌ failing - - | `clang-tidy.yml `__ - | `codeql.yml `__ - - ✅ ASan, LSan, UBSan - - | `sanitizers.yml `__ - - ❌ Open - * - Config Mgmt - - ✅ 238 tests - - | `reference CI run `__ - - 🔄 C0 92.8% / C1 64.1% (C++) - - | `reference CI run `__ - - ❌ Open - - ❌ Open - - ✅ 0 findings - - | `static-analysis.yml `__ - - ❌ Open - - ❌ Open - * - Lifecycle - - ✅ 478 tests - - | `reference CI run `__ - | 476 passed, 2 skipped - - 🔄 C0 77.4% / C1 50.7% (C++), C0 53.5% (Rust) - - | `reference CI run `__ - - ✅ 58 test cases - - | 58 files — ``tests/integration/`` - - ❌ Open - - ✅ 0 findings - - | `on-pr.yml `__ - - ✅ ASan, LSan, TSan, UBSan - - | `on-pr.yml `__ - - 🔄 Draft - - | `verification_report `__ - * - Kyron - - 🔄 3 tests - - | `reference CI run `__ - | bazel-scoped unit tests only - - 🔄 C0 50.4% (Rust) - - | `reference CI run `__ - - ✅ 209 test cases - - | 25 files — ``tests/test_cases/tests/`` - - ❌ Open - - ✅ 0 findings - - | `lint_fmt_clippy.yml `__ - - ❌ Open - - ❌ Open - * - Security/Crypto - - 🔄 Module CI only - - | `test_linux.yml `__ - - ❌ Open - - ✅ 10 test cases - - | 6 files — ``score/tests/integration_tests/`` - - ❌ Open - - ✅ 0 findings - - | `on-pr.yml `__ - - ❌ Open - - 🔄 Draft - - | `module_verification_report `__ - * - Diagnostic Services - - ❌ Open - - ❌ Open - - ❌ Open - - ❌ Open - - ❌ Open - - ❌ Open - - ❌ Open - * - NM - - ❌ Open - - ❌ Open - - ❌ Open - - ❌ Open - - ❌ Open - - ❌ Open - - ❌ Open - * - Some/IP - - 🔄 Module CI only - - | `build_and_test_host.yml `__ - - 🔄 Module CI only - - | `coverage.yml `__ - - ✅ 11 test cases - - | 8 files — ``quality/integration_testing/`` - - ❌ Open - - ✅ 0 findings - - | `static-code-analysis.yml `__ - - ✅ ASan, LSan, TSan, UBSan - - | `build_and_test_host.yml `__ - - ❌ Open - -.. admonition:: Platform Verification Report - :class: important platform-ver-report - - Platform Verification Report — ❌ **Open** (single project-wide deliverable; - not yet published at the pinned ``score`` ref) diff --git a/docs/s_core_v_1/roadmap/pi1.rst b/docs/s_core_v_1/roadmap/pi1.rst index 815d24e4b69..7223c3c8e9c 100644 --- a/docs/s_core_v_1/roadmap/pi1.rst +++ b/docs/s_core_v_1/roadmap/pi1.rst @@ -41,11 +41,14 @@ Focus: Requirements Engineering (PA2) + Architecture Design (PA3) Current State ------------- -See the relevant tables in :doc:`overall_status`: +See the progress charts in :doc:`/s_core_v_1/releases/progress_overview`: -- :ref:`overall_status_pa2` — Requirements Engineering -- :ref:`overall_status_pa3` — Architecture Design -- :ref:`overall_status_pa5` — Verification / Coverage +- :ref:`progress_overview_requirements` — Requirements Engineering +- :ref:`progress_overview_architecture` — Architecture Design +- :ref:`progress_overview_verification` — Verification / Coverage + +For the current per-module detail see the +:doc:`Module Verification Reports `. Work Breakdown -------------- @@ -70,12 +73,12 @@ Work Breakdown in the TL circle** before it is merged. - All in-scope feature requirements and the elements linked to them (component requirements, AoUs, feature architecture, component architecture) - are in status ``valid``. The overall status can always be tracked on the - :doc:`overall_status` page. + are in status ``valid``. The progress can always be tracked on the + :doc:`/s_core_v_1/releases/progress_overview` page. - Implement all missing automation checks for requirement and architecture elements as part of the docs-as-code toolchain used for generation of the - documentation (``//:docs``), as depicted in the *Process Status* pies on - :doc:`overall_status` (PA2 / PA3 *Req. verification status*) + documentation (``//:docs``), as reported in the + :doc:`Platform Verification Report ` - Provide a standardized CI/CD workflow for all implementation modules to validate requirements and architecture artifacts in compliance with the S-CORE process. The workflow shall be executed in the diff --git a/docs/s_core_v_1/roadmap/pi2.rst b/docs/s_core_v_1/roadmap/pi2.rst index d504f195a11..9e7553379eb 100644 --- a/docs/s_core_v_1/roadmap/pi2.rst +++ b/docs/s_core_v_1/roadmap/pi2.rst @@ -34,7 +34,7 @@ Milestone: `score/v0.9 `__ **Current State** -See the relevant tables in :doc:`overall_status`: +See the progress charts in :doc:`/s_core_v_1/releases/progress_overview`: -- :ref:`overall_status_pa4` — Implementation -- :ref:`overall_status_pa5` — Verification / Coverage +- :ref:`progress_overview_implementation` — Implementation +- :ref:`progress_overview_verification` — Verification / Coverage diff --git a/docs/s_core_v_1/roadmap/pi3.rst b/docs/s_core_v_1/roadmap/pi3.rst index 85ab0c41f85..93e81ae031d 100644 --- a/docs/s_core_v_1/roadmap/pi3.rst +++ b/docs/s_core_v_1/roadmap/pi3.rst @@ -37,6 +37,6 @@ Milestone: `score/v0.10 `__ **Current State** -See the relevant tables in :doc:`overall_status`: +See the progress charts in :doc:`/s_core_v_1/releases/progress_overview`: -- :ref:`overall_status_pa5` — Verification / Coverage +- :ref:`progress_overview_verification` — Verification / Coverage diff --git a/docs/s_core_v_1/roadmap/planning_approach.rst b/docs/s_core_v_1/roadmap/planning_approach.rst index 81aae27860e..874ada8b58f 100644 --- a/docs/s_core_v_1/roadmap/planning_approach.rst +++ b/docs/s_core_v_1/roadmap/planning_approach.rst @@ -78,7 +78,7 @@ example ``pa1_req_eng``, ``pa2_arch_design``, ``pa3_implementation``, ``pa4_verification``. This makes it possible to group and filter tickets not only **by time** (milestone / release gate) but also **by function** (process area), which is what feeds the per-process-area views on the -:doc:`Overall Status ` page. +:doc:`Release-wide Progress Overview ` page. Terminology ----------- diff --git a/docs/s_core_v_1/roadmap/roadmap.rst b/docs/s_core_v_1/roadmap/roadmap.rst index 8ff2a69aacc..68f8e3732c1 100644 --- a/docs/s_core_v_1/roadmap/roadmap.rst +++ b/docs/s_core_v_1/roadmap/roadmap.rst @@ -198,7 +198,6 @@ Status & Next Steps :titlesonly: :maxdepth: 1 - Overall Status Planning Approach Release Gate v0.8 — Requirements Engineering + Architecture Design Release Gate v0.9 — Implementation diff --git a/scripts/progress_overview/collect_metrics.py b/scripts/progress_overview/collect_metrics.py new file mode 100644 index 00000000000..9ca1a73cde1 --- /dev/null +++ b/scripts/progress_overview/collect_metrics.py @@ -0,0 +1,461 @@ +#!/usr/bin/env python3 +# ******************************************************************************* +# Copyright (c) 2026 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +"""Collect per-release, per-module metrics for the release-wide progress overview charts. + +For every ``reference_integration`` release tag the module pins are read from +that tag's ``known_good.json``; the working tree's ``known_good.json`` supplies +the forecast column. Metrics are then counted from bare clones using git +plumbing, which keeps the whole run local and free of API rate limits. + +Requires ``GITHUB_PAT`` for the tag/pin lookups. Writes +``progress_overview_data.json``; run ``generate_progress_charts.py`` afterwards. +""" + +import argparse +import base64 +import json +import math +import os +import re +import subprocess +import urllib.error +import urllib.request +from collections import Counter +from pathlib import Path + +REPO_ROOT = Path(__file__).resolve().parents[2] +DATA_FILE = REPO_ROOT / "docs" / "s_core_v_1" / "releases" / "progress_overview_data.json" +API = "https://api.github.com" +REF_INT = "eclipse-score/reference_integration" + +# display name -> (repo, known_good keys oldest-first, score-repo path fragments) +MODULES = { + "Baselibs": ("eclipse-score/baselibs", ["score_baselibs"], ["features/baselibs", "modules/baselibs"]), + "Communication": ( + "eclipse-score/communication", + ["score_communication"], + ["features/communication", "modules/communication"], + ), + "Logging": ( + "eclipse-score/logging", + ["score_logging"], + ["features/logging", "features/analysis-infra/logging", "features/log_and_trace/logging", "modules/logging"], + ), + "Persistency": ( + "eclipse-score/persistency", + ["score_persistency"], + ["features/persistency", "modules/persistency"], + ), + "Time": ("eclipse-score/time", ["score_time"], ["features/time", "modules/time"]), + "Config Mgmt": ( + "eclipse-score/config_management", + ["score_config_management"], + ["features/configuration", "modules/config"], + ), + "Lifecycle": ( + "eclipse-score/lifecycle", + ["score_lifecycle", "score_lifecycle_health"], + ["features/lifecycle", "modules/lifecycle"], + ), + "Kyron": ("eclipse-score/kyron", ["score_kyron"], ["features/kyron", "modules/kyron"]), + "Security/Crypto": ("eclipse-score/inc_security_crypto", [], ["features/security_crypto", "modules/security"]), + "Diagnostic Services": (None, [], ["features/diagnostics", "modules/diagnostic"]), + "NM": (None, [], ["features/network_management", "features/nm/", "modules/network_management"]), + "Some/IP": ("eclipse-score/inc_someip_gateway", [], ["features/communication/some_ip_gateway"]), +} +SCORE_REPO = "eclipse-score/score" +SCORE_KEY = "score_platform" +SOMEIP = "some_ip_gateway" + +# reference_integration hosts the feature-level integration tests; the module a +# test belongs to is taken from the path segment below these directories. +RI_TEST_DIRS = ("feature_integration_tests", "platform_integration_tests") +RI_ALIASES = { + "Baselibs": {"baselibs"}, + "Communication": {"communication"}, + "Logging": {"logging"}, + "Persistency": {"persistency"}, + "Time": {"time"}, + "Config Mgmt": {"config", "config_management", "configuration"}, + "Lifecycle": {"lifecycle"}, + "Kyron": {"kyron"}, + "Security/Crypto": {"security", "crypto", "security_crypto"}, + "Diagnostic Services": {"diagnostics", "diagnostic_services"}, + "NM": {"nm", "network_management"}, + "Some/IP": {"some_ip", "someip", "some_ip_gateway"}, +} + +MODULE_COLORS = { + "Baselibs": "#1f77b4", + "Communication": "#ff7f0e", + "Logging": "#2ca02c", + "Persistency": "#d62728", + "Time": "#9467bd", + "Config Mgmt": "#8c564b", + "Lifecycle": "#e377c2", + "Kyron": "#17becf", + "Security/Crypto": "#bcbd22", + "Diagnostic Services": "#aec7e8", + "NM": "#ffbb78", + "Some/IP": "#98df8a", +} + +CHARTS = [ + ("requirements", "req", "pa2_impl_progress.svg", "Requirements per release (feature + component)"), + ("architecture", "arc", "pa3_arch_progress.svg", "Architecture elements per release (feature + component)"), + ("implementation", "loc", "pa4_impl_progress.svg", "Lines of code per release"), + ("unit_tests", "unit_tests", "pa5_unit_test_progress.svg", "Unit tests per release"), + ( + "integration_tests", + "int_tests", + "pa5_integration_test_progress.svg", + "Component and feature integration tests per release", + ), +] + +REQ_RST = re.compile(r"^\s*\.\.\s+(feat_req|comp_req|aou_req)::", re.M) +ARC_RST = re.compile( + r"^\s*\.\.\s+(feat|feat_arc|feat_arc_sta|feat_arc_dyn|comp|comp_arc|comp_arc_sta" + r"|comp_arc_dyn|logic_arc_int|logic_arc_int_op|real_arc_int|real_arc_int_op)::", + re.M, +) +TRLC_OBJ = re.compile(r"^[ \t]*(?:\w+\.)?([A-Z]\w*)[ \t]+\w+[ \t]*\{", re.M) +TRLC_REQ_TYPES = {"CompReq", "FeatReq", "AoU", "ExternalCompReq", "AssumedSystemReq"} +TEST_PAT = re.compile( + r"\bTEST(?:_F|_P)?\s*\(|\bTYPED_TEST(?:_P)?\s*\(|^\s*#\[\s*test\s*\]" + r"|^\s*(?:async\s+)?def\s+test_", + re.M, +) +SRC_EXT = (".cpp", ".cc", ".cxx", ".c", ".h", ".hpp", ".hh", ".rs", ".py") +# a test whose path crosses one of these directories is not a unit test +INT_TEST_DIRS = { + "component", + "integration", + "integration_test", + "integration_tests", + "integration_testing", + "itf", + *RI_TEST_DIRS, +} + +_api_cache: dict[str, object] = {} + + +def gh(path): + if path not in _api_cache: + req = urllib.request.Request( + API + path, + headers={ + "Authorization": f"Bearer {os.environ['GITHUB_PAT']}", + "Accept": "application/vnd.github+json", + "User-Agent": "progress-overview", + }, + ) + with urllib.request.urlopen(req) as r: + _api_cache[path] = json.load(r) + return _api_cache[path] + + +def resolve_tag(repo, tag): + """Return the commit a tag points at, dereferencing annotated tags.""" + try: + d = gh(f"/repos/{repo}/git/ref/tags/{tag}") + except urllib.error.HTTPError: + return None + sha = d["object"]["sha"] + if d["object"]["type"] == "tag": + sha = gh(f"/repos/{repo}/git/tags/{sha}")["object"]["sha"] + return sha + + +def commit_before(repo, iso_date): + try: + c = gh(f"/repos/{repo}/commits?until={iso_date}&per_page=1") + except urllib.error.HTTPError: + return None + return c[0]["sha"] if c else None + + +def flatten(known_good): + flat = {} + for key, value in known_good.get("modules", {}).items(): + if isinstance(value, dict) and "repo" in value: + flat[key] = value + elif isinstance(value, dict): + flat.update(value) + return flat + + +def gitdir(repo, cache): + """reference_integration is measured from this checkout, not from a clone.""" + if repo == REF_INT: + return REPO_ROOT / ".git" + return cache / f"{repo.split('/')[-1]}.git" + + +def git(repo, cache, *args): + return subprocess.run( + ["git", f"--git-dir={gitdir(repo, cache)}", *args], + capture_output=True, + ) + + +def ensure_clone(repo, cache): + target = gitdir(repo, cache) + if target.exists(): + subprocess.run(["git", f"--git-dir={target}", "fetch", "-q", "--all", "--tags"], check=False) + return + token = os.environ["GITHUB_PAT"] + print(f" cloning {repo}") + subprocess.run( + ["git", "clone", "-q", "--bare", f"https://x-access-token:{token}@github.com/{repo}.git", str(target)], + check=True, + ) + + +def ls_tree(repo, sha, cache): + out = git(repo, cache, "ls-tree", "-r", "--long", sha) + if out.returncode: + return [] + entries = [] + for line in out.stdout.decode("utf-8", "replace").splitlines(): + meta, path = line.split("\t", 1) + parts = meta.split() + if parts[1] == "blob": + entries.append((parts[2], path)) + return entries + + +def read_blobs(repo, shas, cache): + """Stream several blobs through a single `git cat-file --batch` call.""" + if not shas: + return {} + p = subprocess.run( + ["git", f"--git-dir={gitdir(repo, cache)}", "cat-file", "--batch"], + input=("\n".join(shas) + "\n").encode(), + capture_output=True, + ) + res, buf, pos = {}, p.stdout, 0 + for sha in shas: + nl = buf.index(b"\n", pos) + header = buf[pos:nl].decode() + pos = nl + 1 + if "missing" in header: + continue + size = int(header.split()[2]) + res[sha] = buf[pos : pos + size].decode("utf-8", "replace") + pos += size + 1 + return res + + +def is_doc(path): + return path.endswith(".rst") and "chklst" not in path + + +def is_src(path): + p = path.lower() + if not p.endswith(SRC_EXT) or p.startswith("bazel-"): + return False + return not (p.startswith(("docs/", "third_party/")) or "/docs/" in p or "/third_party/" in p) + + +def is_integration_test(path): + return bool(INT_TEST_DIRS & set(path.split("/")[:-1])) + + +def measure(repo, sha, cache, path_ok=None, *, with_code=True): + entries = [e for e in ls_tree(repo, sha, cache) if path_ok is None or path_ok(e[1])] + counts = Counter() + if not entries: + return counts + + docs = [s for s, p in entries if is_doc(p)] + blobs = read_blobs(repo, docs, cache) + for sha_ in docs: + body = blobs.get(sha_, "") + counts["req"] += len(REQ_RST.findall(body)) + counts["arc"] += len(ARC_RST.findall(body)) + + trlc = [s for s, p in entries if p.endswith(".trlc")] + blobs = read_blobs(repo, trlc, cache) + for sha_ in trlc: + for kind in TRLC_OBJ.findall(blobs.get(sha_, "")): + if kind in TRLC_REQ_TYPES: + counts["req"] += 1 + + if with_code: + src = [(s, p) for s, p in entries if is_src(p)] + blobs = read_blobs(repo, [s for s, _ in src], cache) + for sha_, path in src: + body = blobs.get(sha_, "") + counts["loc"] += body.count("\n") + bucket = "int_tests" if is_integration_test(path) else "unit_tests" + counts[bucket] += len(TEST_PAT.findall(body)) + return counts + + +def ri_integration_tests(repo, sha, cache): + """Count reference_integration's own feature tests per module.""" + per_module = Counter() + entries = [(s, p) for s, p in ls_tree(repo, sha, cache) if p.startswith(RI_TEST_DIRS) and is_src(p)] + blobs = read_blobs(repo, [s for s, _ in entries], cache) + for sha_, path in entries: + n = len(TEST_PAT.findall(blobs.get(sha_, ""))) + if not n: + continue + segs = set(path.split("/")[1:-1]) + for name, aliases in RI_ALIASES.items(): + if aliases & segs: + per_module[name] += n + break + return per_module + + +VERSION = re.compile(r"^v(\d+)\.(\d+)(?:\.(\d+))?(?:-(.+))?$") + + +def version_key(tag): + """Sort key for v.[.][-
]; a pre-release sorts before its final release."""
+    major, minor, patch, pre = VERSION.match(tag).groups()
+    return int(major), int(minor), int(patch or 0), pre is None, pre or ""
+
+
+def next_release(last_tag):
+    """The lowest release milestone (v.) in eclipse-score/score after the latest tag."""
+    titles = [m["title"] for m in gh(f"/repos/{SCORE_REPO}/milestones?state=all&per_page=100")]
+    later = [t for t in titles if re.fullmatch(r"v\d+\.\d+", t) and version_key(t) > version_key(last_tag)]
+    if not later:
+        raise SystemExit(f"error: no release milestone after {last_tag} in {SCORE_REPO}; create it first")
+    return min(later, key=version_key)
+
+
+def release_pins(cache):
+    """Return [(label, {module: (repo, sha)})] oldest first, forecast last.
+
+    The pseudo-entries ``__score__`` and ``__ri__`` carry the platform and
+    reference_integration commits for the same release.
+    """
+    tags = [t["name"] for t in gh(f"/repos/{REF_INT}/tags?per_page=100")]
+    columns = []
+    for tag in sorted((t for t in tags if VERSION.match(t) and t != "v0.5.0-alpha"), key=version_key):
+        ref = resolve_tag(REF_INT, tag)
+        date = gh(f"/repos/{REF_INT}/commits/{ref}")["commit"]["committer"]["date"]
+        blob = gh(f"/repos/{REF_INT}/contents/known_good.json?ref={ref}")
+        flat = flatten(json.loads(base64.b64decode(blob["content"])))
+        columns.append((tag, date, ref, flat))
+
+    forecast = f"{next_release(columns[-1][0])} (forecast)"
+    local = flatten(json.loads((REPO_ROOT / "known_good.json").read_text(encoding="utf-8")))
+    head = git(REF_INT, cache, "rev-parse", "HEAD").stdout.decode().strip()
+    columns.append((forecast, None, head, local))
+
+    out = []
+    for tag, date, ri_sha, flat in columns:
+        resolved = {"__ri__": (REF_INT, ri_sha)}
+        for name, (repo, keys, _) in list(MODULES.items()) + [("__score__", (SCORE_REPO, [SCORE_KEY], []))]:
+            if repo is None:
+                continue
+            entry = next((flat[k] for k in keys if k in flat), None)
+            sha = entry.get("hash") if entry else None
+            if not sha and entry and entry.get("version"):
+                sha = resolve_tag(repo, f"v{entry['version']}") or resolve_tag(repo, entry["version"])
+            if not sha:
+                ensure_clone(repo, cache)
+                sha = (
+                    commit_before(repo, date)
+                    if date
+                    else git(repo, cache, "rev-parse", "main").stdout.decode().strip() or None
+                )
+            if sha:
+                resolved[name] = (repo, sha)
+        out.append((tag, resolved))
+    return out
+
+
+def nice_axis(peak):
+    """Round the axis maximum up to a readable step."""
+    base = 10 ** math.floor(math.log10(peak))
+    for mult in (0.1, 0.2, 0.25, 0.5, 1.0):
+        step = base * mult
+        if peak / step <= 10:
+            top = math.ceil(peak / step) * step
+            return int(top + step if top < peak * 1.04 else top), int(step)
+    return int(peak), int(base)
+
+
+def main() -> None:
+    parser = argparse.ArgumentParser(description=__doc__)
+    parser.add_argument("--cache", type=Path, default=Path("/tmp/progress_overview_repos"))
+    parser.add_argument("--out", type=Path, default=DATA_FILE)
+    parser.add_argument("--collected", default=None, help="data collection date, default today")
+    args = parser.parse_args()
+    args.cache.mkdir(parents=True, exist_ok=True)
+
+    for repo, _, _ in MODULES.values():
+        if repo:
+            ensure_clone(repo, args.cache)
+    ensure_clone(SCORE_REPO, args.cache)
+
+    per_release = []
+    for label, resolved in release_pins(args.cache):
+        print(f"== {label}")
+        score_repo, score_sha = resolved["__score__"]
+        ri_int = ri_integration_tests(*resolved["__ri__"], args.cache)
+        totals = {}
+        for name, (_, _, fragments) in MODULES.items():
+            counts = Counter()
+
+            def score_ok(path, fragments=fragments, name=name):
+                if not any(f in path for f in fragments):
+                    return False
+                return not (name == "Communication" and SOMEIP in path)
+
+            counts.update(measure(score_repo, score_sha, args.cache, score_ok, with_code=False))
+            if name in resolved:
+                repo, sha = resolved[name]
+                counts.update(measure(repo, sha, args.cache))
+            counts["int_tests"] += ri_int[name]
+            totals[name] = counts
+            summary = " ".join(f"{m}={counts[m]:>7d}" for _, m, _, _ in CHARTS)
+            print(f"   {name:22s} {summary}")
+        per_release.append((label, totals))
+
+    from datetime import date
+
+    data = {
+        "data_collected": args.collected or date.today().isoformat(),
+        "module_colors": MODULE_COLORS,
+        "charts": {},
+    }
+    for key, metric, fname, title in CHARTS:
+        releases = [
+            {"name": label, "modules": {m: totals[m][metric] for m in MODULE_COLORS}} for label, totals in per_release
+        ]
+        peak = max(sum(r["modules"].values()) for r in releases)
+        axis_max, axis_step = nice_axis(peak)
+        data["charts"][key] = {
+            "file": fname,
+            "title": title,
+            "axis_max": axis_max,
+            "axis_step": axis_step,
+            "releases": releases,
+        }
+
+    args.out.write_text(json.dumps(data, indent=2) + "\n", encoding="utf-8")
+    print(f"\nwrote {args.out}")
+    print("now run scripts/progress_overview/generate_progress_charts.py")
+
+
+if __name__ == "__main__":
+    main()
diff --git a/scripts/progress_overview/generate_progress_charts.py b/scripts/progress_overview/generate_progress_charts.py
new file mode 100644
index 00000000000..608936b8d8a
--- /dev/null
+++ b/scripts/progress_overview/generate_progress_charts.py
@@ -0,0 +1,171 @@
+#!/usr/bin/env python3
+# *******************************************************************************
+# Copyright (c) 2026 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Apache License Version 2.0 which is available at
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# SPDX-License-Identifier: Apache-2.0
+# *******************************************************************************
+"""Render the release-wide progress overview charts from ``progress_overview_data.json``.
+
+Every release is a stacked bar whose colour slots map to the contributing
+modules, so the per-module split is comparable across releases. Colours come
+from the shared ``module_colors`` map, which makes a module recognisable by the
+same colour in every chart. Within a bar the slots are ordered by size,
+largest at the bottom.
+"""
+
+import argparse
+import json
+from pathlib import Path
+from xml.sax.saxutils import escape
+
+REPO_ROOT = Path(__file__).resolve().parents[2]
+DATA_FILE = REPO_ROOT / "docs" / "s_core_v_1" / "releases" / "progress_overview_data.json"
+ASSET_DIR = REPO_ROOT / "docs" / "_assets"
+
+WIDTH = 880
+PLOT_LEFT = 90
+PLOT_RIGHT = 850
+PLOT_TOP = 56
+PLOT_BOTTOM = 300
+BAR_WIDTH = 82
+LABEL_Y = 322
+LEGEND_TOP = 348
+LEGEND_ROW_H = 20
+LEGEND_COLS = 3
+# segments thinner than this get no inline label, it would not fit
+MIN_LABEL_PX = 12
+
+
+def fmt(value: int) -> str:
+    return f"{value:,}"
+
+
+def bar_x(index: int, count: int) -> float:
+    span = (PLOT_RIGHT - PLOT_LEFT) / count
+    return PLOT_LEFT + span * index + (span - BAR_WIDTH) / 2
+
+
+def text(x: float, y: float, content: str, **attrs: str) -> str:
+    extra = "".join(f' {k.replace("_", "-")}="{v}"' for k, v in attrs.items())
+    return f'  {content}'
+
+
+def render(chart: dict, module_colors: dict) -> str:
+    releases = chart["releases"]
+    axis_max = int(chart["axis_max"])
+    axis_step = int(chart["axis_step"])
+    scale = (PLOT_BOTTOM - PLOT_TOP) / axis_max
+    title = escape(chart["title"])
+
+    contributing = [m for m in module_colors if any(r["modules"].get(m, 0) > 0 for r in releases)]
+    legend_rows = -(-len(contributing) // LEGEND_COLS)
+    height = LEGEND_TOP + legend_rows * LEGEND_ROW_H + 10
+
+    o = [
+        (
+            f''
+        ),
+        f"  {title}",
+        text(WIDTH // 2, 26, title, font_size="15", font_weight="bold"),
+        f'  ',
+        f'  ',
+        '  ',
+    ]
+    for tick in range(axis_step, axis_max + 1, axis_step):
+        y = round(PLOT_BOTTOM - tick * scale, 1)
+        o.append(f'    ')
+    o.append("  ")
+
+    o.append('  ')
+    for tick in range(0, axis_max + 1, axis_step):
+        y = round(PLOT_BOTTOM - tick * scale + 4, 1)
+        o.append(f'    {fmt(tick)}')
+    o.append("  ")
+
+    for i, release in enumerate(releases):
+        mods = release["modules"]
+        total = sum(mods.values())
+        x = round(bar_x(i, len(releases)), 1)
+        cx = round(x + BAR_WIDTH / 2, 1)
+        o.append(f"  ")
+        cursor = float(PLOT_BOTTOM)
+        # largest slot at the bottom; colour stays tied to the module either way
+        order = sorted(
+            (m for m in contributing if mods.get(m, 0) > 0),
+            key=lambda m: (-mods[m], contributing.index(m)),
+        )
+        for module in order:
+            value = mods[module]
+            h = value * scale
+            y = cursor - h
+            o.append(
+                f'  '
+                f"{escape(module)}: {fmt(value)}"
+            )
+            if h >= MIN_LABEL_PX:
+                o.append(
+                    text(
+                        cx,
+                        round(y + h / 2 + 3.5, 1),
+                        fmt(value),
+                        font_size="9",
+                        fill="#fff",
+                        font_weight="bold",
+                    )
+                )
+            cursor = y
+        o.append(text(cx, round(cursor - 6, 1), fmt(total), font_size="11", font_weight="bold"))
+        o.append(text(cx, LABEL_Y, escape(release["name"]), font_weight="bold", font_size="12"))
+
+    col_w = (PLOT_RIGHT - PLOT_LEFT) / LEGEND_COLS
+    o.append('  ')
+    for i, module in enumerate(contributing):
+        lx = round(PLOT_LEFT + (i % LEGEND_COLS) * col_w, 1)
+        ly = LEGEND_TOP + (i // LEGEND_COLS) * LEGEND_ROW_H
+        o.append(f'    ')
+        o.append(f'    {escape(module)}')
+    o.append("  ")
+    o.append("")
+    return "\n".join(o) + "\n"
+
+
+def main() -> None:
+    parser = argparse.ArgumentParser(description=__doc__)
+    parser.add_argument("--data", type=Path, default=DATA_FILE)
+    parser.add_argument("--out-dir", type=Path, default=ASSET_DIR)
+    parser.add_argument(
+        "--check",
+        action="store_true",
+        help="fail instead of writing when a chart is out of date",
+    )
+    args = parser.parse_args()
+
+    data = json.loads(args.data.read_text(encoding="utf-8"))
+    stale = []
+    for chart in data["charts"].values():
+        svg = render(chart, data["module_colors"])
+        target = args.out_dir / chart["file"]
+        if args.check:
+            if not target.exists() or target.read_text(encoding="utf-8") != svg:
+                stale.append(target)
+            continue
+        target.write_text(svg, encoding="utf-8")
+        print(f"wrote {target.relative_to(REPO_ROOT)}")
+
+    if stale:
+        names = ", ".join(str(p.relative_to(REPO_ROOT)) for p in stale)
+        raise SystemExit(f"out of date: {names}\nrun scripts/progress_overview/generate_progress_charts.py")
+
+
+if __name__ == "__main__":
+    main()

From 17ba8f96a23b799cca5357b52a6237ce4cab6ad3 Mon Sep 17 00:00:00 2001
From: rmaddikery 
Date: Thu, 29 Oct 2026 12:22:20 +0100
Subject: [PATCH 06/31] Bumps score_logging to v0.2.5

- Fix patched after upstream deps update
- export mw/log aou_requirements.rst from baselibs for
score_logging consumption
---
 .../score_modules_target_sw.MODULE.bazel      |  3 ++-
 known_good.json                               |  5 ++--
 .../003-export-aou-requirements.patch         | 13 +++++++++++
 .../002-undev-component-test-deps.patch       | 23 +++++++++++++------
 4 files changed, 34 insertions(+), 10 deletions(-)
 create mode 100644 patches/baselibs/003-export-aou-requirements.patch

diff --git a/bazel_common/score_modules_target_sw.MODULE.bazel b/bazel_common/score_modules_target_sw.MODULE.bazel
index 9b254e54d7d..638b639878b 100644
--- a/bazel_common/score_modules_target_sw.MODULE.bazel
+++ b/bazel_common/score_modules_target_sw.MODULE.bazel
@@ -22,6 +22,7 @@ git_override(
     patches = [
         "//patches/baselibs:001-restore-trace-library-mock-visibility.patch",
         "//patches/baselibs:002-restore-qnx8-poll-workaround.patch",
+        "//patches/baselibs:003-export-aou-requirements.patch",
     ],
     remote = "https://github.com/eclipse-score/baselibs.git",
 )
@@ -73,7 +74,7 @@ git_override(
 bazel_dep(name = "score_logging")
 git_override(
     module_name = "score_logging",
-    commit = "3d9896611baf4e0d018032e5cb999941b2602dbd",
+    commit = "cda5a5ba57dffe3aa109e518e47f0ada692b3573",
     patch_strip = 1,
     patches = [
         "//patches/logging:002-undev-component-test-deps.patch",
diff --git a/known_good.json b/known_good.json
index 1c28a99d9c8..0668f64b460 100644
--- a/known_good.json
+++ b/known_good.json
@@ -5,7 +5,8 @@
                 "repo": "https://github.com/eclipse-score/baselibs.git",
                 "bazel_patches": [
                     "//patches/baselibs:001-restore-trace-library-mock-visibility.patch",
-                    "//patches/baselibs:002-restore-qnx8-poll-workaround.patch"
+                    "//patches/baselibs:002-restore-qnx8-poll-workaround.patch",
+                    "//patches/baselibs:003-export-aou-requirements.patch"
                 ],
                 "metadata": {
                     "code_root_path": "//score/...",
@@ -192,7 +193,7 @@
                         "-//score/test/component/..."
                     ]
                 },
-                "hash": "3d9896611baf4e0d018032e5cb999941b2602dbd"
+                "hash": "cda5a5ba57dffe3aa109e518e47f0ada692b3573"
             },
             "score_time": {
                 "repo": "https://github.com/eclipse-score/time.git",
diff --git a/patches/baselibs/003-export-aou-requirements.patch b/patches/baselibs/003-export-aou-requirements.patch
new file mode 100644
index 00000000000..9380309f826
--- /dev/null
+++ b/patches/baselibs/003-export-aou-requirements.patch
@@ -0,0 +1,13 @@
+diff --git a/score/mw/log/BUILD b/score/mw/log/BUILD
+index 5af00a2..f359e8c 100644
+--- a/score/mw/log/BUILD
++++ b/score/mw/log/BUILD
+@@ -499,3 +499,8 @@ docs_bundle(
+     source_dir = "docs",
+     visibility = ["//visibility:public"],
+ )
++
++exports_files(
++    ["docs/safety_analysis/aou_requirements.rst"],
++    visibility = ["//visibility:public"],
++)
diff --git a/patches/logging/002-undev-component-test-deps.patch b/patches/logging/002-undev-component-test-deps.patch
index 251b6fb4a62..5c0204000a0 100644
--- a/patches/logging/002-undev-component-test-deps.patch
+++ b/patches/logging/002-undev-component-test-deps.patch
@@ -1,13 +1,13 @@
 diff --git a/MODULE.bazel b/MODULE.bazel
-index 45a6aafd..afd6a2aa 100644
+index 0c77eed..ffb29a4 100644
 --- a/MODULE.bazel
 +++ b/MODULE.bazel
-@@ -42,15 +42,15 @@ bazel_dep(name = "score_rust_policies", version = "0.0.5")
- bazel_dep(name = "score_process_description", version = "2.1.2")
+@@ -56,15 +56,15 @@ bazel_dep(name = "score_rust_policies", version = "0.0.5")
+ bazel_dep(name = "score_process_description", version = "2.2.1")
  bazel_dep(name = "score_platform", version = "0.7.2")
  
--bazel_dep(name = "score_itf", version = "0.5.0", dev_dependency = True)
-+bazel_dep(name = "score_itf", version = "0.5.0")
+-bazel_dep(name = "score_itf", version = "0.6.0", dev_dependency = True)
++bazel_dep(name = "score_itf", version = "0.6.0")
  
  # OCI / Docker image rules for integration tests
 -bazel_dep(name = "rules_oci", version = "2.2.7", dev_dependency = True)
@@ -21,7 +21,7 @@ index 45a6aafd..afd6a2aa 100644
  
  imagefs = use_extension("@score_rules_imagefs//extensions:imagefs.bzl", "imagefs", dev_dependency = True)
  imagefs.toolchain(
-@@ -75,7 +75,7 @@ use_repo(
+@@ -89,7 +89,7 @@ use_repo(
      "score_qnx_x86_64_ifs_toolchain",
  )
  
@@ -30,8 +30,17 @@ index 45a6aafd..afd6a2aa 100644
  oci.pull(
      name = "ubuntu_24_04",
      digest = "sha256:2e863c44b718727c860746568e1d54afd13b2fa71b160f5cd9058fc436217b30",
+@@ -107,7 +107,7 @@ bazel_dep(name = "score_toolchains_rust", version = "0.10.0", dev_dependency = T
+ bazel_dep(name = "score_crates", version = "0.0.11")
+ 
+ # TRLC dependency for requirements traceability
+-bazel_dep(name = "trlc", version = "0.0.0", dev_dependency = True)
++bazel_dep(name = "trlc", version = "0.0.0")
+ git_override(
+     module_name = "trlc",
+     commit = "8f369f1208598c2e75f44a77a98d244634ed482a",  # trlc-3.0.1 (score_tooling >= 2.x needs trlc 3.x)
 diff --git a/score/test/component/defs.bzl b/score/test/component/defs.bzl
-index 665f891a..0177a698 100644
+index 665f891..0177a69 100644
 --- a/score/test/component/defs.bzl
 +++ b/score/test/component/defs.bzl
 @@ -66,7 +66,6 @@ def py_logging_itf_test(name, srcs, filesystem, filesystem_pkg, extra_oci_tars =

From 1ec2a9d554153c3722bd2075f451eac47c94487e Mon Sep 17 00:00:00 2001
From: Leonardo Rossetti 
Date: Thu, 29 Oct 2026 10:17:54 -0300
Subject: [PATCH 07/31] push autosd image on release (#413) (#424)

Signed-off-by: odra 
---
 .github/workflows/build_and_test_autosd.yml | 35 +++++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git a/.github/workflows/build_and_test_autosd.yml b/.github/workflows/build_and_test_autosd.yml
index 8e060fea428..c704c9f3abf 100644
--- a/.github/workflows/build_and_test_autosd.yml
+++ b/.github/workflows/build_and_test_autosd.yml
@@ -12,6 +12,8 @@
 # *******************************************************************************
 name: AutoSD - Build & Integration Test
 on:
+  release:
+    types: [created]
   pull_request:
     types: [opened, reopened, synchronize]
   merge_group:
@@ -112,6 +114,39 @@ jobs:
           sleep 5
           sshcmd 'bootc status'
           sshcmd '/showcases/bin/cli --examples all'
+          sshcmd 'rm -f /tmp/score_showcases_autosd_latest.oci'
         working-directory: ./images/autosd
         env:
           SSH_PASSWORD: password
+      - name: Archive Modified Image
+        run: |
+          xz disk.qcow2
+          mv disk.qcow2.xz eclipse-autosd-bootc-qemu-${{ matrix.platform }}.qcow2.xz
+        working-directory: ./images/autosd
+      - name: Store Image
+        uses: actions/upload-artifact@v4
+        with:
+          name: eclipse-autosd-bootc-qemu-${{ matrix.platform }}.qcow2.xz
+          path: images/autosd/eclipse-autosd-bootc-qemu-${{ matrix.platform }}.qcow2.xz
+  release:
+    name: Publish image to release
+    needs: build
+    if: github.event_name == 'release'
+    runs-on: ubuntu-24.04
+    permissions:
+      contents: write
+    env:
+      RELEASE_NAME: ${{ github.event.release.tag_name }}
+    steps:
+      - name: Download archived image artifact
+        uses: actions/download-artifact@v4
+        with:
+          name: eclipse-autosd-bootc-qemu-x86_64.qcow2.xz
+          path: ./release-assets
+      - name: Upload image to release
+        env:
+          GH_TOKEN: ${{ github.token }}
+        run: |
+          gh release upload "$RELEASE_NAME" \
+            ./release-assets/eclipse-autosd-bootc-qemu-x86_64.qcow2.xz \
+            --clobber

From 3193244cf668314bbf37f791a623549c4a298fda Mon Sep 17 00:00:00 2001
From: Arkadiusz Jedrzejewski 
Date: Thu, 29 Oct 2026 15:57:37 +0100
Subject: [PATCH 08/31] score_persistency: bump to current main

---
 known_good.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/known_good.json b/known_good.json
index 0668f64b460..491320dc7f6 100644
--- a/known_good.json
+++ b/known_good.json
@@ -109,7 +109,7 @@
                         "//:unit_tests"
                     ]
                 },
-                "hash": "a804b85f67381378b2250abaa91e0a3a6046e994"
+                "hash": "41d76090c7d0b05068cdc5bb22ef2e9f3571906a"
             },
             "score_kyron": {
                 "repo": "https://github.com/eclipse-score/kyron.git",

From a3e02fcd465b0fb68d42c37bd9bd111473b88b8e Mon Sep 17 00:00:00 2001
From: Anton Krivoborodov 
Date: Thu, 29 Oct 2026 14:59:06 +0000
Subject: [PATCH 09/31] Bump process_description 2.2.2, platform 0.7.4,
 docs-as-code 8.6.0, lifecycle 0.9.0

Persistency a804b85 (bumped in cb89c10) expects score_platform 0.7.4 and
score_process_description 2.2.2 (feat_req version 2,
feat_req__persistency__cfg_priority, wp__module_user_manual,
gd_temp__rel_mod_user_manual). The previous pins were platform v0.7.2 and
process_description v2.1.2, which caused 12 docs-check warnings.

- score_process_description, score_platform and score_docs_as_code are now
  pinned to released registry versions (pin_version) instead of git commits.
- score_platform 0.7.4 drops lifecycle feat_reqs that lifecycle 85da216 still
  linked (33 warnings), so score_lifecycle moves to v0.9.0 (2c3a919), which
  targets exactly platform 0.7.4 / process_description 2.2.2 / docs-as-code
  8.6.0.
- Lifecycle v0.9.0 no longer has its own glossary, so the platform patch
  removing the duplicated lifecycle glossary is obsolete (it would now hide
  the 'Monitoring of Processes' term). Removed.
- patches/lifecycle/001 is already upstream in v0.9.0; removed.
  patches/lifecycle/002 rebased: score_itf is non-dev upstream, only the oci
  extension still needs un-deving.
- Lifecycle's verification report moved to
  verification_report/module_verification_report (mod_ver_report); link
  updated in docs/verification_report/modules/index.rst.

Local docs_shim build: the persistency and lifecycle warnings are gone; the
remaining warnings are the logging v0.2.5 ones (31 mounts.path_escape, 2
absolute :doc: links).

Also regenerates bazel_common/score_modules_target_sw.MODULE.bazel for the
preceding persistency bump (3193244), which only touched known_good.json.
---
 MODULE.bazel.lock                             |   6 +
 .../score_modules_target_sw.MODULE.bazel      |   5 +-
 .../score_modules_tooling.MODULE.bazel        |  19 +--
 docs/verification_report/modules/index.rst    |   4 +-
 known_good.json                               |  15 +-
 .../001-migrate-baselibs-rust-targets.patch   |  92 ------------
 .../002-undev-integration-test-deps.patch     |   8 +-
 ...-remove-duplicate-lifecycle-glossary.patch | 132 ------------------
 patches/platform/BUILD                        |   0
 9 files changed, 25 insertions(+), 256 deletions(-)
 delete mode 100644 patches/lifecycle/001-migrate-baselibs-rust-targets.patch
 delete mode 100644 patches/platform/001-remove-duplicate-lifecycle-glossary.patch
 delete mode 100644 patches/platform/BUILD

diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock
index 0540baff444..369a0261647 100644
--- a/MODULE.bazel.lock
+++ b/MODULE.bazel.lock
@@ -1006,10 +1006,16 @@
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_swift/1.16.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_swift/1.18.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_swift/2.1.1/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_docs_as_code/8.6.0/MODULE.bazel": "bbbbbeeefce7e520c7bf45eeef7cd6700fff8a8a4e4a7f3fc527daf1cf4462ec",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_docs_as_code/8.6.0/source.json": "ec461822c632ab0e9f9a620d831cb2b3ded5b9288550289180d891db71b7ec8f",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_itf/0.6.0/MODULE.bazel": "84fe2438bde5db32cbcfca5db1194a56fd753f69e5466cf8e46aada7f209e613",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_itf/0.6.0/source.json": "59e6efe70c81dbda18631020035bcedc1d92ee86bcae5965989ee5126aa78c92",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_platform/0.7.4/MODULE.bazel": "c3255f4f8ec36d60842839a2beaef003059849869f30ba2c6694100098cf508c",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_platform/0.7.4/source.json": "a5ed01a942535f7042e89ef5f586542f5367af83b6e58f91d2689f02a7e16fc6",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_process/2.0.2/MODULE.bazel": "6d2b227bb6880e9f6871cc8cf94c83399e35c188424f7e9b826262de8149ed43",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_process/2.0.2/source.json": "5ae55f0dabcddeb5bfae16ce480e2c065f907d2b0ed6a8e4ed7409b259b004ee",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_process_description/2.2.2/MODULE.bazel": "b0fd319ef2bed02e26307f2336f967d4d4885ab0538c44605a589797d973c803",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_process_description/2.2.2/source.json": "8b974430c3e2023a7534412e2bc03bced4eef9838f3b573739b7652fd26b335c",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_qnx_unit_tests/0.2.0/MODULE.bazel": "aaffff67916dd058737aac8e04368f12b214e7646ff58adbab48e6429d1a5410",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_qnx_unit_tests/0.2.0/source.json": "c40a614fd88beab7cb65b8640debd44eff3fbc32a7839734ef1112f265d2eeef",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_rules_imagefs/0.0.3/MODULE.bazel": "d87fcd3485438284fa96d6a5a81923d6b6672468947423517cc43c4d7692ca6a",
diff --git a/bazel_common/score_modules_target_sw.MODULE.bazel b/bazel_common/score_modules_target_sw.MODULE.bazel
index 638b639878b..c23c931d119 100644
--- a/bazel_common/score_modules_target_sw.MODULE.bazel
+++ b/bazel_common/score_modules_target_sw.MODULE.bazel
@@ -44,7 +44,7 @@ git_override(
 bazel_dep(name = "score_persistency")
 git_override(
     module_name = "score_persistency",
-    commit = "a804b85f67381378b2250abaa91e0a3a6046e994",
+    commit = "41d76090c7d0b05068cdc5bb22ef2e9f3571906a",
     patch_strip = 1,
     patches = [
         "//patches/persistency:003-undev-deps-for-root-module.patch",
@@ -62,10 +62,9 @@ git_override(
 bazel_dep(name = "score_lifecycle")
 git_override(
     module_name = "score_lifecycle",
-    commit = "85da2168328d17a3cf53791ebf93534e5ed921fc",
+    commit = "2c3a919452b0f81a016c6c8783254d7d0189d0a9",
     patch_strip = 1,
     patches = [
-        "//patches/lifecycle:001-migrate-baselibs-rust-targets.patch",
         "//patches/lifecycle:002-undev-integration-test-deps.patch",
     ],
     remote = "https://github.com/eclipse-score/lifecycle.git",
diff --git a/bazel_common/score_modules_tooling.MODULE.bazel b/bazel_common/score_modules_tooling.MODULE.bazel
index 5fc32bac29d..94a6b65f67c 100644
--- a/bazel_common/score_modules_tooling.MODULE.bazel
+++ b/bazel_common/score_modules_tooling.MODULE.bazel
@@ -42,14 +42,9 @@ git_override(
 )
 
 bazel_dep(name = "score_platform")
-git_override(
+single_version_override(
     module_name = "score_platform",
-    commit = "6d65a262c2329328cb9cbdd276bb143b417c54a4",
-    patch_strip = 1,
-    patches = [
-        "//patches/platform:001-remove-duplicate-lifecycle-glossary.patch",
-    ],
-    remote = "https://github.com/eclipse-score/score.git",
+    version = "0.7.4",
 )
 
 bazel_dep(name = "score_bazel_platforms")
@@ -66,17 +61,15 @@ single_version_override(
 )
 
 bazel_dep(name = "score_docs_as_code")
-git_override(
+single_version_override(
     module_name = "score_docs_as_code",
-    commit = "f1b30375e49646d95ca52565c41f5b926b0aa884",
-    remote = "https://github.com/eclipse-score/docs-as-code.git",
+    version = "8.6.0",
 )
 
 bazel_dep(name = "score_process_description")
-git_override(
+single_version_override(
     module_name = "score_process_description",
-    commit = "98d1d5f42dad412a09a888ea25e59c62fa6371ce",
-    remote = "https://github.com/eclipse-score/process_description.git",
+    version = "2.2.2",
 )
 
 bazel_dep(name = "score_bazel_cpp_toolchains")
diff --git a/docs/verification_report/modules/index.rst b/docs/verification_report/modules/index.rst
index 4daddeff330..cc7c20951c2 100644
--- a/docs/verification_report/modules/index.rst
+++ b/docs/verification_report/modules/index.rst
@@ -18,7 +18,7 @@ Module Verification Reports
 This page lists the per-module verification reports.
 
 * :doc:`Baselibs `
-* :doc:`Lifecycle `
+* :doc:`Lifecycle `
 * :doc:`Logging `
 * :doc:`Persistency `
 
@@ -27,6 +27,6 @@ This page lists the per-module verification reports.
    :hidden:
 
    Baselibs 
-   Lifecycle 
+   Lifecycle 
    Logging 
    Persistency 
diff --git a/known_good.json b/known_good.json
index 491320dc7f6..579f45c4bb4 100644
--- a/known_good.json
+++ b/known_good.json
@@ -130,7 +130,6 @@
             "score_lifecycle": {
                 "repo": "https://github.com/eclipse-score/lifecycle.git",
                 "bazel_patches": [
-                    "//patches/lifecycle:001-migrate-baselibs-rust-targets.patch",
                     "//patches/lifecycle:002-undev-integration-test-deps.patch"
                 ],
                 "metadata": {
@@ -160,7 +159,7 @@
                         "//..."
                     ]
                 },
-                "hash": "85da2168328d17a3cf53791ebf93534e5ed921fc"
+                "hash": "2c3a919452b0f81a016c6c8783254d7d0189d0a9"
             },
             "score_logging": {
                 "repo": "https://github.com/eclipse-score/logging.git",
@@ -287,10 +286,8 @@
             },
             "score_platform": {
                 "repo": "https://github.com/eclipse-score/score.git",
-                "hash": "6d65a262c2329328cb9cbdd276bb143b417c54a4",
-                "bazel_patches": [
-                    "//patches/platform:001-remove-duplicate-lifecycle-glossary.patch"
-                ]
+                "version": "0.7.4",
+                "pin_version": true
             },
             "score_bazel_platforms": {
                 "repo": "https://github.com/eclipse-score/bazel_platforms.git",
@@ -305,11 +302,13 @@
             },
             "score_docs_as_code": {
                 "repo": "https://github.com/eclipse-score/docs-as-code.git",
-                "hash": "f1b30375e49646d95ca52565c41f5b926b0aa884"
+                "version": "8.6.0",
+                "pin_version": true
             },
             "score_process_description": {
                 "repo": "https://github.com/eclipse-score/process_description.git",
-                "hash": "98d1d5f42dad412a09a888ea25e59c62fa6371ce"
+                "version": "2.2.2",
+                "pin_version": true
             },
             "score_bazel_cpp_toolchains": {
                 "repo": "https://github.com/eclipse-score/bazel_cpp_toolchains.git",
diff --git a/patches/lifecycle/001-migrate-baselibs-rust-targets.patch b/patches/lifecycle/001-migrate-baselibs-rust-targets.patch
deleted file mode 100644
index fabadf7d25a..00000000000
--- a/patches/lifecycle/001-migrate-baselibs-rust-targets.patch
+++ /dev/null
@@ -1,92 +0,0 @@
-diff --git a/examples/rust_supervised_app/BUILD b/examples/rust_supervised_app/BUILD
-index 9738ceb0b7..2dff53f79c 100644
---- a/examples/rust_supervised_app/BUILD
-+++ b/examples/rust_supervised_app/BUILD
-@@ -36,8 +36,8 @@ rust_binary(
-     deps = [
-         "//score/health_monitor:health_monitoring_rust",
-         "//score/launch_manager:lifecycle_rust",
--        "@score_baselibs//src/log/score_log",
--        "@score_baselibs//src/log/stdout_logger",
-+        "@score_baselibs//score/log_rust/score_log",
-+        "@score_baselibs//score/log_rust/stdout_logger",
-         "@score_crates//:clap",
-         "@score_crates//:libc",
-         "@score_crates//:signal_hook",
-diff --git a/score/health_monitor/src/rust/BUILD b/score/health_monitor/src/rust/BUILD
-index 44ab61c9e2..15b09001f1 100644
---- a/score/health_monitor/src/rust/BUILD
-+++ b/score/health_monitor/src/rust/BUILD
-@@ -14,14 +14,14 @@
- load("@rules_rust//rust:defs.bzl", "miri_test", "rust_library", "rust_static_library", "rust_test")
- 
- COMMON_RUST_DEPS = [
--    "@score_baselibs//src/containers:containers",
--    "@score_baselibs//src/thread:thread",
--    "@score_baselibs//src/log/score_log:score_log",
-+    "@score_baselibs//score/containers_rust:containers",
-+    "@score_baselibs//score/thread",
-+    "@score_baselibs//score/log_rust/score_log",
-     "//score/launch_manager:alive_rust",
- ]
- 
- PROC_MACRO_DEPS = [
--    "@score_baselibs//src/testing_macros:score_testing_macros",
-+    "@score_baselibs//score/testing_macros:score_testing_macros",
- ]
- 
- rust_library(
-@@ -78,7 +78,7 @@ rust_test(
-         "//config:unit_host": ["@platforms//os:linux"],  # see https://github.com/eclipse-score/lifecycle/issues/272
-         "//conditions:default": ["@platforms//:incompatible"],
-     }),
--    deps = ["@score_baselibs//src/log/stdout_logger"],
-+    deps = ["@score_baselibs//score/log_rust/stdout_logger"],
- )
- 
- rust_test(
-@@ -110,7 +110,7 @@ rust_test(
-         "//conditions:default": ["@platforms//:incompatible"],
-     }),
-     deps = [
--        "@score_baselibs//src/log/stdout_logger",
-+        "@score_baselibs//score/log_rust/stdout_logger",
-         "@score_crates//:loom",
-     ],
- )
-diff --git a/examples/cpp_supervised_app/BUILD b/examples/cpp_supervised_app/BUILD
-index 984f359388..320e13240d 100644
---- a/examples/cpp_supervised_app/BUILD
-+++ b/examples/cpp_supervised_app/BUILD
-@@ -34,6 +34,6 @@ cc_binary(
-     deps = [
-         "//score/health_monitor:health_monitoring_cc",
-         "//score/launch_manager:lifecycle_cc",
--        "@score_baselibs//src/log/stdout_logger_cpp_init",
-+        "@score_baselibs//score/log_rust/stdout_logger_cpp_init",
-     ],
- )
-diff --git a/score/health_monitor/src/cpp/details/BUILD b/score/health_monitor/src/cpp/details/BUILD
-index 6dbd9e45fa..7ccfa29283 100644
---- a/score/health_monitor/src/cpp/details/BUILD
-+++ b/score/health_monitor/src/cpp/details/BUILD
-@@ -19,6 +19,6 @@ cc_library(
-     visibility = ["//score/health_monitor/src/cpp:__pkg__"],
-     deps = [
-         "@googletest//:gtest",
--        "@score_baselibs//src/log/stdout_logger_cpp_init",
-+        "@score_baselibs//score/log_rust/stdout_logger_cpp_init",
-     ],
- )
-diff --git a/tests/integration/complex_monitoring/BUILD b/tests/integration/complex_monitoring/BUILD
-index 15306f47ec..7467efa724 100644
---- a/tests/integration/complex_monitoring/BUILD
-+++ b/tests/integration/complex_monitoring/BUILD
-@@ -42,6 +42,6 @@ cc_binary(
-         "//score/launch_manager:lifecycle_cc",
-         "//tests/utils/test_helper",
-         "@googletest//:gtest_main",
--        "@score_baselibs//src/log/stdout_logger_cpp_init",
-+        "@score_baselibs//score/log_rust/stdout_logger_cpp_init",
-     ],
- )
diff --git a/patches/lifecycle/002-undev-integration-test-deps.patch b/patches/lifecycle/002-undev-integration-test-deps.patch
index 532eb7fc2dd..e33886c8517 100644
--- a/patches/lifecycle/002-undev-integration-test-deps.patch
+++ b/patches/lifecycle/002-undev-integration-test-deps.patch
@@ -1,13 +1,9 @@
 diff --git a/MODULE.bazel b/MODULE.bazel
-index 721aacc9e..f7726c220 100644
 --- a/MODULE.bazel
 +++ b/MODULE.bazel
-@@ -174,9 +174,9 @@ pip.parse(
- )
- use_repo(pip, "score_lifecycle_pip")
+@@ -303,7 +303,7 @@ use_repo(pip, "codeql_coding_standards_pip_hub")
  
--bazel_dep(name = "score_itf", version = "0.5.0", dev_dependency = True)
-+bazel_dep(name = "score_itf", version = "0.5.0")
+ bazel_dep(name = "score_itf", version = "0.6.0")
  
 -oci = use_extension("@rules_oci//oci:extensions.bzl", "oci", dev_dependency = True)
 +oci = use_extension("@rules_oci//oci:extensions.bzl", "oci")
diff --git a/patches/platform/001-remove-duplicate-lifecycle-glossary.patch b/patches/platform/001-remove-duplicate-lifecycle-glossary.patch
deleted file mode 100644
index 19c9f57f16f..00000000000
--- a/patches/platform/001-remove-duplicate-lifecycle-glossary.patch
+++ /dev/null
@@ -1,132 +0,0 @@
-diff --git a/docs/features/lifecycle/glossary.rst b/docs/features/lifecycle/glossary.rst
---- a/docs/features/lifecycle/glossary.rst
-+++ b/docs/features/lifecycle/glossary.rst
-@@ -15,123 +15,8 @@
- Lifecycle Glossary
- ==================
- 
--.. glossary::
--    Lifecycle Feature
--      Feature providing support for starting and stopping processes.
--
--    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`.
--
--    Component
--      A configurable unit in the Launch Manager that describes an executable and its runtime environment (sandbox). Components can be grouped together in Run Targets to define system operational states.
--
--    Ready State
--      A state when the component is ready to provide services to other components.
--
--    Dependency (between components)
--      A configuration parameter indicating that **Component A** can only start
--      after **Component B** has reached its :term:`Ready State`. In this case,
--      **Component A** depends on **Component B**.
--
--    Dependency (between run targets)
--      A configuration parameter indicating that **Run Target A** includes all
--      components from **Run Target B**. In this case, **Run Target A** depends
--      on **Run Target B**.
--
--    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.
--
--    Ready Condition
--      A configurable condition that must be satisfied before a component is considered ready and operational. Ready conditions can include file system checks, network availability, or custom application-specific signals.
--
--      Ready conditions can either be reported by the component itself through the Lifecycle Interface or determined via external state monitoring. External state examples include: process started, file is available, socket was opened, or that the process finished successfully.
--
--    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.
-+.. note::
-+   This glossary previously duplicated content now maintained in the
-+   ``score_lifecycle`` repository (`eclipse-score/lifecycle
-+   `_). See its own
-+   ``docs/features/lifecycle/glossary.rst`` for the current definitions.
diff --git a/patches/platform/BUILD b/patches/platform/BUILD
deleted file mode 100644
index e69de29bb2d..00000000000

From a575ce6982f0d73ed759462f25f29d2d39ab7627 Mon Sep 17 00:00:00 2001
From: Anton Krivoborodov 
Date: Thu, 29 Oct 2026 15:26:59 +0000
Subject: [PATCH 10/31] simple_lifecycle: migrate Launch Manager config to
 lifecycle v0.9.0 schema

lifecycle v0.9.0 renamed all duration fields to integer milliseconds
(*_ms). The old keys fail schema validation in launch_manager_config:
"Additional properties are not allowed ('transition_timeout' was unexpected)".

delay_before_restart 0.5 -> delay_before_restart_ms 500
reporting_cycle 0.1      -> reporting_cycle_ms 100
transition_timeout 5     -> transition_timeout_ms 5000
transition_timeout 1.5   -> transition_timeout_ms 1500 (fallback run target)
evaluation_cycle 0.5     -> evaluation_cycle_ms 500 (defaults and global)
---
 .../configs/launch_manager_config.json               | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/showcases/simple_lifecycle/configs/launch_manager_config.json b/showcases/simple_lifecycle/configs/launch_manager_config.json
index 1f9e1b87539..08ce602d41c 100644
--- a/showcases/simple_lifecycle/configs/launch_manager_config.json
+++ b/showcases/simple_lifecycle/configs/launch_manager_config.json
@@ -6,7 +6,7 @@
             "ready_recovery_action": {
                 "restart": {
                     "number_of_attempts": 1,
-                    "delay_before_restart": 0.5
+                    "delay_before_restart_ms": 500
                 }
             },
             "sandbox": {
@@ -22,7 +22,7 @@
                 "application_type": "Reporting",
                 "is_self_terminating": false,
                 "alive_supervision": {
-                    "reporting_cycle": 0.1,
+                    "reporting_cycle_ms": 100,
                     "min_indications": 1,
                     "max_indications": 3,
                     "failed_cycles_tolerance": 1
@@ -35,7 +35,7 @@
             }
         },
         "run_target": {
-            "transition_timeout": 5,
+            "transition_timeout_ms": 5000,
             "recovery_action": {
                 "switch_run_target": {
                     "run_target": "fallback_run_target"
@@ -43,7 +43,7 @@
             }
         },
         "alive_supervision" : {
-            "evaluation_cycle": 0.5
+            "evaluation_cycle_ms": 500
         }
     },
     "components": {
@@ -112,9 +112,9 @@
     "fallback_run_target": {
         "description": "Switching off everything",
         "depends_on": ["state_manager"],
-        "transition_timeout": 1.5
+        "transition_timeout_ms": 1500
     },
     "alive_supervision" : {
-        "evaluation_cycle": 0.5
+        "evaluation_cycle_ms": 500
     }
 }
\ No newline at end of file

From 03a369b0acdba98a61fba9948d57484bc1440df6 Mon Sep 17 00:00:00 2001
From: Andrey Babanin 
Date: Thu, 29 Oct 2026 17:39:44 +0100
Subject: [PATCH 11/31] Bump baselibs to 0.2.16

---
 bazel_common/score_modules_target_sw.MODULE.bazel | 5 ++---
 known_good.json                                   | 5 +----
 2 files changed, 3 insertions(+), 7 deletions(-)

diff --git a/bazel_common/score_modules_target_sw.MODULE.bazel b/bazel_common/score_modules_target_sw.MODULE.bazel
index c23c931d119..86f102f43e0 100644
--- a/bazel_common/score_modules_target_sw.MODULE.bazel
+++ b/bazel_common/score_modules_target_sw.MODULE.bazel
@@ -15,16 +15,15 @@
 # Do not edit manually - use scripts/known_good/update_module_from_known_good.py --known known_good.json --output-dir-modules bazel_common
 
 bazel_dep(name = "score_baselibs")
-git_override(
+single_version_override(
     module_name = "score_baselibs",
-    commit = "ee40fece5abacb28ea641b448446a04175038b17",
     patch_strip = 1,
     patches = [
         "//patches/baselibs:001-restore-trace-library-mock-visibility.patch",
         "//patches/baselibs:002-restore-qnx8-poll-workaround.patch",
         "//patches/baselibs:003-export-aou-requirements.patch",
     ],
-    remote = "https://github.com/eclipse-score/baselibs.git",
+    version = "0.2.16",
 )
 
 bazel_dep(name = "score_communication")
diff --git a/known_good.json b/known_good.json
index 579f45c4bb4..8dc18e64d8d 100644
--- a/known_good.json
+++ b/known_good.json
@@ -10,9 +10,6 @@
                 ],
                 "metadata": {
                     "code_root_path": "//score/...",
-                    "extra_test_config": [
-                        "@score_baselibs//score/json:base_library=nlohmann"
-                    ],
                     "exclude_test_targets": [
                         "//score/language/safecpp/aborts_upon_exception:abortsuponexception_toolchain_test",
                         "//score/containers:dynamic_array_test",
@@ -38,7 +35,7 @@
                         "//..."
                     ]
                 },
-                "hash": "ee40fece5abacb28ea641b448446a04175038b17"
+                "version": "0.2.16"
             },
             "score_communication": {
                 "repo": "https://github.com/eclipse-score/communication.git",

From 2b94076692700d3cef971ef8cc631407f07e7cdd Mon Sep 17 00:00:00 2001
From: Anton Krivoborodov 
Date: Fri, 30 Oct 2026 07:08:39 +0000
Subject: [PATCH 12/31] Refresh MODULE.bazel.lock for score_baselibs 0.2.16

03a369b switched score_baselibs to the registry version 0.2.16 without
updating the lockfile, so every job using --lockfile_mode=error failed with
"Missing checksum for registry file .../score_baselibs/0.2.16/MODULE.bazel".

Generated with: bazel mod deps --lockfile_mode=update
---
 MODULE.bazel.lock | 1556 +++++++++++++++++++++++++--------------------
 1 file changed, 868 insertions(+), 688 deletions(-)

diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock
index 369a0261647..30203a583c9 100644
--- a/MODULE.bazel.lock
+++ b/MODULE.bazel.lock
@@ -14,17 +14,23 @@
     "https://bcr.bazel.build/modules/abseil-cpp/20240722.0/MODULE.bazel": "88668a07647adbdc14cb3a7cd116fb23c9dda37a90a1681590b6c9d8339a5b84",
     "https://bcr.bazel.build/modules/abseil-cpp/20250127.0/MODULE.bazel": "d1086e248cda6576862b4b3fe9ad76a214e08c189af5b42557a6e1888812c5d5",
     "https://bcr.bazel.build/modules/abseil-cpp/20250127.1/MODULE.bazel": "c4a89e7ceb9bf1e25cf84a9f830ff6b817b72874088bf5141b314726e46a57c1",
+    "https://bcr.bazel.build/modules/abseil-cpp/20250512.0/MODULE.bazel": "c4d02dd22cd87458516655a45512060246ee2a4732f1fbe948a5bd9eb614e626",
     "https://bcr.bazel.build/modules/abseil-cpp/20250512.1/MODULE.bazel": "d209fdb6f36ffaf61c509fcc81b19e81b411a999a934a032e10cd009a0226215",
-    "https://bcr.bazel.build/modules/abseil-cpp/20250512.1/source.json": "d725d73707d01bb46ab3ca59ba408b8e9bd336642ca77a2269d4bfb8bbfd413d",
+    "https://bcr.bazel.build/modules/abseil-cpp/20250814.0/MODULE.bazel": "c43c16ca2c432566cdb78913964497259903ebe8fb7d9b57b38e9f1425b427b8",
+    "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/MODULE.bazel": "51f2312901470cdab0dbdf3b88c40cd21c62a7ed58a3de45b365ddc5b11bcab2",
+    "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/source.json": "cea3901d7e299da7320700abbaafe57a65d039f10d0d7ea601c4a66938ea4b0c",
     "https://bcr.bazel.build/modules/abseil-py/2.1.0/MODULE.bazel": "5ebe5bf853769c65707e5c28f216798f7a4b1042015e6a36e6d03094d94bec8a",
     "https://bcr.bazel.build/modules/abseil-py/2.1.0/source.json": "0e8fc4f088ce07099c1cd6594c20c7ddbb48b4b3c0849b7d94ba94be88ff042b",
     "https://bcr.bazel.build/modules/ape/1.0.1/MODULE.bazel": "37411cfd13bfc28cd264674d660a3ecb3b5b35b9dbe4c0b2be098683641b3fee",
     "https://bcr.bazel.build/modules/apple_support/1.11.1/MODULE.bazel": "1843d7cd8a58369a444fc6000e7304425fba600ff641592161d9f15b179fb896",
     "https://bcr.bazel.build/modules/apple_support/1.15.1/MODULE.bazel": "a0556fefca0b1bb2de8567b8827518f94db6a6e7e7d632b4c48dc5f865bc7c85",
     "https://bcr.bazel.build/modules/apple_support/1.17.1/MODULE.bazel": "655c922ab1209978a94ef6ca7d9d43e940cd97d9c172fb55f94d91ac53f8610b",
+    "https://bcr.bazel.build/modules/apple_support/1.21.0/MODULE.bazel": "ac1824ed5edf17dee2fdd4927ada30c9f8c3b520be1b5fd02a5da15bc10bff3e",
+    "https://bcr.bazel.build/modules/apple_support/1.21.1/MODULE.bazel": "5809fa3efab15d1f3c3c635af6974044bac8a4919c62238cce06acee8a8c11f1",
     "https://bcr.bazel.build/modules/apple_support/1.22.1/MODULE.bazel": "90bd1a660590f3ceffbdf524e37483094b29352d85317060b2327fff8f3f4458",
     "https://bcr.bazel.build/modules/apple_support/1.23.1/MODULE.bazel": "53763fed456a968cf919b3240427cf3a9d5481ec5466abc9d5dc51bc70087442",
     "https://bcr.bazel.build/modules/apple_support/1.24.1/MODULE.bazel": "f46e8ddad60aef170ee92b2f3d00ef66c147ceafea68b6877cb45bd91737f5f8",
+    "https://bcr.bazel.build/modules/apple_support/1.24.2/MODULE.bazel": "0e62471818affb9f0b26f128831d5c40b074d32e6dda5a0d3852847215a41ca4",
     "https://bcr.bazel.build/modules/apple_support/2.8.0/MODULE.bazel": "c45f5176057092afba0be6c48a9ea02101666802f8be536947e099e94757f8ed",
     "https://bcr.bazel.build/modules/apple_support/2.9.1/MODULE.bazel": "fb209b83ed172af587419acb3340389cfe3260669e5f1c05e1ac3974aca614e0",
     "https://bcr.bazel.build/modules/apple_support/2.9.1/source.json": "247d9f86d94c546533fb01e6e18b018486f9a6dff5faccae8838ef12e659b2a7",
@@ -44,7 +50,8 @@
     "https://bcr.bazel.build/modules/aspect_bazel_lib/2.8.1/MODULE.bazel": "812d2dd42f65dca362152101fbec418029cc8fd34cbad1a2fde905383d705838",
     "https://bcr.bazel.build/modules/aspect_bazel_lib/2.9.3/MODULE.bazel": "66baf724dbae7aff4787bf2245cc188d50cb08e07789769730151c0943587c14",
     "https://bcr.bazel.build/modules/aspect_rules_esbuild/0.21.0/MODULE.bazel": "77dc393c43ad79398b05865444c5200c6f1aae6765615544f2c7730b5858d533",
-    "https://bcr.bazel.build/modules/aspect_rules_esbuild/0.21.0/source.json": "062b1d3dba8adcfeb28fe60c185647f5a53ec0487ffe93cf0ae91566596e4b49",
+    "https://bcr.bazel.build/modules/aspect_rules_esbuild/0.23.0/MODULE.bazel": "9b437a9ec25a619304940434fa03b8d41248213eb7009da2c898f3d6a4075ef3",
+    "https://bcr.bazel.build/modules/aspect_rules_esbuild/0.23.0/source.json": "7b4cac4e61bae4262e7f67f6bec0b200fcb9060044f12e84a3bc37e0be245de7",
     "https://bcr.bazel.build/modules/aspect_rules_js/1.33.1/MODULE.bazel": "db3e7f16e471cf6827059d03af7c21859e7a0d2bc65429a3a11f005d46fc501b",
     "https://bcr.bazel.build/modules/aspect_rules_js/1.40.0/MODULE.bazel": "01a1014e95e6816b68ecee2584ae929c7d6a1b72e4333ab1ff2d2c6c30babdf1",
     "https://bcr.bazel.build/modules/aspect_rules_js/2.0.0/MODULE.bazel": "b45b507574aa60a92796e3e13c195cd5744b3b8aff516a9c0cb5ae6a048161c5",
@@ -60,6 +67,7 @@
     "https://bcr.bazel.build/modules/aspect_rules_py/1.5.2/source.json": "020d2bd6b07210cee97226ee2215d80c4cf91e455a6702c9af1e5788d072e673",
     "https://bcr.bazel.build/modules/aspect_rules_ts/3.6.0/MODULE.bazel": "d0045b5eabb012be550a609589b3e5e47eba682344b19cfd9365d4d896ed07df",
     "https://bcr.bazel.build/modules/aspect_rules_ts/3.6.0/source.json": "5593e3f1cd0dd5147f7748e163307fd5c2e1077913d6945b58739ad8d770a290",
+    "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.2.6/MODULE.bazel": "cafb8781ad591bc57cc765dca5fefab08cf9f65af363d162b79d49205c7f8af7",
     "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.2.8/MODULE.bazel": "aa975a83e72bcaac62ee61ab12b788ea324a1d05c4aab28aadb202f647881679",
     "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.2.8/source.json": "786cbc49377fb6bf4859aec5b1c61f8fc26b08e9fdb929e2dde2e1e2a406bd24",
     "https://bcr.bazel.build/modules/bazel_features/0.1.0/MODULE.bazel": "47011d645b0f949f42ee67f2e8775188a9cf4a0a1528aa2fa4952f2fd00906fd",
@@ -81,7 +89,9 @@
     "https://bcr.bazel.build/modules/bazel_features/1.3.0/MODULE.bazel": "cdcafe83ec318cda34e02948e81d790aab8df7a929cec6f6969f13a489ccecd9",
     "https://bcr.bazel.build/modules/bazel_features/1.30.0/MODULE.bazel": "a14b62d05969a293b80257e72e597c2da7f717e1e69fa8b339703ed6731bec87",
     "https://bcr.bazel.build/modules/bazel_features/1.32.0/MODULE.bazel": "095d67022a58cb20f7e20e1aefecfa65257a222c18a938e2914fd257b5f1ccdc",
+    "https://bcr.bazel.build/modules/bazel_features/1.33.0/MODULE.bazel": "8b8dc9d2a4c88609409c3191165bccec0e4cb044cd7a72ccbe826583303459f6",
     "https://bcr.bazel.build/modules/bazel_features/1.34.0/MODULE.bazel": "e8475ad7c8965542e0c7aac8af68eb48c4af904be3d614b6aa6274c092c2ea1e",
+    "https://bcr.bazel.build/modules/bazel_features/1.36.0/MODULE.bazel": "596cb62090b039caf1cad1d52a8bc35cf188ca9a4e279a828005e7ee49a1bec3",
     "https://bcr.bazel.build/modules/bazel_features/1.38.0/MODULE.bazel": "f9b8a9c890ebd216b4049fd12a31d3c2602e3403c7af636b04fbbd7453edc9c9",
     "https://bcr.bazel.build/modules/bazel_features/1.39.0/MODULE.bazel": "28739425c1fc283c91931619749c832b555e60bcd1010b40d8441ce0a5cf726d",
     "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7",
@@ -222,14 +232,18 @@
     "https://bcr.bazel.build/modules/bzip2/1.0.8.bcr.3/MODULE.bazel": "29ecf4babfd3c762be00d7573c288c083672ab60e79c833ff7f49ee662e54471",
     "https://bcr.bazel.build/modules/bzip2/1.0.8.bcr.3/source.json": "8be4a3ef2599693f759e5c0990a4cc5a246ac08db4c900a38f852ba25b5c39be",
     "https://bcr.bazel.build/modules/c-ares/1.15.0/MODULE.bazel": "ba0a78360fdc83f02f437a9e7df0532ad1fbaa59b722f6e715c11effebaa0166",
-    "https://bcr.bazel.build/modules/c-ares/1.15.0/source.json": "5e3ed991616c5ec4cc09b0893b29a19232de4a1830eb78c567121bfea87453f7",
+    "https://bcr.bazel.build/modules/c-ares/1.19.1/MODULE.bazel": "73bca21720772370ff91cc8e88bbbaf14897720c6473e87c1ddc0f848284c313",
+    "https://bcr.bazel.build/modules/c-ares/1.34.5.bcr.1/MODULE.bazel": "f4632f68dbc075342966477d9c94a8a4a299d91e155980b042e1cd9f5a7ebcf5",
+    "https://bcr.bazel.build/modules/c-ares/1.34.5.bcr.1/source.json": "55fae1e004176f6cb36efcc77de9894f799d985f482b8f82fec989d556745a84",
     "https://bcr.bazel.build/modules/cel-spec/0.15.0/MODULE.bazel": "e1eed53d233acbdcf024b4b0bc1528116d92c29713251b5154078ab1348cb600",
-    "https://bcr.bazel.build/modules/cel-spec/0.15.0/source.json": "ab7dccdf21ea2261c0f809b5a5221a4d7f8b580309f285fdf1444baaca75d44a",
+    "https://bcr.bazel.build/modules/cel-spec/0.24.0/MODULE.bazel": "e310c7aff8490ed689ccafd32729b77a660b9547f5a5ba9b20e967011c324b36",
+    "https://bcr.bazel.build/modules/cel-spec/0.24.0/source.json": "522d08bc22524e07863276dd0f038f446a83166e91281dcfc07d5b8433c8d89e",
     "https://bcr.bazel.build/modules/civetweb/1.16/MODULE.bazel": "46a38f9daeb57392e3827fce7d40926be0c802bd23cdd6bfd3a96c804de42fae",
     "https://bcr.bazel.build/modules/civetweb/1.16/source.json": "ba8b9585adb8355cb51b999d57172fd05e7a762c56b8d4bac6db42c99de3beb7",
     "https://bcr.bazel.build/modules/curl/8.4.0/MODULE.bazel": "0bc250aa1cb69590049383df7a9537c809591fcf876c620f5f097c58fdc9bc10",
     "https://bcr.bazel.build/modules/curl/8.7.1/MODULE.bazel": "088221c35a2939c555e6e47cb31a81c15f8b59f4daa8009b1e9271a502d33485",
-    "https://bcr.bazel.build/modules/curl/8.7.1/source.json": "bf9890e809717445b10a3ddc323b6d25c46631589c693a232df8310a25964484",
+    "https://bcr.bazel.build/modules/curl/8.8.0/MODULE.bazel": "7da3b3e79b0b4ee8f8c95d640bc6ad7b430ce66ef6e9c9d2bc29b3b5ef85f6fe",
+    "https://bcr.bazel.build/modules/curl/8.8.0/source.json": "d7d138b6878cf38891692fee0649ace35357fd549b425614d571786f054374d4",
     "https://bcr.bazel.build/modules/cxx.rs/1.0.186/MODULE.bazel": "af6d2cf790d198754250b1bf1dc36c671f2006ffff7ea1e19ee13972347ef16f",
     "https://bcr.bazel.build/modules/cxx.rs/1.0.186/source.json": "6c30eb2ca366d9199343c00a5b49d5edcde0c72ee48f01c1017e19cc7bf210b5",
     "https://bcr.bazel.build/modules/cython/3.0.11-1/MODULE.bazel": "868b3f5c956c3657420d2302004c6bb92606bfa47e314bab7f2ba0630c7c966c",
@@ -240,9 +254,12 @@
     "https://bcr.bazel.build/modules/download_utils/1.2.2/MODULE.bazel": "7d185ec9dd3c5ee277f269e3a8e5f09b9de4cb7ba34d06b93dce9bf41c1279f8",
     "https://bcr.bazel.build/modules/download_utils/1.2.2/source.json": "c88be2bc48c98371d35665b805f307a647c98c83327345c918d9088822d77928",
     "https://bcr.bazel.build/modules/envoy_api/0.0.0-20241214-918efc9/MODULE.bazel": "24e05f6f52f37be63a795192848555a2c8c855e7814dbc1ed419fb04a7005464",
-    "https://bcr.bazel.build/modules/envoy_api/0.0.0-20241214-918efc9/source.json": "212043ab69d87f7a04aa4f627f725b540cff5e145a3a31a9403d8b6ec2e920c9",
+    "https://bcr.bazel.build/modules/envoy_api/0.0.0-20250128-4de3c74/MODULE.bazel": "1fe72489212c530086e3ffb0e018b2bfef4663200ca03571570f9f006bef1d75",
+    "https://bcr.bazel.build/modules/envoy_api/0.0.0-20251105-4a2b9a3/MODULE.bazel": "b66e87a0e0c2207f07e35c321388eb1feb036344565977444b52912c53a84466",
+    "https://bcr.bazel.build/modules/envoy_api/0.0.0-20251105-4a2b9a3/source.json": "c4780edf780977f2ab7d00a189432c5b0b2fa08c6e4e2e09d2950499364a687d",
+    "https://bcr.bazel.build/modules/flatbuffers/25.12.19.bcr.1/MODULE.bazel": "e0292ad82ecfc94217bf07d2a5a546f1ccbcd931b3a85f0841c10c035a168bf6",
+    "https://bcr.bazel.build/modules/flatbuffers/25.12.19.bcr.1/source.json": "4a507d687de21eb596ad2709671eb4684d94f1604f8f3760b4c079bb0a12224e",
     "https://bcr.bazel.build/modules/flatbuffers/25.12.19/MODULE.bazel": "fe3a7f7811f43264f68136ad99e64384d70b2a25245e09ab800c4bb83171da25",
-    "https://bcr.bazel.build/modules/flatbuffers/25.12.19/source.json": "ea0204be7a79de9141cee5fa436e58a14e88b39b5b59227b21efa0394474ebea",
     "https://bcr.bazel.build/modules/flatbuffers/25.9.23/MODULE.bazel": "32753ba60bf3bacfe7737c0f3e8e3e55624b19af5d398c485580d57492d145d8",
     "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.1/MODULE.bazel": "cdf8cbe5ee750db04b78878c9633cc76e80dcf4416cbe982ac3a9222f80713c8",
     "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.3/MODULE.bazel": "f1b7bb2dd53e8f2ef984b39485ec8a44e9076dda5c4b8efd2fb4c6a6e856a31d",
@@ -254,17 +271,30 @@
     "https://bcr.bazel.build/modules/gazelle/0.34.0/MODULE.bazel": "abdd8ce4d70978933209db92e436deb3a8b737859e9354fb5fd11fb5c2004c8a",
     "https://bcr.bazel.build/modules/gazelle/0.36.0/MODULE.bazel": "e375d5d6e9a6ca59b0cb38b0540bc9a05b6aa926d322f2de268ad267a2ee74c0",
     "https://bcr.bazel.build/modules/gazelle/0.37.0/MODULE.bazel": "d1327ba0907d0275ed5103bfbbb13518f6c04955b402213319d0d6c0ce9839d4",
+    "https://bcr.bazel.build/modules/gazelle/0.39.1/MODULE.bazel": "1fa3fefad240e535066fd0e6950dfccd627d36dc699ee0034645e51dbde3980f",
     "https://bcr.bazel.build/modules/gazelle/0.40.0/MODULE.bazel": "42ba5378ebe845fca43989a53186ab436d956db498acde790685fe0e8f9c6146",
     "https://bcr.bazel.build/modules/gazelle/0.44.0/MODULE.bazel": "fd3177ca0938da57a1e416cad3f39b9c4334defbc717e89aba9d9ddbbb0341da",
-    "https://bcr.bazel.build/modules/gazelle/0.44.0/source.json": "7fb65ef9c1ce470d099ca27fd478673d9d64c844af28d0d472b0874c7d590cb6",
+    "https://bcr.bazel.build/modules/gazelle/0.46.0/MODULE.bazel": "3dec215dacf2427df87b524a2c99da387882a18d753f0b1b38675992bd0a99c6",
+    "https://bcr.bazel.build/modules/gazelle/0.46.0/source.json": "f255441117f6c63a3cbc0d4fd84c09c047e54a9bdaaf6aedf66e3b4218ddebd4",
     "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb",
     "https://bcr.bazel.build/modules/google_benchmark/1.8.4/MODULE.bazel": "c6d54a11dcf64ee63545f42561eda3fd94c1b5f5ebe1357011de63ae33739d5e",
     "https://bcr.bazel.build/modules/google_benchmark/1.8.5/MODULE.bazel": "9ba9b31b984022828a950e3300410977eda2e35df35584c6b0b2d0c2e52766b7",
+    "https://bcr.bazel.build/modules/google_benchmark/1.9.4/MODULE.bazel": "3bab7c17c10580f87b647478a72a05621f88abc275afb97b578c828f56e59d45",
     "https://bcr.bazel.build/modules/google_benchmark/1.9.5/MODULE.bazel": "8a85cfd90b1e45e6e68f1aa2aa9efce3c04add57df732571d7fd54c07e7c5143",
     "https://bcr.bazel.build/modules/google_benchmark/1.9.5/source.json": "0bd357fd9db30ee31d5eb4c78b1086ce3d79b4423ce76de19e8a2fa7b2fa2e10",
+    "https://bcr.bazel.build/modules/googleapis-cc/1.0.0/MODULE.bazel": "cf01757e7590c56140a4b81638ff2b3e7074769e6271720bbf738fcda25b6fc2",
+    "https://bcr.bazel.build/modules/googleapis-cc/1.0.0/source.json": "ab0e3a2ee9968a8848f59872fbbfa3e1f768597d71d2229e6caa319d357967c7",
+    "https://bcr.bazel.build/modules/googleapis-go/1.0.0/MODULE.bazel": "0a207a4c49da28c5cc1f7b3aeb23c2f7828c85c14aa8d9db0e30357a8d2250ed",
+    "https://bcr.bazel.build/modules/googleapis-go/1.0.0/source.json": "ef189be4e7853e1ebc6123fe20b71822bf9896bd1f8eed8f68505c4585f72a48",
+    "https://bcr.bazel.build/modules/googleapis-java/1.0.0/MODULE.bazel": "d633989337d069b5a95e6101777319681d7a4af4677e36801f11839d6512095c",
+    "https://bcr.bazel.build/modules/googleapis-java/1.0.0/source.json": "ee59e2de37e4b531172870ac0296afa38f1ea004105ee21b2793c31a9d0ddccd",
+    "https://bcr.bazel.build/modules/googleapis-rules-registry/1.0.0/MODULE.bazel": "97c6a4d413b373d4cc97065da3de1b2166e22cbbb5f4cc9f05760bfa83619e24",
+    "https://bcr.bazel.build/modules/googleapis-rules-registry/1.0.0/source.json": "cf611c836a60e98e2e2ab2de8004f119e9f06878dcf4ea2d95a437b1b7a89fe9",
     "https://bcr.bazel.build/modules/googleapis/0.0.0-20240326-1c8d509c5/MODULE.bazel": "a4b7e46393c1cdcc5a00e6f85524467c48c565256b22b5fae20f84ab4a999a68",
     "https://bcr.bazel.build/modules/googleapis/0.0.0-20240819-fe8ba054a/MODULE.bazel": "117b7c7be7327ed5d6c482274533f2dbd78631313f607094d4625c28203cacdf",
-    "https://bcr.bazel.build/modules/googleapis/0.0.0-20240819-fe8ba054a/source.json": "b31fc7eb283a83f71d2e5bfc3d1c562d2994198fa1278409fbe8caec3afc1d3e",
+    "https://bcr.bazel.build/modules/googleapis/0.0.0-20241220-5e258e33.bcr.1/MODULE.bazel": "ee6c30f82ecd476e61f019fb1151aaab380ea419958ff274ef2f0efca7969f5c",
+    "https://bcr.bazel.build/modules/googleapis/0.0.0-20251003-2193a2bf/MODULE.bazel": "cc9e5ed294ed9ebf42cdbbdddd2df29048519e3797004df1e3f369f31ff4f2d4",
+    "https://bcr.bazel.build/modules/googleapis/0.0.0-20251003-2193a2bf/source.json": "21558a194c519e27262cca9cf031bb166a666a8b7fb89993b700c828f8dc0857",
     "https://bcr.bazel.build/modules/googletest/1.17.0.bcr.2/MODULE.bazel": "827f54f492a3ce549c940106d73de332c2b30cebd0c20c0bc5d786aba7f116cb",
     "https://bcr.bazel.build/modules/googletest/1.17.0.bcr.2/source.json": "3664514073a819992320ffbce5825e4238459df344d8b01748af2208f8d2e1eb",
     "https://bcr.bazel.build/modules/grpc-java/1.62.2/MODULE.bazel": "99b8771e8c7cacb130170fed2a10c9e8fed26334a93e73b42d2953250885a158",
@@ -279,11 +309,15 @@
     "https://bcr.bazel.build/modules/grpc/1.41.0/MODULE.bazel": "5bcbfc2b274dabea628f0649dc50c90cf36543b1cfc31624832538644ad1aae8",
     "https://bcr.bazel.build/modules/grpc/1.56.3.bcr.1/MODULE.bazel": "cd5b1eb276b806ec5ab85032921f24acc51735a69ace781be586880af20ab33f",
     "https://bcr.bazel.build/modules/grpc/1.62.1/MODULE.bazel": "2998211594b8a79a6b459c4e797cfa19f0fb8b3be3149760ec7b8c99abfd426f",
+    "https://bcr.bazel.build/modules/grpc/1.63.1.bcr.1/MODULE.bazel": "d7b9fef03bd175e6825237b521b18a3c29f1ac15f8aa52c8a1a0f3bd8f33d54b",
     "https://bcr.bazel.build/modules/grpc/1.66.0.bcr.2/MODULE.bazel": "0fa2b0fd028ce354febf0fe90f1ed8fecfbfc33118cddd95ac0418cc283333a0",
     "https://bcr.bazel.build/modules/grpc/1.66.0.bcr.3/MODULE.bazel": "f6047e89faf488f5e3e65cb2594c6f5e86992abec7487163ff6b623526e543b0",
     "https://bcr.bazel.build/modules/grpc/1.69.0/MODULE.bazel": "4e26e05c9e1ef291ccbc96aad8e457b1b8abedbc141623831629da2f8168eef6",
     "https://bcr.bazel.build/modules/grpc/1.70.1/MODULE.bazel": "b800cd8e3e7555c1e61cba2e02d3a2fcf0e91f66e800db286d965d3b7a6a721a",
-    "https://bcr.bazel.build/modules/grpc/1.70.1/source.json": "e2977ea6cf9f2755418934d4ae134a6569713dd200fd7aded86a4b7f1b86efc9",
+    "https://bcr.bazel.build/modules/grpc/1.71.0/MODULE.bazel": "7fcab2c05530373f1a442c362b17740dd0c75b6a2a975eec8f5bf4c70a37928a",
+    "https://bcr.bazel.build/modules/grpc/1.74.1/MODULE.bazel": "09523be10ba2bfd999683671d0f8f22fb5b20ec77ad89b05ef58ff19a1b65c82",
+    "https://bcr.bazel.build/modules/grpc/1.76.0/MODULE.bazel": "7373bd407fcb183b8bf379fa35dfe29feebdc6d8ec1bc40004cec6c7b2544be0",
+    "https://bcr.bazel.build/modules/grpc/1.76.0/source.json": "5c1deef5b02cb7dd52df9cb628d956e02db3ec40bd165a465bc10b7bf47aa16a",
     "https://bcr.bazel.build/modules/helly25_bzl/0.4.3/MODULE.bazel": "9c20052fd3f1fb767c48b78c1bbc46f501a4ca69d14558429d1234e68e449f68",
     "https://bcr.bazel.build/modules/helly25_bzl/0.4.3/source.json": "e8c54d81e72633fb6f1d23c7e2d44e0b39b1caef2a256141136a2f63e6204b78",
     "https://bcr.bazel.build/modules/jq.bzl/0.1.0/MODULE.bazel": "2ce69b1af49952cd4121a9c3055faa679e748ce774c7f1fda9657f936cae902f",
@@ -302,24 +336,29 @@
     "https://bcr.bazel.build/modules/nlohmann_json/3.12.0/MODULE.bazel": "21f19a4479e994c1546cf6f10c65d2fa464cd95f49eebad98dc5bac49c801dab",
     "https://bcr.bazel.build/modules/nlohmann_json/3.12.0/source.json": "6bf17b358c467effad70c02ab43e2d65939d740f667157397f583435909cfae1",
     "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/MODULE.bazel": "6f7b417dcc794d9add9e556673ad25cb3ba835224290f4f848f8e2db1e1fca74",
+    "https://bcr.bazel.build/modules/opencensus-cpp/0.0.0-20230502-50eb5de.bcr.2/MODULE.bazel": "cc18734138dd18c912c6ce2a59186db28f85d8058c99c9f21b46ca3e0aba0ebe",
+    "https://bcr.bazel.build/modules/opencensus-cpp/0.0.0-20230502-50eb5de.bcr.2/source.json": "7c135f9d42bb3b045669c3c6ab3bb3c208e00b46aca4422eea64c29811a5b240",
     "https://bcr.bazel.build/modules/opencensus-cpp/0.0.0-20230502-50eb5de/MODULE.bazel": "02201d2921dadb4ec90c4980eca4b2a02904eddcf6fa02f3da7594fb7b0d821c",
-    "https://bcr.bazel.build/modules/opencensus-cpp/0.0.0-20230502-50eb5de/source.json": "f50efc07822f5425bd1d3e40e977484f9c0142463052717d40ec85cd6744243e",
     "https://bcr.bazel.build/modules/opencensus-proto/0.4.1.bcr.2/MODULE.bazel": "789706a714855f92c5c8cfcf1ef32bbb64dcd3b7c9066756ad7986ec59709d29",
     "https://bcr.bazel.build/modules/opencensus-proto/0.4.1.bcr.2/source.json": "aadf3f53e08b72376506b7c4ea3d167010c9efb160d7d6e1e304ed646bac1b36",
     "https://bcr.bazel.build/modules/opencensus-proto/0.4.1/MODULE.bazel": "4a2e8b4d0b544002502474d611a5a183aa282251e14f6a01afe841c0c1b10372",
+    "https://bcr.bazel.build/modules/openssl/3.3.1.bcr.1/MODULE.bazel": "49c0c07e8fb87b480bccb842cfee1b32617f11dac590f732573c69058699a3d1",
     "https://bcr.bazel.build/modules/openssl/3.5.5.bcr.4/MODULE.bazel": "b3f35b53c6c73bd3a7c8efbf9b7e79e92566d189e64d313aede69f608ac6dd77",
     "https://bcr.bazel.build/modules/openssl/3.5.5.bcr.4/source.json": "662d68be9227e60ef65fed83c6820564bda4af0efe6a40dc62dd9aee288fe9cf",
     "https://bcr.bazel.build/modules/opentelemetry-cpp/1.14.2/MODULE.bazel": "089a5613c2a159c7dfde098dabfc61e966889c7d6a81a98422a84c51535ed17d",
     "https://bcr.bazel.build/modules/opentelemetry-cpp/1.16.0/MODULE.bazel": "b7379a140f538cea3f749179a2d481ed81942cc6f7b05a6113723eb34ac3b3e7",
-    "https://bcr.bazel.build/modules/opentelemetry-cpp/1.16.0/source.json": "da0cf667713b1e48d7f8912b100b4e0a8284c8a95717af5eb8c830d699e61cf5",
+    "https://bcr.bazel.build/modules/opentelemetry-cpp/1.19.0/MODULE.bazel": "3455326c08b28415648a3d60d8e3c811847ebdbe64474f75b25878f25585aea1",
+    "https://bcr.bazel.build/modules/opentelemetry-cpp/1.19.0/source.json": "4e48137e4c3ecb99401ff99876df8fa330598d7da051869bec643446e8a8ff95",
     "https://bcr.bazel.build/modules/opentelemetry-proto/1.1.0/MODULE.bazel": "a49f406e99bf05ab43ed4f5b3322fbd33adfd484b6546948929d1316299b68bf",
     "https://bcr.bazel.build/modules/opentelemetry-proto/1.3.1/MODULE.bazel": "0141a50e989576ee064c11ce8dd5ec89993525bd9f9a09c5618e4dacc8df9352",
     "https://bcr.bazel.build/modules/opentelemetry-proto/1.4.0.bcr.1/MODULE.bazel": "5ceaf25e11170d22eded4c8032728b4a3f273765fccda32f9e94f463755c4167",
-    "https://bcr.bazel.build/modules/opentelemetry-proto/1.4.0.bcr.1/source.json": "fb9e01517460cfad8bafab082f2e1508d3cc2b7ed700cff19f3c7c84b146e5eb",
+    "https://bcr.bazel.build/modules/opentelemetry-proto/1.5.0/MODULE.bazel": "7543d91a53b98e7b5b37c5a0865b93bff12c1ee022b1e322cd236b968894b030",
+    "https://bcr.bazel.build/modules/opentelemetry-proto/1.5.0/source.json": "046b721ce203e88cdaad44d7dd17a86b7200eab9388b663b234e72e13ff7b143",
     "https://bcr.bazel.build/modules/opentracing-cpp/1.6.0/MODULE.bazel": "b3925269f63561b8b880ae7cf62ccf81f6ece55b62cd791eda9925147ae116ec",
     "https://bcr.bazel.build/modules/opentracing-cpp/1.6.0/source.json": "da1cb1add160f5e5074b7272e9db6fd8f1b3336c15032cd0a653af9d2f484aed",
     "https://bcr.bazel.build/modules/package_metadata/0.0.2/MODULE.bazel": "fb8d25550742674d63d7b250063d4580ca530499f045d70748b1b142081ebb92",
     "https://bcr.bazel.build/modules/package_metadata/0.0.3/MODULE.bazel": "77890552ecea9e284b5424c9de827a58099348763a4359e975c359a83d4faa83",
+    "https://bcr.bazel.build/modules/package_metadata/0.0.5/MODULE.bazel": "ef4f9439e3270fdd6b9fd4dbc3d2f29d13888e44c529a1b243f7a31dfbc2e8e4",
     "https://bcr.bazel.build/modules/package_metadata/0.0.6/MODULE.bazel": "341dab6f417197494517d54c8e557c0baee1de7aec83543a4fbefe57900acb7e",
     "https://bcr.bazel.build/modules/package_metadata/0.0.7/MODULE.bazel": "7adb03933fc8401f495800cf4eafcff0edc6da0ff55c7db223ef69d19f689486",
     "https://bcr.bazel.build/modules/package_metadata/0.0.7/source.json": "50639625e937b56115012674c797cca7a05a96b4878c87d803c13dc2b31de8a0",
@@ -335,8 +374,9 @@
     "https://bcr.bazel.build/modules/platforms/1.1.0/MODULE.bazel": "1c0c09f5bdcf4b3f924720d2478a3711cb39f4977019ca5988685e5b7e18b3d2",
     "https://bcr.bazel.build/modules/platforms/1.1.0/source.json": "fcf351c47596c939140ab0d333dfdd08ed1ea6ce33c2fe70c12493a301cf1344",
     "https://bcr.bazel.build/modules/prometheus-cpp/1.2.4/MODULE.bazel": "0fbe5dcff66311947a3f6b86ebc6a6d9328e31a28413ca864debc4a043f371e5",
+    "https://bcr.bazel.build/modules/prometheus-cpp/1.3.0.bcr.1/MODULE.bazel": "116ad46e97c1d2aeb020fe2899a342a7e703574ce7c0faf7e4810f938c974a9a",
+    "https://bcr.bazel.build/modules/prometheus-cpp/1.3.0.bcr.1/source.json": "e813cce2d450708cfcb26e309c5172583a7440776edf354e83e6788c768e5cca",
     "https://bcr.bazel.build/modules/prometheus-cpp/1.3.0/MODULE.bazel": "ce82e086bbc0b60267e970f6a54b2ca6d0f22d3eb6633e00e2cc2899c700f3d8",
-    "https://bcr.bazel.build/modules/prometheus-cpp/1.3.0/source.json": "8cb66b4e535afc718e9d104a3db96ccb71a42ee816a100e50fd0d5ac843c0606",
     "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7",
     "https://bcr.bazel.build/modules/protobuf/23.1/MODULE.bazel": "88b393b3eb4101d18129e5db51847cd40a5517a53e81216144a8c32dfeeca52a",
     "https://bcr.bazel.build/modules/protobuf/24.4/MODULE.bazel": "7bc7ce5f2abf36b3b7b7c8218d3acdebb9426aeb35c2257c96445756f970eb12",
@@ -348,6 +388,7 @@
     "https://bcr.bazel.build/modules/protobuf/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c",
     "https://bcr.bazel.build/modules/protobuf/27.1/MODULE.bazel": "703a7b614728bb06647f965264967a8ef1c39e09e8f167b3ca0bb1fd80449c0d",
     "https://bcr.bazel.build/modules/protobuf/27.2/MODULE.bazel": "32450b50673882e4c8c3d10a83f3bc82161b213ed2f80d17e38bece8f165c295",
+    "https://bcr.bazel.build/modules/protobuf/29.0-rc2.bcr.1/MODULE.bazel": "52f4126f63a2f0bbf36b99c2a87648f08467a4eaf92ba726bc7d6a500bbf770c",
     "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df",
     "https://bcr.bazel.build/modules/protobuf/29.0-rc3/MODULE.bazel": "33c2dfa286578573afc55a7acaea3cada4122b9631007c594bf0729f41c8de92",
     "https://bcr.bazel.build/modules/protobuf/29.0/MODULE.bazel": "319dc8bf4c679ff87e71b1ccfb5a6e90a6dbc4693501d471f48662ac46d04e4e",
@@ -355,12 +396,17 @@
     "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0",
     "https://bcr.bazel.build/modules/protobuf/3.19.2/MODULE.bazel": "532ffe5f2186b69fdde039efe6df13ba726ff338c6bc82275ad433013fa10573",
     "https://bcr.bazel.build/modules/protobuf/3.19.6/MODULE.bazel": "9233edc5e1f2ee276a60de3eaa47ac4132302ef9643238f23128fea53ea12858",
+    "https://bcr.bazel.build/modules/protobuf/30.0/MODULE.bazel": "0e736de5d52ad7824113f47e65256a26ee74b689ba859c5447a0663e5a075409",
     "https://bcr.bazel.build/modules/protobuf/31.1/MODULE.bazel": "379a389bb330b7b8c1cdf331cc90bf3e13de5614799b3b52cdb7c6f389f6b38e",
-    "https://bcr.bazel.build/modules/protobuf/31.1/source.json": "25af5d0219da0c0fc4d1191a24ce438e6ca7f49d2e1a94f354efeba6ef10426f",
+    "https://bcr.bazel.build/modules/protobuf/32.1/MODULE.bazel": "89cd2866a9cb07fee9ff74c41ceace11554f32e0d849de4e23ac55515cfada4d",
+    "https://bcr.bazel.build/modules/protobuf/33.0/MODULE.bazel": "c5270efb4aad37a2f893536076518793f409ea7df07a06df995d848d1690f21c",
+    "https://bcr.bazel.build/modules/protobuf/33.0/source.json": "cd7ac80ad863190b9151281a85acc11d77b5bde2ba56443a7215da2d4ace6da3",
     "https://bcr.bazel.build/modules/protoc-gen-validate/1.0.4.bcr.2/MODULE.bazel": "c4bd2c850211ff5b7dadf9d2d0496c1c922fdedc303c775b01dfd3b3efc907ed",
     "https://bcr.bazel.build/modules/protoc-gen-validate/1.0.4/MODULE.bazel": "b8913c154b16177990f6126d2d2477d187f9ddc568e95ee3e2d50fc65d2c494a",
     "https://bcr.bazel.build/modules/protoc-gen-validate/1.2.1.bcr.1/MODULE.bazel": "4bf09676b62fa587ae07e073420a76ec8766dcce7545e5f8c68cfa8e484b5120",
-    "https://bcr.bazel.build/modules/protoc-gen-validate/1.2.1.bcr.1/source.json": "c19071ebc4b53b5f1cfab9c66eefaf6e4179eb8a998970d07b1077687e777f29",
+    "https://bcr.bazel.build/modules/protoc-gen-validate/1.2.1.bcr.2/MODULE.bazel": "3bd4b14a8e7c78dbef973280deabaa139db1fe350aa92da03730a31f59082068",
+    "https://bcr.bazel.build/modules/protoc-gen-validate/1.2.1.bcr.2/source.json": "14c28a5527fcd699f5efbf83a046666efabed3384364bd48428de89dfdc8110e",
+    "https://bcr.bazel.build/modules/protoc-gen-validate/1.2.1/MODULE.bazel": "52b51f50533ec4fbd5d613cd093773f979ac2e035d954e02ca11de383f502505",
     "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e",
     "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/MODULE.bazel": "e6f4c20442eaa7c90d7190d8dc539d0ab422f95c65a57cc59562170c58ae3d34",
     "https://bcr.bazel.build/modules/pybind11_bazel/2.13.6/MODULE.bazel": "2d746fda559464b253b2b2e6073cb51643a2ac79009ca02100ebbc44b4548656",
@@ -377,9 +423,11 @@
     "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8",
     "https://bcr.bazel.build/modules/rules_android/0.6.6/MODULE.bazel": "b0fb569752aab65ab1a9db0a8f6cfaf5aa1754965e17e95dcf0e4d88e192a68d",
     "https://bcr.bazel.build/modules/rules_android/0.6.6/source.json": "a9d8dc2d5a102dc03269a94acc886a4cab82cdcb9ccbc77b0f665d6d17a6ae09",
+    "https://bcr.bazel.build/modules/rules_apple/3.13.0/MODULE.bazel": "b4559a2c6281ca3165275bb36c1f0ac74666632adc5bdb680e366de7ce845f43",
     "https://bcr.bazel.build/modules/rules_apple/3.16.0/MODULE.bazel": "0d1caf0b8375942ce98ea944be754a18874041e4e0459401d925577624d3a54a",
-    "https://bcr.bazel.build/modules/rules_apple/3.16.0/source.json": "d8b5fe461272018cc07cfafce11fe369c7525330804c37eec5a82f84cd475366",
     "https://bcr.bazel.build/modules/rules_apple/3.5.1/MODULE.bazel": "3d1bbf65ad3692003d36d8a29eff54d4e5c1c5f4bfb60f79e28646a924d9101c",
+    "https://bcr.bazel.build/modules/rules_apple/4.1.0/MODULE.bazel": "76e10fd4a48038d3fc7c5dc6e63b7063bbf5304a2e3bd42edda6ec660eebea68",
+    "https://bcr.bazel.build/modules/rules_apple/4.1.0/source.json": "8ee81e1708756f81b343a5eb2b2f0b953f1d25c4ab3d4a68dc02754872e80715",
     "https://bcr.bazel.build/modules/rules_buf/0.1.1/MODULE.bazel": "6189aec18a4f7caff599ad41b851ab7645d4f1e114aa6431acf9b0666eb92162",
     "https://bcr.bazel.build/modules/rules_buf/0.5.2/MODULE.bazel": "5f2492d284ab9bedf2668178303abf5f3cd7d8cdf85d768951008e88456e9c6a",
     "https://bcr.bazel.build/modules/rules_buf/0.5.2/source.json": "41876d4834c0832de4b393de6e55dfd1cb3b25d3109e4ba90eb7fb57c560e0d9",
@@ -398,8 +446,11 @@
     "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e",
     "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5",
     "https://bcr.bazel.build/modules/rules_cc/0.1.1/MODULE.bazel": "2f0222a6f229f0bf44cd711dc13c858dad98c62d52bd51d8fc3a764a83125513",
+    "https://bcr.bazel.build/modules/rules_cc/0.1.2/MODULE.bazel": "557ddc3a96858ec0d465a87c0a931054d7dcfd6583af2c7ed3baf494407fd8d0",
     "https://bcr.bazel.build/modules/rules_cc/0.1.4/MODULE.bazel": "bb03a452a7527ac25a7518fb86a946ef63df860b9657d8323a0c50f8504fb0b9",
     "https://bcr.bazel.build/modules/rules_cc/0.1.5/MODULE.bazel": "88dfc9361e8b5ae1008ac38f7cdfd45ad738e4fa676a3ad67d19204f045a1fd8",
+    "https://bcr.bazel.build/modules/rules_cc/0.2.0/MODULE.bazel": "b5c17f90458caae90d2ccd114c81970062946f49f355610ed89bebf954f5783c",
+    "https://bcr.bazel.build/modules/rules_cc/0.2.13/MODULE.bazel": "eecdd666eda6be16a8d9dc15e44b5c75133405e820f620a234acc4b1fdc5aa37",
     "https://bcr.bazel.build/modules/rules_cc/0.2.14/MODULE.bazel": "353c99ed148887ee89c54a17d4100ae7e7e436593d104b668476019023b58df8",
     "https://bcr.bazel.build/modules/rules_cc/0.2.16/MODULE.bazel": "9242fa89f950c6ef7702801ab53922e99c69b02310c39fb6e62b2bd30df2a1d4",
     "https://bcr.bazel.build/modules/rules_cc/0.2.17/MODULE.bazel": "1849602c86cb60da8613d2de887f9566a6d354a6df6d7009f9d04a14402f9a84",
@@ -426,7 +477,10 @@
     "https://bcr.bazel.build/modules/rules_go/0.50.1/MODULE.bazel": "b91a308dc5782bb0a8021ad4330c81fea5bda77f96b9e4c117b9b9c8f6665ee0",
     "https://bcr.bazel.build/modules/rules_go/0.51.0-rc2/MODULE.bazel": "edfc3a9cea7bedb0eaaff37b0d7817c1a4bf72b3c615580b0ffcee6c52690fd4",
     "https://bcr.bazel.build/modules/rules_go/0.51.0/MODULE.bazel": "b6920f505935bfd69381651c942496d99b16e2a12f3dd5263b90ded16f3b4d0f",
-    "https://bcr.bazel.build/modules/rules_go/0.51.0/source.json": "473c0263360b1ae3aca71758e001d257a638620b2e2a36e3a2721fdae04377ec",
+    "https://bcr.bazel.build/modules/rules_go/0.53.0/MODULE.bazel": "a4ed760d3ac0dbc0d7b967631a9a3fd9100d28f7d9fcf214b4df87d4bfff5f9a",
+    "https://bcr.bazel.build/modules/rules_go/0.58.3/MODULE.bazel": "5582119a4a39558d8d1b1634bcae46043d4f43a31415e861c3551b2860040b5e",
+    "https://bcr.bazel.build/modules/rules_go/0.60.0/MODULE.bazel": "4a57ff2ffc2a3570e3c5646575c5a4b07287e91bcdac5d1f72383d51502b48cb",
+    "https://bcr.bazel.build/modules/rules_go/0.60.0/source.json": "1e21368c5e0c3013a110bd79a8fcff8ca46b5bcb2b561713a7273cbfcff7c464",
     "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74",
     "https://bcr.bazel.build/modules/rules_java/5.1.0/MODULE.bazel": "324b6478b0343a3ce7a9add8586ad75d24076d6d43d2f622990b9c1cfd8a1b15",
     "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86",
@@ -444,10 +498,12 @@
     "https://bcr.bazel.build/modules/rules_java/7.3.2/MODULE.bazel": "50dece891cfdf1741ea230d001aa9c14398062f2b7c066470accace78e412bc2",
     "https://bcr.bazel.build/modules/rules_java/7.4.0/MODULE.bazel": "a592852f8a3dd539e82ee6542013bf2cadfc4c6946be8941e189d224500a8934",
     "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe",
+    "https://bcr.bazel.build/modules/rules_java/7.6.5/MODULE.bazel": "481164be5e02e4cab6e77a36927683263be56b7e36fef918b458d7a8a1ebadb1",
     "https://bcr.bazel.build/modules/rules_java/8.13.0/MODULE.bazel": "0444ebf737d144cf2bb2ccb368e7f1cce735264285f2a3711785827c1686625e",
     "https://bcr.bazel.build/modules/rules_java/8.14.0/MODULE.bazel": "717717ed40cc69994596a45aec6ea78135ea434b8402fb91b009b9151dd65615",
     "https://bcr.bazel.build/modules/rules_java/8.15.1/MODULE.bazel": "5071eebf0fd602ab0617f846e0e0d8f388d66c961513c736e0ac4a1dcde3ff2c",
-    "https://bcr.bazel.build/modules/rules_java/8.15.1/source.json": "e48286d5819767bc5b3d457539ae7f94e28a9b3e55d092d5c47176cb6a2a289b",
+    "https://bcr.bazel.build/modules/rules_java/8.16.1/MODULE.bazel": "0f20b1cecaa8e52f60a8f071e59a20b4e3b9a67f6c56c802ea256f6face692d3",
+    "https://bcr.bazel.build/modules/rules_java/8.16.1/source.json": "072f8d11264edc499621be2dc9ea01d6395db5aa6f8799c034ae01a3e857f2e4",
     "https://bcr.bazel.build/modules/rules_java/8.3.2/MODULE.bazel": "7336d5511ad5af0b8615fdc7477535a2e4e723a357b6713af439fe8cf0195017",
     "https://bcr.bazel.build/modules/rules_java/8.5.1/MODULE.bazel": "d8a9e38cc5228881f7055a6079f6f7821a073df3744d441978e7a43e20226939",
     "https://bcr.bazel.build/modules/rules_java/8.6.0/MODULE.bazel": "9c064c434606d75a086f15ade5edb514308cccd1544c2b2a89bbac4310e41c71",
@@ -486,6 +542,7 @@
     "https://bcr.bazel.build/modules/rules_nodejs/6.5.2/MODULE.bazel": "7f9ea68a0ce6d82905ce9f74e76ab8a8b4531ed4c747018c9d76424ad0b3370d",
     "https://bcr.bazel.build/modules/rules_nodejs/6.7.3/MODULE.bazel": "c22a48b2a0dbf05a9dc5f83837bbc24c226c1f6e618de3c3a610044c9f336056",
     "https://bcr.bazel.build/modules/rules_nodejs/6.7.3/source.json": "a3f966f4415a8a6545e560ee5449eac95cc633f96429d08e87c87775c72f5e09",
+    "https://bcr.bazel.build/modules/rules_perl/0.2.4/MODULE.bazel": "5f5af7be4bf5fb88d91af7469518f0fd2161718aefc606188f7cd51f436ca938",
     "https://bcr.bazel.build/modules/rules_perl/1.1.0/MODULE.bazel": "22138e75bb8f1ee6c21f609b90d2c24b0c9b796ccf55cc04c1c9190b699f7e9d",
     "https://bcr.bazel.build/modules/rules_perl/1.1.0/source.json": "896fe7707a38c5b229c6f5fa77134209874c4d57fecda5f756c1f23e4d25aae2",
     "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc",
@@ -513,16 +570,20 @@
     "https://bcr.bazel.build/modules/rules_python/0.28.0/MODULE.bazel": "cba2573d870babc976664a912539b320cbaa7114cd3e8f053c720171cde331ed",
     "https://bcr.bazel.build/modules/rules_python/0.29.0/MODULE.bazel": "2ac8cd70524b4b9ec49a0b8284c79e4cd86199296f82f6e0d5da3f783d660c82",
     "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58",
+    "https://bcr.bazel.build/modules/rules_python/0.32.2/MODULE.bazel": "01052470fc30b49de91fb8483d26bea6f664500cfad0b078d4605b03e3a83ed4",
     "https://bcr.bazel.build/modules/rules_python/0.33.2/MODULE.bazel": "3e036c4ad8d804a4dad897d333d8dce200d943df4827cb849840055be8d2e937",
     "https://bcr.bazel.build/modules/rules_python/0.34.0/MODULE.bazel": "1d623d026e075b78c9fde483a889cda7996f5da4f36dffb24c246ab30f06513a",
+    "https://bcr.bazel.build/modules/rules_python/0.35.0/MODULE.bazel": "c3657951764cdcdb5a7370d5e885fad5e8c1583320aad18d46f9f110d2c22755",
     "https://bcr.bazel.build/modules/rules_python/0.37.1/MODULE.bazel": "3faeb2d9fa0a81f8980643ee33f212308f4d93eea4b9ce6f36d0b742e71e9500",
     "https://bcr.bazel.build/modules/rules_python/0.37.2/MODULE.bazel": "b5ffde91410745750b6c13be1c5dc4555ef5bc50562af4a89fd77807fdde626a",
     "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c",
     "https://bcr.bazel.build/modules/rules_python/0.40.0/MODULE.bazel": "9d1a3cd88ed7d8e39583d9ffe56ae8a244f67783ae89b60caafc9f5cf318ada7",
     "https://bcr.bazel.build/modules/rules_python/1.0.0/MODULE.bazel": "898a3d999c22caa585eb062b600f88654bf92efb204fa346fb55f6f8edffca43",
     "https://bcr.bazel.build/modules/rules_python/1.1.0/MODULE.bazel": "57e01abae22956eb96d891572490d20e07d983e0c065de0b2170cafe5053e788",
+    "https://bcr.bazel.build/modules/rules_python/1.3.0/MODULE.bazel": "8361d57eafb67c09b75bf4bbe6be360e1b8f4f18118ab48037f2bd50aa2ccb13",
     "https://bcr.bazel.build/modules/rules_python/1.4.1/MODULE.bazel": "8991ad45bdc25018301d6b7e1d3626afc3c8af8aaf4bc04f23d0b99c938b73a6",
     "https://bcr.bazel.build/modules/rules_python/1.5.1/MODULE.bazel": "acfe65880942d44a69129d4c5c3122d57baaf3edf58ae5a6bd4edea114906bf5",
+    "https://bcr.bazel.build/modules/rules_python/1.6.0/MODULE.bazel": "7e04ad8f8d5bea40451cf80b1bd8262552aa73f841415d20db96b7241bd027d8",
     "https://bcr.bazel.build/modules/rules_python/1.7.0/MODULE.bazel": "d01f995ecd137abf30238ad9ce97f8fc3ac57289c8b24bd0bf53324d937a14f8",
     "https://bcr.bazel.build/modules/rules_python/1.8.3/MODULE.bazel": "f343e159b59701334be3914416b9f1b72845801ba47920fcb288af4ce8c5cce3",
     "https://bcr.bazel.build/modules/rules_python/1.8.5/MODULE.bazel": "28b2d79ed8368d7d45b34bacc220e3c0b99cbcd9392641961b849e4c3f55dd30",
@@ -542,7 +603,9 @@
     "https://bcr.bazel.build/modules/rules_swift/1.16.0/MODULE.bazel": "4a09f199545a60d09895e8281362b1ff3bb08bbde69c6fc87aff5b92fcc916ca",
     "https://bcr.bazel.build/modules/rules_swift/1.18.0/MODULE.bazel": "a6aba73625d0dc64c7b4a1e831549b6e375fbddb9d2dde9d80c9de6ec45b24c9",
     "https://bcr.bazel.build/modules/rules_swift/2.1.1/MODULE.bazel": "494900a80f944fc7aa61500c2073d9729dff0b764f0e89b824eb746959bc1046",
-    "https://bcr.bazel.build/modules/rules_swift/2.1.1/source.json": "40fc69dfaac64deddbb75bd99cdac55f4427d9ca0afbe408576a65428427a186",
+    "https://bcr.bazel.build/modules/rules_swift/2.4.0/MODULE.bazel": "1639617eb1ede28d774d967a738b4a68b0accb40650beadb57c21846beab5efd",
+    "https://bcr.bazel.build/modules/rules_swift/3.1.2/MODULE.bazel": "72c8f5cf9d26427cee6c76c8e3853eb46ce6b0412a081b2b6db6e8ad56267400",
+    "https://bcr.bazel.build/modules/rules_swift/3.1.2/source.json": "e85761f3098a6faf40b8187695e3de6d97944e98abd0d8ce579cb2daf6319a66",
     "https://bcr.bazel.build/modules/stardoc/0.5.0/MODULE.bazel": "f9f1f46ba8d9c3362648eea571c6f9100680efc44913618811b58cc9c02cd678",
     "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8",
     "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c",
@@ -554,7 +617,8 @@
     "https://bcr.bazel.build/modules/stardoc/0.7.2/MODULE.bazel": "fc152419aa2ea0f51c29583fab1e8c99ddefd5b3778421845606ee628629e0e5",
     "https://bcr.bazel.build/modules/stardoc/0.7.2/source.json": "58b029e5e901d6802967754adf0a9056747e8176f017cfe3607c0851f4d42216",
     "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.1/MODULE.bazel": "5e463fbfba7b1701d957555ed45097d7f984211330106ccd1352c6e0af0dcf91",
-    "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.1/source.json": "32bd87e5f4d7acc57c5b2ff7c325ae3061d5e242c0c4c214ae87e0f1c13e54cb",
+    "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/MODULE.bazel": "75aab2373a4bbe2a1260b9bf2a1ebbdbf872d3bd36f80bff058dccd82e89422f",
+    "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/source.json": "5fba48bbe0ba48761f9e9f75f92876cafb5d07c0ce059cc7a8027416de94a05b",
     "https://bcr.bazel.build/modules/tar.bzl/0.2.1/MODULE.bazel": "52d1c00a80a8cc67acbd01649e83d8dd6a9dc426a6c0b754a04fe8c219c76468",
     "https://bcr.bazel.build/modules/tar.bzl/0.5.1/MODULE.bazel": "7c2eb3dcfc53b0f3d6f9acdfd911ca803eaf92aadf54f8ca6e4c1f3aee288351",
     "https://bcr.bazel.build/modules/tar.bzl/0.6.0/MODULE.bazel": "a3584b4edcfafcabd9b0ef9819808f05b372957bbdff41601429d5fd0aac2e7c",
@@ -599,15 +663,21 @@
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/abseil-cpp/20240722.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/abseil-cpp/20250127.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/abseil-cpp/20250127.1/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/abseil-cpp/20250512.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/abseil-cpp/20250512.1/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/abseil-cpp/20250814.0/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/abseil-cpp/20250814.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/abseil-py/2.1.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/ape/1.0.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/apple_support/1.11.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/apple_support/1.15.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/apple_support/1.17.1/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/apple_support/1.21.0/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/apple_support/1.21.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/apple_support/1.22.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/apple_support/1.23.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/apple_support/1.24.1/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/apple_support/1.24.2/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/apple_support/2.8.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/apple_support/2.9.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/aspect_bazel_lib/1.31.2/MODULE.bazel": "not found",
@@ -625,6 +695,7 @@
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/aspect_bazel_lib/2.8.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/aspect_bazel_lib/2.9.3/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/aspect_rules_esbuild/0.21.0/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/aspect_rules_esbuild/0.23.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/aspect_rules_js/1.33.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/aspect_rules_js/1.40.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/aspect_rules_js/2.0.0/MODULE.bazel": "not found",
@@ -636,6 +707,7 @@
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/aspect_rules_py/1.4.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/aspect_rules_py/1.5.2/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/aspect_rules_ts/3.6.0/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/aspect_tools_telemetry/0.2.6/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/aspect_tools_telemetry/0.2.8/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bazel_features/0.1.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bazel_features/1.0.0/MODULE.bazel": "not found",
@@ -656,7 +728,9 @@
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bazel_features/1.3.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bazel_features/1.30.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bazel_features/1.32.0/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bazel_features/1.33.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bazel_features/1.34.0/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bazel_features/1.36.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bazel_features/1.38.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bazel_features/1.39.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bazel_features/1.4.1/MODULE.bazel": "not found",
@@ -743,16 +817,23 @@
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/buildozer/7.1.2/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/bzip2/1.0.8.bcr.3/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/c-ares/1.15.0/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/c-ares/1.19.1/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/c-ares/1.34.5.bcr.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/cel-spec/0.15.0/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/cel-spec/0.24.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/civetweb/1.16/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/curl/8.4.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/curl/8.7.1/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/curl/8.8.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/cxx.rs/1.0.186/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/cython/3.0.11-1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/diff.bzl/0.5.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/download_utils/1.0.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/download_utils/1.2.2/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/envoy_api/0.0.0-20241214-918efc9/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/envoy_api/0.0.0-20250128-4de3c74/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/envoy_api/0.0.0-20251105-4a2b9a3/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/flatbuffers/25.12.19.bcr.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/flatbuffers/25.12.19/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/flatbuffers/25.9.23/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/gawk/5.3.2.bcr.1/MODULE.bazel": "not found",
@@ -764,14 +845,23 @@
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/gazelle/0.34.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/gazelle/0.36.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/gazelle/0.37.0/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/gazelle/0.39.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/gazelle/0.40.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/gazelle/0.44.0/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/gazelle/0.46.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/google_benchmark/1.8.2/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/google_benchmark/1.8.4/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/google_benchmark/1.8.5/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/google_benchmark/1.9.4/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/google_benchmark/1.9.5/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/googleapis-cc/1.0.0/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/googleapis-go/1.0.0/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/googleapis-java/1.0.0/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/googleapis-rules-registry/1.0.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/googleapis/0.0.0-20240326-1c8d509c5/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/googleapis/0.0.0-20240819-fe8ba054a/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/googleapis/0.0.0-20241220-5e258e33.bcr.1/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/googleapis/0.0.0-20251003-2193a2bf/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/googletest/1.17.0.bcr.2/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/grpc-java/1.62.2/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/grpc-java/1.66.0/MODULE.bazel": "not found",
@@ -783,10 +873,14 @@
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/grpc/1.41.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/grpc/1.56.3.bcr.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/grpc/1.62.1/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/grpc/1.63.1.bcr.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/grpc/1.66.0.bcr.2/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/grpc/1.66.0.bcr.3/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/grpc/1.69.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/grpc/1.70.1/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/grpc/1.71.0/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/grpc/1.74.1/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/grpc/1.76.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/helly25_bzl/0.4.3/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/jq.bzl/0.1.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/jq.bzl/0.4.0/MODULE.bazel": "not found",
@@ -799,18 +893,23 @@
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/nlohmann_json/3.11.3/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/nlohmann_json/3.12.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/nlohmann_json/3.6.1/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/opencensus-cpp/0.0.0-20230502-50eb5de.bcr.2/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/opencensus-cpp/0.0.0-20230502-50eb5de/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/opencensus-proto/0.4.1.bcr.2/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/opencensus-proto/0.4.1/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/openssl/3.3.1.bcr.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/openssl/3.5.5.bcr.4/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/opentelemetry-cpp/1.14.2/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/opentelemetry-cpp/1.16.0/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/opentelemetry-cpp/1.19.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/opentelemetry-proto/1.1.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/opentelemetry-proto/1.3.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/opentelemetry-proto/1.4.0.bcr.1/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/opentelemetry-proto/1.5.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/opentracing-cpp/1.6.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/package_metadata/0.0.2/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/package_metadata/0.0.3/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/package_metadata/0.0.5/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/package_metadata/0.0.6/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/package_metadata/0.0.7/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/platforms/0.0.10/MODULE.bazel": "not found",
@@ -824,6 +923,7 @@
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/platforms/1.0.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/platforms/1.1.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/prometheus-cpp/1.2.4/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/prometheus-cpp/1.3.0.bcr.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/prometheus-cpp/1.3.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/protobuf/21.7/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/protobuf/23.1/MODULE.bazel": "not found",
@@ -836,6 +936,7 @@
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/protobuf/27.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/protobuf/27.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/protobuf/27.2/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/protobuf/29.0-rc2.bcr.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/protobuf/29.0-rc2/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/protobuf/29.0-rc3/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/protobuf/29.0/MODULE.bazel": "not found",
@@ -843,10 +944,15 @@
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/protobuf/3.19.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/protobuf/3.19.2/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/protobuf/3.19.6/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/protobuf/30.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/protobuf/31.1/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/protobuf/32.1/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/protobuf/33.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/protoc-gen-validate/1.0.4.bcr.2/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/protoc-gen-validate/1.0.4/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/protoc-gen-validate/1.2.1.bcr.1/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/protoc-gen-validate/1.2.1.bcr.2/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/protoc-gen-validate/1.2.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/pybind11_bazel/2.11.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/pybind11_bazel/2.12.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/pybind11_bazel/2.13.6/MODULE.bazel": "not found",
@@ -859,8 +965,10 @@
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/re2/2025-08-12.bcr.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_android/0.1.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_android/0.6.6/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_apple/3.13.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_apple/3.16.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_apple/3.5.1/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_apple/4.1.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_buf/0.1.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_buf/0.5.2/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_build_error/0.11.0/MODULE.bazel": "not found",
@@ -877,8 +985,11 @@
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.0.8/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.0.9/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.1.1/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.1.2/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.1.4/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.1.5/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.2.0/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.2.13/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.2.14/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.2.16/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_cc/0.2.17/MODULE.bazel": "not found",
@@ -903,6 +1014,9 @@
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_go/0.50.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_go/0.51.0-rc2/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_go/0.51.0/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_go/0.53.0/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_go/0.58.3/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_go/0.60.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_java/4.0.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_java/5.1.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_java/5.3.5/MODULE.bazel": "not found",
@@ -920,9 +1034,11 @@
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_java/7.3.2/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_java/7.4.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_java/7.6.1/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_java/7.6.5/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_java/8.13.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_java/8.14.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_java/8.15.1/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_java/8.16.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_java/8.3.2/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_java/8.5.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_java/8.6.0/MODULE.bazel": "not found",
@@ -955,6 +1071,7 @@
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_nodejs/6.3.3/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_nodejs/6.5.2/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_nodejs/6.7.3/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_perl/0.2.4/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_perl/1.1.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_pkg/0.7.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_pkg/1.0.1/MODULE.bazel": "not found",
@@ -979,16 +1096,20 @@
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_python/0.28.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_python/0.29.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_python/0.31.0/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_python/0.32.2/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_python/0.33.2/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_python/0.34.0/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_python/0.35.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_python/0.37.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_python/0.37.2/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_python/0.4.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_python/0.40.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_python/1.0.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_python/1.1.0/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_python/1.3.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_python/1.4.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_python/1.5.1/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_python/1.6.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_python/1.7.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_python/1.8.3/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_python/1.8.5/MODULE.bazel": "not found",
@@ -1006,6 +1127,10 @@
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_swift/1.16.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_swift/1.18.0/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_swift/2.1.1/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_swift/2.4.0/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/rules_swift/3.1.2/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_baselibs/0.2.16/MODULE.bazel": "ab876c72e62f4ad29a20da6fe69c7d888c49f12d382dac241ee7ff98341778ff",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_baselibs/0.2.16/source.json": "fce4fdcbb347484e4d7d8b9ecec251e21ec7f462ad02a38dbc5bec9057e7c470",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_docs_as_code/8.6.0/MODULE.bazel": "bbbbbeeefce7e520c7bf45eeef7cd6700fff8a8a4e4a7f3fc527daf1cf4462ec",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_docs_as_code/8.6.0/source.json": "ec461822c632ab0e9f9a620d831cb2b3ded5b9288550289180d891db71b7ec8f",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/score_itf/0.6.0/MODULE.bazel": "84fe2438bde5db32cbcfca5db1194a56fd753f69e5466cf8e46aada7f209e613",
@@ -1040,6 +1165,7 @@
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/stardoc/0.7.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/stardoc/0.7.2/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/swift_argument_parser/1.3.1.1/MODULE.bazel": "not found",
+    "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/swift_argument_parser/1.3.1.2/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/tar.bzl/0.2.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/tar.bzl/0.5.1/MODULE.bazel": "not found",
     "https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/modules/tar.bzl/0.6.0/MODULE.bazel": "not found",
@@ -1069,8 +1195,8 @@
   "moduleExtensions": {
     "@@aspect_rules_esbuild+//esbuild:extensions.bzl%esbuild": {
       "general": {
-        "bzlTransitiveDigest": "xa0pOEfVyufb2E4901P5WFYhgbi0g5qBN03HONY+wCw=",
-        "usagesDigest": "sj4kz7yaVclWMuWhUhSLq0bVH7+HrkWyMdODMeA7Zhw=",
+        "bzlTransitiveDigest": "wguCGPXGIg4T+lCxDNsBklS5fcTpTp7qkLI46R2h1Y4=",
+        "usagesDigest": "2aGKRniWdOhtlYOL0710cE1WHQSZgVJOOQnU6OcEH6M=",
         "recordedFileInputs": {},
         "recordedDirentsInputs": {},
         "envVariables": {},
@@ -1191,6 +1317,11 @@
             "aspect_rules_js",
             "aspect_rules_js+"
           ],
+          [
+            "aspect_rules_esbuild+",
+            "aspect_tools_telemetry_report",
+            "aspect_tools_telemetry++telemetry+aspect_tools_telemetry_report"
+          ],
           [
             "aspect_rules_esbuild+",
             "bazel_skylib",
@@ -1512,7 +1643,7 @@
     "@@aspect_tools_telemetry+//:extension.bzl%telemetry": {
       "general": {
         "bzlTransitiveDigest": "gA7tPEdJXhskzPIEUxjX9IdDrM6+WjfbgXJ8Ez47umk=",
-        "usagesDigest": "Qe1lA0prPNt87OXoXq3fzmffG9RmcuqdmLdwKVAOUnc=",
+        "usagesDigest": "aiWShUDjoNv1aayeGTTvqXz2Y/TSC0zLzUPpjC916Jo=",
         "recordedFileInputs": {},
         "recordedDirentsInputs": {},
         "envVariables": {},
@@ -1522,6 +1653,7 @@
             "attributes": {
               "deps": {
                 "aspect_rules_lint": "2.5.0",
+                "aspect_rules_esbuild": "0.23.0",
                 "aspect_tools_telemetry": "0.2.8"
               }
             }
@@ -1543,7 +1675,7 @@
     },
     "@@bazel_jar_jar+//internal:non_module_deps.bzl%non_module_deps": {
       "general": {
-        "bzlTransitiveDigest": "WKp1gL89DpGSSx+oIwtE0toTaqU5pfTzmQSNhxgCEwk=",
+        "bzlTransitiveDigest": "yY4JZwLqlWjGdqgeYKwhn5LxsFmnACDn0uA/vYnrYVQ=",
         "usagesDigest": "P1uSZ4XnqOp90Mkh0A4Nrjx12Bgz/iceROnSbTsawGk=",
         "recordedFileInputs": {},
         "recordedDirentsInputs": {},
@@ -1657,207 +1789,10 @@
         ]
       }
     },
-    "@@cel-spec+//:extensions.bzl%non_module_dependencies": {
-      "general": {
-        "bzlTransitiveDigest": "49v9UE4eBOMtW8ATb+3VHdFaCc//dFbCS+ZQW0HIKNE=",
-        "usagesDigest": "HFQJtQrL9nKaFZEjgwaHVMHALMW+cafu696xy7J4ueM=",
-        "recordedFileInputs": {},
-        "recordedDirentsInputs": {},
-        "envVariables": {},
-        "generatedRepoSpecs": {
-          "com_google_googleapis": {
-            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
-            "attributes": {
-              "sha256": "bd8e735d881fb829751ecb1a77038dda4a8d274c45490cb9fcf004583ee10571",
-              "strip_prefix": "googleapis-07c27163ac591955d736f3057b1619ece66f5b99",
-              "urls": [
-                "https://github.com/googleapis/googleapis/archive/07c27163ac591955d736f3057b1619ece66f5b99.tar.gz"
-              ]
-            }
-          }
-        },
-        "recordedRepoMappingEntries": [
-          [
-            "cel-spec+",
-            "bazel_tools",
-            "bazel_tools"
-          ]
-        ]
-      }
-    },
-    "@@cel-spec+//:googleapis_ext.bzl%googleapis_ext": {
-      "general": {
-        "bzlTransitiveDigest": "yun2jmsomFi3bs5bjQWXApBzqQf66zBJ39JEBYigzdc=",
-        "usagesDigest": "Ek7VfZ+tuyRBx/1h5wcmtnW9EGpOb0dkXUwBluZbD8k=",
-        "recordedFileInputs": {},
-        "recordedDirentsInputs": {},
-        "envVariables": {},
-        "generatedRepoSpecs": {
-          "com_google_googleapis_imports": {
-            "repoRuleId": "@@cel-spec++non_module_dependencies+com_google_googleapis//:repository_rules.bzl%switched_rules",
-            "attributes": {
-              "rules": {
-                "proto_library_with_info": [
-                  "",
-                  ""
-                ],
-                "moved_proto_library": [
-                  "",
-                  ""
-                ],
-                "java_proto_library": [
-                  "",
-                  ""
-                ],
-                "java_grpc_library": [
-                  "",
-                  ""
-                ],
-                "java_gapic_library": [
-                  "",
-                  ""
-                ],
-                "java_gapic_test": [
-                  "",
-                  ""
-                ],
-                "java_gapic_assembly_gradle_pkg": [
-                  "",
-                  ""
-                ],
-                "py_proto_library": [
-                  "",
-                  ""
-                ],
-                "py_grpc_library": [
-                  "",
-                  ""
-                ],
-                "py_gapic_library": [
-                  "",
-                  ""
-                ],
-                "py_test": [
-                  "",
-                  ""
-                ],
-                "py_gapic_assembly_pkg": [
-                  "",
-                  ""
-                ],
-                "py_import": [
-                  "",
-                  ""
-                ],
-                "go_proto_library": [
-                  "",
-                  ""
-                ],
-                "go_library": [
-                  "",
-                  ""
-                ],
-                "go_test": [
-                  "",
-                  ""
-                ],
-                "go_gapic_library": [
-                  "",
-                  ""
-                ],
-                "go_gapic_assembly_pkg": [
-                  "",
-                  ""
-                ],
-                "cc_proto_library": [
-                  "native.cc_proto_library",
-                  ""
-                ],
-                "cc_grpc_library": [
-                  "",
-                  ""
-                ],
-                "cc_gapic_library": [
-                  "",
-                  ""
-                ],
-                "php_proto_library": [
-                  "",
-                  "php_proto_library"
-                ],
-                "php_grpc_library": [
-                  "",
-                  "php_grpc_library"
-                ],
-                "php_gapic_library": [
-                  "",
-                  "php_gapic_library"
-                ],
-                "php_gapic_assembly_pkg": [
-                  "",
-                  "php_gapic_assembly_pkg"
-                ],
-                "nodejs_gapic_library": [
-                  "",
-                  "typescript_gapic_library"
-                ],
-                "nodejs_gapic_assembly_pkg": [
-                  "",
-                  "typescript_gapic_assembly_pkg"
-                ],
-                "ruby_proto_library": [
-                  "",
-                  ""
-                ],
-                "ruby_grpc_library": [
-                  "",
-                  ""
-                ],
-                "ruby_ads_gapic_library": [
-                  "",
-                  ""
-                ],
-                "ruby_cloud_gapic_library": [
-                  "",
-                  ""
-                ],
-                "ruby_gapic_assembly_pkg": [
-                  "",
-                  ""
-                ],
-                "csharp_proto_library": [
-                  "",
-                  ""
-                ],
-                "csharp_grpc_library": [
-                  "",
-                  ""
-                ],
-                "csharp_gapic_library": [
-                  "",
-                  ""
-                ],
-                "csharp_gapic_assembly_pkg": [
-                  "",
-                  ""
-                ]
-              }
-            }
-          }
-        },
-        "recordedRepoMappingEntries": [
-          [
-            "cel-spec+",
-            "com_google_googleapis",
-            "cel-spec++non_module_dependencies+com_google_googleapis"
-          ]
-        ]
-      }
-    },
     "@@envoy_api+//bazel:repositories.bzl%non_module_deps": {
       "general": {
-        "bzlTransitiveDigest": "VzLskQI4CUM3XVC+wpI1FIlKua2ToSOGRJ8G+0HfaV8=",
-        "usagesDigest": "cxAa0VVo9d210JBUBw6wpuGp8jg+ltqw3tzH0tPtIEg=",
+        "bzlTransitiveDigest": "ZZmkeUj6sKBhRPx7KC3Ko/bFvj0z/1JGGmJwq07Bjz8=",
+        "usagesDigest": "lOhJkV09ITWn6LOK9fLMuf1t3969wdr45lToQ2MVQoU=",
         "recordedFileInputs": {},
         "recordedDirentsInputs": {},
         "envVariables": {},
@@ -1866,33 +1801,12 @@
             "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
             "attributes": {
               "urls": [
-                "https://github.com/prometheus/client_model/archive/v0.6.1.tar.gz"
+                "https://github.com/prometheus/client_model/archive/v0.6.2.tar.gz"
               ],
-              "sha256": "b9b690bc35d80061f255faa7df7621eae39fe157179ccd78ff6409c3b004f05e",
-              "strip_prefix": "client_model-0.6.1",
+              "sha256": "47c5ea7949f68e7f7b344350c59b6bd31eeb921f0eec6c3a566e27cf1951470c",
+              "strip_prefix": "client_model-0.6.2",
               "build_file_content": "\nload(\"@envoy_api//bazel:api_build_system.bzl\", \"api_cc_py_proto_library\")\nload(\"@io_bazel_rules_go//proto:def.bzl\", \"go_proto_library\")\n\napi_cc_py_proto_library(\n    name = \"client_model\",\n    srcs = [\n        \"io/prometheus/client/metrics.proto\",\n    ],\n    visibility = [\"//visibility:public\"],\n)\n\ngo_proto_library(\n    name = \"client_model_go_proto\",\n    importpath = \"github.com/prometheus/client_model/go\",\n    proto = \":client_model\",\n    visibility = [\"//visibility:public\"],\n)\n"
             }
-          },
-          "com_github_bufbuild_buf": {
-            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
-            "attributes": {
-              "urls": [
-                "https://github.com/bufbuild/buf/releases/download/v1.47.2/buf-Linux-x86_64.tar.gz"
-              ],
-              "sha256": "39716cfe0185df3cba21f66ec739620ffb6876c48b2da4338a8c68c290c9b116",
-              "strip_prefix": "buf",
-              "build_file_content": "\npackage(\n    default_visibility = [\"//visibility:public\"],\n)\n\nfilegroup(\n    name = \"buf\",\n    srcs = [\n        \"@com_github_bufbuild_buf//:bin/buf\",\n    ],\n    tags = [\"manual\"], # buf is downloaded as a linux binary; tagged manual to prevent build for non-linux users\n)\n"
-            }
-          },
-          "envoy_toolshed": {
-            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
-            "attributes": {
-              "urls": [
-                "https://github.com/envoyproxy/toolshed/archive/bazel-v0.2.0.tar.gz"
-              ],
-              "sha256": "ef5e95580c41f6805beec197d9a4f6683550f4bfc1e1c678449b6d205dbf000b",
-              "strip_prefix": "toolshed-bazel-v0.2.0/bazel"
-            }
           }
         },
         "recordedRepoMappingEntries": [
@@ -1911,168 +1825,12 @@
     },
     "@@googleapis+//:extensions.bzl%switched_rules": {
       "general": {
-        "bzlTransitiveDigest": "vG6fuTzXD8MMvHWZEQud0MMH7eoC4GXY0va7VrFFh04=",
-        "usagesDigest": "GgS9fFQ+jq1T8XmP/+O39Kr+uPlDWkWIZFIy6ex93WA=",
+        "bzlTransitiveDigest": "1ZTg77R3Ks/ksx8QMNIoTRJetbJPRlzGFlJa9hoUn+Y=",
+        "usagesDigest": "4qqLlQt9ukbtcljUbNd31KFkYT16jA3KGb6yYAFv+o4=",
         "recordedFileInputs": {},
         "recordedDirentsInputs": {},
         "envVariables": {},
-        "generatedRepoSpecs": {
-          "com_google_googleapis_imports": {
-            "repoRuleId": "@@googleapis+//:repository_rules.bzl%switched_rules",
-            "attributes": {
-              "rules": {
-                "proto_library_with_info": [
-                  "",
-                  ""
-                ],
-                "moved_proto_library": [
-                  "",
-                  ""
-                ],
-                "java_proto_library": [
-                  "",
-                  ""
-                ],
-                "java_grpc_library": [
-                  "",
-                  ""
-                ],
-                "java_gapic_library": [
-                  "",
-                  ""
-                ],
-                "java_gapic_test": [
-                  "",
-                  ""
-                ],
-                "java_gapic_assembly_gradle_pkg": [
-                  "",
-                  ""
-                ],
-                "py_proto_library": [
-                  "",
-                  ""
-                ],
-                "py_grpc_library": [
-                  "",
-                  ""
-                ],
-                "py_gapic_library": [
-                  "",
-                  ""
-                ],
-                "py_test": [
-                  "",
-                  ""
-                ],
-                "py_gapic_assembly_pkg": [
-                  "",
-                  ""
-                ],
-                "py_import": [
-                  "",
-                  ""
-                ],
-                "go_proto_library": [
-                  "",
-                  ""
-                ],
-                "go_grpc_library": [
-                  "",
-                  ""
-                ],
-                "go_library": [
-                  "",
-                  ""
-                ],
-                "go_test": [
-                  "",
-                  ""
-                ],
-                "go_gapic_library": [
-                  "",
-                  ""
-                ],
-                "go_gapic_assembly_pkg": [
-                  "",
-                  ""
-                ],
-                "cc_proto_library": [
-                  "",
-                  ""
-                ],
-                "cc_grpc_library": [
-                  "",
-                  ""
-                ],
-                "cc_gapic_library": [
-                  "",
-                  ""
-                ],
-                "php_proto_library": [
-                  "",
-                  "php_proto_library"
-                ],
-                "php_grpc_library": [
-                  "",
-                  "php_grpc_library"
-                ],
-                "php_gapic_library": [
-                  "",
-                  "php_gapic_library"
-                ],
-                "php_gapic_assembly_pkg": [
-                  "",
-                  "php_gapic_assembly_pkg"
-                ],
-                "nodejs_gapic_library": [
-                  "",
-                  "typescript_gapic_library"
-                ],
-                "nodejs_gapic_assembly_pkg": [
-                  "",
-                  "typescript_gapic_assembly_pkg"
-                ],
-                "ruby_proto_library": [
-                  "",
-                  ""
-                ],
-                "ruby_grpc_library": [
-                  "",
-                  ""
-                ],
-                "ruby_ads_gapic_library": [
-                  "",
-                  ""
-                ],
-                "ruby_cloud_gapic_library": [
-                  "",
-                  ""
-                ],
-                "ruby_gapic_assembly_pkg": [
-                  "",
-                  ""
-                ],
-                "csharp_proto_library": [
-                  "",
-                  ""
-                ],
-                "csharp_grpc_library": [
-                  "",
-                  ""
-                ],
-                "csharp_gapic_library": [
-                  "",
-                  ""
-                ],
-                "csharp_gapic_assembly_pkg": [
-                  "",
-                  ""
-                ]
-              }
-            }
-          }
-        },
+        "generatedRepoSpecs": {},
         "recordedRepoMappingEntries": []
       }
     },
@@ -2169,126 +1927,6 @@
         "recordedRepoMappingEntries": []
       }
     },
-    "@@rules_apple+//apple:apple.bzl%provisioning_profile_repository_extension": {
-      "general": {
-        "bzlTransitiveDigest": "lgof385rXHmmk4IC53d7qCeKZlZunQ4c6SX3i40TjMI=",
-        "usagesDigest": "vsJl8Rw5NL+5Ag2wdUDoTeRF/5klkXO8545Iy7U1Q08=",
-        "recordedFileInputs": {},
-        "recordedDirentsInputs": {},
-        "envVariables": {},
-        "generatedRepoSpecs": {
-          "local_provisioning_profiles": {
-            "repoRuleId": "@@rules_apple+//apple/internal:local_provisioning_profiles.bzl%provisioning_profile_repository",
-            "attributes": {}
-          }
-        },
-        "recordedRepoMappingEntries": [
-          [
-            "apple_support+",
-            "bazel_skylib",
-            "bazel_skylib+"
-          ],
-          [
-            "bazel_tools",
-            "rules_cc",
-            "rules_cc+"
-          ],
-          [
-            "rules_apple+",
-            "bazel_skylib",
-            "bazel_skylib+"
-          ],
-          [
-            "rules_apple+",
-            "bazel_tools",
-            "bazel_tools"
-          ],
-          [
-            "rules_apple+",
-            "build_bazel_apple_support",
-            "apple_support+"
-          ],
-          [
-            "rules_apple+",
-            "build_bazel_rules_swift",
-            "rules_swift+"
-          ],
-          [
-            "rules_cc+",
-            "bazel_tools",
-            "bazel_tools"
-          ],
-          [
-            "rules_cc+",
-            "cc_compatibility_proxy",
-            "rules_cc++compatibility_proxy+cc_compatibility_proxy"
-          ],
-          [
-            "rules_cc+",
-            "rules_cc",
-            "rules_cc+"
-          ],
-          [
-            "rules_cc++compatibility_proxy+cc_compatibility_proxy",
-            "rules_cc",
-            "rules_cc+"
-          ],
-          [
-            "rules_swift+",
-            "bazel_skylib",
-            "bazel_skylib+"
-          ],
-          [
-            "rules_swift+",
-            "bazel_tools",
-            "bazel_tools"
-          ],
-          [
-            "rules_swift+",
-            "build_bazel_apple_support",
-            "apple_support+"
-          ],
-          [
-            "rules_swift+",
-            "build_bazel_rules_swift",
-            "rules_swift+"
-          ],
-          [
-            "rules_swift+",
-            "build_bazel_rules_swift_local_config",
-            "rules_swift++non_module_deps+build_bazel_rules_swift_local_config"
-          ]
-        ]
-      }
-    },
-    "@@rules_apple+//apple:extensions.bzl%non_module_deps": {
-      "general": {
-        "bzlTransitiveDigest": "4xtddSlWIQdtVNVuvOI62fJfQVETHZCVWFvYYwQHMR4=",
-        "usagesDigest": "M3VqFpeTCo4qmrNKGZw0dxBHvTYDrfV3cscGzlSAhQ4=",
-        "recordedFileInputs": {},
-        "recordedDirentsInputs": {},
-        "envVariables": {},
-        "generatedRepoSpecs": {
-          "xctestrunner": {
-            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
-            "attributes": {
-              "urls": [
-                "https://github.com/google/xctestrunner/archive/b7698df3d435b6491b4b4c0f9fc7a63fbed5e3a6.tar.gz"
-              ],
-              "strip_prefix": "xctestrunner-b7698df3d435b6491b4b4c0f9fc7a63fbed5e3a6",
-              "sha256": "ae3a063c985a8633cb7eb566db21656f8db8eb9a0edb8c182312c7f0db53730d"
-            }
-          }
-        },
-        "recordedRepoMappingEntries": [
-          [
-            "rules_apple+",
-            "bazel_tools",
-            "bazel_tools"
-          ]
-        ]
-      }
-    },
     "@@rules_boost+//:boost/repositories.bzl%non_module_dependencies": {
       "general": {
         "bzlTransitiveDigest": "LyNJAJDFfdhRYUCeGd1OJlb0/cdtrEpQca0MpJy9l6w=",
@@ -3697,7 +3335,7 @@
     "@@rules_nodejs+//nodejs:extensions.bzl%node": {
       "general": {
         "bzlTransitiveDigest": "4pUxCNc22K4I+6+4Nxu52Hur12tFRfa1JMsN5mdDv60=",
-        "usagesDigest": "+Q1iBvxUCNrDBPl7RSp1m8ia6iWfULbEIgocScokBtY=",
+        "usagesDigest": "KC7HyKRhcVBxLzBZ154+/svI34MlSgynA4NSElgMXaI=",
         "recordedFileInputs": {},
         "recordedDirentsInputs": {},
         "envVariables": {},
@@ -11305,165 +10943,6 @@
         ]
       }
     },
-    "@@rules_swift+//swift:extensions.bzl%non_module_deps": {
-      "general": {
-        "bzlTransitiveDigest": "6axDCXf6fQoPav8hojnUBxGA0FAMqLvtpC1cRsisCdw=",
-        "usagesDigest": "mhACFnrdMv9Wi0Mt67bxocJqviRkDSV+Ee5Mqdj5akA=",
-        "recordedFileInputs": {},
-        "recordedDirentsInputs": {},
-        "envVariables": {},
-        "generatedRepoSpecs": {
-          "com_github_apple_swift_protobuf": {
-            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
-            "attributes": {
-              "urls": [
-                "https://github.com/apple/swift-protobuf/archive/1.20.2.tar.gz"
-              ],
-              "sha256": "3fb50bd4d293337f202d917b6ada22f9548a0a0aed9d9a4d791e6fbd8a246ebb",
-              "strip_prefix": "swift-protobuf-1.20.2/",
-              "build_file": "@@rules_swift+//third_party:com_github_apple_swift_protobuf/BUILD.overlay"
-            }
-          },
-          "com_github_grpc_grpc_swift": {
-            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
-            "attributes": {
-              "urls": [
-                "https://github.com/grpc/grpc-swift/archive/1.16.0.tar.gz"
-              ],
-              "sha256": "58b60431d0064969f9679411264b82e40a217ae6bd34e17096d92cc4e47556a5",
-              "strip_prefix": "grpc-swift-1.16.0/",
-              "build_file": "@@rules_swift+//third_party:com_github_grpc_grpc_swift/BUILD.overlay"
-            }
-          },
-          "com_github_apple_swift_docc_symbolkit": {
-            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
-            "attributes": {
-              "urls": [
-                "https://github.com/apple/swift-docc-symbolkit/archive/refs/tags/swift-5.10-RELEASE.tar.gz"
-              ],
-              "sha256": "de1d4b6940468ddb53b89df7aa1a81323b9712775b0e33e8254fa0f6f7469a97",
-              "strip_prefix": "swift-docc-symbolkit-swift-5.10-RELEASE",
-              "build_file": "@@rules_swift+//third_party:com_github_apple_swift_docc_symbolkit/BUILD.overlay"
-            }
-          },
-          "com_github_apple_swift_nio": {
-            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
-            "attributes": {
-              "urls": [
-                "https://github.com/apple/swift-nio/archive/2.42.0.tar.gz"
-              ],
-              "sha256": "e3304bc3fb53aea74a3e54bd005ede11f6dc357117d9b1db642d03aea87194a0",
-              "strip_prefix": "swift-nio-2.42.0/",
-              "build_file": "@@rules_swift+//third_party:com_github_apple_swift_nio/BUILD.overlay"
-            }
-          },
-          "com_github_apple_swift_nio_http2": {
-            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
-            "attributes": {
-              "urls": [
-                "https://github.com/apple/swift-nio-http2/archive/1.26.0.tar.gz"
-              ],
-              "sha256": "f0edfc9d6a7be1d587e5b403f2d04264bdfae59aac1d74f7d974a9022c6d2b25",
-              "strip_prefix": "swift-nio-http2-1.26.0/",
-              "build_file": "@@rules_swift+//third_party:com_github_apple_swift_nio_http2/BUILD.overlay"
-            }
-          },
-          "com_github_apple_swift_nio_transport_services": {
-            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
-            "attributes": {
-              "urls": [
-                "https://github.com/apple/swift-nio-transport-services/archive/1.15.0.tar.gz"
-              ],
-              "sha256": "f3498dafa633751a52b9b7f741f7ac30c42bcbeb3b9edca6d447e0da8e693262",
-              "strip_prefix": "swift-nio-transport-services-1.15.0/",
-              "build_file": "@@rules_swift+//third_party:com_github_apple_swift_nio_transport_services/BUILD.overlay"
-            }
-          },
-          "com_github_apple_swift_nio_extras": {
-            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
-            "attributes": {
-              "urls": [
-                "https://github.com/apple/swift-nio-extras/archive/1.4.0.tar.gz"
-              ],
-              "sha256": "4684b52951d9d9937bb3e8ccd6b5daedd777021ef2519ea2f18c4c922843b52b",
-              "strip_prefix": "swift-nio-extras-1.4.0/",
-              "build_file": "@@rules_swift+//third_party:com_github_apple_swift_nio_extras/BUILD.overlay"
-            }
-          },
-          "com_github_apple_swift_log": {
-            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
-            "attributes": {
-              "urls": [
-                "https://github.com/apple/swift-log/archive/1.4.4.tar.gz"
-              ],
-              "sha256": "48fe66426c784c0c20031f15dc17faf9f4c9037c192bfac2f643f65cb2321ba0",
-              "strip_prefix": "swift-log-1.4.4/",
-              "build_file": "@@rules_swift+//third_party:com_github_apple_swift_log/BUILD.overlay"
-            }
-          },
-          "com_github_apple_swift_nio_ssl": {
-            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
-            "attributes": {
-              "urls": [
-                "https://github.com/apple/swift-nio-ssl/archive/2.23.0.tar.gz"
-              ],
-              "sha256": "4787c63f61dd04d99e498adc3d1a628193387e41efddf8de19b8db04544d016d",
-              "strip_prefix": "swift-nio-ssl-2.23.0/",
-              "build_file": "@@rules_swift+//third_party:com_github_apple_swift_nio_ssl/BUILD.overlay"
-            }
-          },
-          "com_github_apple_swift_collections": {
-            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
-            "attributes": {
-              "urls": [
-                "https://github.com/apple/swift-collections/archive/1.0.4.tar.gz"
-              ],
-              "sha256": "d9e4c8a91c60fb9c92a04caccbb10ded42f4cb47b26a212bc6b39cc390a4b096",
-              "strip_prefix": "swift-collections-1.0.4/",
-              "build_file": "@@rules_swift+//third_party:com_github_apple_swift_collections/BUILD.overlay"
-            }
-          },
-          "com_github_apple_swift_atomics": {
-            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
-            "attributes": {
-              "urls": [
-                "https://github.com/apple/swift-atomics/archive/1.1.0.tar.gz"
-              ],
-              "sha256": "1bee7f469f7e8dc49f11cfa4da07182fbc79eab000ec2c17bfdce468c5d276fb",
-              "strip_prefix": "swift-atomics-1.1.0/",
-              "build_file": "@@rules_swift+//third_party:com_github_apple_swift_atomics/BUILD.overlay"
-            }
-          },
-          "build_bazel_rules_swift_index_import": {
-            "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
-            "attributes": {
-              "build_file": "@@rules_swift+//third_party:build_bazel_rules_swift_index_import/BUILD.overlay",
-              "canonical_id": "index-import-5.8",
-              "urls": [
-                "https://github.com/MobileNativeFoundation/index-import/releases/download/5.8.0.1/index-import.tar.gz"
-              ],
-              "sha256": "28c1ffa39d99e74ed70623899b207b41f79214c498c603915aef55972a851a15"
-            }
-          },
-          "build_bazel_rules_swift_local_config": {
-            "repoRuleId": "@@rules_swift+//swift/internal:swift_autoconfiguration.bzl%swift_autoconfiguration",
-            "attributes": {}
-          }
-        },
-        "recordedRepoMappingEntries": [
-          [
-            "rules_swift+",
-            "bazel_tools",
-            "bazel_tools"
-          ],
-          [
-            "rules_swift+",
-            "build_bazel_rules_swift",
-            "rules_swift+"
-          ]
-        ]
-      }
-    },
     "@@score_bazel_cpp_toolchains+//extensions:gcc.bzl%gcc": {
       "general": {
         "bzlTransitiveDigest": "4I0YNPbDgLY5CojGj/bUi9kZkZnU0EDjGFyT8XcfAc4=",
@@ -12250,5 +11729,706 @@
       }
     }
   },
-  "facts": {}
+  "facts": {
+    "@@rules_go+//go:extensions.bzl%go_sdk": {
+      "1.20.2": {
+        "darwin_amd64": [
+          "go1.20.2.darwin-amd64.tar.gz",
+          "c93b8ced9517d07e1cd4c362c6e2d5242cb139e29b417a328fbf19aded08764c"
+        ],
+        "darwin_arm64": [
+          "go1.20.2.darwin-arm64.tar.gz",
+          "7343c87f19e79c0063532e82e1c4d6f42175a32d99f7a4d15e658e88bf97f885"
+        ],
+        "freebsd_386": [
+          "go1.20.2.freebsd-386.tar.gz",
+          "14f9be2004e042b3a64d0facb0c020756a9084a5c7333e33b0752b393b6016ea"
+        ],
+        "freebsd_amd64": [
+          "go1.20.2.freebsd-amd64.tar.gz",
+          "b41b67b4f1b56797a7cecf6ee7f47fcf4f93960b2788a3683c07dd009d30b2a4"
+        ],
+        "linux_386": [
+          "go1.20.2.linux-386.tar.gz",
+          "ee240ed33ae57504c41f04c12236aeaa17fbeb6ea9fcd096cd9dc7a89d10d4db"
+        ],
+        "linux_amd64": [
+          "go1.20.2.linux-amd64.tar.gz",
+          "4eaea32f59cde4dc635fbc42161031d13e1c780b87097f4b4234cfce671f1768"
+        ],
+        "linux_arm64": [
+          "go1.20.2.linux-arm64.tar.gz",
+          "78d632915bb75e9a6356a47a42625fd1a785c83a64a643fedd8f61e31b1b3bef"
+        ],
+        "linux_armv6l": [
+          "go1.20.2.linux-armv6l.tar.gz",
+          "d79d56bafd6b52b8d8cbe3f8e967caaac5383a23d7a4fa9ac0e89778cd16a076"
+        ],
+        "linux_ppc64le": [
+          "go1.20.2.linux-ppc64le.tar.gz",
+          "850564ddb760cb703db63bf20182dc4407abd2ff090a95fa66d6634d172fd095"
+        ],
+        "linux_s390x": [
+          "go1.20.2.linux-s390x.tar.gz",
+          "8da24c5c4205fe8115f594237e5db7bcb1d23df67bc1fa9a999954b1976896e8"
+        ],
+        "windows_386": [
+          "go1.20.2.windows-386.zip",
+          "31838b291117495bbb93683603e98d5118bfabd2eb318b4d07540bfd524bab86"
+        ],
+        "windows_amd64": [
+          "go1.20.2.windows-amd64.zip",
+          "fe439f0e438f7555a7f5f7194ddb6f4a07b0de1fa414385d19f2aeb26d9f43db"
+        ],
+        "windows_arm64": [
+          "go1.20.2.windows-arm64.zip",
+          "ac5010c8b8b22849228a8dea698d58b9c7be2195d30c6d778cce0f709858fa64"
+        ]
+      },
+      "1.22.0": {
+        "aix_ppc64": [
+          "go1.22.0.aix-ppc64.tar.gz",
+          "190e105fc4133a8b5bb1492f368fa89aa4b729270441120714be7ee82e871ebc"
+        ],
+        "darwin_amd64": [
+          "go1.22.0.darwin-amd64.tar.gz",
+          "ebca81df938d2d1047cc992be6c6c759543cf309d401b86af38a6aed3d4090f4"
+        ],
+        "darwin_arm64": [
+          "go1.22.0.darwin-arm64.tar.gz",
+          "bf8e388b09134164717cd52d3285a4ab3b68691b80515212da0e9f56f518fb1e"
+        ],
+        "dragonfly_amd64": [
+          "go1.22.0.dragonfly-amd64.tar.gz",
+          "357ab446200effa26c73ccaf3e8551426428950bf2490859fb296a09e53228b1"
+        ],
+        "freebsd_386": [
+          "go1.22.0.freebsd-386.tar.gz",
+          "b8065da37783e8b9e7086365a54d74537e832c92311b61101a66989ab2458d8e"
+        ],
+        "freebsd_amd64": [
+          "go1.22.0.freebsd-amd64.tar.gz",
+          "50f421c7f217083ac94aab1e09400cb9c2fea7d337679ec11f1638a11460da30"
+        ],
+        "freebsd_arm64": [
+          "go1.22.0.freebsd-arm64.tar.gz",
+          "e23385e5c640787fa02cd58f2301ea09e162c4d99f8ca9fa6d52766f428a933d"
+        ],
+        "freebsd_armv6l": [
+          "go1.22.0.freebsd-arm.tar.gz",
+          "c9c8b305f90903536f4981bad9f029828c2483b3216ca1783777344fbe603f2d"
+        ],
+        "freebsd_riscv64": [
+          "go1.22.0.freebsd-riscv64.tar.gz",
+          "c8f94d1de6024546194d58e7b9370dc7ea06176aad94a675b0062c25c40cb645"
+        ],
+        "illumos_amd64": [
+          "go1.22.0.illumos-amd64.tar.gz",
+          "d6792f11ad6ee5fc42d2fe51e1f1683471aa2ee4f20e3ad1be22a4afdbd38e7f"
+        ],
+        "linux_386": [
+          "go1.22.0.linux-386.tar.gz",
+          "1e209c4abde069067ac9afb341c8003db6a210f8173c77777f02d3a524313da3"
+        ],
+        "linux_amd64": [
+          "go1.22.0.linux-amd64.tar.gz",
+          "f6c8a87aa03b92c4b0bf3d558e28ea03006eb29db78917daec5cfb6ec1046265"
+        ],
+        "linux_arm64": [
+          "go1.22.0.linux-arm64.tar.gz",
+          "6a63fef0e050146f275bf02a0896badfe77c11b6f05499bb647e7bd613a45a10"
+        ],
+        "linux_armv6l": [
+          "go1.22.0.linux-armv6l.tar.gz",
+          "0525f92f79df7ed5877147bce7b955f159f3962711b69faac66bc7121d36dcc4"
+        ],
+        "linux_loong64": [
+          "go1.22.0.linux-loong64.tar.gz",
+          "b4b1d425cc113608452a32768469b6e34e538fd072bde9f508a75c8dbbdb843f"
+        ],
+        "linux_mips": [
+          "go1.22.0.linux-mips.tar.gz",
+          "ec0f9194df750c78492c02e4c70ffe6f3864f2511e47c894415320db752719f8"
+        ],
+        "linux_mips64": [
+          "go1.22.0.linux-mips64.tar.gz",
+          "47e938d215e4968ab42afb7307792e5e64184a717e8f176d0de7c411af96d63d"
+        ],
+        "linux_mips64le": [
+          "go1.22.0.linux-mips64le.tar.gz",
+          "c162a1a516b8bc8839fc0c0283ad90f6b511e5aca3da4939ed4800f124b9e72c"
+        ],
+        "linux_mipsle": [
+          "go1.22.0.linux-mipsle.tar.gz",
+          "6ce3e9a06e3a8ca0312dc1f85046b6914c19852eba5393c5cbf26acf698f8977"
+        ],
+        "linux_ppc64": [
+          "go1.22.0.linux-ppc64.tar.gz",
+          "5ae23bf460731eb078f5700b01a50a303308b9f7174a2994892e28bf061f7c85"
+        ],
+        "linux_ppc64le": [
+          "go1.22.0.linux-ppc64le.tar.gz",
+          "0e57f421df9449066f00155ce98a5be93744b3d81b00ee4c2c9b511be2a31d93"
+        ],
+        "linux_riscv64": [
+          "go1.22.0.linux-riscv64.tar.gz",
+          "afe9cedcdbd6fdff27c57efd30aa5ce0f666f471fed5fa96cd4fb38d6b577086"
+        ],
+        "linux_s390x": [
+          "go1.22.0.linux-s390x.tar.gz",
+          "2e546a3583ba7bd3988f8f476245698f6a93dfa9fe206a8ca8f85c1ceecb2446"
+        ],
+        "netbsd_386": [
+          "go1.22.0.netbsd-386.tar.gz",
+          "9b7e2dbd43a169bff18bf533a6c2f462eebe04126ab01c138d0d669c046e1658"
+        ],
+        "netbsd_amd64": [
+          "go1.22.0.netbsd-amd64.tar.gz",
+          "b11995c271d2256dfe85cf54882ca3655e18c49c4d7db0502bff9977767894e7"
+        ],
+        "netbsd_arm64": [
+          "go1.22.0.netbsd-arm64.tar.gz",
+          "499918ccfedde78264d194244d251bf41d95cf606cc0adad13b36b8103cb974f"
+        ],
+        "netbsd_armv6l": [
+          "go1.22.0.netbsd-arm.tar.gz",
+          "b57a3aa9c862300ec0ee8609ce5e0f430f132044f351677fd34711a504081872"
+        ],
+        "openbsd_386": [
+          "go1.22.0.openbsd-386.tar.gz",
+          "379e0829104c18a139d78b33378e6bd3ab2e0792f6c43b4c38e7f20d8d77b99d"
+        ],
+        "openbsd_amd64": [
+          "go1.22.0.openbsd-amd64.tar.gz",
+          "ceb0c97ffc3bfaf74e1df843cb8571d7fc3173a08432f0f42112495df6a31520"
+        ],
+        "openbsd_arm64": [
+          "go1.22.0.openbsd-arm64.tar.gz",
+          "358801cab7122ab50d7d92727644f26d818e9e973403f09e85c2e935a625db75"
+        ],
+        "openbsd_armv6l": [
+          "go1.22.0.openbsd-arm.tar.gz",
+          "8af5aea3df539bc95ed412c0a176fe84baced70ea1dd29f4aa82d0e9ce27fd9f"
+        ],
+        "plan9_386": [
+          "go1.22.0.plan9-386.tar.gz",
+          "fa42c545c9025c45ca9af176dc13a0f4af0cc26bacff6fcb35bb4a170ac538e8"
+        ],
+        "plan9_amd64": [
+          "go1.22.0.plan9-amd64.tar.gz",
+          "d8cf64f37a1dfd8e190c5a303c43ab2d49324868f098d88a3106072d137a5a0b"
+        ],
+        "plan9_armv6l": [
+          "go1.22.0.plan9-arm.tar.gz",
+          "86fd6165f0cbb47ad551094f74b3e5a6c5e09de858d8b99de72d978d41be6e2a"
+        ],
+        "solaris_amd64": [
+          "go1.22.0.solaris-amd64.tar.gz",
+          "a6c12651768d3a74f16104502b4b7bef513ea6b646d99990a28d934c261d1689"
+        ],
+        "windows_386": [
+          "go1.22.0.windows-386.zip",
+          "553d44928509965cbda02a45b35ab01cf8b925534bc526a34e2d9dc7794b57e8"
+        ],
+        "windows_amd64": [
+          "go1.22.0.windows-amd64.zip",
+          "78b3158fe3aa358e0b6c9f26ecd338f9a11441e88bc434ae2e9f0ca2b0cc4dd3"
+        ],
+        "windows_arm64": [
+          "go1.22.0.windows-arm64.zip",
+          "31a61e41d06a3bb2189a303f5f3e777ca4b454eff439f0a67bc2b166330021f4"
+        ],
+        "windows_armv6l": [
+          "go1.22.0.windows-arm.zip",
+          "495c7dfaea4e2bf48643662bb622e4ce6378d6d9840015238ad4b8792b99ddbf"
+        ]
+      },
+      "1.22.4": {
+        "aix_ppc64": [
+          "go1.22.4.aix-ppc64.tar.gz",
+          "b9647fa9fc83a0cc5d4f092a19eaeaecf45f063a5aa7d4962fde65aeb7ae6ce1"
+        ],
+        "darwin_amd64": [
+          "go1.22.4.darwin-amd64.tar.gz",
+          "c95967f50aa4ace34af0c236cbdb49a9a3e80ee2ad09d85775cb4462a5c19ed3"
+        ],
+        "darwin_arm64": [
+          "go1.22.4.darwin-arm64.tar.gz",
+          "242b78dc4c8f3d5435d28a0d2cec9b4c1aa999b601fb8aa59fb4e5a1364bf827"
+        ],
+        "dragonfly_amd64": [
+          "go1.22.4.dragonfly-amd64.tar.gz",
+          "f2fbb51af4719d3616efb482d6ed2b96579b474156f85a7ddc6f126764feec4b"
+        ],
+        "freebsd_386": [
+          "go1.22.4.freebsd-386.tar.gz",
+          "7c54884bb9f274884651d41e61d1bc12738863ad1497e97ea19ad0e9aa6bf7b5"
+        ],
+        "freebsd_amd64": [
+          "go1.22.4.freebsd-amd64.tar.gz",
+          "88d44500e1701dd35797619774d6dd51bf60f45a8338b0a82ddc018e4e63fb78"
+        ],
+        "freebsd_arm64": [
+          "go1.22.4.freebsd-arm64.tar.gz",
+          "726dc093cf020277be45debf03c3b02b43c2efb3e2a5d4fba8f52579d65327dc"
+        ],
+        "freebsd_armv6l": [
+          "go1.22.4.freebsd-arm.tar.gz",
+          "3d9efe47db142a22679aba46b1772e3900b0d87ae13bd2b3bc80dbf2ac0b2cd6"
+        ],
+        "freebsd_riscv64": [
+          "go1.22.4.freebsd-riscv64.tar.gz",
+          "5f6b67e5e32f1d6ccb2d4dcb44934a5e2e870a877ba7443d86ec43cfc28afa71"
+        ],
+        "illumos_amd64": [
+          "go1.22.4.illumos-amd64.tar.gz",
+          "d56ecc2f85b6418a21ef83879594d0c42ab4f65391a676bb12254870e6690d63"
+        ],
+        "linux_386": [
+          "go1.22.4.linux-386.tar.gz",
+          "47a2a8d249a91eb8605c33bceec63aedda0441a43eac47b4721e3975ff916cec"
+        ],
+        "linux_amd64": [
+          "go1.22.4.linux-amd64.tar.gz",
+          "ba79d4526102575196273416239cca418a651e049c2b099f3159db85e7bade7d"
+        ],
+        "linux_arm64": [
+          "go1.22.4.linux-arm64.tar.gz",
+          "a8e177c354d2e4a1b61020aca3562e27ea3e8f8247eca3170e3fa1e0c2f9e771"
+        ],
+        "linux_armv6l": [
+          "go1.22.4.linux-armv6l.tar.gz",
+          "e2b143fbacbc9cbd448e9ef41ac3981f0488ce849af1cf37e2341d09670661de"
+        ],
+        "linux_loong64": [
+          "go1.22.4.linux-loong64.tar.gz",
+          "e2ff9436e4b34bf6926b06d97916e26d67a909a2effec17967245900f0816f1d"
+        ],
+        "linux_mips": [
+          "go1.22.4.linux-mips.tar.gz",
+          "73f0dcc60458c4770593b05a7bc01cc0d31fc98f948c0c2334812c7a1f2fc3f1"
+        ],
+        "linux_mips64": [
+          "go1.22.4.linux-mips64.tar.gz",
+          "417af97fc2630a647052375768be4c38adcc5af946352ea5b28613ea81ca5d45"
+        ],
+        "linux_mips64le": [
+          "go1.22.4.linux-mips64le.tar.gz",
+          "7486e2d7dd8c98eb44df815ace35a7fe7f30b7c02326e3741bd934077508139b"
+        ],
+        "linux_mipsle": [
+          "go1.22.4.linux-mipsle.tar.gz",
+          "69479c8aad301e459a8365b40cad1074a0dbba5defb9291669f94809c4c4be6e"
+        ],
+        "linux_ppc64": [
+          "go1.22.4.linux-ppc64.tar.gz",
+          "dd238847e65bc3e2745caca475a5db6522a2fcf85cf6c38fc36a06642b19efd7"
+        ],
+        "linux_ppc64le": [
+          "go1.22.4.linux-ppc64le.tar.gz",
+          "a3e5834657ef92523f570f798fed42f1f87bc18222a16815ec76b84169649ec4"
+        ],
+        "linux_riscv64": [
+          "go1.22.4.linux-riscv64.tar.gz",
+          "56a827ff7dc6245bcd7a1e9288dffaa1d8b0fd7468562264c1523daf3b4f1b4a"
+        ],
+        "linux_s390x": [
+          "go1.22.4.linux-s390x.tar.gz",
+          "7590c3e278e2dc6040aae0a39da3ca1eb2e3921673a7304cc34d588c45889eec"
+        ],
+        "netbsd_386": [
+          "go1.22.4.netbsd-386.tar.gz",
+          "ddd2eebe34471a2502de6c5dad04ab27c9fc80cbde7a9ad5b3c66ecec4504e1d"
+        ],
+        "netbsd_amd64": [
+          "go1.22.4.netbsd-amd64.tar.gz",
+          "33af79f6f935f6fbacc5d23876450b3567b79348fc065beef8e64081127dd234"
+        ],
+        "netbsd_arm64": [
+          "go1.22.4.netbsd-arm64.tar.gz",
+          "c9a2971dec9f6d320c6f2b049b2353c6d0a2d35e87b8a4b2d78a2f0d62545f8e"
+        ],
+        "netbsd_armv6l": [
+          "go1.22.4.netbsd-arm.tar.gz",
+          "fa3550ebd5375a70b3bcd342b5a71f4bd271dcbbfaf4eabefa2144ab5d8924b6"
+        ],
+        "openbsd_386": [
+          "go1.22.4.openbsd-386.tar.gz",
+          "d21af022331bfdc2b5b161d616c3a1a4573d33cf7a30416ee509a8f3641deb47"
+        ],
+        "openbsd_amd64": [
+          "go1.22.4.openbsd-amd64.tar.gz",
+          "72c0094c43f7e5722ec49c2a3e9dfa7a1123ac43a5f3a63eecf3e3795d3ff0ae"
+        ],
+        "openbsd_arm64": [
+          "go1.22.4.openbsd-arm64.tar.gz",
+          "a7ab8d4e0b02bf06ed144ba42c61c0e93ee00f2b433415dfd4ad4b6e79f31650"
+        ],
+        "openbsd_armv6l": [
+          "go1.22.4.openbsd-arm.tar.gz",
+          "1096831ea3c5ea3ca57d14251d9eda3786889531eb40d7d6775dcaa324d4b065"
+        ],
+        "openbsd_ppc64": [
+          "go1.22.4.openbsd-ppc64.tar.gz",
+          "9716327c8a628358798898dc5148c49dbbeb5196bf2cbf088e550721a6e4f60b"
+        ],
+        "plan9_386": [
+          "go1.22.4.plan9-386.tar.gz",
+          "a8dd4503c95c32a502a616ab78870a19889c9325fe9bd31eb16dd69346e4bfa8"
+        ],
+        "plan9_amd64": [
+          "go1.22.4.plan9-amd64.tar.gz",
+          "5423a25808d76fe5aca8607a2e5ac5673abf45446b168cb5e9d8519ee9fe39a1"
+        ],
+        "plan9_armv6l": [
+          "go1.22.4.plan9-arm.tar.gz",
+          "6af939ad583f5c85c09c53728ab7d38c3cc2b39167562d6c18a07c5c6608b370"
+        ],
+        "solaris_amd64": [
+          "go1.22.4.solaris-amd64.tar.gz",
+          "e8cabe69c03085725afdb32a6f9998191a3e55a747b270d835fd05000d56abba"
+        ],
+        "windows_386": [
+          "go1.22.4.windows-386.zip",
+          "aca4e2c37278a10f1c70dd0df142f7d66b50334fcee48978d409202d308d6d25"
+        ],
+        "windows_amd64": [
+          "go1.22.4.windows-amd64.zip",
+          "26321c4d945a0035d8a5bc4a1965b0df401ff8ceac66ce2daadabf9030419a98"
+        ],
+        "windows_arm64": [
+          "go1.22.4.windows-arm64.zip",
+          "8a2daa9ea28cbdafddc6171aefed384f4e5b6e714fb52116fe9ed25a132f37ed"
+        ],
+        "windows_armv6l": [
+          "go1.22.4.windows-arm.zip",
+          "5fcd0671a49cecf39b41021621ee1b6e7aa1370f37122b72e80d4fd4185833b6"
+        ]
+      },
+      "1.24.0": {
+        "aix_ppc64": [
+          "go1.24.0.aix-ppc64.tar.gz",
+          "5d04588154d5923bd8e26b76111806340ec55c41af1b05623ea744fcb3d6bc22"
+        ],
+        "darwin_amd64": [
+          "go1.24.0.darwin-amd64.tar.gz",
+          "7af054e5088b68c24b3d6e135e5ca8d91bbd5a05cb7f7f0187367b3e6e9e05ee"
+        ],
+        "darwin_arm64": [
+          "go1.24.0.darwin-arm64.tar.gz",
+          "fd9cfb5dd6c75a347cfc641a253f0db1cebaca16b0dd37965351c6184ba595e4"
+        ],
+        "dragonfly_amd64": [
+          "go1.24.0.dragonfly-amd64.tar.gz",
+          "d0dc34ad86aea746abe245994c68a9e1ad8f46ba8c4af901cd5861a4dd4c21df"
+        ],
+        "freebsd_386": [
+          "go1.24.0.freebsd-386.tar.gz",
+          "4ee02b1f3812aff4da79c79464ee4038ca61ad74b3a9619850f30435f81c2536"
+        ],
+        "freebsd_amd64": [
+          "go1.24.0.freebsd-amd64.tar.gz",
+          "838191001f9324da904dece35a586a3156d548687db87ac9461aa3d38fc88b09"
+        ],
+        "freebsd_arm": [
+          "go1.24.0.freebsd-arm.tar.gz",
+          "ce6ad4e84a40a8a1d848b7e31b0cddfd1cee8f7959e7dc358a8fa8b5566ea718"
+        ],
+        "freebsd_arm64": [
+          "go1.24.0.freebsd-arm64.tar.gz",
+          "511f7b0cac4c4ed1066d324072ce223b906ad6b2a85f2e1c5d260eb7d08b5901"
+        ],
+        "freebsd_riscv64": [
+          "go1.24.0.freebsd-riscv64.tar.gz",
+          "a1e4072630dc589a2975ef51317b52c7d8599bf6f389fc59033c01e0a0fa705a"
+        ],
+        "illumos_amd64": [
+          "go1.24.0.illumos-amd64.tar.gz",
+          "7593e9dcee9f07c3df6d099f7d259f5734a6c0dccc5f28962f18e7f501c9bb21"
+        ],
+        "linux_386": [
+          "go1.24.0.linux-386.tar.gz",
+          "90521453a59c6ce20364d2dc7c38532949b033b602ba12d782caeb90af1b0624"
+        ],
+        "linux_amd64": [
+          "go1.24.0.linux-amd64.tar.gz",
+          "dea9ca38a0b852a74e81c26134671af7c0fbe65d81b0dc1c5bfe22cf7d4c8858"
+        ],
+        "linux_arm64": [
+          "go1.24.0.linux-arm64.tar.gz",
+          "c3fa6d16ffa261091a5617145553c71d21435ce547e44cc6dfb7470865527cc7"
+        ],
+        "linux_armv6l": [
+          "go1.24.0.linux-armv6l.tar.gz",
+          "695dc54fa14cd3124fa6900d7b5ae39eeac23f7a4ecea81656070160fac2c54a"
+        ],
+        "linux_loong64": [
+          "go1.24.0.linux-loong64.tar.gz",
+          "a201e4c9b7e6d29ed64c43296ed88e81a66f82f2093ce45b766d2c526941396f"
+        ],
+        "linux_mips": [
+          "go1.24.0.linux-mips.tar.gz",
+          "f3ac039aae78ad0bfb08106406c2e62eaf763dd82ebaf0ecd539adadd1d729a6"
+        ],
+        "linux_mips64": [
+          "go1.24.0.linux-mips64.tar.gz",
+          "f2e6456d45e024831b1da8d88b1bb6392cca9500c1b00841f525d76c9e9553e0"
+        ],
+        "linux_mips64le": [
+          "go1.24.0.linux-mips64le.tar.gz",
+          "b847893ff119389c939adc2b8516b6500204b7cb49d5e19b25e1c2091d2c74c6"
+        ],
+        "linux_mipsle": [
+          "go1.24.0.linux-mipsle.tar.gz",
+          "bd4aed27d02746c237c3921e97029ac6b6fe687a67436b8f52ff1f698d330bd9"
+        ],
+        "linux_ppc64": [
+          "go1.24.0.linux-ppc64.tar.gz",
+          "007123c9b06c41729a4bb3f166f4df7196adf4e33c2d2ab0e7e990175f0ce1d4"
+        ],
+        "linux_ppc64le": [
+          "go1.24.0.linux-ppc64le.tar.gz",
+          "a871a43de7d26c91dd90cb6e0adacb214c9e35ee2188c617c91c08c017efe81a"
+        ],
+        "linux_riscv64": [
+          "go1.24.0.linux-riscv64.tar.gz",
+          "620dcf48c6297519aad6c81f8e344926dc0ab09a2a79f1e306964aece95a553d"
+        ],
+        "linux_s390x": [
+          "go1.24.0.linux-s390x.tar.gz",
+          "544d78b077c6b54bf78958c4a8285abec2d21f668fb007261c77418cd2edbb46"
+        ],
+        "netbsd_386": [
+          "go1.24.0.netbsd-386.tar.gz",
+          "8b143a7edefbaa2a0b0246c9df2df1bac9fbed909d8615a375c08da7744e697d"
+        ],
+        "netbsd_amd64": [
+          "go1.24.0.netbsd-amd64.tar.gz",
+          "67150a6dd7bdb9c4e88d77f46ee8c4dc99d5e71deca4912d8c2c85f7a16d0262"
+        ],
+        "netbsd_arm": [
+          "go1.24.0.netbsd-arm.tar.gz",
+          "446b2539f11218fd6f6f6e3dd90b20ae55a06afe129885eeb3df51eb344eb0f6"
+        ],
+        "netbsd_arm64": [
+          "go1.24.0.netbsd-arm64.tar.gz",
+          "370115b6ff7d30b29431223de348eb11ab65e3c92627532d97fd55f63f94e7a8"
+        ],
+        "openbsd_386": [
+          "go1.24.0.openbsd-386.tar.gz",
+          "cbda5f15f06ed9630f122a53542d9de13d149643633c74f1dcb45e79649b788a"
+        ],
+        "openbsd_amd64": [
+          "go1.24.0.openbsd-amd64.tar.gz",
+          "926f601d0e655ab1e8d7f357fd82542e5cf206c38c4e2f9fccf0706987d38836"
+        ],
+        "openbsd_arm": [
+          "go1.24.0.openbsd-arm.tar.gz",
+          "8a54892f8c933c541fff144a825d0fdc41bae14b0832aab703cb75eb4cb64f2c"
+        ],
+        "openbsd_arm64": [
+          "go1.24.0.openbsd-arm64.tar.gz",
+          "ef7fddcef0a22c7900c178b7687cf5aa25c2a9d46a3cc330b77a6de6e6c2396b"
+        ],
+        "openbsd_ppc64": [
+          "go1.24.0.openbsd-ppc64.tar.gz",
+          "b3b5e2e2b53489ded2c2c21900ddcbbdb7991632bb5b42f05f125d71675e0b76"
+        ],
+        "openbsd_riscv64": [
+          "go1.24.0.openbsd-riscv64.tar.gz",
+          "fbcb1dbf1269b4079dc4fd0b15f3274b9d635f1a7e319c3fc1a907b03280348e"
+        ],
+        "plan9_386": [
+          "go1.24.0.plan9-386.tar.gz",
+          "33b4221e1c174a16e3f661deab6c60838ac4ae6cb869a4da1d1115773ceed88b"
+        ],
+        "plan9_amd64": [
+          "go1.24.0.plan9-amd64.tar.gz",
+          "111a89014019cdbd69c2978de9b3e201f77e35183c8ab3606fba339d38f28549"
+        ],
+        "plan9_arm": [
+          "go1.24.0.plan9-arm.tar.gz",
+          "8da3d3997049f40ebe0cd336a9bb9e4bfa4832df3c90a32f07383371d6d74849"
+        ],
+        "solaris_amd64": [
+          "go1.24.0.solaris-amd64.tar.gz",
+          "b6069da21dc95ccdbd047675b584e5480ffc3eba35f9e7c8b0e7b317aaf01e2c"
+        ],
+        "windows_386": [
+          "go1.24.0.windows-386.zip",
+          "b53c28a4c2863ec50ab4a1dbebe818ef6177f86773b6f43475d40a5d9aa4ec9e"
+        ],
+        "windows_amd64": [
+          "go1.24.0.windows-amd64.zip",
+          "96b7280979205813759ee6947be7e3bb497da85c482711116c00522e3bb41ff1"
+        ],
+        "windows_arm64": [
+          "go1.24.0.windows-arm64.zip",
+          "53f73450fb66075d16be9f206e9177bd972b528168271918c4747903b5596c3d"
+        ]
+      },
+      "1.25.0": {
+        "aix_ppc64": [
+          "go1.25.0.aix-ppc64.tar.gz",
+          "e5234a7dac67bc86c528fe9752fc9d63557918627707a733ab4cac1a6faed2d4"
+        ],
+        "darwin_amd64": [
+          "go1.25.0.darwin-amd64.tar.gz",
+          "5bd60e823037062c2307c71e8111809865116714d6f6b410597cf5075dfd80ef"
+        ],
+        "darwin_arm64": [
+          "go1.25.0.darwin-arm64.tar.gz",
+          "544932844156d8172f7a28f77f2ac9c15a23046698b6243f633b0a0b00c0749c"
+        ],
+        "dragonfly_amd64": [
+          "go1.25.0.dragonfly-amd64.tar.gz",
+          "5ed3cf9a810a1483822538674f1336c06b51aa1b94d6d545a1a0319a48177120"
+        ],
+        "freebsd_386": [
+          "go1.25.0.freebsd-386.tar.gz",
+          "abea5d5c6697e6b5c224731f2158fe87c602996a2a233ac0c4730cd57bf8374e"
+        ],
+        "freebsd_amd64": [
+          "go1.25.0.freebsd-amd64.tar.gz",
+          "86e6fe0a29698d7601c4442052dac48bd58d532c51cccb8f1917df648138730b"
+        ],
+        "freebsd_arm": [
+          "go1.25.0.freebsd-arm.tar.gz",
+          "d90b78e41921f72f30e8bbc81d9dec2cff7ff384a33d8d8debb24053e4336bfe"
+        ],
+        "freebsd_arm64": [
+          "go1.25.0.freebsd-arm64.tar.gz",
+          "451d0da1affd886bfb291b7c63a6018527b269505db21ce6e14724f22ab0662e"
+        ],
+        "freebsd_riscv64": [
+          "go1.25.0.freebsd-riscv64.tar.gz",
+          "7b565f76bd8bda46549eeaaefe0e53b251e644c230577290c0f66b1ecdb3cdbe"
+        ],
+        "illumos_amd64": [
+          "go1.25.0.illumos-amd64.tar.gz",
+          "b1e1fdaab1ad25aa1c08d7a36c97d45d74b98b89c3f78c6d2145f77face54a2c"
+        ],
+        "linux_386": [
+          "go1.25.0.linux-386.tar.gz",
+          "8c602dd9d99bc9453b3995d20ce4baf382cc50855900a0ece5de9929df4a993a"
+        ],
+        "linux_amd64": [
+          "go1.25.0.linux-amd64.tar.gz",
+          "2852af0cb20a13139b3448992e69b868e50ed0f8a1e5940ee1de9e19a123b613"
+        ],
+        "linux_arm64": [
+          "go1.25.0.linux-arm64.tar.gz",
+          "05de75d6994a2783699815ee553bd5a9327d8b79991de36e38b66862782f54ae"
+        ],
+        "linux_armv6l": [
+          "go1.25.0.linux-armv6l.tar.gz",
+          "a5a8f8198fcf00e1e485b8ecef9ee020778bf32a408a4e8873371bfce458cd09"
+        ],
+        "linux_loong64": [
+          "go1.25.0.linux-loong64.tar.gz",
+          "cab86b1cf761b1cb3bac86a8877cfc92e7b036fc0d3084123d77013d61432afc"
+        ],
+        "linux_mips": [
+          "go1.25.0.linux-mips.tar.gz",
+          "d66b6fb74c3d91b9829dc95ec10ca1f047ef5e89332152f92e136cf0e2da5be1"
+        ],
+        "linux_mips64": [
+          "go1.25.0.linux-mips64.tar.gz",
+          "4082e4381a8661bc2a839ff94ba3daf4f6cde20f8fb771b5b3d4762dc84198a2"
+        ],
+        "linux_mips64le": [
+          "go1.25.0.linux-mips64le.tar.gz",
+          "70002c299ec7f7175ac2ef673b1b347eecfa54ae11f34416a6053c17f855afcc"
+        ],
+        "linux_mipsle": [
+          "go1.25.0.linux-mipsle.tar.gz",
+          "b00a3a39eff099f6df9f1c7355bf28e4589d0586f42d7d4a394efb763d145a73"
+        ],
+        "linux_ppc64": [
+          "go1.25.0.linux-ppc64.tar.gz",
+          "df166f33bd98160662560a72ff0b4ba731f969a80f088922bddcf566a88c1ec1"
+        ],
+        "linux_ppc64le": [
+          "go1.25.0.linux-ppc64le.tar.gz",
+          "0f18a89e7576cf2c5fa0b487a1635d9bcbf843df5f110e9982c64df52a983ad0"
+        ],
+        "linux_riscv64": [
+          "go1.25.0.linux-riscv64.tar.gz",
+          "c018ff74a2c48d55c8ca9b07c8e24163558ffec8bea08b326d6336905d956b67"
+        ],
+        "linux_s390x": [
+          "go1.25.0.linux-s390x.tar.gz",
+          "34e5a2e19f2292fbaf8783e3a241e6e49689276aef6510a8060ea5ef54eee408"
+        ],
+        "netbsd_386": [
+          "go1.25.0.netbsd-386.tar.gz",
+          "f8586cdb7aa855657609a5c5f6dbf523efa00c2bbd7c76d3936bec80aa6c0aba"
+        ],
+        "netbsd_amd64": [
+          "go1.25.0.netbsd-amd64.tar.gz",
+          "ae8dc1469385b86a157a423bb56304ba45730de8a897615874f57dd096db2c2a"
+        ],
+        "netbsd_arm": [
+          "go1.25.0.netbsd-arm.tar.gz",
+          "1ff7e4cc764425fc9dd6825eaee79d02b3c7cafffbb3691687c8d672ade76cb7"
+        ],
+        "netbsd_arm64": [
+          "go1.25.0.netbsd-arm64.tar.gz",
+          "e1b310739f26724216aa6d7d7208c4031f9ff54c9b5b9a796ddc8bebcb4a5f16"
+        ],
+        "openbsd_386": [
+          "go1.25.0.openbsd-386.tar.gz",
+          "4802a9b20e533da91adb84aab42e94aa56cfe3e5475d0550bed3385b182e69d8"
+        ],
+        "openbsd_amd64": [
+          "go1.25.0.openbsd-amd64.tar.gz",
+          "c016cd984bebe317b19a4f297c4f50def120dc9788490540c89f28e42f1dabe1"
+        ],
+        "openbsd_arm": [
+          "go1.25.0.openbsd-arm.tar.gz",
+          "a1e31d0bf22172ddde42edf5ec811ef81be43433df0948ece52fecb247ccfd8d"
+        ],
+        "openbsd_arm64": [
+          "go1.25.0.openbsd-arm64.tar.gz",
+          "343ea8edd8c218196e15a859c6072d0dd3246fbbb168481ab665eb4c4140458d"
+        ],
+        "openbsd_ppc64": [
+          "go1.25.0.openbsd-ppc64.tar.gz",
+          "694c14da1bcaeb5e3332d49bdc2b6d155067648f8fe1540c5de8f3cf8e157154"
+        ],
+        "openbsd_riscv64": [
+          "go1.25.0.openbsd-riscv64.tar.gz",
+          "aa510ad25cf54c06cd9c70b6d80ded69cb20188ac6e1735655eef29ff7e7885f"
+        ],
+        "plan9_386": [
+          "go1.25.0.plan9-386.tar.gz",
+          "46f8cef02086cf04bf186c5912776b56535178d4cb319cd19c9fdbdd29231986"
+        ],
+        "plan9_amd64": [
+          "go1.25.0.plan9-amd64.tar.gz",
+          "29b34391d84095e44608a228f63f2f88113a37b74a79781353ec043dfbcb427b"
+        ],
+        "plan9_arm": [
+          "go1.25.0.plan9-arm.tar.gz",
+          "0a047107d13ebe7943aaa6d54b1d7bbd2e45e68ce449b52915a818da715799c2"
+        ],
+        "solaris_amd64": [
+          "go1.25.0.solaris-amd64.tar.gz",
+          "9977f9e4351984364a3b2b78f8b88bfd1d339812356d5237678514594b7d3611"
+        ],
+        "windows_386": [
+          "go1.25.0.windows-386.zip",
+          "df9f39db82a803af0db639e3613a36681ab7a42866b1384b3f3a1045663961a7"
+        ],
+        "windows_amd64": [
+          "go1.25.0.windows-amd64.zip",
+          "89efb4f9b30812eee083cc1770fdd2913c14d301064f6454851428f9707d190b"
+        ],
+        "windows_arm64": [
+          "go1.25.0.windows-arm64.zip",
+          "27bab004c72b3d7bd05a69b6ec0fc54a309b4b78cc569dd963d8b3ec28bfdb8c"
+        ]
+      }
+    }
+  }
 }

From 346704410622c0863cbb5cf04a1578f426cf797e Mon Sep 17 00:00:00 2001
From: Anton Krivoborodov 
Date: Fri, 30 Oct 2026 07:33:59 +0000
Subject: [PATCH 13/31] config_management: patch to persistency's score/kvs
 headers and enum builder API

Since the persistency bump (cb89c10/3193244) //score/kvs no longer exports its
headers under a bare include path, so config_management's
'#include "kvs.hpp"' fails in every image build ("kvs.hpp: No such file or
directory"). Persistency main also replaced the bool builder flags with
enums.

patches/config_management/003:
- include score/kvs/kvs.h, kvs_builder.h, kvs_value.h; depend on
  @score_persistency//score/kvs instead of the deprecated //:kvs_cpp alias
- move the unit-test KVS stub headers to score_kvs_stub/score/kvs/ so the same
  includes resolve to the stub in the unit-test variant
- KvsBuilder: need_defaults_flag(false)/need_kvs_flag(false)/dir() ->
  Defaults(kOptional)/KvsLoad(kOptional)/WorkingDir() (same semantics); the
  stub mirrors the new API

Should be fixed upstream in eclipse-score/config_management.
---
 .../score_modules_target_sw.MODULE.bazel      |   1 +
 known_good.json                               |   3 +-
 .../003-migrate-to-persistency-kvs-api.patch  | 555 ++++++++++++++++++
 3 files changed, 558 insertions(+), 1 deletion(-)
 create mode 100644 patches/config_management/003-migrate-to-persistency-kvs-api.patch

diff --git a/bazel_common/score_modules_target_sw.MODULE.bazel b/bazel_common/score_modules_target_sw.MODULE.bazel
index 86f102f43e0..7613b01155c 100644
--- a/bazel_common/score_modules_target_sw.MODULE.bazel
+++ b/bazel_common/score_modules_target_sw.MODULE.bazel
@@ -101,6 +101,7 @@ git_override(
     patches = [
         "//patches/config_management:001-adapt-proxy-api-and-remove-internal-targets.patch",
         "//patches/config_management:002-migrate-baselibs-targets.patch",
+        "//patches/config_management:003-migrate-to-persistency-kvs-api.patch",
     ],
     remote = "https://github.com/eclipse-score/config_management.git",
 )
diff --git a/known_good.json b/known_good.json
index 8dc18e64d8d..94ce64f299b 100644
--- a/known_good.json
+++ b/known_good.json
@@ -226,7 +226,8 @@
                 "hash": "d0dab01ae408ceb8ec65344e93d8a51d8173da81",
                 "bazel_patches": [
                     "//patches/config_management:001-adapt-proxy-api-and-remove-internal-targets.patch",
-                    "//patches/config_management:002-migrate-baselibs-targets.patch"
+                    "//patches/config_management:002-migrate-baselibs-targets.patch",
+                    "//patches/config_management:003-migrate-to-persistency-kvs-api.patch"
                 ],
                 "metadata": {
                     "code_root_path": "//score/config_management/...",
diff --git a/patches/config_management/003-migrate-to-persistency-kvs-api.patch b/patches/config_management/003-migrate-to-persistency-kvs-api.patch
new file mode 100644
index 00000000000..995fe19a0a8
--- /dev/null
+++ b/patches/config_management/003-migrate-to-persistency-kvs-api.patch
@@ -0,0 +1,555 @@
+diff --git a/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/BUILD b/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/BUILD
+--- a/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/BUILD
++++ b/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/BUILD
+@@ -48,7 +48,7 @@ COMMON_FEATURES = [
+             "details_score",
+             False,
+             [
+-                "@score_persistency//:kvs_cpp",
++                "@score_persistency//score/kvs",
+             ],
+         ),
+         (
+diff --git a/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/parameter_set_storage_score_impl.cpp b/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/parameter_set_storage_score_impl.cpp
+--- a/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/parameter_set_storage_score_impl.cpp
++++ b/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/parameter_set_storage_score_impl.cpp
+@@ -16,7 +16,7 @@
+ #include "score/config_management/config_daemon/code/data_model/parameter_set_storage/error/parameter_set_storage_error.h"
+ #include "score/config_management/config_daemon/code/data_model/parameterset_collection.h"
+ 
+-#include "kvsvalue.hpp"
++#include "score/kvs/kvs_value.h"
+ #include "score/json/json_writer.h"
+ #include "score/hash/code/common/algorithms.h"
+ #include "score/hash/code/core/factory/impl/safe_hash_calculator_factory.h"
+diff --git a/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/parameter_set_storage_score_impl.h b/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/parameter_set_storage_score_impl.h
+--- a/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/parameter_set_storage_score_impl.h
++++ b/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/parameter_set_storage_score_impl.h
+@@ -16,7 +16,7 @@
+ 
+ #include "score/config_management/config_daemon/code/data_model/parameter_set_storage/parameter_set_storage.h"
+ 
+-#include "kvs.hpp"
++#include "score/kvs/kvs.h"
+ 
+ #include 
+ #include 
+diff --git a/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/score_kvs_stub/BUILD b/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/score_kvs_stub/BUILD
+--- a/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/score_kvs_stub/BUILD
++++ b/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/score_kvs_stub/BUILD
+@@ -13,23 +13,23 @@
+ 
+ load("@rules_cc//cc:defs.bzl", "cc_library")
+ 
+-# Stub replacements for score-persistency headers (kvs.hpp / kvsbuilder.hpp / kvsvalue.hpp).
++# Stub replacements for score-persistency headers (score/kvs/kvs.h / kvs_builder.h / kvs_value.h).
+ # Used when compiling score-variant source files (e.g. factory_mw_impl.cpp,
+ # parameter_set_storage_score_impl.cpp) under the SPP toolchain where the real
+ # score-baselibs / score-persistency headers would cause namespace clashes.
+ #
+ # The stubs expose exactly the same types and method signatures used by those files
+ # but have no real implementation — every operation is a no-op / returns failure.
+-# On the actual score build, the real @score-persistency//:kvs_cpp is used instead.
++# On the actual score build, the real @score_persistency//score/kvs is used instead.
+ cc_library(
+     name = "score_kvs_stub",
+     hdrs = [
+-        "kvs.hpp",
+-        "kvsbuilder.hpp",
+-        "kvsvalue.hpp",
++        "score/kvs/kvs.h",
++        "score/kvs/kvs_builder.h",
++        "score/kvs/kvs_value.h",
+     ],
+     # Expose the directory itself as a system include path so that
+-    # `#include "kvs.hpp"` resolves here, mirroring how score-persistency does it.
++    # `#include "score/kvs/kvs.h"` resolves here, mirroring score-persistency's header paths.
+     includes = ["."],
+     tags = ["FUSA"],
+     visibility = [
+diff --git a/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/score_kvs_stub/kvs.hpp b/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/score_kvs_stub/kvs.hpp
+deleted file mode 100644
+--- a/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/score_kvs_stub/kvs.hpp
++++ /dev/null
+@@ -1,69 +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
+-// *******************************************************************************
+-
+-#ifndef SCORE_LIB_KVS_KVS_HPP
+-#define SCORE_LIB_KVS_KVS_HPP
+-
+-#include "kvsvalue.hpp"
+-
+-#include "score/config_management/config_daemon/code/data_model/parameter_set_storage/error/parameter_set_storage_error.h"
+-
+-#include 
+-#include 
+-
+-namespace score::mw::per::kvs
+-{
+-
+-struct InstanceId
+-{
+-    explicit InstanceId(std::size_t id) : id{id} {}
+-    std::size_t id{0U};
+-};
+-
+-// Stub for score-persistency's Kvs. Concrete so make_unique(unique_ptr) in
+-// factory_mw_impl.cpp compiles. MockKvs subclasses and overrides the virtual methods for tests.
+-class Kvs
+-{
+-  public:
+-    Kvs() = default;
+-    // Accepts a unique_ptr to match the real score-persistency API used in factory_mw_impl.cpp.
+-    explicit Kvs(std::unique_ptr /*inner*/) noexcept {}
+-    virtual ~Kvs() = default;
+-    Kvs(const Kvs&) = delete;
+-    Kvs& operator=(const Kvs&) = delete;
+-    Kvs(Kvs&&) noexcept = delete;
+-    Kvs& operator=(Kvs&&) noexcept = delete;
+-
+-    // NOLINTBEGIN(readability-identifier-naming)
+-    virtual score::Result get_value(std::string_view /*key*/) noexcept
+-    {
+-        return score::MakeUnexpected(
+-            score::MakeUnexpected(::score::config_management::config_daemon::data_model::ParameterSetStorageError::kDataNotFound)
+-                .error());
+-    }
+-    virtual score::Result set_value(std::string_view /*key*/, const KvsValue& /*value*/) noexcept
+-    {
+-        return score::MakeUnexpected(
+-            ::score::config_management::config_daemon::data_model::ParameterSetStorageError::kUnableToSaveToPersistency);
+-    }
+-    virtual score::Result flush() noexcept
+-    {
+-        return score::MakeUnexpected(
+-            ::score::config_management::config_daemon::data_model::ParameterSetStorageError::kUnableToSaveToPersistency);
+-    }
+-    // NOLINTEND(readability-identifier-naming)
+-};
+-
+-}  // namespace score::mw::per::kvs
+-
+-#endif  // SCORE_LIB_KVS_KVS_HPP
+diff --git a/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/score_kvs_stub/kvs_mock.hpp b/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/score_kvs_stub/kvs_mock.hpp
+--- a/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/score_kvs_stub/kvs_mock.hpp
++++ b/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/score_kvs_stub/kvs_mock.hpp
+@@ -14,7 +14,7 @@
+ #ifndef SCORE_CONFIG_MANAGEMENT_CONFIG_DAEMON_CODE_PARAMETER_SET_STORAGE_DETAILS_SCORE_KVS_STUB_KVS_MOCK_HPP
+ #define SCORE_CONFIG_MANAGEMENT_CONFIG_DAEMON_CODE_PARAMETER_SET_STORAGE_DETAILS_SCORE_KVS_STUB_KVS_MOCK_HPP
+ 
+-#include "kvs.hpp"
++#include "score/kvs/kvs.h"
+ 
+ #include 
+ 
+diff --git a/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/score_kvs_stub/kvsbuilder.hpp b/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/score_kvs_stub/kvsbuilder.hpp
+deleted file mode 100644
+--- a/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/score_kvs_stub/kvsbuilder.hpp
++++ /dev/null
+@@ -1,55 +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
+-// *******************************************************************************
+-
+-// Stub replacing score-persistency's kvsbuilder.hpp for SPP compilation.
+-// Only the subset of the API used by factory_mw_impl.cpp is provided.
+-
+-#ifndef SCORE_LIB_KVS_KVSBUILDER_HPP
+-#define SCORE_LIB_KVS_KVSBUILDER_HPP
+-
+-#include "kvs.hpp"
+-
+-#include 
+-#include 
+-
+-namespace score::mw::per::kvs
+-{
+-
+-/// @brief Stub KvsBuilder — build() always returns an empty (failure) Result.
+-class KvsBuilder final
+-{
+-  public:
+-    explicit KvsBuilder(const InstanceId& /*instance_id*/) {}
+-
+-    KvsBuilder& need_defaults_flag(bool /*flag*/) noexcept
+-    {
+-        return *this;
+-    }
+-    KvsBuilder& need_kvs_flag(bool /*flag*/) noexcept
+-    {
+-        return *this;
+-    }
+-    KvsBuilder& dir(std::string&& /*dir_path*/) noexcept
+-    {
+-        return *this;
+-    }
+-
+-    score::Result> build() noexcept
+-    {
+-        return score::Result>{std::make_unique()};
+-    }
+-};
+-
+-}  // namespace score::mw::per::kvs
+-
+-#endif  // SCORE_LIB_KVS_KVSBUILDER_HPP
+diff --git a/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/score_kvs_stub/kvsvalue.hpp b/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/score_kvs_stub/kvsvalue.hpp
+deleted file mode 100644
+--- a/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/score_kvs_stub/kvsvalue.hpp
++++ /dev/null
+@@ -1,78 +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
+-// *******************************************************************************
+-
+-#ifndef SCORE_LIB_KVS_KVSVALUE_HPP
+-#define SCORE_LIB_KVS_KVSVALUE_HPP
+-
+-#include "score/result/result.h"
+-
+-#include 
+-#include 
+-#include 
+-#include 
+-#include 
+-
+-namespace score::mw::per::kvs
+-{
+-
+-class KvsValue final
+-{
+-  public:
+-    using Array = std::vector>;
+-    using Object = std::unordered_map>;
+-
+-    // NOLINTBEGIN(readability-identifier-naming) — enum constants mirror real score-persistency KvsValue::Type
+-    enum class Type
+-    {
+-        i32,
+-        u32,
+-        i64,
+-        u64,
+-        f64,
+-        Boolean,
+-        String,
+-        Null,
+-        Array,
+-        Object
+-    };
+-    // NOLINTEND(readability-identifier-naming)
+-
+-    explicit KvsValue(const std::string& str) : value_{str}, type_{Type::String} {}
+-    explicit KvsValue(std::string&& str) : value_{std::move(str)}, type_{Type::String} {}
+-    explicit KvsValue(Type type) : value_{std::string{}}, type_{type} {}
+-
+-    KvsValue(const KvsValue&) = default;
+-    KvsValue& operator=(const KvsValue&) = default;
+-    KvsValue(KvsValue&&) noexcept = default;
+-    KvsValue& operator=(KvsValue&&) noexcept = default;
+-
+-    // NOLINTBEGIN(readability-identifier-naming) — method names mirror real score-persistency KvsValue API
+-    Type getType() const noexcept
+-    {
+-        return type_;
+-    }
+-
+-    const std::variant& getValue() const noexcept
+-    {
+-        return value_;
+-    }
+-    // NOLINTEND(readability-identifier-naming)
+-
+-  private:
+-    std::variant value_;
+-    Type type_{Type::Null};
+-};
+-
+-}  // namespace score::mw::per::kvs
+-
+-#endif  // SCORE_LIB_KVS_KVSVALUE_HPP
+diff --git a/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/score_kvs_stub/score/kvs/kvs.h b/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/score_kvs_stub/score/kvs/kvs.h
+new file mode 100644
+--- /dev/null
++++ b/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/score_kvs_stub/score/kvs/kvs.h
+@@ -0,0 +1,69 @@
++// *******************************************************************************
++// 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
++// *******************************************************************************
++
++#ifndef SCORE_LIB_KVS_KVS_HPP
++#define SCORE_LIB_KVS_KVS_HPP
++
++#include "score/kvs/kvs_value.h"
++
++#include "score/config_management/config_daemon/code/data_model/parameter_set_storage/error/parameter_set_storage_error.h"
++
++#include 
++#include 
++
++namespace score::mw::per::kvs
++{
++
++struct InstanceId
++{
++    explicit InstanceId(std::size_t id) : id{id} {}
++    std::size_t id{0U};
++};
++
++// Stub for score-persistency's Kvs. Concrete so make_unique(unique_ptr) in
++// factory_mw_impl.cpp compiles. MockKvs subclasses and overrides the virtual methods for tests.
++class Kvs
++{
++  public:
++    Kvs() = default;
++    // Accepts a unique_ptr to match the real score-persistency API used in factory_mw_impl.cpp.
++    explicit Kvs(std::unique_ptr /*inner*/) noexcept {}
++    virtual ~Kvs() = default;
++    Kvs(const Kvs&) = delete;
++    Kvs& operator=(const Kvs&) = delete;
++    Kvs(Kvs&&) noexcept = delete;
++    Kvs& operator=(Kvs&&) noexcept = delete;
++
++    // NOLINTBEGIN(readability-identifier-naming)
++    virtual score::Result get_value(std::string_view /*key*/) noexcept
++    {
++        return score::MakeUnexpected(
++            score::MakeUnexpected(::score::config_management::config_daemon::data_model::ParameterSetStorageError::kDataNotFound)
++                .error());
++    }
++    virtual score::Result set_value(std::string_view /*key*/, const KvsValue& /*value*/) noexcept
++    {
++        return score::MakeUnexpected(
++            ::score::config_management::config_daemon::data_model::ParameterSetStorageError::kUnableToSaveToPersistency);
++    }
++    virtual score::Result flush() noexcept
++    {
++        return score::MakeUnexpected(
++            ::score::config_management::config_daemon::data_model::ParameterSetStorageError::kUnableToSaveToPersistency);
++    }
++    // NOLINTEND(readability-identifier-naming)
++};
++
++}  // namespace score::mw::per::kvs
++
++#endif  // SCORE_LIB_KVS_KVS_HPP
+diff --git a/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/score_kvs_stub/score/kvs/kvs_builder.h b/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/score_kvs_stub/score/kvs/kvs_builder.h
+new file mode 100644
+--- /dev/null
++++ b/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/score_kvs_stub/score/kvs/kvs_builder.h
+@@ -0,0 +1,70 @@
++// *******************************************************************************
++// Copyright (c) 2025 Contributors to the Eclipse Foundation
++//
++// See the NOTICE file(s) distributed with this work for additional
++// information regarding copyright ownership.
++//
++// This program and the accompanying materials are made available under the
++// terms of the Apache License Version 2.0 which is available at
++// https://www.apache.org/licenses/LICENSE-2.0
++//
++// SPDX-License-Identifier: Apache-2.0
++// *******************************************************************************
++
++// Stub replacing score-persistency's score/kvs/kvs_builder.h for SPP compilation.
++// Only the subset of the API used by factory_mw_impl.cpp is provided.
++
++#ifndef SCORE_LIB_KVS_KVSBUILDER_HPP
++#define SCORE_LIB_KVS_KVSBUILDER_HPP
++
++#include "score/kvs/kvs.h"
++
++#include 
++#include 
++#include 
++
++namespace score::mw::per::kvs
++{
++
++enum class KvsDefaults : std::uint8_t
++{
++    kRequired = 0,
++    kOptional = 1,
++    kIgnored = 2,
++};
++
++enum class KvsLoad : std::uint8_t
++{
++    kRequired = 0,
++    kOptional = 1,
++    kIgnored = 2,
++};
++
++/// @brief Stub KvsBuilder — build() always returns an empty (failure) Result.
++class KvsBuilder final
++{
++  public:
++    explicit KvsBuilder(const InstanceId& /*instance_id*/) {}
++
++    KvsBuilder& Defaults(const KvsDefaults& /*mode*/) noexcept
++    {
++        return *this;
++    }
++    KvsBuilder& KvsLoad(const score::mw::per::kvs::KvsLoad& /*mode*/) noexcept
++    {
++        return *this;
++    }
++    KvsBuilder& WorkingDir(const std::string& /*working_dir*/) noexcept
++    {
++        return *this;
++    }
++
++    score::Result> build() noexcept
++    {
++        return score::Result>{std::make_unique()};
++    }
++};
++
++}  // namespace score::mw::per::kvs
++
++#endif  // SCORE_LIB_KVS_KVSBUILDER_HPP
+diff --git a/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/score_kvs_stub/score/kvs/kvs_value.h b/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/score_kvs_stub/score/kvs/kvs_value.h
+new file mode 100644
+--- /dev/null
++++ b/score/config_management/config_daemon/code/data_model/parameter_set_storage/details/score_kvs_stub/score/kvs/kvs_value.h
+@@ -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
++// *******************************************************************************
++
++#ifndef SCORE_LIB_KVS_KVSVALUE_HPP
++#define SCORE_LIB_KVS_KVSVALUE_HPP
++
++#include "score/result/result.h"
++
++#include 
++#include 
++#include 
++#include 
++#include 
++
++namespace score::mw::per::kvs
++{
++
++class KvsValue final
++{
++  public:
++    using Array = std::vector>;
++    using Object = std::unordered_map>;
++
++    // NOLINTBEGIN(readability-identifier-naming) — enum constants mirror real score-persistency KvsValue::Type
++    enum class Type
++    {
++        i32,
++        u32,
++        i64,
++        u64,
++        f64,
++        Boolean,
++        String,
++        Null,
++        Array,
++        Object
++    };
++    // NOLINTEND(readability-identifier-naming)
++
++    explicit KvsValue(const std::string& str) : value_{str}, type_{Type::String} {}
++    explicit KvsValue(std::string&& str) : value_{std::move(str)}, type_{Type::String} {}
++    explicit KvsValue(Type type) : value_{std::string{}}, type_{type} {}
++
++    KvsValue(const KvsValue&) = default;
++    KvsValue& operator=(const KvsValue&) = default;
++    KvsValue(KvsValue&&) noexcept = default;
++    KvsValue& operator=(KvsValue&&) noexcept = default;
++
++    // NOLINTBEGIN(readability-identifier-naming) — method names mirror real score-persistency KvsValue API
++    Type getType() const noexcept
++    {
++        return type_;
++    }
++
++    const std::variant& getValue() const noexcept
++    {
++        return value_;
++    }
++    // NOLINTEND(readability-identifier-naming)
++
++  private:
++    std::variant value_;
++    Type type_{Type::Null};
++};
++
++}  // namespace score::mw::per::kvs
++
++#endif  // SCORE_LIB_KVS_KVSVALUE_HPP
+diff --git a/score/config_management/config_daemon/code/factory/details/factory_mw_impl.cpp b/score/config_management/config_daemon/code/factory/details/factory_mw_impl.cpp
+--- a/score/config_management/config_daemon/code/factory/details/factory_mw_impl.cpp
++++ b/score/config_management/config_daemon/code/factory/details/factory_mw_impl.cpp
+@@ -18,7 +18,7 @@
+ #include "score/config_management/config_daemon/code/fault_event_reporter/details/fault_event_reporter_score_impl.h"
+ #include "score/config_management/config_daemon/code/json_helper/details/json_helper_impl.h"
+ 
+-#include "kvsbuilder.hpp"
++#include "score/kvs/kvs_builder.h"
+ #include "score/config_management/config_daemon/code/plugins/plugin_collector/details/plugin_collector_impl.h"
+ #include "score/config_management/config_daemon/code/services/details/internal_config_provider_service_reactor_impl.h"
+ #include "score/config_management/config_daemon/code/services/details/mw_com/internal_config_provider_service_impl.h"
+@@ -101,9 +101,9 @@ std::shared_ptr Factory::CreateParam
+     std::vector>& plugins) const
+ {
+     auto kvs_result = score::mw::per::kvs::KvsBuilder(score::mw::per::kvs::InstanceId{0U})
+-                          .need_defaults_flag(false)
+-                          .need_kvs_flag(false)
+-                          .dir("/persistent/trusted/ConfigDaemon")
++                          .Defaults(score::mw::per::kvs::KvsDefaults::kOptional)
++                          .KvsLoad(score::mw::per::kvs::KvsLoad::kOptional)
++                          .WorkingDir("/persistent/trusted/ConfigDaemon")
+                           .build();
+     if (!kvs_result.has_value())
+     {

From 7b91874e2b301b428528b2a85d865ec9f86af902 Mon Sep 17 00:00:00 2001
From: Anton Krivoborodov 
Date: Fri, 30 Oct 2026 07:33:59 +0000
Subject: [PATCH 14/31] communication: declare safe_math dependency needed with
 baselibs 0.2.16

message_passing_service_instance.cpp includes safe_math.h but did not list
@score_baselibs//score/language/safecpp/safe_math; with baselibs 0.2.16 the
header is no longer reachable transitively ("safe_math.h: No such file or
directory"). communication main already has this dependency.
---
 bazel_common/score_modules_target_sw.MODULE.bazel |  1 +
 known_good.json                                   |  3 ++-
 patches/communication/006-add-safe-math-dep.patch | 11 +++++++++++
 3 files changed, 14 insertions(+), 1 deletion(-)
 create mode 100644 patches/communication/006-add-safe-math-dep.patch

diff --git a/bazel_common/score_modules_target_sw.MODULE.bazel b/bazel_common/score_modules_target_sw.MODULE.bazel
index 7613b01155c..cddbbb877d5 100644
--- a/bazel_common/score_modules_target_sw.MODULE.bazel
+++ b/bazel_common/score_modules_target_sw.MODULE.bazel
@@ -36,6 +36,7 @@ git_override(
         "//patches/communication:003-module-deps-visibility.patch",
         "//patches/communication:004-rules-build-error-not-dev-dependency.patch",
         "//patches/communication:005-migrate-baselibs-rust-targets.patch",
+        "//patches/communication:006-add-safe-math-dep.patch",
     ],
     remote = "https://github.com/eclipse-score/communication.git",
 )
diff --git a/known_good.json b/known_good.json
index 94ce64f299b..493f530bc75 100644
--- a/known_good.json
+++ b/known_good.json
@@ -45,7 +45,8 @@
                     "//patches/communication:001-expose-comm-examples.patch",
                     "//patches/communication:003-module-deps-visibility.patch",
                     "//patches/communication:004-rules-build-error-not-dev-dependency.patch",
-                    "//patches/communication:005-migrate-baselibs-rust-targets.patch"
+                    "//patches/communication:005-migrate-baselibs-rust-targets.patch",
+                    "//patches/communication:006-add-safe-math-dep.patch"
                 ],
                 "metadata": {
                     "code_root_path": "//score/mw/com/impl/...",
diff --git a/patches/communication/006-add-safe-math-dep.patch b/patches/communication/006-add-safe-math-dep.patch
new file mode 100644
index 00000000000..d0b2b83babd
--- /dev/null
+++ b/patches/communication/006-add-safe-math-dep.patch
@@ -0,0 +1,11 @@
+diff --git a/score/mw/com/impl/bindings/lola/messaging/BUILD b/score/mw/com/impl/bindings/lola/messaging/BUILD
+--- a/score/mw/com/impl/bindings/lola/messaging/BUILD
++++ b/score/mw/com/impl/bindings/lola/messaging/BUILD
+@@ -107,6 +107,7 @@
+         "//score/mw/com/impl:error_serializer",
+         "//score/mw/com/impl/bindings/lola/methods:method_error",
+         "@score_baselibs//score/concurrency:thread_pool",
++        "@score_baselibs//score/language/safecpp/safe_math",
+         "@score_baselibs//score/os:errno_logging",
+         "@score_communication//score/message_passing",
+     ],

From d2fb9d94c624fa2cf9789e23b65b8d2626431008 Mon Sep 17 00:00:00 2001
From: Anton Krivoborodov 
Date: Fri, 30 Oct 2026 07:34:00 +0000
Subject: [PATCH 15/31] lifecycle: make the CodeQL pip hub a dev dependency

lifecycle v0.9.0 registers 'codeql_coding_standards_pip_hub' as a non-dev
pip hub. score_time declares a (dev) hub with the same name, so the time module
test, where score_time is the root module, fails with "Duplicate cross-module
pip hub named 'codeql_coding_standards_pip_hub'". The hub is only used by
lifecycle's own CodeQL tooling.
---
 .../score_modules_target_sw.MODULE.bazel      |  1 +
 known_good.json                               |  3 ++-
 .../003-dev-only-codeql-pip-hub.patch         | 19 +++++++++++++++++++
 3 files changed, 22 insertions(+), 1 deletion(-)
 create mode 100644 patches/lifecycle/003-dev-only-codeql-pip-hub.patch

diff --git a/bazel_common/score_modules_target_sw.MODULE.bazel b/bazel_common/score_modules_target_sw.MODULE.bazel
index cddbbb877d5..f3da9c2e6ea 100644
--- a/bazel_common/score_modules_target_sw.MODULE.bazel
+++ b/bazel_common/score_modules_target_sw.MODULE.bazel
@@ -66,6 +66,7 @@ git_override(
     patch_strip = 1,
     patches = [
         "//patches/lifecycle:002-undev-integration-test-deps.patch",
+        "//patches/lifecycle:003-dev-only-codeql-pip-hub.patch",
     ],
     remote = "https://github.com/eclipse-score/lifecycle.git",
 )
diff --git a/known_good.json b/known_good.json
index 493f530bc75..1dcbbbefb4b 100644
--- a/known_good.json
+++ b/known_good.json
@@ -128,7 +128,8 @@
             "score_lifecycle": {
                 "repo": "https://github.com/eclipse-score/lifecycle.git",
                 "bazel_patches": [
-                    "//patches/lifecycle:002-undev-integration-test-deps.patch"
+                    "//patches/lifecycle:002-undev-integration-test-deps.patch",
+                    "//patches/lifecycle:003-dev-only-codeql-pip-hub.patch"
                 ],
                 "metadata": {
                     "code_root_path": "//score/...",
diff --git a/patches/lifecycle/003-dev-only-codeql-pip-hub.patch b/patches/lifecycle/003-dev-only-codeql-pip-hub.patch
new file mode 100644
index 00000000000..14a2b81f5e5
--- /dev/null
+++ b/patches/lifecycle/003-dev-only-codeql-pip-hub.patch
@@ -0,0 +1,19 @@
+diff --git a/MODULE.bazel b/MODULE.bazel
+--- a/MODULE.bazel
++++ b/MODULE.bazel
+@@ -294,12 +294,13 @@ pip.parse(
+ use_repo(pip, "score_lifecycle_pip")
+ 
+ # CodeQL Python dependencies
+-pip.parse(
++pip_dev = use_extension("@rules_python//python/extensions:pip.bzl", "pip", dev_dependency = True)
++pip_dev.parse(
+     hub_name = "codeql_coding_standards_pip_hub",
+     python_version = PYTHON_VERSION,
+     requirements_lock = "//externals/codeql:requirements_lock.txt",
+ )
+-use_repo(pip, "codeql_coding_standards_pip_hub")
++use_repo(pip_dev, "codeql_coding_standards_pip_hub")
+ 
+ bazel_dep(name = "score_itf", version = "0.6.0")
+ 

From e4781ce9a4629fdec3627675d6ccc0a6cf0669b7 Mon Sep 17 00:00:00 2001
From: Anton Krivoborodov 
Date: Fri, 30 Oct 2026 07:34:00 +0000
Subject: [PATCH 16/31] logging: make the verification report links in the
 checklists relative

The datarouter and mw_log implementation inspection checklists link to the
module verification report with an absolute :doc: path, which resolves against
the reference_integration docs root once the logging docs are mounted
("unknown document: '/verification_report/module_verification_report'").
---
 .../score_modules_target_sw.MODULE.bazel      |  1 +
 known_good.json                               |  3 ++-
 ...3-relative-verification-report-links.patch | 24 +++++++++++++++++++
 3 files changed, 27 insertions(+), 1 deletion(-)
 create mode 100644 patches/logging/003-relative-verification-report-links.patch

diff --git a/bazel_common/score_modules_target_sw.MODULE.bazel b/bazel_common/score_modules_target_sw.MODULE.bazel
index f3da9c2e6ea..a394cafa2d2 100644
--- a/bazel_common/score_modules_target_sw.MODULE.bazel
+++ b/bazel_common/score_modules_target_sw.MODULE.bazel
@@ -78,6 +78,7 @@ git_override(
     patch_strip = 1,
     patches = [
         "//patches/logging:002-undev-component-test-deps.patch",
+        "//patches/logging:003-relative-verification-report-links.patch",
     ],
     remote = "https://github.com/eclipse-score/logging.git",
 )
diff --git a/known_good.json b/known_good.json
index 1dcbbbefb4b..aa804f17897 100644
--- a/known_good.json
+++ b/known_good.json
@@ -163,7 +163,8 @@
             "score_logging": {
                 "repo": "https://github.com/eclipse-score/logging.git",
                 "bazel_patches": [
-                    "//patches/logging:002-undev-component-test-deps.patch"
+                    "//patches/logging:002-undev-component-test-deps.patch",
+                    "//patches/logging:003-relative-verification-report-links.patch"
                 ],
                 "metadata": {
                     "code_root_path": "//score/mw/log/...",
diff --git a/patches/logging/003-relative-verification-report-links.patch b/patches/logging/003-relative-verification-report-links.patch
new file mode 100644
index 00000000000..edf435f29dc
--- /dev/null
+++ b/patches/logging/003-relative-verification-report-links.patch
@@ -0,0 +1,24 @@
+diff --git a/docs/components/datarouter/detailed_design/chklst_impl_inspection.rst b/docs/components/datarouter/detailed_design/chklst_impl_inspection.rst
+--- a/docs/components/datarouter/detailed_design/chklst_impl_inspection.rst
++++ b/docs/components/datarouter/detailed_design/chklst_impl_inspection.rst
+@@ -161,7 +161,7 @@
+      - 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.
+      - no
+-     - Refer to the generated :doc:`verification report `
++     - Refer to the generated :doc:`verification report <../../../verification_report/module_verification_report>`
+        and revision-specific CI results. A host run (Linux x86_64) of the unit
+        tests, clang-tidy, ASan/UBSan/LSan, TSan and Memcheck shows no findings.
+        Line and branch coverage are 82.6 % and 76.1 %. The QNX tests were not run.
+diff --git a/docs/components/mw_log/detailed_design/chklst_impl_inspection.rst b/docs/components/mw_log/detailed_design/chklst_impl_inspection.rst
+--- a/docs/components/mw_log/detailed_design/chklst_impl_inspection.rst
++++ b/docs/components/mw_log/detailed_design/chklst_impl_inspection.rst
+@@ -118,7 +118,7 @@
+      - 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.
+      - no
+-     - Refer to the generated :doc:`verification report `
++     - Refer to the generated :doc:`verification report <../../../verification_report/module_verification_report>`
+        and revision-specific CI results.
+ 
+        Following issues need to be addressed:

From 2b2d4c11409ae1d549284656b6b726a0284ec561 Mon Sep 17 00:00:00 2001
From: Anton Krivoborodov 
Date: Fri, 30 Oct 2026 07:34:00 +0000
Subject: [PATCH 17/31] module_tests: exclude logging's datarouter
 architectural-design validation

score_tooling's architectural-design validation fails on logging v0.2.5's
datarouter diagrams ("Entity 'datarouter' has children declared across more
than one component diagram file"), which aborts the logging module test before
any test runs. Excluded with a test note until fixed in score_logging.
---
 known_good.json | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/known_good.json b/known_good.json
index aa804f17897..eda3c76ef83 100644
--- a/known_good.json
+++ b/known_good.json
@@ -175,8 +175,12 @@
                         "@score_logging//score/datarouter/build_configuration_flags:use_local_vlan=True"
                     ],
                     "exclude_test_targets": [
-                        "//score/mw/log/legacy_non_verbose_api:unit_test"
+                        "//score/mw/log/legacy_non_verbose_api:unit_test",
+                        "//score/datarouter/doc/design:datarouter_architectural_design"
                     ],
+                    "test_notes": {
+                        "//score/datarouter/doc/design:datarouter_architectural_design": "TODO fix in score_logging: score_tooling's architectural-design validation rejects the datarouter diagrams ('datarouter' children split across context-sw-units.puml and detail-ipc.puml)"
+                    },
                     "integration_test_targets": [
                         "//score/test/component/..."
                     ],

From 873238a8474c470eb571a47abdf25cab382a6a9e Mon Sep 17 00:00:00 2001
From: Anton Krivoborodov 
Date: Fri, 30 Oct 2026 07:34:17 +0000
Subject: [PATCH 18/31] FIT: use SetValueToDefault instead of the removed
 Kvs::reset_key

score_persistency 41d7609 renamed Kvs::reset_key to SetValueToDefault (#585)
without a deprecated alias, so the C++ test scenarios no longer compiled
("'class score::kvs::Kvs' has no member named 'reset_key'").
---
 .../cpp/src/internals/persistency/kvs_instance.cpp              | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/feature_integration_tests/test_scenarios/cpp/src/internals/persistency/kvs_instance.cpp b/feature_integration_tests/test_scenarios/cpp/src/internals/persistency/kvs_instance.cpp
index d6cf1979e89..901020bbcae 100644
--- a/feature_integration_tests/test_scenarios/cpp/src/internals/persistency/kvs_instance.cpp
+++ b/feature_integration_tests/test_scenarios/cpp/src/internals/persistency/kvs_instance.cpp
@@ -350,7 +350,7 @@ bool KvsInstance::reset() {
 }
 
 bool KvsInstance::reset_key(const std::string& key) {
-    auto result = kvs_.reset_key(key);
+    auto result = kvs_.SetValueToDefault(key);
     return static_cast(result);
 }
 

From 721a13803dda8c515eb82bf8b19dfab84d4b2688 Mon Sep 17 00:00:00 2001
From: Anton Krivoborodov 
Date: Fri, 30 Oct 2026 07:34:17 +0000
Subject: [PATCH 19/31] module_tests: tolerate non-UTF-8 test output

A test printing raw bytes crashed the runner with UnicodeDecodeError while
streaming the bazel output (seen in the score_persistency module test), which
hid the actual test failure. Decode with errors="replace".
---
 scripts/module_tests.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scripts/module_tests.py b/scripts/module_tests.py
index 46820c215ea..fc9a9ad643c 100644
--- a/scripts/module_tests.py
+++ b/scripts/module_tests.py
@@ -55,7 +55,7 @@ def streamed(command: list[str], cwd: Path, env: dict) -> tuple[int, str]:
     print("+ " + " ".join(command), file=sys.stderr, flush=True)
     lines = []
     with subprocess.Popen(
-        command, cwd=cwd, env=env, text=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT
+        command, cwd=cwd, env=env, text=True, errors="replace", stdout=subprocess.PIPE, stderr=subprocess.STDOUT
     ) as proc:
         for line in proc.stdout:
             print(line, end="", flush=True)

From 3b0c884c75378cfce1695f1ac9a86a18f4bf6862 Mon Sep 17 00:00:00 2001
From: Anton Krivoborodov 
Date: Fri, 30 Oct 2026 07:34:17 +0000
Subject: [PATCH 20/31] docs: turn off the mount path check for the logging
 docs

score_logging v0.2.5 symlinks design pages and PlantUML files from score/ into
docs/. sphinx-mounts reports each of them as mounts.path_escape (31 warnings,
fatal with -W). docs-as-code does not expose path_check, so a small local
extension sets path_check = "off" for the logging mount after score_mounts
has built config.mounts. Remove once logging's docs bundle is self-contained.
---
 docs/conf.py            |  1 +
 docs/mount_overrides.py | 31 +++++++++++++++++++++++++++++++
 2 files changed, 32 insertions(+)
 create mode 100644 docs/mount_overrides.py

diff --git a/docs/conf.py b/docs/conf.py
index 185c8d4d33f..759da3f814e 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -43,6 +43,7 @@ def _patch_needpie_suppress_legend() -> None:
     # is updated with new sphinx-needs version
     "sphinxcontrib.plantuml",
     "score_sphinx_bundle",
+    "mount_overrides",
 ]
 
 exclude_patterns = [
diff --git a/docs/mount_overrides.py b/docs/mount_overrides.py
new file mode 100644
index 00000000000..b1d83d8aeb2
--- /dev/null
+++ b/docs/mount_overrides.py
@@ -0,0 +1,31 @@
+# *******************************************************************************
+# Copyright (c) 2026 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Apache License Version 2.0 which is available at
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# SPDX-License-Identifier: Apache-2.0
+# *******************************************************************************
+"""Relax sphinx-mounts' path check for module bundles that are not self-contained yet."""
+
+from sphinx.application import Sphinx
+from sphinx.config import Config
+
+# score_logging v0.2.5 symlinks design docs/PlantUML files from score/ into docs/.
+PATH_CHECK_OFF = {"modules/score_logging"}
+
+
+def _relax_path_check(_app: Sphinx, config: Config) -> None:
+    for mount in getattr(config, "mounts", None) or []:
+        if isinstance(mount, dict) and mount.get("mount_at") in PATH_CHECK_OFF:
+            mount["path_check"] = "off"
+
+
+def setup(app: Sphinx) -> dict[str, object]:
+    # After score_mounts (300) has filled config.mounts, before sphinx_mounts (400) reads it.
+    app.connect("config-inited", _relax_path_check, priority=350)
+    return {"parallel_read_safe": True, "parallel_write_safe": True}

From 05136138337ffbc509224b9f8755b5667bb35bed Mon Sep 17 00:00:00 2001
From: Pawel Rutka 
Date: Fri, 30 Oct 2026 07:45:50 +0000
Subject: [PATCH 21/31] Polish lifecycle

---
 known_good.json                                           | 7 +++----
 .../simple_lifecycle/configs/launch_manager_config.json   | 8 ++------
 2 files changed, 5 insertions(+), 10 deletions(-)

diff --git a/known_good.json b/known_good.json
index eda3c76ef83..e8a224c0ee5 100644
--- a/known_good.json
+++ b/known_good.json
@@ -133,16 +133,15 @@
                 ],
                 "metadata": {
                     "code_root_path": "//score/...",
-                    "extra_test_config": [
-                        "copt=-Wno-error=pessimizing-move"
-                    ],
+                    "extra_test_config": [],
                     "exclude_test_targets": [
                         "//score/health_monitor/src/rust:miri_tests",
+                        "//score/health_monitor/src/rust:loom_tests",
                         "//tests/integration/...",
                         "//examples/demo_verification:examples"
                     ],
                     "test_notes": {
-                        "copt=-Wno-error=pessimizing-move": "TODO fix: fails under clang (unified llvm coverage toolchain): -Wpessimizing-move in alive_monitor/details/ifexm/supervision_handle.hpp:42 breaks the build of 28 test targets",
+                        "//score/health_monitor/src/rust:loom_tests": "TODO fix: fails under the unified toolchain: heartbeat_monitor_heartbeat_evaluate_in_range misses its 30-70ms wall-clock window inside loom::model (Heartbeat(TooLate), 9 of 10 runs)",
                         "//tests/integration/...": "TODO fix: fails under clang (unified llvm coverage toolchain): clang links the host glibc (GLIBC_2.38 not found in the test container); integration tests still run via integration_test_targets",
                         "//examples/demo_verification:examples": "TODO fix: fails under clang (unified llvm coverage toolchain): clang links the host glibc (GLIBC_2.38 not found in the test container); integration tests still run via integration_test_targets"
                     },
diff --git a/showcases/simple_lifecycle/configs/launch_manager_config.json b/showcases/simple_lifecycle/configs/launch_manager_config.json
index 08ce602d41c..e05bbf82857 100644
--- a/showcases/simple_lifecycle/configs/launch_manager_config.json
+++ b/showcases/simple_lifecycle/configs/launch_manager_config.json
@@ -3,12 +3,8 @@
     "defaults": {
         "deployment_config": {
             "bin_dir": "/showcases/bin/",
-            "ready_recovery_action": {
-                "restart": {
-                    "number_of_attempts": 1,
-                    "delay_before_restart_ms": 500
-                }
-            },
+            "activation_retry_attempts": 1,
+            "activation_retry_delay_ms": 500,
             "sandbox": {
                 "uid": 0,
                 "gid": 0,

From 0e4c5be3ebb3441d5f25e72772745ea553b01d67 Mon Sep 17 00:00:00 2001
From: Anton Krivoborodov 
Date: Fri, 30 Oct 2026 08:17:20 +0000
Subject: [PATCH 22/31] FIT (Rust): use set_value_to_default instead of the
 removed Kvs::reset_key

persistency renamed reset_key to set_value_to_default (eclipse-score/persistency#585);
the Rust test scenarios no longer compiled ("no method named reset_key").
---
 .../rust/src/scenarios/persistency/default_values.rs            | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/default_values.rs b/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/default_values.rs
index 1d9d9fdd1bd..d2999ad5198 100644
--- a/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/default_values.rs
+++ b/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/default_values.rs
@@ -127,7 +127,7 @@ impl Scenario for SelectiveReset {
 
         // Reset even-indexed keys (0, 2, 4); odd-indexed keep their overrides.
         for i in (0..num_keys).step_by(2) {
-            kvs.reset_key(&keys[i]).map_err(|e| format!("{e:?}"))?;
+            kvs.set_value_to_default(&keys[i]).map_err(|e| format!("{e:?}"))?;
         }
         kvs.flush().map_err(|e| format!("{e:?}"))?;
 

From 312fde355d1270ab713603ce3233d39c81407c7d Mon Sep 17 00:00:00 2001
From: Anton Krivoborodov 
Date: Fri, 30 Oct 2026 08:17:20 +0000
Subject: [PATCH 23/31] module_tests: exclude config_management JSON-formatting
 tests under baselibs 0.2.16

baselibs 0.2.16 parses/serializes JSON with vaJson only; the base_library
flag no longer has an effect. Two config_management unit tests compare against
nlohmann-formatted strings (e.g. 3.222 vs 3.22199988) and fail:
- config_daemon/code/data_model/details:unit_test
- config_provider/code/parameter_set:unit_test
Excluded with a test_note until config_management adapts its expectations.
---
 known_good.json | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/known_good.json b/known_good.json
index e8a224c0ee5..207e41fc540 100644
--- a/known_good.json
+++ b/known_good.json
@@ -246,8 +246,14 @@
                         "//score/config_management/config_provider/code/config_provider/factory:unit_tests_mw_com",
                         "//score/config_management/config_provider/code/proxies/details:unit_test_mw",
                         "//score/config_management/config_daemon/code:main_function_test",
+                        "//score/config_management/config_daemon/code/data_model/details:unit_test",
+                        "//score/config_management/config_provider/code/parameter_set:unit_test",
                         "//score/config_management/dependability/..."
                     ],
+                    "test_notes": {
+                        "//score/config_management/config_daemon/code/data_model/details:unit_test": "TODO fix: baselibs 0.2.16 serializes JSON with vaJson only (base_library flag has no effect); expected strings assume nlohmann (e.g. 3.222 vs 3.22199988)",
+                        "//score/config_management/config_provider/code/parameter_set:unit_test": "TODO fix: baselibs 0.2.16 serializes JSON with vaJson only (base_library flag has no effect); expected strings assume nlohmann (e.g. 3.222 vs 3.22199988)"
+                    },
                     "langs": [
                         "cpp"
                     ],

From c37c448bf429d1eb519a5dcff39d61205d73b37c Mon Sep 17 00:00:00 2001
From: Anton Krivoborodov 
Date: Fri, 30 Oct 2026 08:24:39 +0000
Subject: [PATCH 24/31] FIT: write KVS defaults files with the type-tagged
 top-level envelope

Since eclipse-score/persistency#490 the KVS rejects untagged JSON, so a
defaults file must be {"t":"obj","v":{...}}. The old bare-map format made every
defaults-based scenario fail with ConversionFailed when creating the KVS.
---
 feature_integration_tests/test_cases/persistency_scenario.py | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/feature_integration_tests/test_cases/persistency_scenario.py b/feature_integration_tests/test_cases/persistency_scenario.py
index e21b5f6651a..d891a565a9e 100644
--- a/feature_integration_tests/test_cases/persistency_scenario.py
+++ b/feature_integration_tests/test_cases/persistency_scenario.py
@@ -35,7 +35,7 @@ def create_kvs_defaults_file(dir_path: Path, instance_id: int, values: dict) ->
     KVS expects defaults at: {dir}/kvs_{instance_id}_default.json
     and the hash at:         {dir}/kvs_{instance_id}_default.hash
 
-    The JSON format is: {"key": {"t": "type_tag", "v": value}, ...}
+    The JSON format is: {"t": "obj", "v": {"key": {"t": "type_tag", "v": value}, ...}}
     The hash is adler32 of the JSON string, written as 4 big-endian bytes.
 
     Parameters
@@ -56,7 +56,8 @@ def create_kvs_defaults_file(dir_path: Path, instance_id: int, values: dict) ->
     hash_path = dir_path / f"kvs_{instance_id}_default.hash"
 
     data = {key: {"t": type_tag, "v": val} for key, (type_tag, val) in values.items()}
-    json_str = json.dumps(data)
+    # KVS only accepts the type-tagged top-level object since persistency#490.
+    json_str = json.dumps({"t": "obj", "v": data})
 
     json_path.write_text(json_str)
     hash_path.write_bytes(adler32(json_str.encode()).to_bytes(length=4, byteorder="big"))

From 9390b2ff66e34e9b245ea337f873b286f7abac61 Mon Sep 17 00:00:00 2001
From: Anton Krivoborodov 
Date: Fri, 30 Oct 2026 08:24:39 +0000
Subject: [PATCH 25/31] FIT (C++): do not wrap the snapshot in a second
 envelope

The C++ KVS now writes the {"t":"obj","v":...} envelope itself (possibly with
whitespace), so the exact-prefix check missed it and the snapshot was wrapped
twice. Detect the envelope with a whitespace-tolerant regex instead.
---
 .../cpp/src/internals/persistency/kvs_instance.cpp            | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/feature_integration_tests/test_scenarios/cpp/src/internals/persistency/kvs_instance.cpp b/feature_integration_tests/test_scenarios/cpp/src/internals/persistency/kvs_instance.cpp
index 901020bbcae..2c7a0087d5a 100644
--- a/feature_integration_tests/test_scenarios/cpp/src/internals/persistency/kvs_instance.cpp
+++ b/feature_integration_tests/test_scenarios/cpp/src/internals/persistency/kvs_instance.cpp
@@ -241,8 +241,10 @@ bool KvsInstance::normalize_snapshot_file_to_rust_envelope(const KvsParameters&
     const std::string bool_canonical = canonicalize_bool_literals(content);
     const std::string canonical_content = canonicalize_f64_literals(bool_canonical);
 
+    // Newer KVS versions already write the envelope (possibly with whitespace); never wrap twice.
+    static const std::regex envelope_prefix(R"(^\{\s*"t"\s*:\s*"obj"\s*,\s*"v"\s*:)");
     std::string final_content;
-    if (canonical_content.rfind("{\"t\":\"obj\",\"v\":", 0) == 0) {
+    if (std::regex_search(canonical_content, envelope_prefix)) {
         final_content = canonical_content;
     } else {
         final_content = "{\"t\":\"obj\",\"v\":" + canonical_content + "}";

From 92b683d6fe6c5b61e30f27c68b361ae9e1b82e60 Mon Sep 17 00:00:00 2001
From: Anton Krivoborodov 
Date: Fri, 30 Oct 2026 08:24:39 +0000
Subject: [PATCH 26/31] FIT: accept reset keys stored with their default value

set_value_to_default (formerly reset_key) now writes the default value into the
snapshot instead of removing the key. TestSelectiveReset accepts both: key absent
or stored with the default value; odd keys still must keep their overrides.
---
 .../test_cases/tests/persistency/test_default_values.py  | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/feature_integration_tests/test_cases/tests/persistency/test_default_values.py b/feature_integration_tests/test_cases/tests/persistency/test_default_values.py
index 2e92a833186..388e1c9f3e9 100644
--- a/feature_integration_tests/test_cases/tests/persistency/test_default_values.py
+++ b/feature_integration_tests/test_cases/tests/persistency/test_default_values.py
@@ -410,7 +410,8 @@ def test_config(self, temp_dir: Path, defaults_file: Path) -> dict[str, Any]:
 
     def test_selective_reset_state(self, results: ScenarioResult, temp_dir: Path) -> None:
         """
-        Even-indexed keys must be absent after reset_key; odd-indexed must retain
+        Even-indexed keys must be back at their default after reset (absent, or stored
+        with the default value since set_value_to_default); odd-indexed must retain
         their override values in the final flushed snapshot.
         """
         assert results.return_code == ResultCode.SUCCESS
@@ -418,7 +419,11 @@ def test_selective_reset_state(self, results: ScenarioResult, temp_dir: Path) ->
         for i in range(self._KEY_COUNT):
             key = f"sel_key_{i}"
             if i % 2 == 0:
-                assert key not in snapshot, f"Even key '{key}' must be absent after reset_key"
+                if key in snapshot:
+                    assert isclose(snapshot[key]["v"], self._DEFAULT_VALUE, abs_tol=1e-4), (
+                        f"Even key '{key}' must hold the default {self._DEFAULT_VALUE} after reset, "
+                        f"got {snapshot[key]['v']}"
+                    )
             else:
                 assert key in snapshot, f"Odd key '{key}' must be present with override"
                 assert isclose(snapshot[key]["v"], self._override_value(i), abs_tol=1e-4), (

From 6331f1a6c9479662a100aff938795ed33f3530b3 Mon Sep 17 00:00:00 2001
From: Ulrich Huber 
Date: Fri, 30 Oct 2026 10:08:30 +0100
Subject: [PATCH 27/31] Use optional Ubuntu snapshot mirror via
 downloader_config in module tests (#429)

(cherry picked from commit 0ae8255b9b342471d2bbc24129cbb15bb073b2f8)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---
 .github/workflows/module_tests.yml  | 22 ++++++++++++++++++++++
 .github/workflows/test_and_docs.yml |  1 +
 2 files changed, 23 insertions(+)

diff --git a/.github/workflows/module_tests.yml b/.github/workflows/module_tests.yml
index dd1d3040dc1..30e8a7c7f3c 100644
--- a/.github/workflows/module_tests.yml
+++ b/.github/workflows/module_tests.yml
@@ -16,6 +16,10 @@
 name: Module Tests
 on:
   workflow_call:
+    secrets:
+      UBUNTU_SNAPSHOT_MIRROR_URL:
+        description: Optional StableBuild mirror tag used before snapshot.ubuntu.com (see the Bazel downloader step).
+        required: false
   workflow_dispatch:
 permissions:
   contents: read
@@ -59,6 +63,24 @@ jobs:
           disk-cache: ${{ github.workflow }}-${{ matrix.module }}
           repository-cache: true
           cache-save: ${{ github.event_name == 'push' && github.ref_name == 'main' }}
+      - name: Configure optional Ubuntu snapshot mirror for Bazel downloader
+        env:
+          UBUNTU_SNAPSHOT_MIRROR_URL: ${{ secrets.UBUNTU_SNAPSHOT_MIRROR_URL }}
+        run: |
+          # snapshot.ubuntu.com is unreliable. If a mirror is configured, try it first and keep the
+          # public URL as fallback. ~/.bazelrc applies to every module workspace, unlike user.bazelrc.
+          if [[ -z "${UBUNTU_SNAPSHOT_MIRROR_URL}" ]]; then
+            echo "No Ubuntu snapshot mirror configured; using snapshot.ubuntu.com."
+            exit 0
+          fi
+          mirror="${UBUNTU_SNAPSHOT_MIRROR_URL}.debmirror.stablebuild.com/2026-04-01T10:40:01Z"
+          cfg="${RUNNER_TEMP}/ubuntu.downloader_config"
+          {
+            echo "rewrite snapshot.ubuntu.com/ubuntu/[^/]*/(.*) ${mirror}/archive.ubuntu.com/ubuntu/\$1"
+            echo "rewrite snapshot.ubuntu.com/ubuntu/[^/]*/(.*) ${mirror}/ports.ubuntu.com/\$1"
+            echo "rewrite snapshot.ubuntu.com/ubuntu/(.*) snapshot.ubuntu.com/ubuntu/\$1"
+          } > "${cfg}"
+          echo "common --downloader_config=${cfg}" >> "${HOME}/.bazelrc"
       - name: Run module tests
         run: python3 scripts/module_tests.py run ${{ matrix.module }}
       - name: Upload test reports and coverage
diff --git a/.github/workflows/test_and_docs.yml b/.github/workflows/test_and_docs.yml
index c0f2c118193..eb92663b4fd 100644
--- a/.github/workflows/test_and_docs.yml
+++ b/.github/workflows/test_and_docs.yml
@@ -35,6 +35,7 @@ env:
 jobs:
   module_tests:
     uses: ./.github/workflows/module_tests.yml
+    secrets: inherit
   test_and_docs:
     runs-on: ubuntu-latest
     needs: module_tests

From 5d09c1bf631767564295ee403d200d2f201eb76a Mon Sep 17 00:00:00 2001
From: Anton Krivoborodov 
Date: Fri, 30 Oct 2026 10:40:54 +0000
Subject: [PATCH 28/31] PIT: link lifecycle showcase to renamed stakeholder
 requirement

score_platform 0.7.4 renamed stkh_req__dependability__safety_features_1 to
stkh_req__dependability__health_management. The stale ID produced two
docs warnings (unknown outgoing link), which fail the docs build because
warnings are treated as errors.
---
 platform_integration_tests/lifecycle/test_lifecycle_showcase.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/platform_integration_tests/lifecycle/test_lifecycle_showcase.py b/platform_integration_tests/lifecycle/test_lifecycle_showcase.py
index e6afecb47ce..4655009f9e4 100644
--- a/platform_integration_tests/lifecycle/test_lifecycle_showcase.py
+++ b/platform_integration_tests/lifecycle/test_lifecycle_showcase.py
@@ -22,7 +22,7 @@
 
 
 @add_test_properties(
-    partially_verifies=["stkh_req__dependability__safety_features_1"],
+    partially_verifies=["stkh_req__dependability__health_management"],
     test_type="interface-test",
     derivation_technique="requirements-analysis",
 )

From 26ec9ef8bc3d8d9491ae5ca9b0bdd40785ad545e Mon Sep 17 00:00:00 2001
From: Anton Krivoborodov 
Date: Fri, 30 Oct 2026 12:57:10 +0000
Subject: [PATCH 29/31] docs: move the logging mount path-check override into
 conf.py

The sandboxed //:needs_json_file build only ships conf.py and doc sources
from docs/, not other .py files, so loading docs/mount_overrides.py as an
extension failed there with "No module named 'mount_overrides'". The
override now lives in conf.py's setup(); behaviour of //:docs is unchanged.
---
 docs/conf.py            | 17 ++++++++++++++++-
 docs/mount_overrides.py | 31 -------------------------------
 2 files changed, 16 insertions(+), 32 deletions(-)
 delete mode 100644 docs/mount_overrides.py

diff --git a/docs/conf.py b/docs/conf.py
index 759da3f814e..119377a9a2c 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -43,7 +43,6 @@ def _patch_needpie_suppress_legend() -> None:
     # is updated with new sphinx-needs version
     "sphinxcontrib.plantuml",
     "score_sphinx_bundle",
-    "mount_overrides",
 ]
 
 exclude_patterns = [
@@ -80,3 +79,19 @@ def _patch_needpie_suppress_legend() -> None:
     "show_toc_level": 2,
     "navigation_with_keys": False,
 }
+
+# score_logging v0.2.5 symlinks design docs/PlantUML files from score/ into docs/,
+# which sphinx-mounts reports as path_escape. Remove once its bundle is self-contained.
+_PATH_CHECK_OFF = {"modules/score_logging"}
+
+
+def _relax_path_check(_app, config) -> None:
+    for mount in getattr(config, "mounts", None) or []:
+        if isinstance(mount, dict) and mount.get("mount_at") in _PATH_CHECK_OFF:
+            mount["path_check"] = "off"
+
+
+# Defined here, not as a docs/*.py extension: the sandboxed needs_json build only ships conf.py.
+def setup(app):
+    # After score_mounts (300) has filled config.mounts, before sphinx_mounts (400) reads it.
+    app.connect("config-inited", _relax_path_check, priority=350)
diff --git a/docs/mount_overrides.py b/docs/mount_overrides.py
deleted file mode 100644
index b1d83d8aeb2..00000000000
--- a/docs/mount_overrides.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# *******************************************************************************
-# Copyright (c) 2026 Contributors to the Eclipse Foundation
-#
-# See the NOTICE file(s) distributed with this work for additional
-# information regarding copyright ownership.
-#
-# This program and the accompanying materials are made available under the
-# terms of the Apache License Version 2.0 which is available at
-# https://www.apache.org/licenses/LICENSE-2.0
-#
-# SPDX-License-Identifier: Apache-2.0
-# *******************************************************************************
-"""Relax sphinx-mounts' path check for module bundles that are not self-contained yet."""
-
-from sphinx.application import Sphinx
-from sphinx.config import Config
-
-# score_logging v0.2.5 symlinks design docs/PlantUML files from score/ into docs/.
-PATH_CHECK_OFF = {"modules/score_logging"}
-
-
-def _relax_path_check(_app: Sphinx, config: Config) -> None:
-    for mount in getattr(config, "mounts", None) or []:
-        if isinstance(mount, dict) and mount.get("mount_at") in PATH_CHECK_OFF:
-            mount["path_check"] = "off"
-
-
-def setup(app: Sphinx) -> dict[str, object]:
-    # After score_mounts (300) has filled config.mounts, before sphinx_mounts (400) reads it.
-    app.connect("config-inited", _relax_path_check, priority=350)
-    return {"parallel_read_safe": True, "parallel_write_safe": True}

From d88d17ad494ddc07818a94e230a80f77ba1a895a Mon Sep 17 00:00:00 2001
From: Anton Krivoborodov 
Date: Fri, 30 Oct 2026 12:57:11 +0000
Subject: [PATCH 30/31] Release note v0.10: regenerate draft and list it last

Regenerated with scripts/release_note/generate_release_note.py --release v0.10.0
--origin v0.9.0 (draft), including the architecture diagram. New Features and
Breaking Changes are written from collect_changes.py evidence.

releases.rst lists the release notes explicitly; the glob sorted v0_10 before
v0_5.
---
 .../releases/_assets/architecture_v0_10.svg   | 221 +++++++
 .../releases/release_note_score_v0_10.rst     | 616 ++++++++++--------
 docs/s_core_v_1/releases/releases.rst         |   9 +-
 3 files changed, 583 insertions(+), 263 deletions(-)
 create mode 100644 docs/s_core_v_1/releases/_assets/architecture_v0_10.svg

diff --git a/docs/s_core_v_1/releases/_assets/architecture_v0_10.svg b/docs/s_core_v_1/releases/_assets/architecture_v0_10.svg
new file mode 100644
index 00000000000..7f2dbd823db
--- /dev/null
+++ b/docs/s_core_v_1/releases/_assets/architecture_v0_10.svg
@@ -0,0 +1,221 @@
+
+S-CORE Platform v0.10
+Reference integration architecture
+DRAFT
+5
+target images
+10
+infrastructure modules
+32
+components
+8
+software modules
+v0.10.0  ·  planned 2026-11-02  ·  compared to v0.9.0
+PLATFORM, INFRASTRUCTURE& TOOLING10 modules
+
+
+
+Platform
+v0.7.4
+
+
+
+Crates
+v0.0.11
+
+
+
+ITF
+v0.6.0
+
+
+
+Tools
+NEW
+4b48cec
+
+
+
+Tooling
+v2.2.3
+
+
+
+Bazel Platforms
+v1.1.0
+
+
+
+Test Scenarios
+v0.5.0
+
+
+
+Docs-as-code
+v8.6.0
+
+
+
+Process description
+v2.2.2
+
+
+
+Bazel CPP Toolchain
+v1.0.3
+INTEGRATED SOFTWARE MODULES8 modules
+
+
+
+Baselibs
+v0.2.16
+was v0.2.12
+
+Bit Manipulation
+
+Concurrency
+
+Containers
+
+Cross-Language Shared-Layout Data Types
+
+Filesystem
+
+FlatBuffers
+
+Hash Library
+
+JSON
+
+JSON-Wrapper
+
+Log Frontend
+
+Memory Shared
+
+OS
+
+Result
+
+Rust Containers
+
+SafeCpp
+
+Scope Exit
+
+Static Reflection with Serialization
+
+String Manipulation
+
+Utils
+
+VaJson
+
+baselibs
+
+
+
+Communication
+313f117
+was v0.4.0
+
+IPC Binding
+
+Lola Configuration
+
+Message Passing
+
+Mock binding
+
+mw::com Frontend
+
+communication
+
+
+
+Persistency
+41d7609
+was v0.3.5
+
+persistency::kvs
+
+persistency
+
+
+
+Kyron
+52d4bef
+was v0.1.4
+no components documented
+
+kyron
+
+
+
+Lifecycle
+v0.9.0
+was v0.6.1
+
+Health Monitor
+
+Launch Manager
+
+lifecycle
+
+
+
+Logging
+v0.2.5
+was v0.2.4
+
+Datarouter
+
+mw::log Backend
+
+logging
+
+
+
+Time
+3723ce6
+was v0.0.2
+
+Time
+
+Time Sync Client
+
+time
+
+
+
+Configuration
+Management
+d0dab01
+was v0.2.0
+no components documented
+
+config_management
+TARGET IMAGESdashed: experimental
+
+Linux
+x86_64
+
+QNX 8.0
+x86_64
+
+QNX 8.0
+aarch64
+
+Red Hat AutoSD
+x86_64
+
+EB corbos Linux
+aarch64
+
+released (tag)
+
+unreleased (commit pin)
+NEW
+new since v0.9.0  (1)
+was … = version in v0.9.0
+generated from known_good.json @ 5d09c1bf631
diff --git a/docs/s_core_v_1/releases/release_note_score_v0_10.rst b/docs/s_core_v_1/releases/release_note_score_v0_10.rst
index a7d072dda3b..002fc96cd29 100644
--- a/docs/s_core_v_1/releases/release_note_score_v0_10.rst
+++ b/docs/s_core_v_1/releases/release_note_score_v0_10.rst
@@ -12,41 +12,46 @@
    # SPDX-License-Identifier: Apache-2.0
    # *******************************************************************************
 
-S-CORE Platform v0.10 release note
-==================================
+S-CORE Platform v0.10 release note (DRAFT)
+============================================
+
+.. warning::
+
+   **DRAFT - release in progress.** v0.10.0 is not released yet (planned for
+   2026-11-02). This note shows the current state of the integration and changes
+   until the release is published.
+
 
 .. document:: S-CORE v0.10 release note
    :id: doc__score_v010_release_note
-   :status: valid
+   :status: draft
    :safety: QM
    :security: YES
    :realizes: wp__platform_sw_release_note
    :version: 1
 
-| **Platform Release:** S-CORE
+| **Platform Name:** S-CORE
 | **Release Tag:** v0.10.0
-| **Origin Release Tag**: v0.9.0
+| **Origin Release Tag:** v0.9.0
 | **Release Date:** 2026-11-02
 
 
-Overview
-^^^^^^^^
+📋 Overview
+^^^^^^^^^^^^
 
 This document provides an overview of the changes, improvements, and bug fixes
 included in the software platform release version v0.10.0 as compared to the
 previous platform release (v0.9.0).
 
-The v0.10 release replaces the resolved-dependency override mechanism of v0.9
-with a two-stage DR-008 test workflow, in which every integrated module is
-tested with its own test suite against the unified toolchain configuration of
-the reference integration. It adds an SBOM to the build, introduces
-showcase-based platform integration tests linked to stakeholder requirements,
-extends requirement coverage with module-owned tests, deduplicates the QNX and
-Linux image definitions, and updates all integrated modules to their latest
-known-good state.
+.. figure:: /s_core_v_1/releases/_assets/architecture_v0_10.svg
+   :width: 100%
+   :alt: S-CORE v0.10 reference integration architecture
+
+   Modules, components and images of the reference integration v0.10.0.
 
-Disclaimer
-----------
+
+📜 Disclaimer
+--------------
 
 This release note does not "release for production", as it does not come with a
 safety argumentation and a performed safety assessment.
@@ -54,275 +59,364 @@ The work products compiled in the safety package are created with care according
 to a process satisfying standards, but the project, being a non-profit and open
 source organization, can not take over any liability for its content.
 
-Changes to the Platform
-^^^^^^^^^^^^^^^^^^^^^^^
 
-New Features
-------------
+🔄 Changes to the Platform
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-Integration Strategy (DR-008) Test Workflow
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+✨ New Features
+----------------
 
-The DR-008 implementation was reworked into a two-stage test workflow:
+New infrastructure module: Tools
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-- **Stage 1** builds and tests the reference integration with all modules as
-  pinned in ``known_good.json``.
-- **Stage 2** runs the test suite of each target software module on its own,
-  with the known-good versions injected via ``--override_module`` and the
-  toolchains and platforms shared through ``bazel_common/unified.bazelrc`` and
-  ``bazel_common/unified_toolchains.MODULE.bazel``.
+``score_tools`` (`eclipse-score/tools `__)
+is now part of ``known_good.json``. Persistency's test BUILD files load
+``@score_tools//score_pytest``, so the reference integration needs it as a
+regular dependency
+(`#388 `__).
 
-The new ``scripts/module_tests.py`` and the ``module_tests.yml`` workflow make
-this available for pull requests. Under ``bazel coverage`` the unified
-configuration uses clang (LLVM) as C++ toolchain, while builds stay on GCC.
-Module-specific exclusions are documented in the new ``metadata.test_notes``
-field of ``known_good.json``.
+Integration Strategy (DR-008) test workflow
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-The resolved-dependency override mechanism introduced in v0.9
-(``scripts/known_good/resolved_dependencies.py``) was removed in favour of this
-workflow.
+The reference integration no longer runs the unit tests of all modules inside
+its own workspace. Each target software module now runs its own test suite in
+its own workspace, against the dependency versions resolved by the reference
+integration
+(`#398 `__):
+
+- ``scripts/module_tests.py run `` fetches the module at its
+  ``known_good.json`` pin with the integration patches applied, pins its direct
+  dependencies to the versions of the reference integration
+  (``--override_module``) and runs ``bazel coverage`` with the shared
+  configuration from ``bazel_common/unified.bazelrc`` and
+  ``bazel_common/unified_toolchains.MODULE.bazel``. Coverage builds C++ with
+  clang (LLVM); regular builds stay on GCC.
+- The ``module_tests.yml`` workflow runs one job per module and feeds the
+  results into the unit test summary and the documentation.
+- Module-specific test exclusions are documented in the ``metadata.test_notes``
+  field of ``known_good.json``.
+- If the ``UBUNTU_SNAPSHOT_MIRROR_URL`` secret is set, the module test jobs
+  download Ubuntu snapshot packages from a mirror first
+  (`#429 `__).
 
 Software Bill of Materials (SBOM)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-The reference integration now generates an SBOM via
-`score_sbom `_ (``0.1.1``). All target
-software modules are tracked and the SBOM is uploaded as a CI build artifact.
+The reference integration generates an SBOM with
+`score_sbom `__ ``0.1.1`` and uploads it
+as a CI build artifact
+(`#304 `__,
+`#339 `__,
+`#353 `__).
 
-Platform Integration Tests
-~~~~~~~~~~~~~~~~~~~~~~~~~~
+Reference images
+~~~~~~~~~~~~~~~~
 
-A new ``platform_integration_tests/`` package runs the ``//showcases`` demo
-applications for Communication, Kyron, Lifecycle, Logging and Time as ITF
-tests. They are linked to the platform stakeholder requirements, which are now
-reported in a dedicated "Stakeholder Requirements" chapter of the platform
-verification report.
+- The QNX images use ``score_rules_imagefs`` ``0.1.0``; host files are placed
+  with ``rules_pkg`` ``pkg_files`` targets
+  (`#349 `__).
+- The QNX and Linux image definitions were deduplicated into shared packages:
+  ``//images/common/apps``, ``//images/qnx_common/build`` and
+  ``//images/qnx_common/configs``
+  (`#389 `__).
+- The AutoSD image uses a newer AutoSD OCI base image and is pushed on release
+  (`#404 `__,
+  `#424 `__).
+
+Platform integration tests
+~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-Improvements
-------------
+The new ``//platform_integration_tests:pit`` suite runs the ``//showcases``
+applications for Communication, Kyron, Lifecycle, Logging and Time on the target
+image (Docker on Linux x86_64, QEMU on QNX x86_64). Each test is linked to the
+platform stakeholder requirement it demonstrates; the platform verification
+report shows them in a new "Stakeholder Requirements" chapter
+(`#377 `__).
 
-Requirement Coverage from Module Tests
+Requirement coverage from module tests
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 The Lifecycle integration tests, the Logging component tests and the Persistency
-component integration tests are now executed by the reference integration, so
-their ``PartiallyVerifies``/``FullyVerifies`` links appear in the verification
-reports. The Logging integration tests were re-enabled after fixing the
-datarouter configuration packaging.
-
-Reference Images
-~~~~~~~~~~~~~~~~
-
-- ``score_rules_imagefs`` was updated from ``0.0.1`` to ``0.1.0``, migrating the
-  image definitions to ``rules_pkg`` ``pkg_files``.
-- QNX and Linux image definitions were deduplicated into shared packages
-  (``//images/common/apps``, ``//images/qnx_common/build``,
-  ``//images/qnx_common/configs``).
-
-Documentation
-~~~~~~~~~~~~~
-
-- Documentation is now generated from ``known_good.json``
-  (``bazel_common/docs_bundles.bzl``); the Time documentation bundle was
-  enabled.
-- The verification report was restructured: the former platform verification
-  report page became the status dashboard, module verification reports
-  (Lifecycle, Logging, Persistency, ...) are linked from a common index, and
-  unit test and coverage summaries are nested under the Platform Verification
-  Report.
+component integration tests are executed by the reference integration, so their
+``PartiallyVerifies``/``FullyVerifies`` links appear in the verification reports
+(`#385 `__).
+The Logging tests run after fixing the packaging of the datarouter
+configuration
+(`#387 `__).
+
+Lifecycle control interface for State Managers
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Lifecycle provides the new ``ILmControl`` API, with which State Managers
+communicate with the Launch Manager over ``mw::com``
+(`Lifecycle v0.8.0 release notes `__).
+
+Documentation and reports
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- The documentation bundles are generated from ``known_good.json``
+  (``bazel_common/docs_bundles.bzl``); the Time documentation is included
+  (`#337 `__,
+  `#348 `__).
+- Module verification reports (Baselibs, Lifecycle, Logging, Persistency) are
+  linked from a common index; the unit test and coverage summaries are part of
+  the Platform Verification Report; the status dashboard uses branch-aware links
+  (`#342 `__,
+  `#358 `__,
+  `#373 `__).
+- The Overall Status page was replaced by the Release-wide Progress Overview
+  next to the release notes, with release-over-release charts per module
+  (`#392 `__).
+- The release note is generated from ``known_good.json`` with
+  ``scripts/release_note/generate_release_note.py``
+  (`#414 `__).
 
 CI
 ~~
 
-- The documentation build runs as a separate, fail-fast workflow.
-- Bazel cache keys rotate on module bumps; the test cache is trusted on push
-  and fresh runs are gated on tags.
-- Failing module tests are reported by module name.
-- Dashboard documentation links are branch-aware.
+- The documentation build runs as a separate, fail-fast workflow
+  (`#375 `__).
+- Bazel cache keys rotate on module bumps and the test cache is trusted on push
+  (`#356 `__,
+  `#362 `__,
+  `#366 `__).
+- Failing module tests are reported by module name
+  (`#368 `__).
 
-Incompatible Changes
+💥 Breaking Changes
 --------------------
 
-.. warning::
-
-   The resolved-dependency override mechanism introduced in v0.9
-   (``scripts/known_good/resolved_dependencies.py``) and the ``rust_coverage``
-   package were removed. Users relying on them need to switch to the DR-008
-   test workflow (``scripts/module_tests.py``) and the unified configuration
-   in ``bazel_common/unified.bazelrc``.
-
-S-CORE Platform scope
-^^^^^^^^^^^^^^^^^^^^^
-
-- **Version:** ``6d65a262c232`` (commit)
-- **Release notes**: `S-CORE platform release notes
-  `_
-
-Integrated Software Modules
----------------------------
-
-Baselibs
-~~~~~~~~
-
-- ...
-
-Communication
-~~~~~~~~~~~~~
-
-- ...
-
-Persistency
-~~~~~~~~~~~
-
-- ...
-
-Lifecycle
-~~~~~~~~~
-
-- ...
-
-Logging
-~~~~~~~
-
-- ...
-
-Time
-~~~~
-
-- ...
-
-Configuration Management
-~~~~~~~~~~~~~~~~~~~~~~~~
-
-- ...
-
-Kyron
-~~~~~
-
-- ...
-
-Reference integration
-~~~~~~~~~~~~~~~~~~~~~
+Reference integration: resolved-dependency overrides removed
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The module test mechanism of v0.9 was removed together with its generated files:
+``scripts/known_good/resolved_dependencies.py``,
+``scripts/known_good/module_patches.py`` and the ``rust_coverage`` package
+(`#398 `__).
+
+Action required: run module tests with ``scripts/module_tests.py`` and the
+configuration in ``bazel_common/unified.bazelrc`` instead.
+
+Reference integration: QNX image packages moved
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The common QNX build fragments and configuration files moved to
+``//images/qnx_common/build`` and ``//images/qnx_common/configs``; the
+``images/qnx_aarch64/configs`` package was removed and
+``images/qnx_x86_64/configs`` keeps only the x86-specific files
+(`#389 `__).
+
+Action required: update references to the old image paths in derived images.
+
+Platform: stakeholder requirement IDs renamed
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Platform ``v0.7.4`` renamed ``stkh_req__dependability__safety_features_1`` to
+``stkh_req__dependability__health_management``. Tests that still link the old
+ID make the documentation build fail with an unknown-link warning
+(`5d09c1b `__,
+`Platform v0.7.4 release notes `__).
+
+Action required: link tests to the new stakeholder requirement IDs.
+
+Baselibs: vaJson is the only JSON backend
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+``score/json`` uses vaJson as its only parser (v0.2.15) and writer (v0.2.16).
+The ``--@score_baselibs//score/json:writer_library`` flag was removed;
+``--@score_baselibs//score/json:base_library`` is a deprecated no-op that this
+repository still sets in ``.bazelrc`` and ``known_good.json``. The written JSON
+differs (for example ``true``/``false`` instead of ``1``/``0`` and different
+float formatting), which is why two Configuration Management unit tests are
+excluded in ``known_good.json``
+(`Baselibs v0.2.15 `__,
+`Baselibs v0.2.16 `__,
+`312fde3 `__).
+
+Action required: remove the ``base_library`` and ``writer_library`` flags from
+build configurations and do not compare JSON output against the old format.
+
+Persistency: KVS API and file format
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The integrated Persistency commit changes the public KVS API that applications
+use directly:
+
+- ``Kvs::reset_key`` was renamed to ``SetValueToDefault`` (C++) and
+  ``set_value_to_default`` (Rust), without a deprecated alias
+  (`persistency#585 `__,
+  `873238a `__,
+  `0e4c5be `__).
+- The KVS rejects untagged JSON; a defaults file must use the type-tagged
+  top-level envelope ``{"t":"obj","v":{...}}``
+  (`persistency#490 `__,
+  `c37c448 `__).
+- The C++ headers are included as ``score/kvs/kvs.h``, ``kvs_builder.h`` and
+  ``kvs_value.h`` from ``@score_persistency//score/kvs``, and the
+  ``KvsBuilder`` flags became enums (``Defaults``, ``KvsLoad``,
+  ``WorkingDir``). Configuration Management is adapted by a patch in this
+  repository
+  (`3467044 `__).
+
+Action required: rename ``reset_key`` calls, convert defaults files to the
+tagged envelope and update the KVS includes and builder calls.
+
+Lifecycle: Launch Manager configuration in milliseconds
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Lifecycle ``v0.9.0`` renamed all duration fields of the Launch Manager
+configuration to integer milliseconds, for example ``transition_timeout`` to
+``transition_timeout_ms`` and ``reporting_cycle`` to ``reporting_cycle_ms``.
+Configurations with the old keys fail the schema validation
+(`a575ce6 `__,
+`Lifecycle v0.9.0 release notes `__).
+
+Action required: rename the duration fields to ``*_ms`` and convert the values
+from seconds to milliseconds.
+
+🎯 Reference Integration scope
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 - **Version:** ``v0.10.0``
-- **Source / tag:** `Reference integration releases
-  `_
-
-- Added the two-stage DR-008 test workflow and removed the resolved-dependency
-  override mechanism.
-- Added SBOM generation.
-- Added showcase-based platform integration tests.
-- Executed Lifecycle, Logging and Persistency module tests for requirement
-  coverage.
-- Deduplicated QNX/Linux image definitions.
-
-Reference QNX image
-+++++++++++++++++++
-
-- Image definitions migrated to ``score_rules_imagefs`` ``0.1.0`` and
-  deduplicated between ``qnx_x86_64`` and ``qnx_aarch64``.
-
-Reference Red Hat AutoSD Linux image (Experimental)
-+++++++++++++++++++++++++++++++++++++++++++++++++++
-
-- Updated to a newer AutoSD OCI image.
-
-Reference Elektrobit corbos Linux for Safety Applications Linux image (Experimental)
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-- No functional changes in this release.
-
-Associated Infrastructure Modules
----------------------------------
-
-Process description
-~~~~~~~~~~~~~~~~~~~
-
-- **Version:** ``2.2.2`` (previously ``2.1.2``)
-- **Release notes**: `Process description releases
-  `_
-
-Docs-as-code
-~~~~~~~~~~~~
-
-- ...
-
-
-Tooling
-~~~~~~~
-
-- ...
-
-
-Tools
-~~~~~
-
-- ...
-
-Platform
-~~~~~~~~
-
-- ...
-
-ITF (Integration Testing Framework)
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-- ...
-
-Test Scenarios
-~~~~~~~~~~~~~~
-
-- ...
-
-Crates
-~~~~~~
-
-- ...
-
-Bazel CPP Toolchain
-~~~~~~~~~~~~~~~~~~~
-
-- ...
-
-Bazel Platforms
-~~~~~~~~~~~~~~~
-
-- ...
-
-Compatibility
-^^^^^^^^^^^^^
-
-- **Dependencies:** See `Incompatible Changes`_.
-
-Performed Verification
-^^^^^^^^^^^^^^^^^^^^^^
-
-- See latest verification: :need:`doc__platform_verification_report_latest`.
-
-Known Issues/Vulnerabilities and Bug Fixes
-------------------------------------------
-
-- See release notes of every module separately.
-- Several modules are integrated from commit hashes instead of published
-  registry releases.
-- Some module tests are excluded or relaxed under the clang coverage toolchain
-  (Time, Baselibs, Lifecycle); see ``metadata.test_notes`` in
-  ``known_good.json``.
-- The reference integration carries integration patches for Baselibs,
-  Communication, Configuration Management, Lifecycle, Logging, Persistency,
-  Platform, Time and ``rules_rust``. See the ``patches/`` directory for details.
-
-Upgrade Instructions
---------------------
-
-- Increase to newest bazel registry versions:
-  https://eclipse-score.github.io/bazel_registry_ui
-- Versions can be found under:
-  https://github.com/eclipse-score/reference_integration/blob/v0.10.0/known_good.json
-
-Contact Information
--------------------
+- **Source / tag:** `Reference integration `__
+- **Release notes:** `Reference integration release notes `__
+- **Platform Verification Report:** :need:`doc__platform_verification_report_latest`
+
+
+🧩 Integrated Software Modules
+-------------------------------
+
+.. list-table::
+   :header-rows: 1
+   :widths: 25 15 25 35
+
+   * - Name
+     - Version
+     - Release notes
+     - Module verification report
+   * - `Platform `__
+     - ``v0.7.4``
+     - `Release notes `__
+     - ---
+   * - `Baselibs `__
+     - ``v0.2.16``
+     - `Release notes `__
+     - :doc:`Verification report `
+   * - `Communication `__
+     - ``313f117 (unreleased)``
+     - ---
+     - ---
+   * - `Persistency `__
+     - ``41d7609 (unreleased)``
+     - ---
+     - :doc:`Verification report `
+   * - `Kyron `__
+     - ``52d4bef (unreleased)``
+     - ---
+     - ---
+   * - `Lifecycle `__
+     - ``v0.9.0``
+     - `Release notes `__
+     - :doc:`Verification report `
+   * - `Logging `__
+     - ``v0.2.5``
+     - `Release notes `__
+     - :doc:`Verification report `
+   * - `Time `__
+     - ``3723ce6 (unreleased)``
+     - ---
+     - ---
+   * - `Configuration Management `__
+     - ``d0dab01 (unreleased)``
+     - ---
+     - ---
+
+🔧 Associated Infrastructure Modules
+-------------------------------------
+
+.. list-table::
+   :header-rows: 1
+   :widths: 30 25 45
+
+   * - Name
+     - Version
+     - Release notes
+   * - `Crates `__
+     - ``v0.0.11``
+     - `Release notes `__
+   * - `ITF (Integration Testing Framework) `__
+     - ``v0.6.0``
+     - `Release notes `__
+   * - `Tools `__
+     - ``4b48cec (unreleased)``
+     - ---
+   * - `Tooling `__
+     - ``v2.2.3``
+     - `Release notes `__
+   * - `Bazel Platforms `__
+     - ``v1.1.0``
+     - `Release notes `__
+   * - `Test Scenarios `__
+     - ``v0.5.0``
+     - `Release notes `__
+   * - `Docs-as-code `__
+     - ``v8.6.0``
+     - `Release notes `__
+   * - `Process description `__
+     - ``v2.2.2``
+     - `Release notes `__
+   * - `Bazel CPP Toolchain `__
+     - ``v1.0.3``
+     - `Release notes `__
+
+💿 Images
+----------
 
-For any questions or support, please contact the *Project leads* or raise an
-issue/discussion.
+.. list-table::
+   :header-rows: 1
+   :widths: 30 15 15 40
+
+   * - Name
+     - Tarball
+     - How-to
+     - Description
+   * - Reference Linux x86_64 image
+     - ---
+     - `How-to `__
+     - Linux x86_64 Docker image bundling the S-CORE showcases.
+   * - Reference QNX x86_64 image
+     - ---
+     - `How-to `__
+     - QNX x86_64 image, run in QEMU.
+   * - Reference QNX aarch64 image
+     - ---
+     - `How-to `__
+     - QNX 8.0 aarch64 image, run in QEMU or on Raspberry Pi 4/5.
+   * - Reference Red Hat AutoSD Linux image (Experimental)
+     - ---
+     - `How-to `__
+     - Red Hat AutoSD x86_64 image.
+   * - Reference Elektrobit corbos Linux for Safety Applications image (Experimental)
+     - ---
+     - `How-to `__
+     - Elektrobit corbos Linux for Safety Applications (aarch64) image.
+
+🐞 Known Issues/Vulnerabilities and Bug Fixes
+----------------------------------------------
+
+- See the release notes of the individual modules.
+
+🚀 Upgrade Instructions
+------------------------
+
+- Increase to the newest Bazel registry versions: https://eclipse-score.github.io/bazel_registry_ui
+- Modules shown as *(unreleased)* are pinned to a commit and have no registry version; use the commit from ``known_good.json``.
+- The module versions of this release are listed in `known_good.json `__.
+
+
+📧 Contact Information
+-----------------------
+
+For any questions or support, please contact the *Project leads* or raise an issue/discussion.
 https://projects.eclipse.org/projects/automotive.score
+
diff --git a/docs/s_core_v_1/releases/releases.rst b/docs/s_core_v_1/releases/releases.rst
index 24781d9b830..f1e88729e79 100644
--- a/docs/s_core_v_1/releases/releases.rst
+++ b/docs/s_core_v_1/releases/releases.rst
@@ -22,6 +22,11 @@ Releases
 
 .. toctree::
    :titlesonly:
-   :glob:
 
-   release_note_*
+   release_note_score_v0_5_alpha
+   release_note_score_v0_5_beta
+   release_note_score_v0_6
+   release_note_score_v0_7
+   release_note_score_v0_8
+   release_note_score_v0_9
+   release_note_score_v0_10

From 12bd1f15073eef49f8a2d6d9ddd7daddb4bf7fac Mon Sep 17 00:00:00 2001
From: Arkadiusz Jedrzejewski 
Date: Fri, 30 Oct 2026 15:05:34 +0100
Subject: [PATCH 31/31] Add requested line to release note

---
 docs/s_core_v_1/releases/release_note_score_v0_10.rst | 1 +
 1 file changed, 1 insertion(+)

diff --git a/docs/s_core_v_1/releases/release_note_score_v0_10.rst b/docs/s_core_v_1/releases/release_note_score_v0_10.rst
index 002fc96cd29..82d69e144d4 100644
--- a/docs/s_core_v_1/releases/release_note_score_v0_10.rst
+++ b/docs/s_core_v_1/releases/release_note_score_v0_10.rst
@@ -405,6 +405,7 @@ from seconds to milliseconds.
 ----------------------------------------------
 
 - See the release notes of the individual modules.
+- Safety Package(s) not completed for modules and platform. To qualify the S-CORE platform these gaps must be filled.
 
 🚀 Upgrade Instructions
 ------------------------