{"record":{"id":"03e40032eb8778be","repo":"zeroclaw-labs/zeroclaw","slug":"qdrant-scroll-failed-status-text-03e400","errorCode":null,"errorMessage":"Qdrant scroll failed ({status}): {text}","messagePattern":"Qdrant scroll failed \\((.+?)\\): (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-memory/src/qdrant.rs","lineNumber":173,"sourceCode":"            \"limit\": 1000,\n            \"with_payload\": true,\n            \"filter\": { \"must\": must_conditions }\n        });\n\n        let resp = self\n            .request(\n                reqwest::Method::POST,\n                &format!(\"/collections/{}/points/scroll\", self.collection),\n            )\n            .json(&scroll_body)\n            .send()\n            .await\n            .context(\"failed to scroll Qdrant for allowed agent set\")?;\n\n        if !resp.status().is_success() {\n            let status = resp.status();\n            let text = resp.text().await.unwrap_or_default();\n            anyhow::bail!(\"Qdrant scroll failed ({status}): {text}\");\n        }\n\n        let result: QdrantScrollResult = resp.json().await?;\n\n        let entries = result\n            .result\n            .points\n            .into_iter()\n            .filter_map(|point| {\n                let payload = point.payload?;\n                let id = match &point.id {\n                    serde_json::Value::String(s) => s.clone(),\n                    serde_json::Value::Number(n) => n.to_string(),\n                    _ => return None,\n                };\n\n                Some(MemoryEntry {\n                    id,","sourceCodeStart":155,"sourceCodeEnd":191,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-memory/src/qdrant.rs#L155-L191","documentation":"A paginated Qdrant scroll (POST /collections/{name}/points/scroll with an agent-id filter) returned a non-success HTTP status; the status code and response body are surfaced verbatim. This scroll backs purge_agent, export_agent, rename_agent, count_agent, and recall_for_agents, so any of those agent-scoped operations can surface it.","triggerScenarios":"Qdrant answers 401/403 (bad or rotated API key), 404 (collection dropped mid-operation), 400 (malformed filter or invalid collection name), or 5xx while the scroll executes. Transport-level failures surface as a different context error; this one means Qdrant answered with an error status.","commonSituations":"Expired Qdrant API key; collection recreated without the expected payload; Qdrant restarts or cloud maintenance windows during long scrolls; the collection deleted by another operator between check and scroll.","solutions":["Read the status and body: 401/403 means credentials in [storage.qdrant.<alias>], 404 means the collection is gone, 400 usually means collection-name or filter shape, 5xx is server-side.","Verify url, api_key, and collection still match the live cluster.","Retry transient 5xx after a short backoff; re-create the collection (ensure_collection runs on init) if it was deleted."],"exampleFix":"# diagnose against the same cluster\n$ curl -H \"api-key: $QDRANT_KEY\" \\\n    http://qdrant-host:6333/collections/zeroclaw_memories/points/scroll \\\n    -X POST -H 'Content-Type: application/json' \\\n    -d '{\"limit\": 1, \"with_payload\": true}'","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"match memory.recall_for_agents(query, limit, &agents).await {\n    Ok(v) => Ok(v),\n    Err(e) => {\n        let msg = e.to_string();\n        if msg.contains(\"Qdrant scroll failed (401\") || msg.contains(\"Qdrant scroll failed (403\") {\n            return Err(e.context(\"qdrant credentials rejected; fix [storage.qdrant.<alias>].api_key\"));\n        }\n        if msg.contains(\"Qdrant scroll failed (404\") {\n            return Err(e.context(\"qdrant collection missing; recreate it via ensure_initialized\"));\n        }\n        if msg.contains(\"Qdrant scroll failed (5\") {\n            // server-side: safe to retry with backoff\n        }\n        Err(e)\n    }\n}","preventionTips":["Alert on scroll error rates per status class so key rotation and dropped collections are caught early.","Keep the collection name stable; if it must be recreated, do it while the service is not mid-operation and let ensure_collection rebuild it on restart."],"tags":["qdrant","http","scroll","vector-db","agent-operations"],"backgroundTag":"http-error-response","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}