{"record":{"id":"f3c88e53608b117d","repo":"HKUDS/nanobot","slug":"channelplugin-name-must-not-be-empty","errorCode":null,"errorMessage":"ChannelPlugin.name must not be empty","messagePattern":"ChannelPlugin\\.name must not be empty","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"nanobot/channels/contracts.py","lineNumber":534,"sourceCode":"        for field in (\"name\", \"display_name\", \"avatar_url\"):\n            if field in override:\n                by_id[instance_id][field] = str(override[field] or \"\")\n    return instances\n\n\ndef refresh_channel_feature_metadata(\n    channel_cls: type[Any],\n    config_path: Path,\n    *,\n    instance_id: str = \"default\",\n) -> bool:\n    return bool(channel_cls.refresh_feature_metadata(config_path, instance_id=instance_id))\n\n\ndef _validate_runtime_name(plugin: ChannelPlugin, runtime_name: Any) -> None:\n    channel_name = str(plugin.name).strip()\n    if not channel_name:\n        raise ValueError(\"ChannelPlugin.name must not be empty\")\n    if not isinstance(runtime_name, str) or not runtime_name.strip():\n        raise ValueError(f\"ChannelPlugin.management for '{plugin.name}' returned an empty runtime name\")\n    if runtime_name != channel_name and not runtime_name.startswith(f\"{channel_name}.\"):\n        raise ValueError(\n            f\"ChannelPlugin.management runtime name '{runtime_name}' must be scoped under \"\n            f\"'{channel_name}'\"\n        )\n\n\ndef channel_field_value(values: Any, field_path: str) -> Any:\n    current: Any = values\n    for part in field_path.split(\".\"):\n        candidates = (part, _camel_to_snake(part))\n        if isinstance(current, dict):\n            for candidate in candidates:\n                if candidate in current:\n                    current = cast(Any, current)[candidate]\n                    break","sourceCodeStart":516,"sourceCodeEnd":552,"githubUrl":"https://github.com/HKUDS/nanobot/blob/42f37dc4c0e409eac7818a82d165c5f2757bc075/nanobot/channels/contracts.py#L516-L552","documentation":"Error \"ChannelPlugin.name must not be empty\" thrown in HKUDS/nanobot.","triggerScenarios":"Thrown at nanobot/channels/contracts.py:534 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"42f37dc4c0e409eac7818a82d165c5f2757bc075","analyzedAt":"2026-08-26T00:18:52.276Z","schemaVersion":2},"datasetVersion":"2026-08-26T04:18:47.238Z"}