Миллион строк в одном PR: как Copilot тянет ревью без рывков

Экран pull request в GitHub Copilot пересобрали под рефакторы, которые нельзя честно разрезать на стек маленьких PR: diff и обсуждение растут вместе, а прокрутка не должна дёргаться. Стресс-тест — открытый PR на 2200 файлов, свыше миллиона строк изменений и больше 400 inline-комментариев.
Почему комментарии — узкое место
Чистый код виртуализируют давно: в DOM одновременно живёт порядка сотни строк, высоту строки считают заранее. Тред ревью посередине диффа ломает договорённость «все высоты известны до отрисовки» — переносы markdown, раскрытые блоки, поле ответа, suggested changes и картинки меняют раскладку уже после первого paint.
Фиксированный слот по оценке на таком масштабе даёт пустоты или вложенный скролл; запись реальной высоты после отрисовки сдвигает всё ниже и даёт скачок. Вместо одной геометрии на весь документ — две: точная высота кода и отдельный индекс динамических блоков с ключом по файлу, строке и стороне.
Замер без петли на каждый блок
Первый вариант — ResizeObserver на каждый комментарий с записью высоты обратно в layout — отбросили: стоимость растёт с числом смонтированных блоков. В проде один пакетный проход, когда скролл остановился: кандидаты только в зоне примерно 2400px от экрана, смонтированный блок читают одним batch без записей между чтениями.
Observer остался, чтобы пометить блок на повторное чтение, но сам высоту не пишет. Если пользователь раскрывает тред или дописывает ответ в видимой зоне, коррекцию успевают в том же кадре — не чаще одного commit за кадр и никогда во время активной прокрутки.
Держать место на экране
Когда замер не совпал с оценкой, якорь берут по строке или блоку, а не по пикселю: после поправки высот точка взгляда не уезжает. Отдельно поймали баг — после сужения панели diff из-за дерева файлов программный скролл принимали за жест пользователя и не возвращали нужный файл в кадр при переносе строк.
Diff с бэкенда идёт инкрементально: сначала дерево файлов и метаданные, потом содержимое, чтобы быстрый UI не простаивал в ожидании полного документа.
Источник: Rendering huge pull requests in the GitHub Copilot app.