{"record":{"id":"b5790f2cce659fe7","repo":"bytedance/deer-flow","slug":"legacy-facts-in-path-must-be-a-list-or-mapping","errorCode":null,"errorMessage":"Legacy facts in {path} must be a list or mapping","messagePattern":"Legacy facts in (.+?) must be a list or mapping","errorType":"exception","errorClass":"MemoryStorageCorruption","httpStatus":null,"severity":"error","filePath":"backend/packages/harness/deerflow/agents/memory/backends/deermem/deermem/core/storage.py","lineNumber":967,"sourceCode":"        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\n        return self._document_from_memory_file(memory_file, path, agent_name, user_id=user_id)\n\n    def load(self, agent_name: str | None = None, *, user_id: str | None = None) -> dict[str, Any]:\n        path = self._get_memory_file_path(agent_name, user_id=user_id)\n        key = self._cache_key(agent_name, user_id=user_id)\n        journal_path = path.parent / \".memory.journal.json\"\n        legacy_path = self._legacy_agent_memory_path(path, agent_name) if agent_name is not None else None","sourceCodeStart":949,"sourceCodeEnd":985,"githubUrl":"https://github.com/bytedance/deer-flow/blob/1dd6ba1acb03700589994b0366c5d1c7d05e2eff/backend/packages/harness/deerflow/agents/memory/backends/deermem/deermem/core/storage.py#L949-L985","documentation":"Error \"Legacy facts in {path} must be a list or mapping\" thrown in bytedance/deer-flow.","triggerScenarios":"Thrown at backend/packages/harness/deerflow/agents/memory/backends/deermem/deermem/core/storage.py:967 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Convert the legacy facts file to a JSON list or mapping before migrating.","Fix the file's top-level JSON structure and retry migration."],"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-15T17:31:12.345Z"}