{"record":{"id":"93fe0adf96db71f2","repo":"headroomlabs-ai/headroom","slug":"invalid-memory-mode-config-memory-mode-r-expect","errorCode":null,"errorMessage":"Invalid memory_mode={config.memory_mode!r}; expected one of {[m.value for m in MemoryMode]}","messagePattern":"Invalid memory_mode=(.+?); expected one of (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"headroom/proxy/server.py","lineNumber":1260,"sourceCode":"            )\n        elif config.memory_enabled:\n            # Resolve memory DB path: empty → project-scoped default\n            _mem_db_path = config.memory_db_path\n            if not _mem_db_path:\n                _mem_dir = Path.cwd() / \".headroom\"\n                _mem_dir.mkdir(parents=True, exist_ok=True)\n                _mem_db_path = str(_mem_dir / \"memory.db\")\n                logger.info(f\"Memory: Project-scoped DB at {_mem_db_path}\")\n\n            # PR-B6: translate the string-typed ``ProxyConfig.memory_mode``\n            # into the typed ``MemoryMode`` enum. Unknown values raise\n            # loudly per the no-silent-fallback policy.\n            from headroom.proxy.memory_handler import MemoryMode\n\n            try:\n                _memory_mode = MemoryMode(config.memory_mode)\n            except ValueError as exc:\n                raise ValueError(\n                    f\"Invalid memory_mode={config.memory_mode!r}; \"\n                    f\"expected one of {[m.value for m in MemoryMode]}\"\n                ) from exc\n\n            from headroom.memory.storage_router import MemoryStorageMode\n\n            try:\n                _storage_mode = MemoryStorageMode(config.memory_storage_mode)\n            except ValueError as exc:\n                raise ValueError(\n                    f\"Invalid memory_storage_mode={config.memory_storage_mode!r}; \"\n                    f\"expected one of {[m.value for m in MemoryStorageMode]}\"\n                ) from exc\n\n            memory_config = MemoryConfig(\n                enabled=True,\n                backend=config.memory_backend,\n                db_path=_mem_db_path,","sourceCodeStart":1242,"sourceCodeEnd":1278,"githubUrl":"https://github.com/headroomlabs-ai/headroom/blob/322425c43bffde1ed0b64fecf3cf5951565dd82b/headroom/proxy/server.py#L1242-L1278","documentation":"During app creation, the string-typed ProxyConfig.memory_mode is converted to the MemoryMode enum, and unknown strings raise loudly instead of silently falling back. The error lists the accepted enum values. It occurs after memory directories are prepared, before MemoryConfig is built.","triggerScenarios":"ProxyConfig(memory_mode='aggressive') or any value not in MemoryMode, supplied via config file or programmatic construction; usually a typo or a value from an older/newer version.","commonSituations":"Version skew between config and installed headroom; hand-edited YAML/JSON with a stale mode name; case-sensitive value like 'Session'.","solutions":["Check the error's accepted-values list and use an exact enum value.","Update or remove the memory_mode key so a supported default applies.","Regenerate config files after upgrading headroom."],"exampleFix":"# before\nconfig = ProxyConfig(memory_mode=\"aggressive\")\n\n# after\nfrom headroom.proxy.memory_handler import MemoryMode\nconfig = ProxyConfig(memory_mode=MemoryMode.SESSION.value)  # use a listed value","handlingStrategy":"type-guard","validationCode":"from headroom.proxy.memory_handler import MemoryMode\nif cfg[\"memory_mode\"] not in {m.value for m in MemoryMode}:\n    raise SystemExit(f\"memory_mode must be one of {[m.value for m in MemoryMode]}\")","typeGuard":"from headroom.proxy.memory_handler import MemoryMode\ndef is_memory_mode(v: str) -> bool:\n    return v in {m.value for m in MemoryMode}","tryCatchPattern":"try:\n    app = create_app(config)\nexcept ValueError as e:\n    if \"memory_mode\" in str(e):\n        fix_config(e)\n    raise","preventionTips":["Derive config values from the installed enums, not hardcoded strings.","Re-validate memory_* keys after every headroom upgrade."],"tags":["config","enum","validation"],"backgroundTag":null,"analyzedSha":"322425c43bffde1ed0b64fecf3cf5951565dd82b","analyzedAt":"2026-08-15T01:03:05.481Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}