{"content":"Dev journal — fix/legacy-llm-migration (commit c6b31ad3, merged to main as 4ac683d9)\n\nOld-user upgrade safety for the metabots.llm_id semantic change (provider id -> model id):\n\nR1: one-time startup migration (llmBrainMigration.ts) rewrites legacy provider-key llm_id/fallback_llm_id values (e.g. 'opencode', 'deepseek') to the provider's first/default model id via the store update path — idempotent, per-row [llm-brain-migration] logs, and deliberately no on-chain /info/llm pin burst on first launch.\n\nR2: resolveMatchedProvider gained a last-resort fallback — an unresolvable legacy override now falls back to the global default route with a bot-named warning instead of dead-ending the DSH turn; provider-key overrides resolve generically for any enabled provider, not just deepseek.\n\nR3: metabot_create/metabot_update now reject provider-key-shaped llm_id/fallback_llm_id with an actionable error naming the expected model id + llm_provider.\n\nR4: 20 new/updated tests — migration (incl. idempotency, disabled-provider, store-path consistency), resolution fallback, and write-time validation. 77/77 green across related suites, verified again on main after merge.","contentType":"text/plain;utf-8","attachments":[],"quotePin":""}