{"record":{"id":"eb1914e63d149f4f","repo":"bytedance/deer-flow","slug":"mem0-failure-policy-read-must-be-one-of-sorted-r","errorCode":null,"errorMessage":"mem0 failure_policy.read must be one of {sorted(_READ_POLICIES)}","messagePattern":"mem0 failure_policy\\.read must be one of (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"backend/packages/harness/deerflow/agents/memory/backends/mem0/config.py","lineNumber":99,"sourceCode":"        if not isinstance(allow_insecure_http, bool):\n            raise ValueError(\"mem0 allow_insecure_http must be a boolean\")\n\n        config = cls(\n            api_key_env=str(cfg.get(\"api_key_env\", \"MEM0_API_KEY\")),\n            base_url=str(cfg.get(\"base_url\", \"https://api.mem0.ai\")).rstrip(\"/\"),\n            allow_insecure_http=allow_insecure_http,\n            top_k=int(cfg.get(\"top_k\", 8)),\n            score_threshold=float(cfg.get(\"score_threshold\", 0.1)),\n            max_injection_chars=int(cfg.get(\"max_injection_chars\", 12000)),\n            timeout_seconds=float(cfg.get(\"timeout_seconds\", 10.0)),\n            startup_policy=str(cfg.get(\"startup_policy\", \"fail_fast\")),\n            read_policy=str(failure_policy.get(\"read\", \"fail_open\")),\n            write_policy=str(failure_policy.get(\"write\", \"log_and_drop\")),\n        )\n        if config.startup_policy not in _STARTUP_POLICIES:\n            raise ValueError(f\"mem0 startup_policy must be one of {sorted(_STARTUP_POLICIES)}\")\n        if config.read_policy not in _READ_POLICIES:\n            raise ValueError(f\"mem0 failure_policy.read must be one of {sorted(_READ_POLICIES)}\")\n        if config.write_policy not in _WRITE_POLICIES:\n            raise ValueError(f\"mem0 failure_policy.write must be one of {sorted(_WRITE_POLICIES)}\")\n        if not 1 <= config.top_k <= 1000:\n            raise ValueError(\"mem0 top_k must be in [1, 1000]\")\n        if not 0.0 <= config.score_threshold <= 1.0:\n            raise ValueError(\"mem0 score_threshold must be in [0, 1]\")\n        if config.max_injection_chars <= 0:\n            raise ValueError(\"mem0 max_injection_chars must be positive\")\n        if config.timeout_seconds <= 0:\n            raise ValueError(\"mem0 timeout_seconds must be positive\")\n        if not config.api_key_env.strip():\n            raise ValueError(\"mem0 api_key_env must be a non-empty env var name\")\n        parsed_base_url = urlsplit(config.base_url)\n        if parsed_base_url.scheme not in {\"http\", \"https\"} or not parsed_base_url.netloc:\n            raise ValueError(\"mem0 base_url must be an absolute http:// or https:// URL\")\n        if parsed_base_url.scheme == \"http\" and not config.allow_insecure_http:\n            raise ValueError(\"mem0 base_url must use https:// because it carries the API key; set allow_insecure_http: true only for trusted local development\")\n        return config","sourceCodeStart":81,"sourceCodeEnd":117,"githubUrl":"https://github.com/bytedance/deer-flow/blob/1dd6ba1acb03700589994b0366c5d1c7d05e2eff/backend/packages/harness/deerflow/agents/memory/backends/mem0/config.py#L81-L117","documentation":"Raised by Mem0Config.from_backend_config when memory.backend_config.failure_policy.read is not one of the two supported values: fail_open (default; recall errors inject nothing and the run continues) and fail_closed (recall errors raise MemoryManagerError). Checked after str() coercion, so any other string — typos, case variants, synonyms — is rejected.","triggerScenarios":"failure_policy: {read: open}, {read: fail-closed}, {read: FailOpen}, or {read: ignore} in backend_config.","commonSituations":"Vocabulary drift from other backends' docs; typos; trying to express 'never fail' with words like ignore/skip/soft.","solutions":["Use exactly fail_open (log + inject nothing on recall failure) or fail_closed (raise MemoryManagerError)","For graceful degradation keep the default fail_open; use fail_closed only when memory recall must be guaranteed","Remove the read key to accept the fail_open default"],"exampleFix":"# before (config.yaml)\nmemory:\n  backend_config:\n    failure_policy:\n      read: ignore   # not a policy value\n\n# after\nmemory:\n  backend_config:\n    failure_policy:\n      read: fail_open","handlingStrategy":"validation","validationCode":"READ_POLICIES = {\"fail_open\", \"fail_closed\"}\n\ndef read_policy_ok(backend_config: dict) -> bool:\n    fp = (backend_config or {}).get(\"failure_policy\") or {}\n    return str(fp.get(\"read\", \"fail_open\")) in READ_POLICIES","typeGuard":"def is_read_policy(v: object) -> bool:\n    return v in (\"fail_open\", \"fail_closed\")","tryCatchPattern":null,"preventionTips":["Memorize the two semantics: fail_open = inject nothing and continue; fail_closed = raise MemoryManagerError","Default fail_open is right for most deployments — opt into fail_closed deliberately"],"tags":["config","mem0","memory","validation","failure-policy"],"backgroundTag":null,"analyzedSha":"1dd6ba1acb03700589994b0366c5d1c7d05e2eff","analyzedAt":"2026-08-14T21:20:34.804Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}