Модель знает, получится ли код, ещё до того, как его напишет
Новая работа про latent programming horizon: простой пробинг скрытых состояний coding-агента предсказывает, заработает ли код, и даже его будущее на ~25 шагов вперёд. Мы копаем тот же латент с другой стороны — в оценке кандидата — и пришли к тем же выводам.
Авторы: slavb18

Coding-агент берёт задачу и уходит в работу: читает файлы, грепает проект, гоняет тесты, правит код. Медианная попытка — 52 шага и 36 тысяч токенов. И часто уже в начале этой траектории понятно, что задача не решится. Только узнаёте вы об этом в конце, когда токены сожжены.
Свежая работа «Latent Programming Horizons in Coding Agents» (Silva, Tu, Monperrus) показывает: сама модель понимает это заметно раньше. Ответ уже лежит в её внутренних состояниях.
Что сделали
К скрытым состояниям агента подключили простой классификатор — логистическую регрессию. Модель не дообучали, новых голов не добавляли: чистый линейный пробинг активаций. Масштаб серьёзный — 1231 задача из SWE-Bench Verified и Pro, около 22,7 тыс. запусков агента и ~80 тыс. изменений кода на двух открытых моделях.
И этот простой пробинг вытаскивает из активаций:
- заработает ли код целиком — AUC до 0,83
- стало ли падающих тестов меньше — до 0,84
- компилируется ли код — до 0,78
- не сломал ли агент то, что уже работало
0,5 здесь — случайное угадывание, так что сигнал сильный. Причём важная деталь: лучше всего он читается не из последнего слоя, а примерно из середины сети. Финальный слой заточен предсказывать следующий токен; «понимание» о состоянии кода живёт глубже.
Latent programming horizon
Дальше интереснее. По внутреннему состоянию «сейчас» частично предсказывается не только текущий статус кода, но и будущий. Модель чувствует направление примерно на 25 шагов вперёд: AUC ~0,55 на Verified и ~0,65 на более сложном Pro. Слабый сигнал держится даже на 50 шагах — около 0,52 и 0,60. Это и назвали latent programming horizon — латентным горизонтом программирования.
Оговорка, чтобы не переоценить эффект: шаг — это не обязательно правка. Агент в основном читает и ищет; в медианной траектории всего два реальных изменения кода. Значит, модель не держит в голове готовый патч. Она рано схватывает общее направление: задача чинится — или агент уже уехал не туда.
Практический смысл прямой: провальную попытку можно гасить рано, а не после 36 тысяч токенов. Ветвиться, поднимать effort, подключать модель посильнее — по сигналу изнутри, а не по факту провала.
Мы читаем латент с другой стороны
Нам это близко: мы сейчас копаем то же латентное пространство, только в другой задаче — в оценке кандидата.
У нас совет экспертов спорит не текстом, а латентно: LoRA-адаптеры обмениваются скрытыми состояниями, а сам латент мы декодируем — своим автоэнкодером (CALM) и через голову модели (logit-lens). В наших прогонах латент читается на 89-95%, а итоговый исход калибруется (Brier 0,068). То есть мы буквально достаём «что модель думает» из промежуточного представления и превращаем это в аудируемое решение.
И независимо от авторов пришли к тем же трём выводам:
- Сигнал живёт в середине, а не на выходе. Последний слой — про следующий токен, смысл лежит глубже. Наш декод латентного дебата тоже идёт из промежуточных состояний, а не из финального ответа.
- Простой ридаут бьёт чтение вывода. Им хватило логистической регрессии, нам — линейного декодера поверх скрытых состояний. Дорогая часть не «прочитать», а получить сам разделяющий сигнал: у нас его даёт латентный спор экспертов.
- Главный приз — не прочитать сигнал, а рулить по нему. Авторы прямо пишут: следующий шаг — использовать сигнал для управления агентом. У нас это эскалация к человеку, когда эксперты латентно не сходятся, — вмешиваемся по внутреннему расхождению, а не по итоговому провалу.
Если коротко
Модель знает про свою работу больше, чем говорит в ответе. И для кода, и для оценки человека полезное «мнение» лежит не в финальном токене, а в середине сети — и читается простым пробингом. Фронтир теперь не «модель побольше», а умение слушать её на середине мысли и вмешаться, пока бюджет ещё не сожжён.
Работа: https://arxiv.org/abs/2607.05188