diff --git a/src/atocore/memory/service.py b/src/atocore/memory/service.py index 3f8e24c..122ca79 100644 --- a/src/atocore/memory/service.py +++ b/src/atocore/memory/service.py @@ -369,10 +369,13 @@ def get_memories_for_context( available = budget - wrapper_chars selected_entries: list[str] = [] + used = 0 - for index, mtype in enumerate(memory_types): - type_budget = available if index == len(memory_types) - 1 else max(0, available // (len(memory_types) - index)) - type_used = 0 + # Flat budget across types so paragraph-length project memories + # aren't starved by an even slice. Types are still walked in order + # (identity/preference first when they're the input), so earlier + # types still get first pick when the budget is tight. + for mtype in memory_types: for mem in get_memories( memory_type=mtype, project=project, @@ -381,11 +384,10 @@ def get_memories_for_context( ): entry = f"[{mem.memory_type}] {mem.content}" entry_len = len(entry) + 1 - if entry_len > type_budget - type_used: + if entry_len > available - used: continue selected_entries.append(entry) - type_used += entry_len - available -= type_used + used += entry_len if not selected_entries: return "", 0