Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions QUALITY_DECLARATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ All packages in the repository share the same version number.

### Version Stability [1.ii]

The current version is **0.6.0**.
The current version is **0.7.0**.
The package follows semver; the pre-1.0 version reflects that the public API may still evolve
based on early adopter feedback, not a lack of quality infrastructure.
The 1.0.0 release is planned after the API has been validated through pilot deployments.
Expand Down Expand Up @@ -240,7 +240,7 @@ Security issues can be reported via GitHub Security Advisories on the

| Requirement | Status | Notes |
|---|---|---|
| Version policy | Met | Semver, all packages at 0.6.0 |
| Version policy | Met | Semver, all packages at 0.7.0 |
| Stable version (>=1.0.0) | Caveat | Pre-1.0; API versioned, 1.0.0 planned post-pilot |
| Change requests | Met | All changes via PR |
| CI | Met | Build + test + coverage on every PR |
Expand All @@ -252,6 +252,6 @@ Security issues can be reported via GitHub Security Advisories on the
| Platform support | Met | Ubuntu Noble / ROS 2 Jazzy + Ubuntu Jammy / ROS 2 Humble + Ubuntu Resolute / ROS 2 Lyrical |
| Security policy | Met | REP-2006 compliant |

**Caveat:** Version is 0.6.0 (pre-1.0.0, requirement 1.ii). The REST API is versioned (`/api/v1/`)
**Caveat:** Version is 0.7.0 (pre-1.0.0, requirement 1.ii). The REST API is versioned (`/api/v1/`)
and the package meets all other Level 3 requirements. The 1.0.0 release is planned after
API validation through pilot deployments.
2 changes: 1 addition & 1 deletion docs/Doxyfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# Used by Breathe extension to integrate with Sphinx

PROJECT_NAME = "ros2_medkit"
PROJECT_NUMBER = "0.6.0"
PROJECT_NUMBER = "0.7.0"
PROJECT_BRIEF = "SOVD Gateway for ROS 2"

# Input settings
Expand Down
4 changes: 2 additions & 2 deletions docs/api/rest.rst
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ Server Capabilities

{
"name": "ROS 2 Medkit Gateway",
"version": "0.6.0",
"version": "0.7.0",
"api_base": "/api/v1",
"endpoints": [
"GET /api/v1/health",
Expand Down Expand Up @@ -126,7 +126,7 @@ Server Capabilities
"version": "1.0.0",
"base_uri": "/api/v1",
"vendor_info": {
"version": "0.6.0",
"version": "0.7.0",
"name": "ros2_medkit"
}
}
Expand Down
2 changes: 2 additions & 0 deletions docs/changelog.rst
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ This page aggregates changelogs from all ros2_medkit packages.

.. include:: ../src/ros2_medkit_plugins/ros2_medkit_graph_provider/CHANGELOG.rst

.. include:: ../src/ros2_medkit_plugins/ros2_medkit_graph_watchdog/CHANGELOG.rst

.. include:: ../src/ros2_medkit_plugins/ros2_medkit_opcua/CHANGELOG.rst

.. include:: ../src/ros2_medkit_plugins/ros2_medkit_sovd_service_interface/CHANGELOG.rst
4 changes: 2 additions & 2 deletions docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@
project_copyright = f'{datetime.now().year}, selfpatch'
author = 'selfpatch Team'

version = '0.6.0'
release = '0.6.0'
version = '0.7.0'
release = '0.7.0'

# -- General configuration ---------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
Expand Down
16 changes: 15 additions & 1 deletion docs/installation.rst
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,24 @@ for your distribution:
vendored copy as a fallback - no manual installation is needed. The build system
automatically uses the vendored header when the system package is insufficient.

Installation from Binary Packages
---------------------------------

ros2_medkit is in the ROS index, so most packages install with ``apt``:

.. code-block:: bash

sudo apt install ros-jazzy-ros2-medkit-gateway # or ros-humble- / ros-lyrical-
ros2 launch ros2_medkit_gateway bringup.launch.py

``ros2_medkit_opcua`` is the one package not distributed this way; it is waiting
on open62541pp being vendored and has to be built from source.

Installation from Source
------------------------

ros2_medkit is currently distributed as source code. Binary packages will be available in future releases.
Build from source to get every package, to run against an unreleased version, or
to develop against the tree.

1. **Create a workspace**

Expand Down
2 changes: 1 addition & 1 deletion docs/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "ros2-medkit-docs"
version = "0.6.0"
version = "0.7.0"
description = "Documentation for ROS 2 Medkit"
authors = [{ name = "bburda", email = "bartoszburda93@gmail.com" }]
requires-python = ">=3.12"
Expand Down
14 changes: 7 additions & 7 deletions docs/requirements/specs/scripts.rst
Original file line number Diff line number Diff line change
Expand Up @@ -3,49 +3,49 @@ Scripts

.. req:: POST /{entity}/scripts
:id: REQ_INTEROP_040
:status: open
:status: verified
:tags: Scripts

The endpoint shall upload a new diagnostic script or test script to the addressed entity.

.. req:: GET /{entity}/scripts
:id: REQ_INTEROP_041
:status: open
:status: verified
:tags: Scripts

The endpoint shall list all scripts stored on the addressed entity.

.. req:: GET /{entity}/scripts/{id}
:id: REQ_INTEROP_042
:status: open
:status: verified
:tags: Scripts

The endpoint shall return metadata and content information for the addressed script.

.. req:: DELETE /{entity}/scripts/{id}
:id: REQ_INTEROP_043
:status: open
:status: verified
:tags: Scripts

The endpoint shall delete the addressed script from the entity.

.. req:: POST /{entity}/scripts/{id}/executions
:id: REQ_INTEROP_044
:status: open
:status: verified
:tags: Scripts

The endpoint shall start an execution of the addressed script on the entity.

.. req:: GET /{entity}/scripts/{id}/executions/{exec-id}
:id: REQ_INTEROP_046
:status: open
:status: verified
:tags: Scripts

The endpoint shall return status and results for the addressed script execution.

.. req:: PUT /{entity}/scripts/{id}/executions/{exec-id}
:id: REQ_INTEROP_047
:status: open
:status: verified
:tags: Scripts

The endpoint shall control or modify the addressed script execution, if supported.
29 changes: 23 additions & 6 deletions scripts/release.sh
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,13 @@ DOXYFILE="${REPO_ROOT}/docs/Doxyfile"
QUALITY_DECL="${REPO_ROOT}/QUALITY_DECLARATION.md"
REST_RST="${REPO_ROOT}/docs/api/rest.rst"

# Read one assignment out of docs/conf.py. Accepts either quote style and any
# spacing around "="; the value is anchored to the closing quote so a suffixed
# version is returned whole rather than truncated to its numeric prefix.
conf_py_field() {
grep -oP "^[[:space:]]*$1[[:space:]]*=[[:space:]]*[\"']\\K[^\"']*(?=[\"'][[:space:]]*\$)" "$CONF_PY" | head -1
}

usage() {
echo "Usage: $0 {bump <version>|verify [<version>]}"
echo ""
Expand Down Expand Up @@ -98,9 +105,15 @@ cmd_bump() {
# Update docs/conf.py version and release
if [ -f "$CONF_PY" ]; then
local old_conf
old_conf=$(grep -oP '^version = "\K[0-9]+\.[0-9]+\.[0-9]+' "$CONF_PY" || echo "unknown")
sed -i "s|^version = \"[0-9]\+\.[0-9]\+\.[0-9]\+\"|version = \"${target_version}\"|" "$CONF_PY"
sed -i "s|^release = \"[0-9]\+\.[0-9]\+\.[0-9]\+\"|release = \"${target_version}\"|" "$CONF_PY"
old_conf=$(conf_py_field version || echo "unknown")
sed -i -E "s|^([[:space:]]*version[[:space:]]*=[[:space:]]*)[\"'][^\"']*[\"']|\\1'${target_version}'|" "$CONF_PY"
sed -i -E "s|^([[:space:]]*release[[:space:]]*=[[:space:]]*)[\"'][^\"']*[\"']|\\1'${target_version}'|" "$CONF_PY"
# sed exits 0 whether or not it substituted, so confirm the rewrite landed
# rather than reporting a bump the file never received.
if [ "$(conf_py_field version)" != "${target_version}" ] || [ "$(conf_py_field release)" != "${target_version}" ]; then
echo " ERROR: docs/conf.py was not rewritten to ${target_version}" >&2
return 1
fi
echo " docs/conf.py: ${old_conf} -> ${target_version}"
fi

Expand Down Expand Up @@ -187,10 +200,14 @@ cmd_verify() {

# Check docs/conf.py
if [ -f "$CONF_PY" ]; then
local conf_version
conf_version=$(grep -oP '^version = "\K[0-9]+\.[0-9]+\.[0-9]+' "$CONF_PY" || echo "unknown")
local conf_version conf_release
conf_version=$(conf_py_field version || echo "unknown")
conf_release=$(conf_py_field release || echo "unknown")
if [ -n "$expected_version" ] && [ "$conf_version" != "$expected_version" ]; then
echo " MISMATCH: docs/conf.py is ${conf_version}, expected ${expected_version}"
echo " MISMATCH: docs/conf.py version is ${conf_version}, expected ${expected_version}"
all_ok=false
elif [ "$conf_release" != "$conf_version" ]; then
echo " MISMATCH: docs/conf.py release is ${conf_release}, version is ${conf_version}"
all_ok=false
else
echo " OK: docs/conf.py = ${conf_version}"
Expand Down
7 changes: 7 additions & 0 deletions src/ros2_medkit_action_status_bridge/CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@
Changelog for package ros2_medkit_action_status_bridge
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

0.7.0 (2026-08-27)
------------------
* A deferred fault report is retried instead of dropped, and delivered promptly through a fast retry timer rather than waiting for the next ordinary cycle (`#472 <https://github.com/selfpatch/ros2_medkit/pull/472>`_)
* Silent parameter coercion is closed off, including a NaN that passed a ``FloatingPointRange`` descriptor and two integer narrowing paths where an out-of-range value wrapped back into the legal band before its own check ran. A value the node refuses or corrects is now reported rather than applied quietly (`#607 <https://github.com/selfpatch/ros2_medkit/pull/607>`_)
* Build and test only: the package is instrumented for coverage (`#582 <https://github.com/selfpatch/ros2_medkit/pull/582>`_), every integration launch test runs on its own DDS domain taken at run time (`#551 <https://github.com/selfpatch/ros2_medkit/pull/551>`_, `#597 <https://github.com/selfpatch/ros2_medkit/pull/597>`_), and the suite synchronises on bridge discovery before raising a fault instead of assuming the graph has settled (`#504 <https://github.com/selfpatch/ros2_medkit/pull/504>`_)
* Contributors: @bburda, @mfaferek93

0.6.0 (2026-06-22)
------------------
* Initial release: generic action-status bridge. Watches every
Expand Down
2 changes: 1 addition & 1 deletion src/ros2_medkit_action_status_bridge/package.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>ros2_medkit_action_status_bridge</name>
<version>0.6.0</version>
<version>0.7.0</version>
<description>Bridge node turning terminal ROS2 action goal states (aborted) into FaultManager faults</description>

<maintainer email="michal.faferek@selfpatch.ai">mfaferek93</maintainer>
Expand Down
9 changes: 9 additions & 0 deletions src/ros2_medkit_cmake/CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,15 @@
Changelog for package ros2_medkit_cmake
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

0.7.0 (2026-08-27)
------------------
* ``ROS_DOMAIN_ID`` isolation is allocated at run time instead of from a hand-maintained table. A test registered through ``medkit_add_gtest``, ``medkit_add_gmock``, ``medkit_add_launch_test``, ``medkit_add_pytest_test`` or ``medkit_add_wrapped_test`` takes a domain when it starts and holds it through an open socket for exactly as long as it runs, so a crash or a SIGKILL releases it the same way an ordinary exit does. The isolation reaches across packages, which a CTest ``RESOURCE_LOCK`` cannot, because colcon runs one ctest per package in parallel. ``medkit_test_needs_no_domain()`` opts out a test that creates no ROS node. The usable band excludes the domains whose RTPS port slice falls inside the kernel ephemeral port range (`#551 <https://github.com/selfpatch/ros2_medkit/pull/551>`_, `#597 <https://github.com/selfpatch/ros2_medkit/pull/597>`_)
* Launch tests are no longer registered in a system package build, where they failed as a group and were reported as passing anyway because bloom runs the test step permissively; the macro now owns their properties instead of each package setting them (`#608 <https://github.com/selfpatch/ros2_medkit/pull/608>`_, `#602 <https://github.com/selfpatch/ros2_medkit/issues/602>`_)
* clang-tidy analyses a package's translation units in parallel, with the job count capped for an 8 GB machine and packages serialised so the cap holds, cutting PR feedback time from about 56 minutes to about 35 (`#588 <https://github.com/selfpatch/ros2_medkit/pull/588>`_, `#590 <https://github.com/selfpatch/ros2_medkit/pull/590>`_)
* Every C++ package is instrumented for coverage, and every package that lints exports a compile database (`#582 <https://github.com/selfpatch/ros2_medkit/pull/582>`_)
* Sanitizer builds keep their asserts, and the build reports what ccache did (`#590 <https://github.com/selfpatch/ros2_medkit/pull/590>`_)
* Contributors: @bburda

0.6.0 (2026-06-22)
------------------
* ``ROS2MedkitTestDomain``: carve dedicated ``ROS_DOMAIN_ID`` ranges for the new log bridge (210-214) and action-status bridge (215-219) test suites out of the integration-tests range (`#422 <https://github.com/selfpatch/ros2_medkit/pull/422>`_)
Expand Down
2 changes: 1 addition & 1 deletion src/ros2_medkit_cmake/package.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>ros2_medkit_cmake</name>
<version>0.6.0</version>
<version>0.7.0</version>
<description>Shared CMake modules for ros2_medkit packages (multi-distro compat, ccache, linting)</description>
<maintainer email="bartoszburda93@gmail.com">bburda</maintainer>
<license>Apache-2.0</license>
Expand Down
8 changes: 8 additions & 0 deletions src/ros2_medkit_diagnostic_bridge/CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,14 @@
Changelog for package ros2_medkit_diagnostic_bridge
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

0.7.0 (2026-08-27)
------------------
* The ``hardware_id`` of a diagnostic message is passed through as the fault's source id, so a fault raised from ``/diagnostics`` is attributed to the device the publisher named rather than to the bridge (`#622 <https://github.com/selfpatch/ros2_medkit/pull/622>`_)
* A fault code can be extracted from a diagnostic message's key/value attributes, so a publisher that already carries its own code no longer has to encode it in the message name (`#527 <https://github.com/selfpatch/ros2_medkit/pull/527>`_)
* The Humble fallback warning builds again (`#622 <https://github.com/selfpatch/ros2_medkit/pull/622>`_)
* Build and test only: the package is instrumented for coverage (`#582 <https://github.com/selfpatch/ros2_medkit/pull/582>`_), every integration launch test runs on its own DDS domain taken at run time (`#551 <https://github.com/selfpatch/ros2_medkit/pull/551>`_, `#597 <https://github.com/selfpatch/ros2_medkit/pull/597>`_), and the suite re-emits and polls until the fault surfaces instead of asserting once against a graph that may not have settled (`#504 <https://github.com/selfpatch/ros2_medkit/pull/504>`_)
* Contributors: @bburda, @mfaferek93, @nnarain

0.6.0 (2026-06-22)
------------------
* Tests: label ``test_integration`` as an integration test so it runs in the integration suite instead of the unit set (`#443 <https://github.com/selfpatch/ros2_medkit/pull/443>`_)
Expand Down
2 changes: 1 addition & 1 deletion src/ros2_medkit_diagnostic_bridge/package.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>ros2_medkit_diagnostic_bridge</name>
<version>0.6.0</version>
<version>0.7.0</version>
<description>Bridge node converting ROS2 /diagnostics to FaultManager faults</description>

<maintainer email="michal.faferek@selfpatch.ai">mfaferek93</maintainer>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@
Changelog for package ros2_medkit_beacon_common
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

0.7.0 (2026-08-27)
------------------
* Build and test only: the package is instrumented for coverage (`#582 <https://github.com/selfpatch/ros2_medkit/pull/582>`_), and its tests take a DDS domain at run time from the shared allocator instead of a hand-maintained per-package pool (`#597 <https://github.com/selfpatch/ros2_medkit/pull/597>`_)
* Contributors: @bburda

0.6.0 (2026-06-22)
------------------
* No functional changes; version bump for the coordinated 0.6.0 release.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>ros2_medkit_beacon_common</name>
<version>0.6.0</version>
<version>0.7.0</version>
<description>Shared library for ros2_medkit beacon discovery plugins</description>

<maintainer email="bartoszburda93@gmail.com">bburda</maintainer>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,14 @@
Changelog for package ros2_medkit_linux_introspection
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

0.7.0 (2026-08-27)
------------------
* Container CPU and memory limits are reported on every common cgroup layout, not just one. The reader parses the cgroup v1 line format alongside v2, and resolves the limit files under both ``cgroupns=host`` and ``cgroupns=private`` - the latter being the Docker default, where the container sees its own cgroup mounted directly at ``/sys/fs/cgroup`` and the previously built path did not exist. A limit that could not be read is now distinguished from a container that genuinely has no limit, instead of both being reported as unlimited (`#637 <https://github.com/selfpatch/ros2_medkit/pull/637>`_, `#604 <https://github.com/selfpatch/ros2_medkit/issues/604>`_)
* Limits are read from the cgroup that owns them rather than from the process's own leaf, a legacy controller's limit is no longer outranked by a hierarchy that does not set one, and a limit file is read to its end instead of to the first short read (`#637 <https://github.com/selfpatch/ros2_medkit/pull/637>`_)
* Containers are detected per process rather than once for the whole node, and the ctest suite exercises every supported cgroup layout against synthetic hierarchies (`#637 <https://github.com/selfpatch/ros2_medkit/pull/637>`_)
* Build and test only: the package is instrumented for coverage (`#582 <https://github.com/selfpatch/ros2_medkit/pull/582>`_), and its tests are opted out of DDS domain allocation, reading synthetic /proc and cgroup trees rather than creating a ROS node (`#597 <https://github.com/selfpatch/ros2_medkit/pull/597>`_)
* Contributors: @bburda

0.6.0 (2026-06-22)
------------------
* No functional changes; version bump for the coordinated 0.6.0 release.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>ros2_medkit_linux_introspection</name>
<version>0.6.0</version>
<version>0.7.0</version>
<description>Linux introspection plugins for ros2_medkit gateway - procfs, systemd, and container</description>
<maintainer email="bartoszburda93@gmail.com">bburda</maintainer>
<license>Apache-2.0</license>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@
Changelog for package ros2_medkit_param_beacon
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

0.7.0 (2026-08-27)
------------------
* Build and test only: every integration launch test runs on its own DDS domain, taken when the test starts and released when it ends, so a crash frees the domain the same way an ordinary exit does (`#551 <https://github.com/selfpatch/ros2_medkit/pull/551>`_, `#597 <https://github.com/selfpatch/ros2_medkit/pull/597>`_). The usable band excludes the domains whose RTPS port slice falls inside the kernel ephemeral port range, where any process on the machine can steal a port and kill a node with a bind failure
* Build: the package is instrumented for coverage (`#582 <https://github.com/selfpatch/ros2_medkit/pull/582>`_)
* Contributors: @bburda

0.6.0 (2026-06-22)
------------------
* No functional changes; version bump for the coordinated 0.6.0 release.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>ros2_medkit_param_beacon</name>
<version>0.6.0</version>
<version>0.7.0</version>
<description>Parameter-based beacon discovery plugin for ros2_medkit gateway</description>

<maintainer email="bartoszburda93@gmail.com">bburda</maintainer>
Expand Down
Loading
Loading