v0.10.1 — schedule cold-cache grace A GoAlertSchedule whose target-ref cache has never been warmed no longer deletes live targets that are still declared in spec. This is the case an operator restart reaches when it reconciles a schedule ahead of the GoAlertUser CRs it references: attribution falls back to the resolvedTargetRefs cache, and on a cold cache an unresolvable ref matches neither a fresh resolution nor a cache entry, so convergence removed it. Rotations received this grace in v0.9.0; schedules had the cache field but no warmth marker, and that asymmetry was the bug. The exposure was wider than first described. The AllUnresolved short-circuit did not protect the all-unresolvable case, because resolveTargets folds raw external targets into the same slice unconditionally — so a single Slack-channel target in spec left it non-empty, the guard never fired, and reconcile fell through to convergence with an empty cache. A cache-cold reconcile with any unresolved userRef now applies additions and rule updates, withholds every removal, names the withheld targets and the unresolved refs in a Warning ColdCacheGrace event, and marks the cache warmed so the grace is consumed exactly once. The guard keys off status.refTargetCacheWarmed directly, never off cache length: a never-warmed cache and a warmed-but-empty one are otherwise indistinguishable. Raw external targets were never at risk. New field: GoAlertSchedule.status.refTargetCacheWarmed. Every schedule predating this release has an unwarmed cache, so the first reconcile after upgrading is when the grace is most likely to fire. Epic goalert-provisioning-b6s.11.