🛡️ Robustness Release
Four review-driven fixes, no breaking changes.
Background-task safety
All fire-and-forget tasks now use async_create_background_task (keeps a strong reference) instead of async_create_task. Under load the event loop could otherwise garbage-collect a pending task before completion — most importantly the heating-model persistence after a session and the preheat absorb/cancel. Six call sites across coordinator, preheat, ambilight and light_sync.
Heating model: no fabricated rates across sensor gaps
If consecutive readings skipped one or more 5 °C buckets (e.g. the first reading after a sensor gap), the model scored the left bucket with a far-away temperature, inventing a wrong rate. A multi-bucket jump now discards the affected buckets (re-learned on a later gap-free heat-up); normal single-step transitions are unchanged.
Duplicate preset names rejected
The options flow now rejects duplicate climate-preset names (which would silently overwrite a slot) with a clear form error, translated in all 19 languages.
Ambilight throttle
Reviewed and confirmed correct — a ≥ 1 °C change already bypasses the throttle. Comment clarified, no behavioral change.
All 19 languages updated; CI translation parity verified.