Releases: selfpatch/ros2_medkit
v0.5.0
Highlights
Cross-gateway peer aggregation
A gateway can now aggregate entities and their resources across multiple peer gateways. The SOVD entity model was aligned and multi-instance peer aggregation added, so a single gateway can present entities hosted on its peers. Per-entity resource handlers fan out to peers, with Component routing that distinguishes hierarchical from leaf Components and annotates responses with provenance and warnings. App-to-Component binding is read from the SOVD is-located-on relationship. Local-only entities skip the fan-out path. Component /logs and /bulk-data aggregate from hosted apps' FQNs, and per-entity fault GET/DELETE is scoped by hosted-app FQNs. (#327, #370, #372, #374, #383, #394, #401)
Protocol plugins: OPC UA and the SOVD Service Interface
OPC UA (ros2_medkit_opcua) bridges an OPC UA server into medkit, including a native AlarmConditionType subscription bridge for OPC UA alarm conditions. Source build only for now: the plugin fetches open62541pp at build time, which the ROS buildfarm does not allow, so it is excluded from the binary (apt) release until the dependency is vendored (#415). (#365, #387)
SOVD Service Interface (ros2_medkit_sovd_service_interface) exposes gateway capabilities as ROS 2 services for external integrations. The VDA 5050 message definitions that landed alongside it were removed again before this release as unused. (#331)
Per-entity providers and gateway internals
The gateway gains per-entity provider interfaces - DataProvider, OperationProvider, and FaultProvider - so each entity can supply its own data, operations, and faults. A new core/ layer scaffolds provider injection, gateway managers become pure C++ behind Transport adapters with discovery split out and graph-event-driven refresh, and topic data is served through a pool-backed TopicDataProvider architecture. (#355, #384, #392, #397)
Typed DTO contract and OpenAPI alignment
HTTP responses are now produced from a typed DTO contract that also drives the OpenAPI schema, keeping the served spec aligned with handler implementations. Vendor-specific fields are nested under x-medkit on SOVD endpoint payloads. (#403, #390, #313, #329)
Plugin API isolation and change notifications
httplib is removed from the plugin-facing API and headers, vendored as a build-farm fallback, with a purity gate that keeps it out of plugin-facing headers. Plugins can signal discovery changes via notify_entities_changed and contribute manifest fragments. Plugin and gateway config can be supplied from YAML, including YAML array parameters declared from --params-file. (#347, #411, #377, #350, #363)
Container images on GHCR
ros2_medkit now ships a Dockerfile and publishes container images to GHCR via a CI workflow. (#343)
Quality gate, hardened warnings, and Lyrical Luth
A new quality.yml CI workflow runs sanitizers and decoupled clang-tidy. Compiler warning flags are centralized and hardened across the build. The CI matrix swaps ROS 2 Rolling for Lyrical Luth on Ubuntu 26.04. (#348, #357, #405)
Stability and reliability
Several concurrency and lifecycle fixes: a timed_mutex with a 3s timeout prevents permanent thread-pool exhaustion, the configurations endpoint deadlock on nodes without a parameter service is resolved, snapshot growth is bounded by three-layer protection, the fault transport runs on its own executor, and SIGSEGV on shutdown in plugins and demo nodes is fixed. (#333, #323, #324, #402, #361)
What's Changed
Features
- feat: SOVD entity model alignment and multi-instance peer aggregation by @bburda in #327
- feat(vda5050): add VDA 5050 msgs + ros2_medkit Service Interface plugin by @mfaferek93 in #331
- feat: add per-entity provider interfaces (DataProvider, OperationProvider, FaultProvider) by @bburda in #355
- feat(plugins): add ros2_medkit_opcua plugin by @mfaferek93 in #365
- ros2_medkit_opcua: native AlarmConditionType subscription bridge by @mfaferek93 in #387
- feat: add cross-gateway peer fan-out to all per-entity resource handlers by @bburda in #372
- feat(plugins): notify_entities_changed + manifest fragments by @bburda in #377
- feat(data): pool-backed TopicDataProvider architecture by @bburda in #384
- feat(gateway): add GET /apps/{id}/belongs-to discovery endpoint by @bburda in #398
- feat(gateway): expose entity context on /faults/stream SSE events by @bburda in #400
- feat(gateway): typed DTO contract for HTTP responses and OpenAPI schema by @bburda in #403
Bug Fixes & Improvements
- fix: merge pipeline fixes, flat entity tree, trigger resolution by @bburda in #310
- fix: allow add_layer() after pipeline execute for plugin registration by @bburda in #311
- fix: suppress root-namespace heuristic entities and orphan apps by @bburda in #312
- fix: align OpenAPI schemas with actual handler responses by @bburda in #313
- fix: prevent subscription teardown crashes and fix flaky tests by @bburda in #317
- fix(gateway): prevent configurations endpoint deadlock on nodes without parameter service by @mfaferek93 in #323
- fix: three-layer protection against unbounded snapshot growth by @bburda in #324
- fix(gateway): use entity cache for detail endpoints instead of DiscoveryManager by @mfaferek93 in #326
- fix(gateway): correct OpenAPI schemas to match handler implementations by @bburda in #329
- fix(gateway): use timed_mutex with 3s timeout to prevent permanent thread pool exhaustion by @mfaferek93 in #333
- fix: resolve flaky test_resource_change_notifier and Humble demo node SIGSEGV by @bburda in #345
- Abstract httplib from plugin API, vendor as build farm fallback by @bburda in #347
- fix(gateway): plugin config from YAML, thread-safety, CI stability by @bburda in #350
- fix(linux_introspection): declare pkg-config as buildtool_depend by @bburda in #353
- fix: prevent SIGSEGV on shutdown in plugins and demo nodes by @bburda in #361
- fix(plugin_manager): declare YAML array params from --params-file by @bburda in #363
- fix(aggregation): read app-to-component binding from SOVD is-located-on by @bburda in #370
- fix(aggregation): hierarchical/leaf Component routing with provenance and warnings by @bburda in #374
- fix(updates): seed Pending state on register so /updates/{id}/status returns 200 by @bburda in #379
- fix(aggregation): skip per-entity fan-out for local-only entities by @bburda in #383
- Nest x-medkit vendor fields on SOVD endpoint payloads by @bburda in #390
- refactor(gateway): introduce core/ layer scaffolding for provider injection by @bburda in #392
- fix(gateway): aggregate component /logs and /bulk-data from hosted apps' fqns by @bburda in #394
*...
v0.4.0
Highlights
Resource locking
Acquire, release, and extend locks with session tracking and automatic expiration. Lock enforcement is applied to all mutating handlers (PUT, POST, DELETE), with per-entity lock scopes configurable via manifest YAML. Plugins can access lock state via PluginContext. Cyclic subscriptions are automatically cleaned up on lock expiry. (#287)
Diagnostic scripts
Upload, list, execute, and control diagnostic scripts via REST. The ScriptProvider plugin interface lets you bring your own execution backend. The built-in DefaultScriptProvider supports manifest-defined and filesystem-uploaded scripts with argument passing, timeout enforcement, and concurrent execution limits. RBAC guards all operations. (#286, #304)
Condition-based triggers
Event-driven push notifications for resource changes. Define triggers with conditions (OnChange, OnChangeTo, EnterRange, LeaveRange) on any resource collection - data, faults, logs, configurations, or update-status. Triggers fire via SSE and persist across gateway restarts via SQLite. Plugin authors can add custom delivery transports via TriggerTransportProvider. (#293)
Multi-collection cyclic subscriptions
Cyclic subscriptions now support all resource collections - data, faults, logs, configurations, and update-status. Previously limited to data topics, you can now stream any resource type via SSE with configurable intervals. Function-level cyclic subscriptions aggregate from child apps. (#254, #270)
OpenAPI 3.1.0 spec and Swagger UI
The gateway now serves a full OpenAPI 3.1.0 specification at /api/v1/docs with per-entity-type sub-specs, named component schemas, clean operationId values, and endpoint descriptions suitable for client code generation. Swagger UI can be embedded at build time with -DENABLE_SWAGGER_UI=ON. (#271, #302)
Log endpoints
LogManager with /rosout ring buffer and plugin delegation via LogProvider. New /logs and /logs/configuration endpoints with area and function-level namespace aggregation. (#245)
Layered merge pipeline
Hybrid discovery now uses a multi-layer merge pipeline with per-layer, per-field-group merge policies. Manifest, runtime, and plugin layers each contribute entities that are merged according to configurable rules. Gap-fill heuristics are controllable via allow_heuristic_* options. (#246, #258)
Plugins
GraphProviderPlugin (ros2_medkit_graph_provider) builds pipeline graph documents for functions with topic-level metrics - frequency (Hz), latency (ms), drop rate - and pipeline health analysis (healthy/degraded/error edges, bottleneck detection). Exposed via x-medkit-graph vendor extension endpoints on functions. (#270, #289)
Beacon discovery plugins enrich entities with runtime metadata that the ROS 2 graph API cannot provide - transport type, process IDs, hostnames, function membership, and more. TopicBeaconPlugin (push-based): nodes publish MedkitDiscoveryHint messages. ParameterBeaconPlugin (pull-based): the plugin polls node parameters. Both feed into the merge pipeline's plugin layer. (#264)
Linux introspection plugins - procfs, systemd, and container - expose process-level diagnostics (CPU, memory, file descriptors, cgroup limits) via x-medkit-* vendor extension endpoints. (#263)
Plugin API bumped to v4 with ScriptProvider, locking API, and extended PluginContext (entity snapshot, fault listing, sampler registration, child app access).
What's Changed
Features
- feat(logging): add Log Entries REST API endpoints by @bburda in #245
- Add layered MergePipeline for multi-source entity discovery by @bburda in #246
- Support all SOVD resource collections in cyclic subscriptions by @bburda in #254
- feat: Linux introspection plugins (procfs, systemd, container) by @bburda in #263
- feat(discovery): add beacon-based discovery plugins (topic + parameter) by @bburda in #264
- feat: add /docs endpoint with OpenAPI capability description by @bburda in #271
- feat(locking): implement SOVD resource locking by @bburda in #287
- feat: SOVD diagnostic scripts with plugin-extensible ScriptProvider by @bburda in #286
- feat(triggers): implement event-based conditional data delivery by @bburda in #293
- feat(openapi): add response schemas, component types, and operationIds for client code generation by @bburda in #302
- feat(manifest): support scripts section in entity manifest by @bburda in #304
- Add x-medkit-graph provider and function cyclic subscriptions by @eclipse0922 in #270
- Add GET /apps/{app-id}/is-located-on endpoint by @eclipse0922 in #299
- feat: per-entity confirmation and healing thresholds by @mfaferek93 in #274
Bug Fixes & Improvements
- docs+fix: update documentation and API responses for post-0.3.0 changes by @bburda in #258
- Fix exceptions getting bulk_data.categories and plugins at startup by @nnarain in #256
- fix(rosbag): default storage format sqlite3 -> mcap by @mfaferek93 in #252
- fix(deps): use correct rosdep key for SQLite3 by @mfaferek93 in #250
- fix(gateway): support namespaced fault manager integration by @eclipse0922 in #301
- fix: align discovery plugin package versions to 0.3.0 by @mfaferek93 in #292
Testing
- Add unit tests for DiscoveryHandlers by @eclipse0922 in #281
- Add unit tests for operation handlers by @eclipse0922 in #290
CI & Build
- Optimize local DX and CI pipeline by @bburda in #239
- ci: trigger selfpatch_demos CI on push to main by @bburda in #244
- fix(ci): match Jenkins build farm dependency isolation by @bburda in #280
- fix(ci): resolve graph provider test deadlock and clang-tidy timeout by @bburda in #283
- fix(test): resolve buildfarm executor shutdown deadlock in graph provider tests by @bburda in #285
- feat: extract shared cmake modules into ros2_medkit_cmake package by @bburda in #295
- Extract GraphProviderPlugin to loadable .so plugin by @bburda in #289
- feat: experimental cross-platform Pixi support by @bburda in #266
Docs
- docs: rewrite copilot-instructions.md for effective code review by @bburda in #247
- Release v0.4.0 by @bburda in #298
New Contributors
Full Changelog: 0.3.0...0.4.0
v0.3.0
Highlights
Gateway plugin framework
ros2_medkit now supports runtime-loaded C++ plugins for extending the gateway with custom endpoints and capabilities. Plugins are shared libraries (.so) loaded at startup, with full lifecycle management, API versioning, and access to gateway internals via PluginContext. The first built-in plugin type is UpdateProvider for software updates. (#237)
Software updates endpoints
8 new REST endpoints under /api/v1/{entity}/updates implement the SOVD software update lifecycle - from listing available campaigns through installation to activation. The update logic is fully delegated to plugins, so any backend (OTA server, local repo, custom protocol) can be integrated without touching gateway code. (#231, #237)
SSE-based periodic data subscriptions
Clients can now subscribe to entity data streams via Server-Sent Events at /api/v1/{entity}/data/{resource}/subscriptions, receiving periodic samples without polling. Each subscription runs independently with configurable intervals. (#223)
Multi-distro CI: Humble, Jazzy, and Rolling
The entire workspace now builds and passes tests on ROS 2 Humble, Jazzy, and Rolling. This required a compatibility shim for ament_target_dependencies (deprecated on Rolling), GenericClient backport for Humble, and fixes for GCC 11, older rosbag2, and DDS behavior differences. (#219, #242)
Rate limiting
New token-bucket rate limiting middleware protects the gateway from request floods. Limits are configurable per-endpoint group (data, operations, faults, config, discovery, bulk_data) with separate burst and sustained rate settings. (#220)
Dedicated integration test package
All integration tests and demo nodes have been extracted into a standalone ros2_medkit_integration_tests package with a shared ros2_medkit_test_utils library, GatewayTestCase base class, and structured test categories (features, scenarios). (#227)
What's Changed
Features
- Gateway plugin framework with dynamic C++ plugin loading by @bburda in #237
- Software updates plugin system with 8 SOVD endpoints by @bburda in #231
- SSE-based periodic data subscriptions by @bburda in #223
- Bulk data upload and delete endpoints by @bburda in #216
- Token-bucket rate limiting middleware by @eclipse0922 in #220
- Global
DELETE /api/v1/faultsendpoint by @mfaferek93 in #228 - Return HEALED/PREPASSED faults via status filter by @mfaferek93 in #218
Bug Fixes & Improvements
- Accurate HIGHEST_SEVERITY reassignment and stale
fault_to_cluster_cleanup by @eclipse0922 in #221 - Clean up
pending_clusters_when fault cleared beforemin_countby @eclipse0922 in #211 - Reduce lock contention in ConfigurationManager by @eclipse0922 in #194
- Cache component topic map to avoid per-request graph rebuild by @eclipse0922 in #212
- Add missing
ament_index_cppdependency topackage.xmlby @eclipse0922 in #191 - Require cpp-httplib >= 0.14 in pkg-config check by @bburda in #230
Testing
- Unit tests for HealthHandlers by @eclipse0922 in #232
- Unit tests for DataHandlers by @eclipse0922 in #234
- Unit tests for AuthHandlers by @eclipse0922 in #233
- Refactor integration test suite into dedicated package by @bburda in #227
CI & Build
- Multi-distro CI support for ROS 2 Humble, Jazzy, and Rolling by @bburda in #219
- Migrate
ament_target_dependenciesto compat shim for Rolling by @bburda in #242 - Standardize include guards to
#pragma onceby @eclipse0922 in #192 - Use
foreachloop for CMake coverage flags by @eclipse0922 in #193
Docs
- REP-2004 Quality Declaration (Level 3) by @mfaferek93 in #172
- Streamline README Quick Start by @mfaferek93 in #170
- Fix deprecated
needs_extra_linksin sphinx conf by @eclipse0922 in #236 - Fix invalid URLs in CONTRIBUTING.md by @bburda in #187
New Contributors
- @eclipse0922 made their first contribution in #191
Full Changelog: 0.2.0...0.3.0
v0.2.0
What's Changed
- feat(serialization): vendor dynmsg library by @mfaferek93 in #163
- docs: add hero GIF to README by @mfaferek93 in #166
- Gateway: Add SOVD bulk-data endpoints and fault detail response by @bburda in #165
- Add pre-commit hooks for clang-format, flake8, cmake-lint, shellcheck and copyright by @bburda in #167
- Feat/rosdistro release prep by @mfaferek93 in #169
Full Changelog: v0.1.0...0.2.0
v0.1.0
Changelog
All notable changes to ros2_medkit are documented in this file.
The format is based on Keep a Changelog <https://keepachangelog.com/en/1.1.0/>,
and this project adheres to Semantic Versioning <https://semver.org/spec/v2.0.0.html>.
[0.1.0] - 2026-02-01
First public release of ros2_medkit.
Added
Gateway (ros2_medkit_gateway)
- REST API gateway exposing ROS 2 graph via SOVD-compatible endpoints
- Discovery endpoints:
/areas,/components,/apps,/functions - Data access: Read topic data, publish to topics
- Operations: Call ROS 2 services and actions with execution tracking
- Configurations: Read/write/reset ROS 2 node parameters
- Faults: Query and clear faults from fault manager
- Three discovery modes: runtime_only, hybrid, manifest_only
- Manifest-based discovery with YAML system definitions
- Heuristic app detection in runtime mode
- JWT authentication with RBAC (viewer, operator, configurator, admin roles)
- TLS/HTTPS support with configurable TLS 1.2/1.3
- CORS configuration for browser clients
- SSE (Server-Sent Events) for real-time fault notifications
- Health check endpoint
Fault Manager (ros2_medkit_fault_manager)
- Centralized fault storage and management node
- ROS 2 services:
report_fault,get_faults,clear_fault - AUTOSAR DEM-style debounce lifecycle (PREFAILED → CONFIRMED → HEALED → CLEARED)
- Fault aggregation from multiple sources
- Severity escalation
- In-memory storage with thread-safe implementation
Fault Reporter (ros2_medkit_fault_reporter)
- Client library for reporting faults from ROS 2 nodes
- Local filtering with configurable threshold and time window
- Fire-and-forget async service calls
- High-severity bypass for immediate fault reporting
Diagnostic Bridge (ros2_medkit_diagnostic_bridge)
- Bridge node converting
/diagnosticsmessages to fault manager faults - Configurable severity mapping from diagnostic status levels
- Support for diagnostic arrays with multiple status entries
Serialization (ros2_medkit_serialization)
- Runtime JSON ↔ ROS 2 message serialization
- Dynamic message introspection without compile-time type knowledge
- Support for all ROS 2 built-in types, arrays, nested messages
- Type caching for performance
Messages (ros2_medkit_msgs)
Fault.msg: Fault status message with severity, timestamps, sourcesFaultEvent.msg: Fault event for subscriptionsReportFault.srv: Service for reporting faultsGetFaults.srv: Service for querying faults with filtersClearFault.srv: Service for clearing faults
Documentation
- Sphinx documentation with Doxygen integration
- Getting Started tutorial
- REST API reference
- Configuration reference (server, discovery, manifest)
- Authentication and HTTPS tutorials
- Docker deployment guide
- Companion project tutorials (web-ui, mcp-server)
Tooling
- Postman collection for API testing
- Development container configuration
- GitHub Actions CI/CD pipeline
Companion Projects
sovd_web_ui <https://github.com/selfpatch/sovd_web_ui>_: Web interface for entity browsingros2_medkit_mcp <https://github.com/selfpatch/ros2_medkit_mcp>_: MCP server for LLM integration
SOVD Compliance
This release implements a subset of the SOVD (Service-Oriented Vehicle Diagnostics)
specification adapted for ROS 2:
- Core discovery endpoints (areas, components)
- Extended discovery (apps, functions) via manifest mode
- Data access (read, write)
- Operations (services, actions with executions)
- Configurations (parameters)
- Faults (query, clear)
Not yet implemented:
- Bulk data transfer
- Software updates
- Locks
- Triggers
- Communication logs