{"record":{"id":"6ca4751262689690","repo":"rohitg00/ai-engineering-from-scratch","slug":"peer-name-proven-modern-discovery-retry-returne-6ca475","errorCode":null,"errorMessage":"{peer.name}: proven-modern discovery retry returned an error","messagePattern":"(.+?): proven-modern discovery retry returned an error","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"phases/13-tools-and-protocols/08-building-an-mcp-client/code/main.py","lineNumber":462,"sourceCode":"            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,\n                params,\n                peer.protocol_version or PROTOCOL_VERSION,\n                self.client_capabilities,","sourceCodeStart":444,"sourceCodeEnd":480,"githubUrl":"https://github.com/rohitg00/ai-engineering-from-scratch/blob/39ea8a1c6d0b61f071226eff7ede4d4105fed820/phases/13-tools-and-protocols/08-building-an-mcp-client/code/main.py#L444-L480","documentation":"The versioned discovery retry returned a valid JSON-RPC message that decoded as an error rather than a result. Even after agreeing on a version, the server refused the retry, so activation is aborted — the client does not fall back to legacy from this state.","triggerScenarios":"decode_rpc_response(retried, retry_id) returns retry_kind='error' in the -32022 retry branch.","commonSituations":"Server rejecting the agreed version anyway (bug); auth or capability checks firing only on the second request; race where the server changed state between the two discovers.","solutions":["Log the retry's error payload for the exact server-side reason","Verify the retry request carries the same agreed version the server hinted","Check server-side auth/capability requirements for discovery","Restart or patch the server if the rejection is inconsistent with its own -32022 hint"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"null","typeGuard":"null","tryCatchPattern":"try:\n    client.connect_all()\nexcept RuntimeError as e:\n    if \"discovery retry returned an error\" in str(e):\n        report_server_inconsistency(peer, e)","preventionTips":["Cross-check that the retry version equals the server's -32022 hint","Treat inconsistent server behavior as a server bug, not a client retry"],"tags":["mcp","rpc-error","discovery","retry"],"backgroundTag":"json-rpc-error-response","analyzedSha":"39ea8a1c6d0b61f071226eff7ede4d4105fed820","analyzedAt":"2026-08-26T03:13:46.626Z","schemaVersion":2},"datasetVersion":"2026-08-26T07:17:17.940Z"}