Safari Technology Preview 251: nested @scope с :has(:scope) выбирает неверный корень. Обратимый локальный тест, карта «узел × внешний root × внутренний root × :has match × применившееся правило» и критерий остановки без пользовательских данных и без переноса вывода на стабильный Safari.
Одна проверяемая боль: вложенный @scope применяет правило к соседнему поддереву, когда scope-start содержит :has(:scope ...)
Пользовательская задача этой страницы — как проверить корень nested scope с has scope в safari technology preview 251. Наблюдаемый симптом: вложенный @scope применяет правило к соседнему поддереву, когда scope-start содержит :has(:scope ...). Он не доказывает общую неисправность Safari и не переносится на stable-ветку без отдельной проверки. У этой темы два уровня области видимости, поэтому снимок computed style только конечного узла недостаточен. Нужно записать, какой root сформирован каждым @scope. :scope внутри :has() относится к контексту сопоставления, а не автоматически к ближайшему визуальному контейнеру. Граница диагноза фиксируется до опыта: входные условия, одно действие, ожидаемый и фактический результат. Соседние визуальные или сетевые проблемы не объединяются с этим URL.
Что именно подтверждают WebKit Release 251 и 318711@main
На прямой странице WebKit Release Notes for Safari Technology Preview 251 от 26 августа 2026 года указано: исправлены неверные scoping roots у вложенного @scope, если условие начала содержит :has(:scope ...). Строка ведёт на первичную запись 318711@main в репозитории WebKit. Эти два источника подтверждают наличие и техническую границу изменения в Technology Preview 251, но не подтверждают частоту проблемы, конкретную конфигурацию сайта, поисковый спрос или поведение всех будущих версий. Публичная ветка о релизе используется только как lead свежести, а не как доказательство причины.
Baseline для карта «узел × внешний root × внутренний root × :has match × применившееся правило»
До canary запишите: DOM-узел кандидата, внешний scope root, внутренний scope root, результат :has(), matched rule и итоговое вычисленное свойство. Каждое поле снимается из минимального fixture, а не восстанавливается по памяти. Добавьте точную версию Safari Technology Preview 251, масштаб страницы, локаль и время опыта; не прикладывайте имя профиля, IP, cookie, токены, query-параметры, локальные пути и рабочий контент. Рабочая форма результата — карта «узел × внешний root × внутренний root × :has match × применившееся правило». Пустая колонка обозначается unknown: её нельзя заполнять предположением или текстом из поискового сниппета.
Обратимый canary с одной изменяемой переменной
На изолированной странице постройте две одинаковые соседние ветки DOM, только в одной добавьте маркер для :has(); примените контрастное свойство во вложенном @scope и затем удалите маркер. До действия сохраните baseline, после действия снимите только заранее выбранные поля, затем полностью выполните rollback и повторите наблюдение. Минимальный пример должен работать без аккаунта, расширений, внешних данных и production endpoint. Положительный и отрицательный контроль запускаются отдельно, чтобы не смешивать состояния. Если возврат не восстановил baseline, опыт останавливается: добавлять вторую CSS-декларацию, новый API-вызов или очистку общего кэша нельзя.
Интерпретация без подмены expected и observed
Исправление видно, когда стиль получает только ветка с корректным внутренним корнем, а соседняя остаётся контролем. Если обе ветки окрашены, приложите DOM и одну декларацию. Если не окрашена ни одна, сначала проверяется синтаксис @scope. В итоговой записи разделите supported, reproduced, not reproduced, unsupported и unknown. Статус not reproduced относится только к этой сборке и этому fixture; он не обещает отсутствие регрессии на реальном сайте. Статус reproduced требует одинакового результата минимум в повторе после успешного rollback. Несовпадение контролей означает invalid test, а не повод расширять вывод.
Красная линия и минимальный пакет для 318711@main
Красная линия: не переносите селектор в production и не упрощайте его до обычного descendant selector до фиксации matched rules. Для воспроизводимого обращения достаточно версии сборки, коротких expected/actual, минимального HTML/CSS/JS fixture, результата rollback, карта «узел × внешний root × внутренний root × :has match × применившееся правило» и ссылки на 318711@main. Удалите из вложений локальные пути, идентификаторы, сетевые дампы и реальный контент. Отчёт не обещает срок исправления, индексацию страницы или одинаковое поведение стабильного Safari. Он позволяет другому человеку повторить ровно одну безопасную проверку.
Материал подготовлен редакцией VOne с помощью ИИ; дата, граница факта, первичный WebKit commit, обратимый тест, стоп-линия и роль community lead постатейно проверены 29 августа 2026 года.
Источники и проверка
- WebKit — Release Notes for Safari Technology Preview 251 проверено 2026-08-29
- WebKit commit 318711@main проверено 2026-08-29
Информация актуальна на дату публикации. Правила сервисов, приложений и сетей могут меняться.