From d80c94b9735252d78159cd1cfbde366c791e4330 Mon Sep 17 00:00:00 2001 From: Ed_ Date: Wed, 10 Jun 2026 08:46:54 -0400 Subject: [PATCH] fix(controller): pre-populate mma_tier_usage on reset (restore _flush_to_project contract) --- src/app_controller.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/app_controller.py b/src/app_controller.py index b0836b0f..7375c50c 100644 --- a/src/app_controller.py +++ b/src/app_controller.py @@ -3405,8 +3405,18 @@ class AppController: self.active_tickets = [] self.engines.clear() self.mma_streams.clear() - # Reset mma_tier_usage to pre-populated default (prior tests pollute it) - self.mma_tier_usage = {'Tier 1': {}, 'Tier 2': {}, 'Tier 3': {}, 'Tier 4': {}} + # Reset mma_tier_usage to the same shape as __init__ (line 952-957). Prior + # tests pollute it; downstream consumers like _flush_to_project require + # every tier entry to have 'model' / 'provider' / 'tool_preset' keys. The + # pre-populated defaults (input=0, output=0, provider='gemini', model= + # tier default, tool_preset=None) restore the contract without retaining + # any polluted model names or token counts from a prior session. + self.mma_tier_usage = { + "Tier 1": {"input": 0, "output": 0, "provider": "gemini", "model": "gemini-3.1-pro-preview", "tool_preset": None}, + "Tier 2": {"input": 0, "output": 0, "provider": "gemini", "model": "gemini-3-flash-preview", "tool_preset": None}, + "Tier 3": {"input": 0, "output": 0, "provider": "gemini", "model": "gemini-2.5-flash-lite", "tool_preset": None}, + "Tier 4": {"input": 0, "output": 0, "provider": "gemini", "model": "gemini-2.5-flash-lite", "tool_preset": None}, + } # Reset RAG engine state so the chroma collection from a prior test # doesn't leak into the next session. The next _sync_rag_engine will # rebuild the engine with the new active_project_root.