detect_qos_mismatches
Diagnose why DDS readers and writers on the same topic do not communicate by pairing every reader with every writer and reporting incompatible or risky QoS policies.
Instructions
Explain why DDS readers and writers on the same topic do not talk, and who will. Pairs every reader with every writer per topic and returns a MismatchScan: matched (pairs DDS will connect given the announced QoS; data flow is not observed), reports (incompatible or risky QoS pairs, each with participant names, requested vs offered values and the failed rule in details), not_matched (pairs DDS never matches: different partitions or type names; the QoS rules are NOT evaluated for them, so a partition split is not blamed on Reliability; latent_incompatible_policies lists the RxO policies that would ALSO be incompatible once the partition/type issue is fixed), hints (orphan topics with a near-identical name, i.e. probable typos, and type id notes), plus pairs_checked, topics_scanned, policies_checked and policies_unchecked. Checked: Partition (with * and ? wildcards), type name, Reliability, Durability, Deadline, Liveliness, LatencyBudget, Ownership, DestinationOrder, DataRepresentation, History (risky only, and only where announced: discovery does not carry it). Not checked: see policies_unchecked. An empty reports with a non-empty not_matched still means no data flows, and an all-empty result does not prove the bus healthy: discovery shows the QoS DECLARED, not runtime behavior (a reader logging 'deadline missed' with compatible QoS means the writer's real period exceeds the deadline, which TopicForge cannot observe). Pass topic to scope to one topic; omit to scan all. reports, matched and not_matched are capped at 200 entries each (truncated is true, the *_total fields keep the real counts, incompatible reports come first). A matched pair flagged late_joiner is a VOLATILE writer whose reader joined later on the same host: normal, not a fault. Read-only by architecture. Raises an MCP error when no DDS module is active; the mock backend returns fixtures.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | Optional DDS topic name to scope the scan to: a bare name such as `scan` or a ROS 2 mangled name such as `rt/scan`. Omit to scan all topics. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| hints | Yes | Leads that are not findings: orphan topics with near-identical names (typos), type id differences, pairs that could not be fully checked. | |
| matched | No | Pairs that will be matched by DDS given the announced QoS: same topic and type name, overlapping partitions, no incompatible RxO policy (a pair with only a `risky` History finding still counts). Actual data flow is not observed. | |
| reports | Yes | Pairs that share a partition and a type but have incompatible or risky QoS. | |
| truncated | No | True when `reports`, `matched` or `not_matched` was cut to its cap (200 entries each, incompatible reports first): see the `*_total` fields. Narrow the scan with `topic`. | |
| not_matched | Yes | Pairs separated by partition or type name. No data flows between them. An empty `reports` with a non-empty `not_matched` does not mean the bus is healthy. | |
| matched_total | No | Matched pairs before the size cap. | |
| pairs_checked | Yes | Same-topic (reader, writer) pairs examined, including those reported in `not_matched`. | |
| reports_total | No | Reports before the size cap. | |
| mode_effective | Yes | Runtime mode the adapter served this response in: `live` (real ROS2 introspection) or `mock` (deterministic fixtures). Lets a caller tell a real graph from a demo one without calling `health_check`. | |
| topics_scanned | Yes | Topics that had at least one endpoint in scope. | |
| policies_checked | Yes | Policies compared on every pair. | |
| not_matched_total | No | Not-matched pairs before the size cap. | |
| policies_unchecked | Yes | Policies and facts this scan does not cover, each with a one-line reason. A clean result says nothing about them. |