{"record":{"id":"92a55c08bd68b535","repo":"jdx/mise","slug":"failed-to-read-schema-at","errorCode":null,"errorMessage":"Failed to read schema at {}: {}","messagePattern":"Failed to read schema at (.+?): (.+?)","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/mise-interactive-config/build.rs","lineNumber":60,"sourceCode":"    // then fall back to repo-root location (used during normal development)\n    let manifest_dir = Path::new(env!(\"CARGO_MANIFEST_DIR\"));\n    let local_schema = manifest_dir.join(\"mise.json\");\n    let repo_schema = manifest_dir\n        .parent()\n        .unwrap()\n        .parent()\n        .unwrap()\n        .join(\"schema/mise.json\");\n    let schema_path = if local_schema.exists() {\n        local_schema\n    } else {\n        repo_schema\n    };\n\n    println!(\"cargo:rerun-if-changed={}\", schema_path.display());\n\n    let schema_content = fs::read_to_string(&schema_path)\n        .unwrap_or_else(|e| panic!(\"Failed to read schema at {}: {}\", schema_path.display(), e));\n\n    let schema: Value = serde_json::from_str(&schema_content)\n        .unwrap_or_else(|e| panic!(\"Failed to parse schema JSON: {}\", e));\n\n    let defs = schema.get(\"$defs\");\n\n    // Extract top-level properties and classify them\n    let mut sections = Vec::new();\n    let mut entries = Vec::new(); // (name, description, type)\n\n    if let Some(properties) = schema.get(\"properties\").and_then(|p| p.as_object()) {\n        for (name, prop) in properties {\n            // Skip deprecated and internal properties\n            if prop\n                .get(\"deprecated\")\n                .and_then(|d| d.as_bool())\n                .unwrap_or(false)\n            {","sourceCodeStart":42,"sourceCodeEnd":78,"githubUrl":"https://github.com/jdx/mise/blob/afd2eddd3a50c16190efc1c7e94404b48f72af57/crates/mise-interactive-config/build.rs#L42-L78","documentation":"Same guard as the other HTTP methods: get_async_with_headers_allow_error_status checks the `offline` setting before sending and throws \"offline mode is enabled\" if set. The \"allow error status\" variant still performs no network I/O in offline mode — it only skips HTTP status validation after a successful request.","triggerScenarios":"Calling get_async_with_headers_allow_error_status while Settings::get().offline() is true (MISE_OFFLINE=1 or offline=true in settings).","commonSituations":"Backend version lookups or registry checks that tolerate non-2xx responses still being invoked while offline mode is enabled in the environment.","solutions":["Disable offline mode: unset MISE_OFFLINE or `mise settings set offline false`","Set `offline = false` in the relevant mise.toml [settings] table","Avoid code paths requiring remote lookups when offline; use cached/installed data"],"exampleFix":"// before\nexport MISE_OFFLINE=1\nmise ls-remote node\n\n// after\nexport MISE_OFFLINE=0\nmise ls-remote node","handlingStrategy":"try-catch","validationCode":"[ \"${MISE_OFFLINE:-0}\" = \"0\" ] || echo \"offline mode on; request will be rejected\"","typeGuard":null,"tryCatchPattern":"if let Err(e) = client.get_async_with_headers_allow_error_status(url, &headers).await {\n    if e.to_string().contains(\"offline mode\") { use_cached_response(); return Ok(()); }\n    return Err(e);\n}","preventionTips":["Disable offline mode when remote lookups are required","Scope MISE_OFFLINE to specific commands instead of exporting globally","Fall back to cached data on this error"],"tags":["network","offline","http"],"backgroundTag":"network-request-failed","analyzedSha":"afd2eddd3a50c16190efc1c7e94404b48f72af57","analyzedAt":"2026-09-09T01:38:25.179Z","contentChangedAt":"2026-09-09T01:38:25.179Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}