Devin пересобрал рендерер чата для сессий на сотни тысяч сообщений

Самые длинные сессии Devin — это 100 000+ событий, и классическая виртуализация здесь не спасает: грузить и рисовать только видимое Cognition пересобрала в новый рендерер, потому что первый вариант агент собрал за один прогон, но он был неюзабелен. Скролл дёргался при стриминге, тяжёлые чаты открывались дольше 20 секунд, а до первого сообщения иногда уходили минуты.
Скелет вместо полной истории
Вместо выгрузки всего чата команда строит outline — массив типов сообщений без тяжёлого JSON. По нему рисуется скелет всей сессии с примерной высотой: можно сразу прокрутить к нужному месту. Когда пользователь доезжает до незагруженного участка, подтягивается «остров» реальных событий вокруг экрана плюс буфер — при медленном скролле skeleton успевает смениться на сообщения раньше, чем их увидят.
Якорь, чтобы текст не прыгал
Главная боль — сдвиг вёрстки: после подгрузки skeleton меняет высоту и сдвигает строки под глазами. Решение — якорная строка: фиксируют верхнее видимое сообщение, а если на экране только skeleton — верхний из них. После layout меряют разницу высоты и компенсируют scroll offset до отрисовки. Если между загруженными блоками остаётся крошечный кусок skeleton, диапазон подгрузки расширяют — иначе якорь ломается.
Отладчик от самого Devin
Большую часть итераций гоняли через virtualization debugger, который Devin собрал под эту задачу: визуализация состояния чата для людей и лог каждого шага virtualizer для агента. Ночью скидывали пачки логов сломанных сессий — утром проверяли фиксы. Один из коммитов — 41 строка в двух файлах плюс regression-тест, PR #61691.
Итог: загрузка больших сессий быстрее на 70% (p99 −70% к legacy), сдвиг вёрстки снизился на 86%. На p50–p95 выигрыш от −23% до −69%. Изменения уже в проде.
Источник: How Devin rebuilt its renderer | Devin.