{"record":{"id":"68914d7e2d00b889","repo":"HKUDS/nanobot","slug":"channelplugin-management-default-config-for-plug","errorCode":null,"errorMessage":"ChannelPlugin.management.default_config for '{plugin.name}' must return a dict","messagePattern":"ChannelPlugin\\.management\\.default_config for '(.+?)' must return a dict","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"nanobot/channels/contracts.py","lineNumber":290,"sourceCode":"        for name, field in plugin.setup.fields.items():\n            value: Any = field.default\n            if value is None:\n                fallback_defaults: dict[str, Any] = {\n                    \"string\": \"\",\n                    \"secret\": \"\",\n                    \"list\": [],\n                    \"bool\": False,\n                }\n                value = fallback_defaults.get(field.kind, _MISSING)\n            if value is not _MISSING:\n                _assign_channel_field(defaults, name, deepcopy(value))\n\n    factory = plugin.management.default_config\n    if factory is None:\n        return defaults\n    values_raw = cast(object, factory())\n    if not isinstance(values_raw, dict):\n        raise TypeError(f\"ChannelPlugin.management.default_config for '{plugin.name}' must return a dict\")\n    values = cast(dict[str, Any], values_raw)\n    return cast(dict[str, Any], merge_missing_defaults(values, defaults))\n\n\ndef _assign_channel_field(values: dict[str, Any], field: str, value: Any) -> None:\n    target = values\n    parts = field.split(\".\")\n    for part in parts[:-1]:\n        nested: object = target.get(part)\n        if not isinstance(nested, dict):\n            nested = {}\n            target[part] = nested\n        target = cast(dict[str, Any], nested)\n    target[parts[-1]] = value\n\n\ndef channel_local_state_present(plugin: ChannelPlugin, section: Any) -> bool:\n    checker = plugin.management.local_state_present","sourceCodeStart":272,"sourceCodeEnd":308,"githubUrl":"https://github.com/HKUDS/nanobot/blob/42f37dc4c0e409eac7818a82d165c5f2757bc075/nanobot/channels/contracts.py#L272-L308","documentation":"Error \"ChannelPlugin.management.default_config for '{plugin.name}' must return a dict\" thrown in HKUDS/nanobot.","triggerScenarios":"Thrown at nanobot/channels/contracts.py:290 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"}