{"record":{"id":"20ff9a6202e3461a","repo":"HKUDS/nanobot","slug":"module-name-plugin-declares-name-plugin-name","errorCode":null,"errorMessage":"{module_name}.PLUGIN declares name '{plugin.name}', expected '{name}'","messagePattern":"(.+?)\\.PLUGIN declares name '(.+?)', expected '(.+?)'","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"nanobot/channels/plugin.py","lineNumber":146,"sourceCode":"    \"\"\"Return whether *name* owns a dependency-free package manifest.\"\"\"\n    if _CHANNEL_PACKAGE_NAME.fullmatch(name) is None:\n        return False\n    return files(\"nanobot.channels\").joinpath(name, \"manifest.py\").is_file()\n\n\n@lru_cache(maxsize=None)\ndef load_channel_package(name: str) -> ChannelPlugin | None:\n    \"\"\"Load one package manifest without importing its runtime.\"\"\"\n    if not has_channel_package(name):\n        return None\n\n    module_name = f\"nanobot.channels.{name}.manifest\"\n    module = importlib.import_module(module_name)\n    plugin = getattr(module, \"PLUGIN\", None)\n    if not isinstance(plugin, ChannelPlugin):\n        raise TypeError(f\"{module_name}.PLUGIN must be a ChannelPlugin\")\n    if plugin.name != name:\n        raise TypeError(\n            f\"{module_name}.PLUGIN declares name '{plugin.name}', expected '{name}'\"\n        )\n\n    package_name = f\"nanobot.channels.{name}\"\n    package_root = files(\"nanobot.channels\").joinpath(name)\n    targets = [(\"runtime\", plugin.runtime)]\n    if plugin.connector is not None:\n        targets.append((\"connector\", plugin.connector))\n    for label, target in targets:\n        target_module, _ = _target_parts(target, label=label)\n        if not target_module.startswith(f\"{package_name}.\"):\n            raise TypeError(\n                f\"{module_name}.PLUGIN {label} must stay inside {package_name}: \"\n                f\"{target_module}\"\n            )\n        target_parts = target_module.removeprefix(f\"{package_name}.\").split(\".\")\n        target_file = package_root.joinpath(\n            *target_parts[:-1],","sourceCodeStart":128,"sourceCodeEnd":164,"githubUrl":"https://github.com/HKUDS/nanobot/blob/42f37dc4c0e409eac7818a82d165c5f2757bc075/nanobot/channels/plugin.py#L128-L164","documentation":"Error \"{module_name}.PLUGIN declares name '{plugin.name}', expected '{name}'\" thrown in HKUDS/nanobot.","triggerScenarios":"Thrown at nanobot/channels/plugin.py:146 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"}