{"record":{"id":"2bb462f232f9ee3a","repo":"bytedance/deer-flow","slug":"legacy-facts-in-path-require-explicit-migrate-us","errorCode":null,"errorMessage":"Legacy facts in {path} require explicit migrate(user_id=..., agent_name=...)","messagePattern":"Legacy facts in (.+?) require explicit migrate\\(user_id=\\.\\.\\., agent_name=\\.\\.\\.\\)","errorType":"exception","errorClass":"MemoryStorageCorruption","httpStatus":null,"severity":"error","filePath":"backend/packages/harness/deerflow/agents/memory/backends/deermem/deermem/core/storage.py","lineNumber":948,"sourceCode":"        )\n        if legacy_memory is not None:\n            legacy_path.unlink(missing_ok=True)\n        return True, from_version, notifications\n\n    def _document_from_memory_file(\n        self,\n        memory_file: dict[str, Any],\n        path: Path,\n        agent_name: str | None,\n        *,\n        user_id: str | None,\n        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:","sourceCodeStart":930,"sourceCodeEnd":966,"githubUrl":"https://github.com/bytedance/deer-flow/blob/1dd6ba1acb03700589994b0366c5d1c7d05e2eff/backend/packages/harness/deerflow/agents/memory/backends/deermem/deermem/core/storage.py#L930-L966","documentation":"Error \"Legacy facts in {path} require explicit migrate(user_id=..., agent_name=...)\" thrown in bytedance/deer-flow.","triggerScenarios":"Thrown at backend/packages/harness/deerflow/agents/memory/backends/deermem/deermem/core/storage.py:948 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Call migrate with explicit user_id and agent_name arguments.","Programmatic migration only; legacy facts are not auto-migrated without scope."],"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"}