{"record":{"id":"f8c95e06bec8bd48","repo":"zeroclaw-labs/zeroclaw","slug":"no-channel-components-tracked-yet","errorCode":null,"errorMessage":"no channel components tracked yet","messagePattern":"no channel components tracked yet","errorType":"console","errorClass":"DiagItem","httpStatus":null,"severity":"warning","filePath":"crates/zeroclaw-runtime/src/doctor/mod.rs","lineNumber":1706,"sourceCode":"                .and_then(serde_json::Value::as_str)\n                .and_then(parse_rfc3339)\n                .map_or(i64::MAX, |dt| {\n                    Utc::now().signed_duration_since(dt).num_seconds()\n                });\n\n            if status_ok && age <= CHANNEL_STALE_SECONDS {\n                items.push(DiagItem::ok(cat, format!(\"{name} fresh ({age}s ago)\")));\n            } else {\n                stale += 1;\n                items.push(DiagItem::error(\n                    cat,\n                    format!(\"{name} stale (ok={status_ok}, age={age}s)\"),\n                ));\n            }\n        }\n\n        if channel_count == 0 {\n            items.push(DiagItem::warn(cat, \"no channel components tracked yet\"));\n        } else if stale > 0 {\n            items.push(DiagItem::warn(\n                cat,\n                format!(\"{channel_count} channels, {stale} stale\"),\n            ));\n        }\n    }\n}\n\n// ── Environment checks ───────────────────────────────────────────\n\nfn check_environment(items: &mut Vec<DiagItem>) {\n    let cat = \"environment\";\n\n    // git\n    check_command_available(\"git\", &[\"--version\"], cat, items);\n\n    // Shell — Unix uses $SHELL, Windows uses %ComSpec% (path to cmd.exe).","sourceCodeStart":1688,"sourceCodeEnd":1724,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-runtime/src/doctor/mod.rs#L1688-L1724","documentation":"A `zeroclaw doctor` warning from `check_daemon_state`: the daemon state file's `components` object contains no entry whose name starts with `channel:`. Doctor counts channel components by that prefix; zero means it cannot report any channel health — usually because no channels are enabled, the daemon just started, or channel components have not registered yet.","triggerScenarios":"Running `zeroclaw doctor` when the daemon is running with zero enabled channels, or before any channel component has written its first status into the state file's `components` map.","commonSituations":"Doctor run against a fresh daemon before channels connect; all channels disabled in config; channels failing so early they never register components.","solutions":["Confirm at least one channel is enabled and its token is set (see the channel config warnings doctor reports).","Give the daemon time to start the channels and write component status, then re-run `zeroclaw doctor`.","If channels are enabled but never register, check daemon logs for channel startup errors."],"exampleFix":"# before: no channel:* entries in the daemon state file\n# doctor: no channel components tracked yet\n\n# after\njournalctl --user -u zeroclaw -n 100   # confirm channels started\nsystemctl --user restart zeroclaw && sleep 10 && zeroclaw doctor","handlingStrategy":"validation","validationCode":"let has_channels = state\n    .get(\"components\")\n    .and_then(|c| c.as_object())\n    .map(|c| c.keys().any(|k| k.starts_with(\"channel:\")))\n    .unwrap_or(false);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Enable and credential at least one channel before expecting channel health in the state file.","Treat 'no channel components tracked yet' as a signal to check startup logs, not just to wait."],"tags":["daemon","channels","health","doctor","zeroclaw"],"backgroundTag":"missing-health-check-data","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}