Skip to content

Python: fix(core): stop losing multiline consolidated memories on reload - #9240

Draft
Yufeng He (he-yufeng) wants to merge 1 commit into
microsoft:mainfrom
he-yufeng:fix/memory-consolidation-multiline-roundtrip
Draft

Yufeng He (he-yufeng) wants to merge 1 commit into
microsoft:mainfrom
he-yufeng:fix/memory-consolidation-multiline-roundtrip

Conversation

@he-yufeng

Copy link
Copy Markdown
Contributor

Motivation & Context

consolidate_memories accepts a valid JSON response whose memories array contains a string with an ordinary line break and reports success, but a fresh MemoryFileStore reads back only the first line: to_markdown writes the break verbatim as a non-bullet line in the Memories section, and from_markdown only reads - bullets, so the continuation silently disappears on reload while the raw file still shows it. The write path does not hit this because _merge_memory normalizes every memory through _normalize_memory_text before it reaches the record.

Description & Review Guide

  • What are the major changes? MemoryTopicRecord.__init__ now runs each memory through _normalize_memory_text, the same normalizer the write path uses, while keeping the existing drop-empty tolerance. Single-line memories become a record invariant, so the markdown round-trip is stable no matter which path supplied the text.
  • What is the impact of these changes? Consolidation, extraction, and any JSON-sourced record construction now behave like write_memory: line breaks fold into spaces instead of truncating on the next read. The on-disk format is unchanged, and existing single-line records are byte-identical after a rewrite.
  • What do you want reviewers to focus on? The decision to normalize at record construction rather than only inside _consolidate_topic, so every current and future intake path inherits the invariant.

Related Issue

Fixes #9228

Contribution Checklist

  • The code builds clean without any errors or warnings
  • All unit tests pass, and I have added new tests where possible
  • The PR follows the Contribution Guidelines
  • The PR is linked to an issue and there is no other open PR for this issue (see Related Issue above).
  • This is not a breaking change. If it is a breaking change, add the breaking change label (or add "[BREAKING]" to the title prefix, before or after any language prefix) — a workflow keeps the label and the title prefix in sync automatically.

The write path normalizes every memory through _normalize_memory_text
before it reaches a record, but _consolidate_topic hands the LLM's
memories strings to MemoryTopicRecord raw. A consolidated memory with
a line break is written by to_markdown as a bullet whose continuation
lands on a non-bullet line, and from_markdown only reads "- " bullets,
so a fresh store silently returns just the first line while the raw
file still shows the rest.

MemoryTopicRecord now normalizes each memory at construction, keeping
the existing drop-empty tolerance, so single-line memories are a record
invariant and the markdown round-trip is stable no matter which path
supplied the text.

Verified with the full agent-framework-core suite: 8536 tests, 0
failures; ruff and pyright clean on the changed files.

Signed-off-by: Yufeng He <40085740+he-yufeng@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings October 9, 2026 13:17
@agent-framework-automation agent-framework-automation Bot added the python Usage: [Issues, PRs], Target: Python label Oct 9, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approval recommended

The focused normalization fix addresses the reported data loss and is covered at both record and consolidation levels.

0 open findings

What changed in this PR

Normalizes memory text at record construction to prevent multiline consolidated memories from being truncated after Markdown reload.

Changes:

  • Enforces single-line, deduplicated memory records.
  • Adds unit and consolidation round-trip coverage for LF and CRLF content.
File Description
python/​packages/​core/​agent_framework/​_harness/​_memory.py Normalizes memories during record initialization.
python/​packages/​core/​tests/​core/​test_harness_memory.py Tests normalization and fresh-store reload behavior.

🧠 Review effort: Balanced


💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.

This branch was successfully deployed

1 active deployment
github-app-auth — c2cd4d3d Deployed Oct 9, 2026 by he-yufeng via team_check #6468
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

python Usage: [Issues, PRs], Target: Python

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Python: [Bug]: Consolidated memory continuation lines disappear on reload

2 participants