removedInput schema / title
Removed value: -"health_checkArguments"
addedOutput schema / properties / contract_version
Added value: +{
+ "default": 2,
+ "description": "Output contract version; changes only when a field is renamed, removed or retyped.",
+ "minimum": 1,
+ "type": "integer"
+}
changedOutput schema / properties / dds_backend / description
Previous value: -"DDS backend of the adapter actually serving requests. `none` when the DDS module is not active (default for ROS2-only installs). `mock` for synthetic fixtures. `cyclone` requires `pip install \"topicforge[dds-cyclone]\"` (Eclipse CycloneDDS); `fast` requires a Fast DDS Python binding built from eProsima sources (not on PyPI); `opendds` and `dust` are permanent stub adapters that never serve."New value: +"DDS backend serving: `mock`, `cyclone`, `fast`, or `none` (DDS module inactive)."
changedOutput schema / properties / dds_backend / enum
Previous value: -[
- "mock",
- "cyclone",
- "fast",
- "opendds",
- "dust",
- "none"
-]New value: +[
+ "mock",
+ "cyclone",
+ "fast",
+ "none"
+]
removedOutput schema / properties / dds_backend / title
Removed value: -"Dds Backend"
removedOutput schema / properties / dds_domain_id / title
Removed value: -"Dds Domain Id"
addedOutput schema / properties / dds_inactive_note
Added value: +{
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "Why `dds_backend` is `none` while ROS 2 serves (not selected, binding missing, or failed to start); else `null`."
+}
removedOutput schema / properties / dds_inactive_reason
Removed value: -{
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ],
- "default": null,
- "description": "Why `dds_backend` is `none` while the ROS 2 CLI serves: the backend was not selected (`TOPICFORGE_DDS_BACKEND` unset or `mock`), its Python binding is not installed, or the binding is installed but the adapter failed to start. `null` when a DDS backend is serving or the cause is not known.",
- "title": "Dds Inactive Reason"
-}
changedOutput schema / properties / dds_security / description
Previous value: -"DDS Security is not handled. On a secured domain TopicForge can show participants but not protected endpoints or data."New value: +"DDS Security is not handled: protected endpoints and data are invisible."
removedOutput schema / properties / dds_security / title
Removed value: -"Dds Security"
changedOutput schema / properties / max_sample_count / description
Previous value: -"Server-side cap on the number of samples returned per `sample_messages` call. Requests above this limit are silently clamped; the value is exposed here so a client can size its requests proactively. Constant within a given server version."New value: +"Server cap on samples per call; larger requests are clamped."
removedOutput schema / properties / max_sample_count / title
Removed value: -"Max Sample Count"
changedOutput schema / properties / middleware_available / description
Previous value: -"True when a DDS backend is serving (`dds_backend` is not `none`). When the DDS module is inactive (`dds_backend == 'none'`), whether the *configured* backend's Python bindings are importable, so a missing binding is visible."New value: +"True when a DDS backend serves; else whether the configured binding is importable."
removedOutput schema / properties / middleware_available / title
Removed value: -"Middleware Available"
changedOutput schema / properties / mode / description
Previous value: -"Runtime mode of the adapter actually serving requests: `mock` or `live`. `live` with `ros_backend` `none` means the DDS tools are live and the ROS 2 tools are not available. Can differ from `requested_mode` when a live backend could not start (e.g. `live` requested without `ros2` installed falls back to `mock`)."New value: +"Mode actually serving: `mock` or `live` (`live` with `ros_backend` `none`: DDS tools only). May differ from `requested_mode` after a fallback."
removedOutput schema / properties / mode / title
Removed value: -"Mode"
addedOutput schema / properties / note
Added value: +{
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "One sentence of context, or `None`."
+}
removedOutput schema / properties / now_ns / title
Removed value: -"Now Ns"
changedOutput schema / properties / observed_domain_note / description
Previous value: -"Plain statement of which DDS domain is observed, set when a DDS module is active: only the domain joined at startup is visible, a program on another domain is invisible."New value: +"Which DDS domain is observed: only the one joined at startup; others are invisible."
removedOutput schema / properties / observed_domain_note / title
Removed value: -"Observed Domain Note"
changedOutput schema / properties / observer_started_ns / description
Previous value: -"Wall-clock time (ns since epoch) when the DDS observer joined the bus. Nothing earlier than this was watched: `now_ns` minus this is how long TopicForge has been observing. `None` without a live DDS observer."New value: +"ns when the DDS observer joined; nothing earlier was watched. `None` without one."
removedOutput schema / properties / observer_started_ns / title
Removed value: -"Observer Started Ns"
changedOutput schema / properties / payload_decoding / description
Previous value: -"Whether DDS user-topic payloads are decoded. `disabled` today: `peek_dds_samples` and `topic_metrics` do not return message content for user topics."New value: +"`disabled`: DDS user-topic payloads are not decoded."
removedOutput schema / properties / payload_decoding / title
Removed value: -"Payload Decoding"
addedOutput schema / properties / payload_decoding_note
Added value: +{
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": "user-topic payload decoding is switched off until it is validated on a real bus; builtin discovery topics are still readable",
+ "description": "Reason for `payload_decoding`."
+}
removedOutput schema / properties / payload_decoding_reason
Removed value: -{
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ],
- "default": "user-topic payload decoding is switched off until it is validated on a real bus; builtin discovery topics are still readable",
- "description": "One-line reason for `payload_decoding`.",
- "title": "Payload Decoding Reason"
-}
changedOutput schema / properties / requested_mode / description
Previous value: -"Mode requested via configuration (may be `auto`)."New value: +"Mode requested by configuration (may be `auto`)."
removedOutput schema / properties / requested_mode / title
Removed value: -"Requested Mode"
addedOutput schema / properties / rmw_implementation
Added value: +{
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "ROS 2 middleware, e.g. `rmw_fastrtps_cpp`; `None` when `rmw_source` is `none`."
+}
addedOutput schema / properties / rmw_source
Added value: +{
+ "default": "none",
+ "description": "`env`, `ros2_cli`, `distro_default` (not verified on the graph) or `none`.",
+ "enum": [
+ "env",
+ "ros2_cli",
+ "distro_default",
+ "none"
+ ],
+ "type": "string"
+}
removedOutput schema / properties / ros2_available / title
Removed value: -"Ros2 Available"
changedOutput schema / properties / ros2_distro / description
Previous value: -"Value of `ROS_DISTRO` if set in the environment. **Env disclosure, by design**: under the local-trust threat model (see README 'Security model'), the MCP client is a trusted agent on a machine the user controls, and exposing the ROS2 distro lets it adapt to e.g. `humble`/`jazzy` differences. For a hosted multi-tenant TopicForge endpoint this field would be scrubbed ."New value: +"`ROS_DISTRO` if set (disclosed by design under the local-trust model)."
removedOutput schema / properties / ros2_distro / title
Removed value: -"Ros2 Distro"
changedOutput schema / properties / ros_backend / description
Previous value: -"Active ROS2 backend. `ros2_cli` when the `ros2` CLI is on PATH and live mode resolves to a Ros2CliAdapter (alone or as the ROS half of a composite). `mock` when MockAdapter serves the ROS surface. `none` when no ROS2 backend is active (e.g. DDS-only live install with no `ros2` CLI). Together with `dds_backend` it tells the ROS2 and DDS halves of the runtime apart."New value: +"ROS 2 backend: `ros2_cli`, `mock` or `none`."
removedOutput schema / properties / ros_backend / title
Removed value: -"Ros Backend"
changedOutput schema / properties / ros_tools_available / description
Previous value: -"True when the ROS 2 tools (`list_topics`, `get_topic_info`, `sample_messages`, `analyze_bag`, `peek_bag_samples`) can run, i.e. `ros_backend` is not `none`. False on a DDS-only setup: use `list_endpoints` for topics and wiring there."New value: +"True when the ROS 2 tools can run (`ros_backend` is not `none`); on a DDS-only setup use `list_endpoints`."
removedOutput schema / properties / ros_tools_available / title
Removed value: -"Ros Tools Available"
changedOutput schema / properties / server_version / description
Previous value: -"TopicForge server version (matches the PyPI release of the `topicforge` package)."New value: +"TopicForge version."
removedOutput schema / properties / server_version / title
Removed value: -"Server Version"
changedOutput schema / properties / sim_clock_published / description
Previous value: -"Whether `/clock` has at least one publisher on the ROS 2 graph. True suggests nodes may run on simulated time (`use_sim_time`), so `header.stamp` values are sim time, not wall time (compare with `received_ns`). It is a hint: a publisher on `/clock` does not prove a given node follows it. `None` in mock mode or when the `ros2` CLI could not answer."New value: +"Whether `/clock` had a publisher in the last graph read (a hint that stamps may be sim time). `None` in mock or without a recent read; `health_check` never runs `ros2`."
removedOutput schema / properties / sim_clock_published / title
Removed value: -"Sim Clock Published"
changedOutput schema / properties / tracker_cache_evictions / description
Previous value: -"Discovery entries dropped because a tracker cache was full (4096 per cache). Non-zero means the bus is bigger than what is listed."New value: +"Discovery entries dropped from a full tracker cache (4096 each); non-zero means the bus is bigger than listed."
removedOutput schema / properties / tracker_cache_evictions / title
Removed value: -"Tracker Cache Evictions"
changedOutput schema / properties / tracker_errors / description
Previous value: -"Discovery tracker passes that raised (swallowed and logged). Non-zero means gaps."New value: +"Tracker passes that raised; non-zero means gaps."
removedOutput schema / properties / tracker_errors / title
Removed value: -"Tracker Errors"
changedOutput schema / properties / tracker_last_pass_ns / description
Previous value: -"Wall-clock time (ns since epoch) of the last completed tracker pass. A value far older than `now_ns` means lifecycle is stale."New value: +"ns of the last tracker pass; far older than `now_ns` means stale lifecycle."
removedOutput schema / properties / tracker_last_pass_ns / title
Removed value: -"Tracker Last Pass Ns"
removedOutput schema / properties / tracker_passes / title
Removed value: -"Tracker Passes"
changedOutput schema / properties / tracker_running / description
Previous value: -"Whether the continuous discovery tracker thread is alive (Cyclone). `None` when the backend has no tracker."New value: +"Whether the discovery tracker thread is alive (Cyclone); `None` without a tracker."
removedOutput schema / properties / tracker_running / title
Removed value: -"Tracker Running"