fix(agent): invalidate flush-scan cursor at the defrag marker-pop sibling site
The micro-compaction defrag pass (_defrag_rolling_summary) rewrites the newest MICRO marker's content and pops _DB_PERSISTED_MARKER from the LIVE dict in place — the same in-place pop class finalize_turn's fill site was fixed for in #75170. Without invalidation the bounded flush-scan cursor identity-skips the rewritten marker row and the defragged rolling summary never reaches state.db (resume rehydrates a stale summary). The compressor holds no agent reference, so the pop site raises _flush_scan_cursor_invalidated and the finalize_turn micro-compaction block consumes it, setting agent._db_flush_scan_prefix = None. The module-scope pop sites (context_compressor.py:175/224) operate on fresh copies — identity-breaking by construction — and need no flag. Follow-up to #75170 (fix-the-class sweep of _DB_PERSISTED_MARKER in-place pops).
This commit is contained in:
@@ -384,6 +384,18 @@ def finalize_turn(
|
||||
):
|
||||
_before = len(messages)
|
||||
_compacted = _compressor._micro_compact(messages)
|
||||
# Micro-compaction defrag rewrites the newest MICRO
|
||||
# marker's content and pops _db_persisted from the live
|
||||
# dict in place — the sibling of the pop site above. The
|
||||
# compressor has no agent reference, so it raises a flag
|
||||
# for us to invalidate the bounded flush-scan cursor;
|
||||
# otherwise the rewritten marker row is identity-skipped
|
||||
# and the stale summary persists to state.db.
|
||||
if getattr(
|
||||
_compressor, "_flush_scan_cursor_invalidated", False
|
||||
):
|
||||
_compressor._flush_scan_cursor_invalidated = False
|
||||
agent._db_flush_scan_prefix = None
|
||||
if isinstance(_compacted, list) and _compacted:
|
||||
messages[:] = _compacted
|
||||
_after = len(messages)
|
||||
|
||||
Reference in New Issue
Block a user