{"record":{"id":"09846792ac4606a9","repo":"bytedance/deer-flow","slug":"legacy-manifest-id-mismatch-for-fact-fact-id-r","errorCode":null,"errorMessage":"Legacy manifest id mismatch for fact {fact_id!r}","messagePattern":"Legacy manifest id mismatch for fact (.+?)","errorType":"exception","errorClass":"MemoryStorageCorruption","httpStatus":null,"severity":"error","filePath":"backend/packages/harness/deerflow/agents/memory/backends/deermem/deermem/core/storage.py","lineNumber":960,"sourceCode":"        allow_legacy_facts: bool = False,\n    ) -> dict[str, Any]:\n        \"\"\"Build the compatibility document without persisting facts in JSON.\"\"\"\n        legacy_facts = memory_file.get(\"facts\")\n        contains_owned_legacy_facts = isinstance(legacy_facts, dict) or (isinstance(legacy_facts, list) and bool(legacy_facts))\n        if contains_owned_legacy_facts and not allow_legacy_facts:\n            raise MemoryStorageCorruption(f\"Legacy facts in {path} require explicit migrate(user_id=..., agent_name=...)\")\n        if isinstance(legacy_facts, list):\n            facts = copy.deepcopy(legacy_facts) if agent_name is not None else []\n        elif isinstance(legacy_facts, dict):\n            facts = []\n            if agent_name is not None:\n                for fact_id, entry in legacy_facts.items():\n                    if not isinstance(entry, dict) or not isinstance(entry.get(\"path\"), str):\n                        raise MemoryStorageCorruption(f\"Invalid legacy manifest entry for fact {fact_id!r}\")\n                    fact_path = _safe_relative_path(path.parent, entry[\"path\"], label=\"legacy fact\")\n                    fact = _parse_fact_markdown(fact_path)\n                    if str(fact.get(\"id\")) != str(fact_id):\n                        raise MemoryStorageCorruption(f\"Legacy manifest id mismatch for fact {fact_id!r}\")\n                    if entry.get(\"contentHash\") and entry.get(\"contentHash\") != _content_hash(fact_path.read_bytes()):\n                        raise MemoryStorageCorruption(f\"Hash mismatch for canonical fact {fact_id!r}\")\n                    facts.append(fact)\n        elif legacy_facts is None:\n            facts = self._load_agent_facts(path, agent_name, user_id=user_id)\n        else:\n            raise MemoryStorageCorruption(f\"Legacy facts in {path} must be a list or mapping\")\n        result = {key: copy.deepcopy(value) for key, value in memory_file.items() if key != \"facts\"}\n        result.setdefault(\"revision\", 0)\n        result[\"facts\"] = facts\n        return result\n\n    def _read_document(self, path: Path, agent_name: str | None, *, user_id: str | None) -> dict[str, Any]:\n        memory_file = self._load_memory_file(path)\n        if memory_file is None:\n            result = create_empty_memory()\n            result[\"facts\"] = self._load_agent_facts(path, agent_name, user_id=user_id)\n            return result","sourceCodeStart":942,"sourceCodeEnd":978,"githubUrl":"https://github.com/bytedance/deer-flow/blob/1dd6ba1acb03700589994b0366c5d1c7d05e2eff/backend/packages/harness/deerflow/agents/memory/backends/deermem/deermem/core/storage.py#L942-L978","documentation":"Error \"Legacy manifest id mismatch for fact {fact_id!r}\" thrown in bytedance/deer-flow.","triggerScenarios":"Thrown at backend/packages/harness/deerflow/agents/memory/backends/deermem/deermem/core/storage.py:960 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Fix the manifest so its id matches the fact file's id for the named fact.","Regenerate the manifest from the fact files if it is inconsistent."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"1dd6ba1acb03700589994b0366c5d1c7d05e2eff","analyzedAt":"2026-08-14T21:20:34.804Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}