{"record":{"id":"20604ea26810d085","repo":"xai-org/x-algorithm","slug":"none-of-lds-resources-decoded-as-listener","errorCode":null,"errorMessage":"none of {} LDS resources decoded as Listener","messagePattern":"none of (.+?) LDS resources decoded as Listener","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"visibility-filtering/dark_traffic_setup.rs","lineNumber":112,"sourceCode":"            .into_inner();\n\n        let response = loop {\n            let response = stream\n                .message()\n                .await\n                .context(\"wildcard LDS stream errored\")?\n                .context(\"wildcard LDS stream ended without a listener-carrying response\")?;\n            if !response.resources.is_empty() {\n                break response;\n            }\n        };\n\n        let names: Vec<String> = response\n            .resources\n            .iter()\n            .filter_map(|any| Some(Listener::decode(any.value.as_ref()).ok()?.name))\n            .collect();\n        anyhow::ensure!(\n            !names.is_empty(),\n            \"none of {} LDS resources decoded as Listener\",\n            response.resources.len()\n        );\n        let endpoints: Vec<EndpointInfo> = names\n            .iter()\n            .filter_map(|name| parse_staging_listener(name))\n            .collect();\n\n        if endpoints.is_empty() {\n            tracing::warn!(\n                listeners = names.len(),\n                \"dark_traffic: no staging listeners matched\"\n            );\n        } else {\n            info!(\n                names = %endpoints.iter().map(|e| e.name.as_str()).collect::<Vec<_>>().join(\", \"),\n                \"dark_traffic: discovery complete\"","sourceCodeStart":94,"sourceCodeEnd":130,"githubUrl":"https://github.com/xai-org/x-algorithm/blob/24c60942c5c5fdad3a6addffb4c6e6d2f228f04f/visibility-filtering/dark_traffic_setup.rs#L94-L130","documentation":"Raised when a Listener Discovery Service (LDS) response contains resources, but none of them can be decoded as a protobuf Listener message. The code filters resources with Listener::decode(...).ok() and ensures at least one name was extracted; zero names means every decode failed. Typically indicates a type URL mismatch or malformed/foreign resource payload in the xDS response.","triggerScenarios":"Calling fetch() against an xDS/LDS endpoint whose response.resources are not Listener-typed protos (wrong type_url, delta vs SOTW mismatch, or a test mock returning Any payloads with a different message type).","commonSituations":"Pointing the visibility-filtering dark traffic setup at a CDS/EDS endpoint instead of LDS; envoy mock servers returning placeholder Any resources; protobuf definition drift between client and server.","solutions":["Verify the xDS server's LDS response resource type_url is envoy.config.listener.v3.Listener","Check that the client's Listener proto definitions match the server's version","Dump response.resources type_urls and compare against the expected Listener type","If using a mock server, make it return real Listener-encoded Any values"],"exampleFix":"// before\nlet response = client.fetch().await?; // resources present but not Listeners\n\n// after\nfor any in &response.resources {\n    tracing::warn!(\"resource type_url={}\", any.type_url);\n}\nassert!(names.iter().any(|n| n == &expected_listener_name));","handlingStrategy":"validation","validationCode":"let decodable = response.resources.iter().any(|any| Listener::decode(any.value.as_ref()).is_ok());\nif !decodable { return Ok(vec![]); }","typeGuard":null,"tryCatchPattern":"Catch anyhow::Error in discover and check for the 'none of {} LDS resources' message; treat as config error, alert, do not retry.","preventionTips":["Log type_url of every xDS resource during integration testing","Pin proto versions between xDS server and client"],"tags":["envoy","xds","protobuf","lds"],"backgroundTag":"xds-resource-decode-failed","analyzedSha":"24c60942c5c5fdad3a6addffb4c6e6d2f228f04f","analyzedAt":"2026-08-28T11:40:14.686Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}