{"record":{"id":"1ee87a1c4cd3d54c","repo":"canopy-network/canopy","slug":"no-response-received-for-id-requestid","errorCode":null,"errorMessage":"No response received for id $requestId","messagePattern":"No response received for id \\$requestId","errorType":"exception","errorClass":"kotlin.Exception","httpStatus":null,"severity":"error","filePath":"plugin/kotlin/src/main/kotlin/com/canopy/plugin/PluginClient.kt","lineNumber":320,"sourceCode":"        lock.withLock {\n            pending[requestId] = pendingResponse\n            if (contract != null) {\n                requestContract[requestId] = contract\n            }\n        }\n\n        sendMessage(msg)\n\n        // Wait for response with timeout\n        if (!pendingResponse.lock.await(TIMEOUT_SECONDS, TimeUnit.SECONDS)) {\n            lock.withLock {\n                pending.remove(requestId)\n                requestContract.remove(requestId)\n            }\n            throw Exception(\"Request timeout for id $requestId\")\n        }\n\n        return pendingResponse.response ?: throw Exception(\"No response received for id $requestId\")\n    }\n\n    /**\n     * Send response to FSM\n     */\n    private fun sendResponse(id: Long, builder: PluginToFSM.Builder) {\n        val msg = builder.setId(id).build()\n        sendMessage(msg)\n    }\n\n    /**\n     * Send protobuf message with length prefix\n     */\n    private fun sendMessage(msg: PluginToFSM) {\n        val bytes = msg.toByteArray()\n        val lengthPrefix = ByteBuffer.allocate(4).order(ByteOrder.BIG_ENDIAN).putInt(bytes.size).array()\n\n        lock.withLock {","sourceCodeStart":302,"sourceCodeEnd":338,"githubUrl":"https://github.com/canopy-network/canopy/blob/ee8197d91dd410f6592cb650a94c925ee6dc8bad/plugin/kotlin/src/main/kotlin/com/canopy/plugin/PluginClient.kt#L302-L338","documentation":"Thrown in PluginClient.sendSync after the response latch fires but pendingResponse.response is still null — the await succeeded without a response being stored. This is a signaling/race defect or an empty reply frame, meaning the FSM's reply never materialized into a usable message.","triggerScenarios":"Thrown at plugin/kotlin/src/main/kotlin/com/canopy/plugin/PluginClient.kt:320 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Inspect the inbound message loop to confirm every completed PendingResponse is fulfilled with a response.","Check for a race between latch completion and response assignment in the listener thread.","Retry the request; persistent occurrences indicate a bug in the reply dispatch path rather than a network issue."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"ee8197d91dd410f6592cb650a94c925ee6dc8bad","analyzedAt":"2026-09-06T09:30:15.973Z","contentChangedAt":"2026-09-06T09:30:15.973Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}