{"record":{"id":"74e43895d9971ffa","repo":"zeroclaw-labs/zeroclaw","slug":"acp-elicitation-create-multi-timed-out-after-ti","errorCode":null,"errorMessage":"ACP elicitation/create (multi) timed out after {timeout:?}","messagePattern":"ACP elicitation/create \\(multi\\) timed out after (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-channels/src/acp_channel.rs","lineNumber":394,"sourceCode":"        }\n\n        let req = ElicitationRequest {\n            session_id: self.session_id.clone(),\n            mode: ElicitationMode::Form,\n            message: question.to_string(),\n            requested_schema: multi_select_schema(choices, min_items, max_items),\n        };\n        let params = serde_json::to_value(&req)?;\n        let call = self.rpc.request(\"elicitation/create\", params);\n        let response_value = match tokio::time::timeout(timeout, call).await {\n            Ok(Ok(value)) => value,\n            Ok(Err(e)) => anyhow::bail!(\n                \"ACP elicitation/create (multi) failed: {} ({})\",\n                e.message,\n                e.code\n            ),\n            Err(_) => {\n                anyhow::bail!(\"ACP elicitation/create (multi) timed out after {timeout:?}\")\n            }\n        };\n\n        let parsed: ElicitationResponse = serde_json::from_value(response_value)\n            .map_err(|e| anyhow::Error::msg(format!(\"malformed elicitation response: {e}\")))?;\n        match parsed {\n            ElicitationResponse::Accept { content } => {\n                let texts =\n                    zeroclaw_api::elicitation::decode_multi_select_accept(&content, choices)?;\n                Ok(Some(texts))\n            }\n            ElicitationResponse::Decline | ElicitationResponse::Cancel => Ok(None),\n        }\n    }\n\n    /// Delegates to [`Self::request_approval_attributed`] and drops the\n    /// provenance, so the prompt logic lives in exactly one place.\n    async fn request_approval(","sourceCodeStart":376,"sourceCodeEnd":412,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-channels/src/acp_channel.rs#L376-L412","documentation":"The multi-select elicitation/create request got no answer before the caller-supplied timeout elapsed (tokio::time::timeout). Like the single-select path, this prevents an unresponsive client from parking the poll tool forever; the elapsed Duration is included in the message.","triggerScenarios":"request_multi_choice on a form-capable client where no JSON-RPC response arrives in time — the user never submits the multi-select form, the client exits, or the transport stalls.","commonSituations":"Multi-select forms left open because users must check several items; unattended sessions; network drops mid-prompt; timeouts copied from single-select defaults that are too short.","solutions":["Raise the timeout passed to request_multi_choice to fit human form-filling time.","Check that the ACP client and transport are alive before issuing the prompt.","Treat the timeout as a cancellation (None) in the caller instead of an error, if proceeding without the selection is safe.","Cancel in-flight prompts during session teardown so timeouts do not race shutdown."],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"match ch.request_multi_choice(q, &choices, min, max, timeout).await {\n    Ok(opt) => opt,\n    Err(e) if e.to_string().contains(\"timed out\") => {\n        tracing::warn!(error = %e, \"multi-select timed out; treating as declined\");\n        None\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Give multi-select forms longer timeouts than single-select","Prompt only when the client is known responsive","Cancel outstanding prompts during session teardown"],"tags":["rust","acp","elicitation","timeout","multi-select"],"backgroundTag":"request-timeout","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}