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/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/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/.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/.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 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 diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 2e2835f4fe3..30203a583c9 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -14,18 +14,26 @@ "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.1/source.json": "cf725267cbacc5f028ef13bb77e7f2c2e0066923a4dab1025e4a0511b1ed258a", + "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", "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", @@ -42,14 +50,14 @@ "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", "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", @@ -59,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", @@ -72,7 +81,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", @@ -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", @@ -212,7 +222,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", @@ -223,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", @@ -241,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", @@ -255,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", @@ -280,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", @@ -303,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", @@ -336,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", @@ -349,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", @@ -356,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", @@ -378,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", @@ -399,13 +446,18 @@ "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", - "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", @@ -425,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", @@ -443,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", @@ -476,7 +533,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", @@ -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", @@ -496,7 +553,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", @@ -514,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", @@ -543,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", @@ -555,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", @@ -564,7 +627,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", @@ -601,15 +663,23 @@ "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", "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", @@ -625,18 +695,19 @@ "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", "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", "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", @@ -649,7 +720,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", @@ -658,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", @@ -738,7 +810,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", @@ -746,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", @@ -767,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", @@ -786,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", @@ -802,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", @@ -827,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", @@ -839,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", @@ -846,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", @@ -862,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", @@ -880,12 +985,17 @@ "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", - "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", @@ -904,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", @@ -921,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", @@ -949,7 +1064,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", @@ -957,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", @@ -965,7 +1080,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", @@ -982,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", @@ -1009,12 +1127,20 @@ "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/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", "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", @@ -1025,6 +1151,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", @@ -1037,13 +1165,13 @@ "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", "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", @@ -1067,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": {}, @@ -1189,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", @@ -1510,7 +1643,7 @@ "@@aspect_tools_telemetry+//:extension.bzl%telemetry": { "general": { "bzlTransitiveDigest": "gA7tPEdJXhskzPIEUxjX9IdDrM6+WjfbgXJ8Ez47umk=", - "usagesDigest": "Qe1lA0prPNt87OXoXq3fzmffG9RmcuqdmLdwKVAOUnc=", + "usagesDigest": "aiWShUDjoNv1aayeGTTvqXz2Y/TSC0zLzUPpjC916Jo=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, @@ -1520,6 +1653,7 @@ "attributes": { "deps": { "aspect_rules_lint": "2.5.0", + "aspect_rules_esbuild": "0.23.0", "aspect_tools_telemetry": "0.2.8" } } @@ -1541,7 +1675,7 @@ }, "@@bazel_jar_jar+//internal:non_module_deps.bzl%non_module_deps": { "general": { - "bzlTransitiveDigest": "HfYvHyph4US1Rb9jKW7AUfDbE5p9915R85CJ0c14mrk=", + "bzlTransitiveDigest": "yY4JZwLqlWjGdqgeYKwhn5LxsFmnACDn0uA/vYnrYVQ=", "usagesDigest": "P1uSZ4XnqOp90Mkh0A4Nrjx12Bgz/iceROnSbTsawGk=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -1655,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": {}, @@ -1864,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": [ @@ -1909,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": [] } }, @@ -2167,126 +1927,6 @@ "recordedRepoMappingEntries": [] } }, - "@@rules_apple+//apple:apple.bzl%provisioning_profile_repository_extension": { - "general": { - "bzlTransitiveDigest": "NcCruFgaVG8TOGmWY57IFfvqi/kgV8TWUht9jzdbxII=", - "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=", @@ -3695,7 +3335,7 @@ "@@rules_nodejs+//nodejs:extensions.bzl%node": { "general": { "bzlTransitiveDigest": "4pUxCNc22K4I+6+4Nxu52Hur12tFRfa1JMsN5mdDv60=", - "usagesDigest": "+Q1iBvxUCNrDBPl7RSp1m8ia6iWfULbEIgocScokBtY=", + "usagesDigest": "KC7HyKRhcVBxLzBZ154+/svI34MlSgynA4NSElgMXaI=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, @@ -11148,7 +10788,7 @@ }, "@@rules_rust+//crate_universe/private:internal_extensions.bzl%cu_nr": { "general": { - "bzlTransitiveDigest": "gJFTSrkFabveIiWVE5fBJ7+WVJC4WdpWiFteWxRjbic=", + "bzlTransitiveDigest": "NRlprWw35DfgCebgqn1TtCp+nk0JTpyOzUUmi+3dlk8=", "usagesDigest": "1ieIYuafZ1pmP+ncVvISMfB3Em0hv9LCmCRwIH7gL8E=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -11303,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=", @@ -12248,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" + ] + } + } + } } diff --git a/bazel_common/score_modules_target_sw.MODULE.bazel b/bazel_common/score_modules_target_sw.MODULE.bazel index 88b152bf7d1..a394cafa2d2 100644 --- a/bazel_common/score_modules_target_sw.MODULE.bazel +++ b/bazel_common/score_modules_target_sw.MODULE.bazel @@ -15,15 +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") @@ -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", ) @@ -43,7 +44,7 @@ git_override( bazel_dep(name = "score_persistency") git_override( module_name = "score_persistency", - commit = "961c0a0989755a1e0fe8de55e83c0a44e2e20b56", + commit = "41d76090c7d0b05068cdc5bb22ef2e9f3571906a", patch_strip = 1, patches = [ "//patches/persistency:003-undev-deps-for-root-module.patch", @@ -54,18 +55,18 @@ 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", ) 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", + "//patches/lifecycle:003-dev-only-codeql-pip-hub.patch", ], remote = "https://github.com/eclipse-score/lifecycle.git", ) @@ -73,10 +74,11 @@ 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", + "//patches/logging:003-relative-verification-report-links.patch", ], remote = "https://github.com/eclipse-score/logging.git", ) @@ -102,6 +104,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/bazel_common/score_modules_tooling.MODULE.bazel b/bazel_common/score_modules_tooling.MODULE.bazel index c0f401f18a7..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") @@ -60,24 +55,21 @@ 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") -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/_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..119377a9a2c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -74,8 +74,24 @@ 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, } + +# 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/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/_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/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_10.rst b/docs/s_core_v_1/releases/release_note_score_v0_10.rst new file mode 100644 index 00000000000..82d69e144d4 --- /dev/null +++ b/docs/s_core_v_1/releases/release_note_score_v0_10.rst @@ -0,0 +1,423 @@ +.. + # ******************************************************************************* + # 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 (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: draft + :safety: QM + :security: YES + :realizes: wp__platform_sw_release_note + :version: 1 + +| **Platform Name:** 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). + +.. 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 +-------------- + +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 +---------------- + +New infrastructure module: Tools +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +``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 `__). + +Integration Strategy (DR-008) test 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 generates an SBOM with +`score_sbom `__ ``0.1.1`` and uploads it +as a CI build artifact +(`#304 `__, +`#339 `__, +`#353 `__). + +Reference images +~~~~~~~~~~~~~~~~ + +- 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 +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +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 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The Lifecycle integration tests, the Logging component tests and the Persistency +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 + (`#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 `__). + +💥 Breaking Changes +-------------------- + +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 `__ +- **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 +---------- + +.. 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. +- Safety Package(s) not completed for modules and platform. To qualify the S-CORE platform these gaps must be filled. + +🚀 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/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..f1e88729e79 100644 --- a/docs/s_core_v_1/releases/releases.rst +++ b/docs/s_core_v_1/releases/releases.rst @@ -17,6 +17,16 @@ Releases .. toctree:: :titlesonly: - :glob: - * + Release-wide Progress Overview + +.. toctree:: + :titlesonly: + + 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 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/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/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")) 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_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), ( 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..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 @@ -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); } @@ -237,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 + "}"; @@ -346,7 +352,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); } 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/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:?}"))?; 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..207e41fc540 100644 --- a/known_good.json +++ b/known_good.json @@ -5,13 +5,11 @@ "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/...", - "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", @@ -37,7 +35,7 @@ "//..." ] }, - "hash": "ee40fece5abacb28ea641b448446a04175038b17" + "version": "0.2.16" }, "score_communication": { "repo": "https://github.com/eclipse-score/communication.git", @@ -47,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/...", @@ -93,7 +92,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 +104,10 @@ ], "test_args": [ "--config=per-x86_64-linux", - "//:test_kvs_cpp", - "//score/kvs/rust_kvs:tests" + "//:unit_tests" ] }, - "hash": "961c0a0989755a1e0fe8de55e83c0a44e2e20b56" + "hash": "41d76090c7d0b05068cdc5bb22ef2e9f3571906a" }, "score_kyron": { "repo": "https://github.com/eclipse-score/kyron.git", @@ -126,26 +123,25 @@ "//src/..." ] }, - "hash": "90fb90258f49f17a504d41262634d43608f28ccc" + "hash": "52d4bef3d1822f82199d72e58e815b9e43406fe6" }, "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" + "//patches/lifecycle:002-undev-integration-test-deps.patch", + "//patches/lifecycle:003-dev-only-codeql-pip-hub.patch" ], "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" }, @@ -161,12 +157,13 @@ "//..." ] }, - "hash": "85da2168328d17a3cf53791ebf93534e5ed921fc" + "hash": "2c3a919452b0f81a016c6c8783254d7d0189d0a9" }, "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/...", @@ -177,8 +174,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/..." ], @@ -194,7 +195,7 @@ "-//score/test/component/..." ] }, - "hash": "3d9896611baf4e0d018032e5cb999941b2602dbd" + "hash": "cda5a5ba57dffe3aa109e518e47f0ada692b3573" }, "score_time": { "repo": "https://github.com/eclipse-score/time.git", @@ -231,7 +232,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/...", @@ -244,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" ], @@ -288,10 +296,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", @@ -301,15 +307,18 @@ "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", - "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/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/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", + ], 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()) + { 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/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") + 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 = 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: 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, ) 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 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", ) 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) 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()
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()
diff --git a/showcases/simple_lifecycle/configs/launch_manager_config.json b/showcases/simple_lifecycle/configs/launch_manager_config.json
index 1f9e1b87539..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": 0.5
-                }
-            },
+            "activation_retry_attempts": 1,
+            "activation_retry_delay_ms": 500,
             "sandbox": {
                 "uid": 0,
                 "gid": 0,
@@ -22,7 +18,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 +31,7 @@
             }
         },
         "run_target": {
-            "transition_timeout": 5,
+            "transition_timeout_ms": 5000,
             "recovery_action": {
                 "switch_run_target": {
                     "run_target": "fallback_run_target"
@@ -43,7 +39,7 @@
             }
         },
         "alive_supervision" : {
-            "evaluation_cycle": 0.5
+            "evaluation_cycle_ms": 500
         }
     },
     "components": {
@@ -112,9 +108,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