e8f253ac6a
Старт следующего плана всегда выбирается строго внутри текущего плана (нахлёст по времени), а раньше был fallback на ближайший более поздний старт, который мог дать разрыв. Если ни одна ЗРВ не начинается внутри текущего плана — цепочка обрывается, но разрыв между планами не создаётся. calculatePlansAfter тоже стартует хвост строго внутри принятого плана. Инвариант цепочки в тестах усилен проверкой строгого нахлёста; добавлен тест на провал видимости.