{"record":{"id":"d02fdd87d777ee3f","repo":"zeroclaw-labs/zeroclaw","slug":"at","errorCode":null,"errorMessage":"{} (at {})","messagePattern":"\\{\\} \\(at \\{\\}\\)","errorType":"console","errorClass":"DiagItem","httpStatus":null,"severity":"warning","filePath":"crates/zeroclaw-runtime/src/doctor/mod.rs","lineNumber":1381,"sourceCode":"        let provider_ref = agent.model_provider.as_str();\n        if provider_ref.is_empty() {\n            continue;\n        }\n        if let Some(reason) = provider_validation_error(config, provider_ref) {\n            items.push(DiagItem::warn(\n                cat,\n                format!(\n                    \"agent \\\"{name}\\\" uses invalid model_provider \\\"{provider_ref}\\\": {reason}\",\n                ),\n            ));\n        }\n    }\n\n    // Non-fatal config warnings — dangling fallback refs, wire_api misuse, etc.\n    // Source of truth: `Config::collect_warnings()` (same signal as gateway API\n    // and `Config::validate()` tracing). Do not duplicate checks here.\n    for warning in config.collect_warnings() {\n        items.push(DiagItem::warn(\n            cat,\n            format!(\"{} (at {})\", warning.message, warning.path),\n        ));\n    }\n}\n\nfn check_web_dist_dir(config: &Config, items: &mut Vec<DiagItem>) {\n    let cat = \"config\";\n    match config.gateway.web_dist_dir.as_deref() {\n        None => {}\n        Some(value) => match web_dist_dir_expansion_reason_key(value) {\n            None => {}\n            Some(reason_key) => {\n                let reason = crate::i18n::get_required_cli_string(reason_key);\n                let message = crate::i18n::get_required_cli_string_with_args(\n                    \"cli-doctor-web-dist-dir-expansion-warning\",\n                    &[(\"path\", value), (\"reason\", reason.as_str())],\n                );","sourceCodeStart":1363,"sourceCodeEnd":1399,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-runtime/src/doctor/mod.rs#L1363-L1399","documentation":"Not a single check but the aggregation point: `check_config_semantics` forwards every warning from `Config::collect_warnings()` — the single source of truth shared with the gateway API and `Config::validate()` tracing — formatting each as `<message> (at <config path>)`. Typical warnings behind this wrapper are dangling model fallback references and `wire_api` misuse. Doctor deliberately does not duplicate those checks; it only re-reports them with their config path.","triggerScenarios":"Running `zeroclaw doctor`/`diagnose` on any config where `collect_warnings()` yields at least one entry, e.g. a `fallback` naming a provider that does not exist, or a `wire_api` value that does not fit the configured provider type.","commonSituations":"Renaming or deleting a provider while a fallback still points at the old name; switching a provider between chat/completions styles without updating `wire_api`; hand-editing config keys doctor's own checks do not cover.","solutions":["Read the message together with the `(at <path>)` suffix — the path names the exact config key to fix.","Fix the referenced key (restore the missing provider, correct the dangling fallback, set a valid `wire_api`).","Re-run `zeroclaw doctor`; the same warning source feeds `Config::validate()` tracing and the gateway API, so a clean doctor means those surfaces are clean too."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"for warning in config.collect_warnings() {\n    eprintln!(\"config warning at {}: {}\", warning.path, warning.message);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat `collect_warnings()` output as a build failure in CI, not log noise.","After renaming/removing providers, grep config for the old names before deploying."],"tags":["config","doctor","warnings","aggregation","zeroclaw"],"backgroundTag":"config-validation-warnings","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}