Problem
extract_plugin_config() built a flat JSON object keyed by the dotted ROS-param remainder. A param like plugins.<name>.native_alarms.enabled produced {"native_alarms.enabled": true}. Every plugin reads nested objects (config["native_alarms"]["enabled"]), so the whole plugins.<name>.* param surface was dead for any nested key across all plugins. Only single-level flat keys worked.
Impact
Configure-via-param was silently broken for all nested plugin config (ADS native_alarms + discovery, discovery/auto_browse/auto_alarms, severity_bands, ...). No error, the value was just dropped.
Fix
Reconstruct a nested JSON object by splitting the prefix-stripped remainder on ., preserving flat single-level keys, array leaves, both param sources (parameter_overrides and --params-file YAML), and the read-only .path exclusion. Helpers moved into param_utils.hpp with gateway gtests locking 2-level, 3-level, array leaf, .path exclusion, and the leaf/intermediate collision.
Fixed in #518
Problem
extract_plugin_config()built a flat JSON object keyed by the dotted ROS-param remainder. A param likeplugins.<name>.native_alarms.enabledproduced{"native_alarms.enabled": true}. Every plugin reads nested objects (config["native_alarms"]["enabled"]), so the wholeplugins.<name>.*param surface was dead for any nested key across all plugins. Only single-level flat keys worked.Impact
Configure-via-param was silently broken for all nested plugin config (ADS native_alarms + discovery, discovery/auto_browse/auto_alarms, severity_bands, ...). No error, the value was just dropped.
Fix
Reconstruct a nested JSON object by splitting the prefix-stripped remainder on
., preserving flat single-level keys, array leaves, both param sources (parameter_overrides and --params-file YAML), and the read-only.pathexclusion. Helpers moved intoparam_utils.hppwith gateway gtests locking 2-level, 3-level, array leaf,.pathexclusion, and the leaf/intermediate collision.Fixed in #518