9ddc6fb23a
_runtime_model_config merges the agent's current identity onto the row's existing model_config JSON. For model and provider it only SET the key when the agent attribute was truthy, while base_url/api_mode/ reasoning_config/service_tier already deleted stale values when falsy. When an agent rebuilt with an empty provider (inheriting the profile default) was persisted, the previous provider/endpoint survived in model_config while _persist_live_session_runtime updated the model column separately. Resume then read the fresh model from the column but the STALE provider from model_config, silently routing the resumed chat to the wrong endpoint (e.g. a VeniceAI/empero route under a model that should run on the profile default). Apply the same delete-on-falsy rule to model and provider, mirroring the or-None deletion the CLI path (_persist_model_switch_to_session) already uses, so a stale session state can never survive into a resume override. Existing desynced rows self-heal on the next live metadata persist. Adds regression tests: merge drops stale provider/model when the agent attribute is falsy, a truthy provider overwrites the stale value, resume overrides fall back to the billing provider instead of the stale endpoint, a real-DB round trip heals an already-desynced row, and a first write (existing=None) reflects only the agent's current identity.