{"record":{"id":"973d296026ae7dc9","repo":"rohitg00/ai-engineering-from-scratch","slug":"peer-name-proven-modern-discovery-retry-returne","errorCode":null,"errorMessage":"{peer.name}: proven-modern discovery retry returned no result","messagePattern":"(.+?): proven-modern discovery retry returned no result","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"phases/13-tools-and-protocols/08-building-an-mcp-client/code/main.py","lineNumber":459,"sourceCode":"            data = payload.get(\"data\")\n            advertised = data.get(\"supported\", []) if isinstance(data, dict) else []\n            selected = self._mutual_version(advertised)\n            if selected is None:\n                raise RuntimeError(f\"{peer.name}: no mutually supported modern version\")\n            retry_id = self._new_id()\n            retry = modern_request(\n                retry_id,\n                \"server/discover\",\n                {},\n                selected,\n                self.client_capabilities,\n            )\n            try:\n                retried = self._send(peer, retry, self.discovery_timeout_ms)\n            except (TimeoutError, ConnectionError) as exc:\n                raise RuntimeError(f\"{peer.name}: proven-modern discovery retry failed\") from exc\n            if not isinstance(retried, dict):\n                raise RuntimeError(f\"{peer.name}: proven-modern discovery retry returned no result\")\n            retry_kind, retry_payload = decode_rpc_response(retried, retry_id)\n            if retry_kind != \"result\":\n                raise RuntimeError(f\"{peer.name}: proven-modern discovery retry returned an error\")\n            self._activate_modern(peer, retry_payload, selected)\n            return\n\n        self._probe_legacy(peer, f\"unrecognized discovery error {code}\")\n\n    def connect_all(self) -> None:\n        for peer_name in sorted(self.peers):\n            self._connect_peer(self.peers[peer_name])\n\n    def _request(self, peer: Peer, method: str, params: dict[str, Any]) -> dict[str, Any]:\n        request_id = self._new_id()\n        if peer.era == \"modern\":\n            message = modern_request(\n                request_id,\n                method,","sourceCodeStart":441,"sourceCodeEnd":477,"githubUrl":"https://github.com/rohitg00/ai-engineering-from-scratch/blob/39ea8a1c6d0b61f071226eff7ede4d4105fed820/phases/13-tools-and-protocols/08-building-an-mcp-client/code/main.py#L441-L477","documentation":"The versioned discovery retry completed but _send returned a non-dict value, so there is no JSON-RPC message to decode. Parallel to the first-attempt shape check, this guards the retry path against transports that yield None or raw strings.","triggerScenarios":"retried = self._send(peer, retry, self.discovery_timeout_ms) succeeds but isinstance(retried, dict) is False.","commonSituations":"Connection closing between write and read so the reader returns None; transport returning serialized text; test doubles with the wrong return shape on the second call.","solutions":["Inspect what the transport returned on the retry","Fix the transport's read path to return parsed dicts","Harden the server so it responds to the versioned discover request","Fix test fakes to return dict responses on every call"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":"null","typeGuard":"def is_rpc_message(value) -> bool:\n    return isinstance(value, dict) and \"jsonrpc\" in value","tryCatchPattern":"try:\n    client.connect_all()\nexcept RuntimeError as e:\n    if \"retry returned no result\" in str(e):\n        dump_transport_frames(peer)","preventionTips":["Test transports under connection-close conditions","Ensure fakes return dicts on every send, including retries"],"tags":["mcp","transport","response-shape","discovery"],"backgroundTag":"malformed-rpc-response","analyzedSha":"39ea8a1c6d0b61f071226eff7ede4d4105fed820","analyzedAt":"2026-08-26T03:13:46.626Z","schemaVersion":2},"datasetVersion":"2026-08-26T07:17:17.940Z"}