{"record":{"id":"972b3a222c9e3c19","repo":"bytedance/deer-flow","slug":"change-set-summaries-history-must-be-an-object","errorCode":null,"errorMessage":"change_set.summaries.history must be an object","messagePattern":"change_set\\.summaries\\.history must be an object","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"backend/packages/harness/deerflow/agents/memory/backends/deermem/deermem/core/storage.py","lineNumber":785,"sourceCode":"            if existing is None:\n                continue\n            if delete_revisions and fact_id in delete_revisions and delete_revisions[fact_id] != existing.get(\"revision\"):\n                raise MemoryFactRevisionConflict(f\"Expected fact {fact_id!r} revision {delete_revisions[fact_id]}, found {existing.get('revision')}\")\n            removals[fact_id] = (existing, fact_path)\n\n        base = current_memory or create_empty_memory()\n        user_section = copy.deepcopy(base.get(\"user\", {}))\n        history_section = copy.deepcopy(base.get(\"history\", {}))\n        if summaries is not None:\n            if not isinstance(summaries, dict):\n                raise ValueError(\"change_set.summaries must be an object\")\n            if \"user\" in summaries:\n                if not isinstance(summaries[\"user\"], dict):\n                    raise ValueError(\"change_set.summaries.user must be an object\")\n                user_section.update(copy.deepcopy(summaries[\"user\"]))\n            if \"history\" in summaries:\n                if not isinstance(summaries[\"history\"], dict):\n                    raise ValueError(\"change_set.summaries.history must be an object\")\n                history_section.update(copy.deepcopy(summaries[\"history\"]))\n        summaries_changed = user_section != base.get(\"user\", {}) or history_section != base.get(\"history\", {})\n        needs_manifest_cleanup = current_memory is None or current_memory.get(\"version\") != DOCUMENT_VERSION or \"facts\" in current_memory\n        if not prepared and not removals and not summaries_changed and not needs_manifest_cleanup:\n            memory_file = current_memory or {\n                \"version\": DOCUMENT_VERSION,\n                \"revision\": 0,\n                \"lastUpdated\": base.get(\"lastUpdated\", utc_now_iso_z()),\n                \"user\": user_section,\n                \"history\": history_section,\n            }\n            return memory_file, []\n\n        next_revision = current_revision + 1\n        old_entries: dict[str, dict[str, str]] = {}\n        for fact_id, (_, existing, fact_path) in prepared.items():\n            if existing is not None:\n                old_entries[fact_id] = {\"path\": fact_path.relative_to(path.parent).as_posix()}","sourceCodeStart":767,"sourceCodeEnd":803,"githubUrl":"https://github.com/bytedance/deer-flow/blob/1dd6ba1acb03700589994b0366c5d1c7d05e2eff/backend/packages/harness/deerflow/agents/memory/backends/deermem/deermem/core/storage.py#L767-L803","documentation":"Error \"change_set.summaries.history must be an object\" thrown in bytedance/deer-flow.","triggerScenarios":"Thrown at backend/packages/harness/deerflow/agents/memory/backends/deermem/deermem/core/storage.py:785 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Pass summaries.history as an object with the expected summary fields.","Omit the history summary key if no history summary update is intended."],"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"}