Skip to content

Commit 8b1969f

Browse files
authored
Release 0.7.0: changelogs, version bump (#644)
* docs: changelogs and package metadata for the 0.7.0 release Fill the 0.7.0 section of every package changelog from the 459 commits since 0.6.0. Thirteen packages had no entry at all; four carried a Forthcoming section whose bullets are kept and moved under the released heading. ros2_medkit_graph_watchdog gains its first changelog and the include that puts it in the aggregated docs page, so all nineteen packages are now covered there. ros2_medkit_fault_detection dated its initial release 0.6.0, a release it was never part of. The section moves to 0.7.0. Three entries are operator-visible and called out as breaking: the default rosbag storage format is mcap again, so recordings land as .mcap and the bulk-data download filename changes with them; the x-medkit-graph health model is at schema_version 2.0.0 with three error_reason values gone; and the lifecycle status operationId values were pluralized, which renames the matching methods in a generated client. The graph watchdog package description listed seven silent-fault classes. Five detectors are registered - qos_mismatch, orphan, node_death, param_drift and lifecycle_expectation - and the description now names those. GRAPH_TF_STALE and GRAPH_LATENCY_BUDGET keep their reserved codes and are described as undelivered in the changelog, as the package README already described them. Running the verification generator flips seven Scripts requirements to verified, matching the tests that already carry their @verifies tags. * chore: bump to 0.7.0 and fix the conf.py leg of the release script release.sh matched docs/conf.py with a double-quoted pattern while the file uses single quotes, so bump silently left it behind and verify reported the file as 'unknown' on every run. Both legs now accept either quote style. Checked by reverting conf.py to 0.6.0 and re-running bump: the patched script rewrites it, the previous one reports 'unknown -> 0.7.0' and leaves the file at 0.6.0. The 0.6.0 changelog of ros2_medkit_fault_manager gains the entry it never got: that release moved the default rosbag storage format back from mcap to sqlite3. The 0.4.0 entries in the gateway and fault_manager changelogs are accurate for the release they sit under - the default was mcap in 0.4.0 and 0.5.0 - and are left alone. All 19 package.xml, version.hpp, docs/conf.py, docs/pyproject.toml, docs/Doxyfile, QUALITY_DECLARATION.md and the REST examples read 0.7.0; 'release.sh verify 0.7.0' reports all versions consistent. * docs: correct the 0.7.0 entries a review panel found wrong * docs: scope the fault-trigger entry to what the code registers The routes exist on Apps only - there is no component path - and the engine is gated on a loaded plugin as well as on fault_triggers.enabled, so the default of true is necessary rather than sufficient. The poll interval is floored at 50 ms and a lower value is reported. * docs: state when the peer credential is actually presented On a forward it is the fallback: with forward_auth enabled and a caller credential present, the caller's token wins, so the peer keeps being told the end user. The entry claimed the gateway credential unconditionally. * docs: the installation page said binary packages do not exist yet They have since 0.3.0, and the README already tells the reader to apt install the gateway. The page now leads with the apt path and names the three packages that genuinely are not in the index: opcua, graph_watchdog and fault_detection. * docs: cover the OpenAPI derivation work in the 0.7.0 notes The release branch was cut before that work merged, so the largest change in 0.7.0 had no entry at all. Two items are breaking for a caller. An action execution now belongs to the entity it was started on, so an execution id no longer works as a global handle and reaching one through another entity answers 404. And GET on a scoped docs path is readable by viewer rather than admin, because the permission table is now derived from the route registrations rather than kept as a literal beside them. The rest is what the derivation buys and what changed on the wire beside it: corrected statuses on four paths, a Location that is sent and dereferenceable, new advertised URIs on entity detail, two added operation ids with none renamed and no route added or removed, and a status recorder whose sweep is driven from the served document rather than a list. The fault manager accepts the fault_code length it advertises, and a long code keeps its recording instead of losing it to a filename limit.
1 parent f1cc4ec commit 8b1969f

48 files changed

Lines changed: 254 additions & 65 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

QUALITY_DECLARATION.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ All packages in the repository share the same version number.
3333

3434
### Version Stability [1.ii]
3535

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

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

255-
**Caveat:** Version is 0.6.0 (pre-1.0.0, requirement 1.ii). The REST API is versioned (`/api/v1/`)
255+
**Caveat:** Version is 0.7.0 (pre-1.0.0, requirement 1.ii). The REST API is versioned (`/api/v1/`)
256256
and the package meets all other Level 3 requirements. The 1.0.0 release is planned after
257257
API validation through pilot deployments.

docs/Doxyfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# Used by Breathe extension to integrate with Sphinx
33

44
PROJECT_NAME = "ros2_medkit"
5-
PROJECT_NUMBER = "0.6.0"
5+
PROJECT_NUMBER = "0.7.0"
66
PROJECT_BRIEF = "SOVD Gateway for ROS 2"
77

88
# Input settings

docs/api/rest.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ Server Capabilities
7272
7373
{
7474
"name": "ROS 2 Medkit Gateway",
75-
"version": "0.6.0",
75+
"version": "0.7.0",
7676
"api_base": "/api/v1",
7777
"endpoints": [
7878
"GET /api/v1/health",
@@ -126,7 +126,7 @@ Server Capabilities
126126
"version": "1.0.0",
127127
"base_uri": "/api/v1",
128128
"vendor_info": {
129-
"version": "0.6.0",
129+
"version": "0.7.0",
130130
"name": "ros2_medkit"
131131
}
132132
}

docs/changelog.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ This page aggregates changelogs from all ros2_medkit packages.
3838

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

41+
.. include:: ../src/ros2_medkit_plugins/ros2_medkit_graph_watchdog/CHANGELOG.rst
42+
4143
.. include:: ../src/ros2_medkit_plugins/ros2_medkit_opcua/CHANGELOG.rst
4244

4345
.. include:: ../src/ros2_medkit_plugins/ros2_medkit_sovd_service_interface/CHANGELOG.rst

docs/conf.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@
4242
project_copyright = f'{datetime.now().year}, selfpatch'
4343
author = 'selfpatch Team'
4444

45-
version = '0.6.0'
46-
release = '0.6.0'
45+
version = '0.7.0'
46+
release = '0.7.0'
4747

4848
# -- General configuration ---------------------------------------------------
4949
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration

docs/installation.rst

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,24 @@ for your distribution:
4141
vendored copy as a fallback - no manual installation is needed. The build system
4242
automatically uses the vendored header when the system package is insufficient.
4343

44+
Installation from Binary Packages
45+
---------------------------------
46+
47+
ros2_medkit is in the ROS index, so most packages install with ``apt``:
48+
49+
.. code-block:: bash
50+
51+
sudo apt install ros-jazzy-ros2-medkit-gateway # or ros-humble- / ros-lyrical-
52+
ros2 launch ros2_medkit_gateway bringup.launch.py
53+
54+
``ros2_medkit_opcua`` is the one package not distributed this way; it is waiting
55+
on open62541pp being vendored and has to be built from source.
56+
4457
Installation from Source
4558
------------------------
4659

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

4963
1. **Create a workspace**
5064

docs/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "ros2-medkit-docs"
7-
version = "0.6.0"
7+
version = "0.7.0"
88
description = "Documentation for ROS 2 Medkit"
99
authors = [{ name = "bburda", email = "bartoszburda93@gmail.com" }]
1010
requires-python = ">=3.12"

docs/requirements/specs/scripts.rst

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,49 +3,49 @@ Scripts
33

44
.. req:: POST /{entity}/scripts
55
:id: REQ_INTEROP_040
6-
:status: open
6+
:status: verified
77
:tags: Scripts
88

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

1111
.. req:: GET /{entity}/scripts
1212
:id: REQ_INTEROP_041
13-
:status: open
13+
:status: verified
1414
:tags: Scripts
1515

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

1818
.. req:: GET /{entity}/scripts/{id}
1919
:id: REQ_INTEROP_042
20-
:status: open
20+
:status: verified
2121
:tags: Scripts
2222

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

2525
.. req:: DELETE /{entity}/scripts/{id}
2626
:id: REQ_INTEROP_043
27-
:status: open
27+
:status: verified
2828
:tags: Scripts
2929

3030
The endpoint shall delete the addressed script from the entity.
3131

3232
.. req:: POST /{entity}/scripts/{id}/executions
3333
:id: REQ_INTEROP_044
34-
:status: open
34+
:status: verified
3535
:tags: Scripts
3636

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

3939
.. req:: GET /{entity}/scripts/{id}/executions/{exec-id}
4040
:id: REQ_INTEROP_046
41-
:status: open
41+
:status: verified
4242
:tags: Scripts
4343

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

4646
.. req:: PUT /{entity}/scripts/{id}/executions/{exec-id}
4747
:id: REQ_INTEROP_047
48-
:status: open
48+
:status: verified
4949
:tags: Scripts
5050

5151
The endpoint shall control or modify the addressed script execution, if supported.

scripts/release.sh

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@ DOXYFILE="${REPO_ROOT}/docs/Doxyfile"
3737
QUALITY_DECL="${REPO_ROOT}/QUALITY_DECLARATION.md"
3838
REST_RST="${REPO_ROOT}/docs/api/rest.rst"
3939

40+
# Read one assignment out of docs/conf.py. Accepts either quote style and any
41+
# spacing around "="; the value is anchored to the closing quote so a suffixed
42+
# version is returned whole rather than truncated to its numeric prefix.
43+
conf_py_field() {
44+
grep -oP "^[[:space:]]*$1[[:space:]]*=[[:space:]]*[\"']\\K[^\"']*(?=[\"'][[:space:]]*\$)" "$CONF_PY" | head -1
45+
}
46+
4047
usage() {
4148
echo "Usage: $0 {bump <version>|verify [<version>]}"
4249
echo ""
@@ -98,9 +105,15 @@ cmd_bump() {
98105
# Update docs/conf.py version and release
99106
if [ -f "$CONF_PY" ]; then
100107
local old_conf
101-
old_conf=$(grep -oP '^version = "\K[0-9]+\.[0-9]+\.[0-9]+' "$CONF_PY" || echo "unknown")
102-
sed -i "s|^version = \"[0-9]\+\.[0-9]\+\.[0-9]\+\"|version = \"${target_version}\"|" "$CONF_PY"
103-
sed -i "s|^release = \"[0-9]\+\.[0-9]\+\.[0-9]\+\"|release = \"${target_version}\"|" "$CONF_PY"
108+
old_conf=$(conf_py_field version || echo "unknown")
109+
sed -i -E "s|^([[:space:]]*version[[:space:]]*=[[:space:]]*)[\"'][^\"']*[\"']|\\1'${target_version}'|" "$CONF_PY"
110+
sed -i -E "s|^([[:space:]]*release[[:space:]]*=[[:space:]]*)[\"'][^\"']*[\"']|\\1'${target_version}'|" "$CONF_PY"
111+
# sed exits 0 whether or not it substituted, so confirm the rewrite landed
112+
# rather than reporting a bump the file never received.
113+
if [ "$(conf_py_field version)" != "${target_version}" ] || [ "$(conf_py_field release)" != "${target_version}" ]; then
114+
echo " ERROR: docs/conf.py was not rewritten to ${target_version}" >&2
115+
return 1
116+
fi
104117
echo " docs/conf.py: ${old_conf} -> ${target_version}"
105118
fi
106119

@@ -187,10 +200,14 @@ cmd_verify() {
187200

188201
# Check docs/conf.py
189202
if [ -f "$CONF_PY" ]; then
190-
local conf_version
191-
conf_version=$(grep -oP '^version = "\K[0-9]+\.[0-9]+\.[0-9]+' "$CONF_PY" || echo "unknown")
203+
local conf_version conf_release
204+
conf_version=$(conf_py_field version || echo "unknown")
205+
conf_release=$(conf_py_field release || echo "unknown")
192206
if [ -n "$expected_version" ] && [ "$conf_version" != "$expected_version" ]; then
193-
echo " MISMATCH: docs/conf.py is ${conf_version}, expected ${expected_version}"
207+
echo " MISMATCH: docs/conf.py version is ${conf_version}, expected ${expected_version}"
208+
all_ok=false
209+
elif [ "$conf_release" != "$conf_version" ]; then
210+
echo " MISMATCH: docs/conf.py release is ${conf_release}, version is ${conf_version}"
194211
all_ok=false
195212
else
196213
echo " OK: docs/conf.py = ${conf_version}"

src/ros2_medkit_action_status_bridge/CHANGELOG.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22
Changelog for package ros2_medkit_action_status_bridge
33
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
44

5+
0.7.0 (2026-08-27)
6+
------------------
7+
* 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>`_)
8+
* 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>`_)
9+
* 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>`_)
10+
* Contributors: @bburda, @mfaferek93
11+
512
0.6.0 (2026-06-22)
613
------------------
714
* Initial release: generic action-status bridge. Watches every

0 commit comments

Comments
 (0)