Merge pull request #407 from AIOSAI/citizen/memory

feat(memory): fix(memory): v2 rollover watcher — use detector instead of threshold bypass
This commit is contained in:
AIPass
2026-04-22 21:09:39 -07:00
committed by GitHub
2 changed files with 9 additions and 9 deletions
@@ -266,19 +266,19 @@ def _should_rollover(file_path: Path) -> tuple[bool, int, int, str, str]:
max_sessions = limits.get("max_sessions")
if max_sessions is not None:
sessions = data.get("sessions", [])
if isinstance(sessions, list) and len(sessions) > max_sessions:
if isinstance(sessions, list) and len(sessions) >= max_sessions:
reasons.append(f"{len(sessions)}/{max_sessions} sessions")
max_key_learnings = limits.get("max_key_learnings")
if max_key_learnings is not None:
key_learnings = data.get("key_learnings", {})
if isinstance(key_learnings, dict) and len(key_learnings) > max_key_learnings:
if isinstance(key_learnings, dict) and len(key_learnings) >= max_key_learnings:
reasons.append(f"{len(key_learnings)}/{max_key_learnings} key_learnings")
max_observations = limits.get("max_observations")
if max_observations is not None:
observations = data.get("observations", [])
if isinstance(observations, list) and len(observations) > max_observations:
if isinstance(observations, list) and len(observations) >= max_observations:
reasons.append(f"{len(observations)}/{max_observations} observations")
triggered = len(reasons) > 0
@@ -280,8 +280,8 @@ def _extract_items_v2(file_path: Path, data: Dict[str, Any]) -> Dict[str, Any]:
max_sessions = limits.get("max_sessions")
if max_sessions is not None:
sessions = data.get("sessions", [])
if isinstance(sessions, list) and len(sessions) > max_sessions:
excess = len(sessions) - max_sessions
if isinstance(sessions, list) and len(sessions) >= max_sessions:
excess = max(len(sessions) - max_sessions, 1)
extracted_sessions = sessions[-excess:] # oldest from end
data["sessions"] = sessions[:-excess] # keep newest
all_extracted.extend(extracted_sessions)
@@ -290,8 +290,8 @@ def _extract_items_v2(file_path: Path, data: Dict[str, Any]) -> Dict[str, Any]:
max_key_learnings = limits.get("max_key_learnings")
if max_key_learnings is not None:
key_learnings = data.get("key_learnings", {})
if isinstance(key_learnings, dict) and len(key_learnings) > max_key_learnings:
excess = len(key_learnings) - max_key_learnings
if isinstance(key_learnings, dict) and len(key_learnings) >= max_key_learnings:
excess = max(len(key_learnings) - max_key_learnings, 1)
keys_list = list(key_learnings.keys())
keys_to_extract = keys_list[:excess] # oldest (first inserted)
for k in keys_to_extract:
@@ -302,8 +302,8 @@ def _extract_items_v2(file_path: Path, data: Dict[str, Any]) -> Dict[str, Any]:
max_observations = limits.get("max_observations")
if max_observations is not None:
observations = data.get("observations", [])
if isinstance(observations, list) and len(observations) > max_observations:
excess = len(observations) - max_observations
if isinstance(observations, list) and len(observations) >= max_observations:
excess = max(len(observations) - max_observations, 1)
extracted_obs = observations[-excess:]
data["observations"] = observations[:-excess]
all_extracted.extend(extracted_obs)