{"record":{"id":"149c37e9318cf839","repo":"zeroclaw-labs/zeroclaw","slug":"elicitation-returned-unknown-choice-const-s","errorCode":null,"errorMessage":"elicitation returned unknown choice const: {s}","messagePattern":"elicitation returned unknown choice const: (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-api/src/elicitation.rs","lineNumber":237,"sourceCode":"pub fn decode_multi_select_accept(\n    content: &Value,\n    choices: &[String],\n) -> anyhow::Result<Vec<String>> {\n    let arr = content\n        .get(\"choices\")\n        .and_then(|v| v.as_array())\n        .ok_or_else(|| anyhow::Error::msg(\"elicitation accept missing content.choices array\"))?;\n    let mut out = Vec::with_capacity(arr.len());\n    for v in arr {\n        let s = v\n            .as_str()\n            .ok_or_else(|| anyhow::Error::msg(\"non-string entry in content.choices\"))?;\n        let idx = s\n            .strip_prefix(\"choice-\")\n            .and_then(|n| n.parse::<usize>().ok());\n        match idx.and_then(|i| choices.get(i)) {\n            Some(text) => out.push(text.clone()),\n            None => anyhow::bail!(\"elicitation returned unknown choice const: {s}\"),\n        }\n    }\n    Ok(out)\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use serde_json::json;\n\n    #[test]\n    fn missing_key_is_no_support() {\n        let caps = ElicitationCapabilities::from_value(None);\n        assert!(!caps.form);\n        assert!(!caps.url);\n    }\n\n    #[test]","sourceCodeStart":219,"sourceCodeEnd":255,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-api/src/elicitation.rs#L219-L255","documentation":"download_release (src/commands/update.rs:430) GETs the release asset URL (browser_download_url taken from the GitHub release metadata during check()) with a 5-minute timeout and bails on any non-2xx status, echoing the raw status. This is Phase 2 of `zeroclaw update`; nothing is installed when it fires. A 404 usually means the asset disappeared or was renamed after the API snapshot; 403/429 are rate limiting; 5xx are CDN-side.","triggerScenarios":"`zeroclaw update` downloading the platform archive (zeroclaw-<triple>.tar.gz / .zip) when the asset fetch fails: asset deleted or replaced after the metadata was fetched, GitHub CDN rate limit (shared egress IP), or a proxy/firewall blocking objects.githubusercontent.com with an error status.","commonSituations":"Corporate proxy or TLS-inspecting middlebox answering 403 for the CDN host; CI runner behind NAT hitting rate limits; a release yanked or its assets re-uploaded mid-update.","solutions":["Verify the asset still exists on the release page (matching your target triple), then re-run `zeroclaw update` to get fresh metadata","If rate-limited (403/429), wait out the window and retry","Configure HTTPS_PROXY correctly or temporarily bypass the proxy for github.com / objects.githubusercontent.com","If the asset is genuinely gone from the release, report it and update to a different tag with --version"],"exampleFix":"# before\n$ zeroclaw update\nError: download returned 404 Not Found\n\n# after\n$ # confirm the asset for your target triple exists on the release page\n$ curl -fsSI \"https://github.com/zeroclaw-labs/zeroclaw/releases/download/<tag>/zeroclaw-x86_64-unknown-linux-gnu.tar.gz\"\n$ zeroclaw update   # retries with fresh release metadata","handlingStrategy":"retry","validationCode":"// Preflight: HEAD the asset URL before committing to the update.\nasync fn asset_fetchable(client: &reqwest::Client, url: &str) -> bool {\n    client\n        .head(url)\n        .send()\n        .await\n        .map(|r| r.status().is_success())\n        .unwrap_or(false)\n}","typeGuard":null,"tryCatchPattern":"match update::run(version, force).await {\n    Err(e) if e.to_string().contains(\"download returned 404\") => {\n        // Permanent-ish: re-run check() for fresh asset metadata; if the\n        // asset is truly gone from the release, pin another --version.\n    }\n    Err(e) if e.to_string().contains(\"download returned 403\")\n            || e.to_string().contains(\"download returned 429\") => {\n        // Rate limited: back off and retry once later.\n    }\n    other => other,\n}","preventionTips":["Configure HTTPS_PROXY/NO_PROXY so the release CDN host is reachable from your environment","Cache release metadata and avoid redundant downloads from rate-limited shared egress IPs","Verify release assets for your target triple exist before automating updates against a tag"],"tags":["download","http-status","github-release","update","network","proxy"],"backgroundTag":"download-http-error-status","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}