You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Cut release 0.7.0. 0.6.0 shipped 2026-06-22. Since that tag main has 59 merged PRs and every package.xml is still at 0.6.0. This issue tracks the documentation work, the changelogs, the bugs that have to go in first, and the pre-tag checklist.
x-medkit-graph health model reworked. pipeline_status no longer reports "broken" for an edge with no /diagnostics coverage, metrics.source is the resolved publisher, per-function overrides now take effect, schema_version is "2.0.0" (feat(graph_provider): rework x-medkit-graph health model (#545) #546).
x-medkit-graphschema_version is "2.0.0". error_reason values node_offline, topic_stale and no_data_source are gone; the only reachable value is metrics_stale. A consumer that matched on the old values needs a change (feat(graph_provider): rework x-medkit-graph health model (#545) #546).
#528, #611, #612 and #613 are one subsystem and share aggregation.timeout_ms and the peer fan-out, so they are being fixed together rather than one at a time. #614 and #615 still need a decision on whether they block the tag.
ros2_medkit_graph_watchdog is not wired into the docs at all. It has a README and a design document in the package, and neither reaches the Sphinx build.
Add src/ros2_medkit_plugins/ros2_medkit_graph_watchdog/CHANGELOG.rst. The package has none.
Add the include for it in docs/changelog.rst.
Add the docs/design/ros2_medkit_graph_watchdog symlink to the package design/ directory.
Add it to the toctree in docs/design/index.rst.
Add docs/config/graph-watchdog.rst and list it in docs/config/index.rst. The 685-line package README is the only description of the detector configuration today.
Other gaps:
docs/config/fault-manager.rst does not mention the audit log. The five parameters from Tamper-evident append-only fault audit log #487 (audit_log.enabled, audit_log.transitions, audit_log.retention_max_records, audit_log.fail_closed, audit_log.database_path) are only in the package README.
src/ros2_medkit_fault_detection/CHANGELOG.rst dates its initial release as 0.6.0 (2026-06-22). The package landed after that tag and was never in it. Move the entry to 0.7.0.
Check the root README against what the release actually ships, in particular graph watchdog and the config-less OPC UA path.
Run python scripts/generate_verification.py and check the documentation build has no warnings. The build uses -W.
Changelogs
Target section: 0.7.0 (<date>).
Four packages have a Forthcoming section, and it covers only part of what changed:
ros2_medkit_gateway - one entry, 141 changed files.
ros2_medkit_fault_manager - one entry, 29 changed files.
ros2_medkit_fault_reporter - two entries.
ros2_medkit_graph_provider - two entries.
Changed with no entry at all:
ros2_medkit_opcua - 36 changed files, the largest gap after the gateway.
ros2_medkit_graph_watchdog - 49 changed files, no CHANGELOG file yet.
Two entries that must not be missed, both about the rosbag storage default:
The default bag format goes back to mcap in Declare the rosbag storage plugins, default to mcap, and serialize the plugin loader #610. This is operator-visible and breaking: bags land as .mcap instead of .db3 and the bulk-data download filename changes with it. The release notes are the only migration surface, so ros2_medkit_fault_manager needs an entry under 0.7.0. The last time this default moved (e526ce48, shipped in 0.6.0 as a crash-safety fix) the flip itself was never written down, which is how it went unnoticed for a release.
Correct the 0.4.0 entries. src/ros2_medkit_fault_manager/CHANGELOG.rst and src/ros2_medkit_gateway/CHANGELOG.rst both say under 0.4.0 "Default rosbag storage format changed from sqlite3 to mcap". That was reverted by e526ce48 and the code has shipped sqlite3 ever since, so the released changelog has claimed mcap for two releases while the default was sqlite3. Decide whether to correct the 0.4.0 lines in place or to note the reversal under 0.7.0.
ros2_medkit_msgs - 3 changed files.
ros2_medkit_sovd_service_interface, ros2_medkit_beacon_common, ros2_medkit_linux_introspection, ros2_medkit_param_beacon, ros2_medkit_topic_beacon - one changed file each, a version bump note is enough.
Version bump
scripts/release.sh bump 0.7.0. It updates 19 package.xml, core/version.hpp, docs/conf.py, docs/pyproject.toml, docs/Doxyfile, QUALITY_DECLARATION.md and the examples in docs/api/rest.rst.
scripts/release.sh verify 0.7.0 reports all OK.
Pre-tag
Decide what happens to the two packages that are not in rosdistro yet. 16 packages are released at 0.6.0-1; the tree has 19. ros2_medkit_fault_detection is only depended on by ros2_medkit_opcua, which stays out. ros2_medkit_graph_watchdog is a leaf and its test dependencies are all released. Either add both to the packages list in a rosdistro PR, or leave them out on purpose.
Full CI passes on Jazzy, Humble and Lyrical on release/0.7.0.
Tag 0.7.0 and bloom-release the supported distros (jazzy, humble, lyrical; ros2_medkit_opcua excluded).
Summary
Cut release 0.7.0. 0.6.0 shipped 2026-06-22. Since that tag
mainhas 59 merged PRs and everypackage.xmlis still at 0.6.0. This issue tracks the documentation work, the changelogs, the bugs that have to go in first, and the pre-tag checklist.Highlights since 0.6.0
New packages
ros2_medkit_fault_detection- shared, protocol-agnostic fault detection for gateway plugins: threshold, status bit and fault-code enum in one header-only evaluator (Shared fault-detection: threshold + status-bit + fault-code enum #486). Also added to the Docker image workspace (Add ros2_medkit_fault_detection to the Docker image workspace #494).ros2_medkit_graph_watchdog- gateway plugin that raises a fault for graph problems nothing reports today. Three detectors so far: QoS mismatch (feat(graph_watchdog): plugin scaffolding + QoS-mismatch detection #571), orphan (feat(graph_watchdog): orphan detector (GRAPH_ORPHAN) #578) and parameter drift (feat(graph_watchdog): param_drift detector (GRAPH_PARAM_DRIFT) #580).OPC UA and PLC
auto_browsewalks the address space and builds the SOVD tree from it (feat(opcua): recursive auto_browse -> SOVD tree from OPC UA address space #510), native Alarms and Conditions become faults with no configuration (feat(opcua): zero-config native A&C alarms -> faults #511), and identity, writability and fault triggers are read from the device itself (Config-less discovery: device-derived identity, A&C faults, AccessLevel writable, runtime fault triggers #544).order_code(feat(opcua): populate order_code identity field from the device nameplate #499).PLC_COMMS_LOSTfault when the connection drops (feat(opcua): raise PLC_COMMS_LOST fault on connection loss #507), alarms routed to separate faults by message substring (feat(opcua): route alarms to distinct faults by message substring #506),severityaccepted as an alias inevent_alarms(fix(opcua): accept severity as an alias in event_alarms #501), non-condition events dropped from the alarm path (fix(opcua): drop non-condition events from the alarm path #552).Faults
FaultReportercan be built from anrclcpp_lifecycle::LifecycleNode(Lifecycle Construction for Fault Reporter #556).Assets and manifest
assets:list or a CSV file (Manifest/CSV manual asset inventory #493).Gateway
x-medkit-graphhealth model reworked.pipeline_statusno longer reports"broken"for an edge with no/diagnosticscoverage,metrics.sourceis the resolved publisher, per-function overrides now take effect,schema_versionis"2.0.0"(feat(graph_provider): rework x-medkit-graph health model (#545) #546).plugins.<name>.*parameters are rebuilt into a nested object instead of a flat key, so nested plugin config works again (fix(gateway): reconstruct nested plugin config from dotted ROS params #518).server.executor_threadsis now real, and a cancel timeout is reported as a timeout (fix(gateway): make executor_threads real and report a cancel timeout as a timeout #593).Build, CI and tests
Behaviour changes to call out
x-medkit-graphschema_versionis"2.0.0".error_reasonvaluesnode_offline,topic_staleandno_data_sourceare gone; the only reachable value ismetrics_stale. A consumer that matched on the old values needs a change (feat(graph_provider): rework x-medkit-graph health model (#545) #546).operationIds were pluralized, so generated clients get renamed methods for those operations (Fix pluralized lifecycle status operationIds (closes #475) #497).Bugs to fix before the tag
dh_auto_test || true. This repeats on every Humble release until it is fixed.config:block is read by nobody.ManifestParser::parse_configis only called withroot["discovery"], so the setting is dropped without a word and unmanifested nodes leak into the tree in hybrid mode.clamp_thread_countandclamp_keep_alive_timeoutchange a mis-set value and log nothing. The config file and the running process disagree and there is no way to see it.cgroup_readerhandles only one of the three common cgroup layouts. Pure cgroup v1 returns nothing, andcgroupns=private, which is the Docker default, builds a path that does not exist.aggregation.timeout_msdefaults to 2000 ms and is used for both connect and read, so a big body cannot make it in time.Filed after this issue was written:
GET /faults/streamon an aggregating gateway returns 200 and streams nothing.#528, #611, #612 and #613 are one subsystem and share
aggregation.timeout_msand the peer fan-out, so they are being fixed together rather than one at a time. #614 and #615 still need a decision on whether they block the tag.Already fixed, close after checking:
Documentation
ros2_medkit_graph_watchdogis not wired into the docs at all. It has a README and a design document in the package, and neither reaches the Sphinx build.src/ros2_medkit_plugins/ros2_medkit_graph_watchdog/CHANGELOG.rst. The package has none.includefor it indocs/changelog.rst.docs/design/ros2_medkit_graph_watchdogsymlink to the packagedesign/directory.docs/design/index.rst.docs/config/graph-watchdog.rstand list it indocs/config/index.rst. The 685-line package README is the only description of the detector configuration today.Other gaps:
docs/config/fault-manager.rstdoes not mention the audit log. The five parameters from Tamper-evident append-only fault audit log #487 (audit_log.enabled,audit_log.transitions,audit_log.retention_max_records,audit_log.fail_closed,audit_log.database_path) are only in the package README.src/ros2_medkit_fault_detection/CHANGELOG.rstdates its initial release as0.6.0 (2026-06-22). The package landed after that tag and was never in it. Move the entry to 0.7.0.python scripts/generate_verification.pyand check the documentation build has no warnings. The build uses-W.Changelogs
Target section:
0.7.0 (<date>).Four packages have a
Forthcomingsection, and it covers only part of what changed:ros2_medkit_gateway- one entry, 141 changed files.ros2_medkit_fault_manager- one entry, 29 changed files.ros2_medkit_fault_reporter- two entries.ros2_medkit_graph_provider- two entries.Changed with no entry at all:
ros2_medkit_opcua- 36 changed files, the largest gap after the gateway.ros2_medkit_graph_watchdog- 49 changed files, no CHANGELOG file yet.ros2_medkit_integration_tests- 60 changed files.ros2_medkit_cmake- 23 changed files.ros2_medkit_serialization- 9 changed files.ros2_medkit_action_status_bridge,ros2_medkit_diagnostic_bridge- 7 changed files each.ros2_medkit_fault_detection- 5 changed files.ros2_medkit_log_bridge- 4 changed files.Two entries that must not be missed, both about the rosbag storage default:
mcapin Declare the rosbag storage plugins, default to mcap, and serialize the plugin loader #610. This is operator-visible and breaking: bags land as.mcapinstead of.db3and the bulk-data download filename changes with it. The release notes are the only migration surface, soros2_medkit_fault_managerneeds an entry under 0.7.0. The last time this default moved (e526ce48, shipped in 0.6.0 as a crash-safety fix) the flip itself was never written down, which is how it went unnoticed for a release.src/ros2_medkit_fault_manager/CHANGELOG.rstandsrc/ros2_medkit_gateway/CHANGELOG.rstboth say under 0.4.0 "Default rosbag storage format changed fromsqlite3tomcap". That was reverted bye526ce48and the code has shippedsqlite3ever since, so the released changelog has claimed mcap for two releases while the default was sqlite3. Decide whether to correct the 0.4.0 lines in place or to note the reversal under 0.7.0.ros2_medkit_msgs- 3 changed files.ros2_medkit_sovd_service_interface,ros2_medkit_beacon_common,ros2_medkit_linux_introspection,ros2_medkit_param_beacon,ros2_medkit_topic_beacon- one changed file each, a version bump note is enough.Version bump
scripts/release.sh bump 0.7.0. It updates 19package.xml,core/version.hpp,docs/conf.py,docs/pyproject.toml,docs/Doxyfile,QUALITY_DECLARATION.mdand the examples indocs/api/rest.rst.scripts/release.sh verify 0.7.0reports all OK.Pre-tag
0.6.0-1; the tree has 19.ros2_medkit_fault_detectionis only depended on byros2_medkit_opcua, which stays out.ros2_medkit_graph_watchdogis a leaf and its test dependencies are all released. Either add both to thepackageslist in a rosdistro PR, or leave them out on purpose.release/0.7.0.0.7.0and bloom-release the supported distros (jazzy, humble, lyrical;ros2_medkit_opcuaexcluded).