Trustbut проверяет, замечают ли новые тесты изменение кода

Trustbut сравнивает новые тесты на коде до и после изменения. Разбираем, что означает этот сигнал, что показывает демонстрационный receipt и почему вердикт не доказывает корректность всей правки.

Trustbut проверяет, замечают ли новые тесты изменение кода. Тематическая карточка Comrad404.

Успешный запуск нового теста сам по себе не показывает, что тест замечает внесённое изменение: он мог бы пройти и на прежней версии программы. Trustbut предназначен для такой проверки. По описанию разработчика, инструмент повторно запускает тесты в чистой копии проекта и проверяет новые или изменённые тесты на коде до правки. Это свидетельство о поведении тестов в конкретном запуске, а не доказательство корректности всей реализации.

Какую задачу решает trustbut

Trustbut — локальная утилита командной строки, которая, согласно README проекта, формирует receipt для изменения кода, написанного человеком или AI-агентом. Её задача — проверить, меняется ли поведение нового или изменённого теста при сравнении версии кода с правкой и без неё. Описание механизма и демонстрационный receipt опубликованы в README проекта.

Схема: trustbut повторно запускает тесты в чистой копии проекта,; а каждый новый или изменённый тест запускает на версии кода до правки.
Основные элементы, разобранные в статье.

Практический вопрос узкий: не проходит ли новый тест на версии кода до изменения, но проходит на версии с изменением? Если он проходит и на старой версии, его успешное выполнение не свидетельствует, что тест проверяет именно эту правку. Такой критерий помогает выявить слабое свидетельство, но не оценивает полноту набора тестов и не устанавливает, соответствует ли программа требованиям.

Как устроена проверка

README описывает два шага: trustbut повторно запускает тесты в чистой копии проекта, а каждый новый или изменённый тест запускает на версии кода до правки. По логике разработчика, тест, который проходит и на старом коде, не подтверждает изменение этим сравнением.

Инструмент также, по заявлению автора, отмечает пропущенные тесты, удалённые утверждения и отключённые проверки типов. Эти предупреждения помогают найти места для ревью, но сами по себе не устанавливают причину изменения или ошибочность правки. Их нужно соотносить с diff и тем, что именно должен проверять тест.

Метод отвечает на ограниченный вопрос о поведении выбранных тестов в двух версиях кода. Он не заменяет ревью, не доказывает отсутствие ошибок и не показывает, покрывают ли тесты все важные сценарии. Независимой оценки того, насколько надёжно trustbut выявляет слабые тесты, нет.

Как читать PASS, WARN и FAIL

Разработчик описывает три итоговых статуса: PASS, WARN и FAIL. Это вердикты по конкретному запуску, а не универсальная сертификация изменения. Для практического решения важны результаты отдельных тестов и предупреждения, на которых основан статус.

Если новый тест не проходит на старой версии и проходит на новой, это свидетельство, что его поведение связано с правкой. Но оно не доказывает, что ожидание в тесте сформулировано верно или что реализация корректна. Если тест проходит на обеих версиях, он не показывает различия, связанные с изменением, хотя может проверять другое поведение.

README описывает и сценарий подключения к агенту: receipt со статусом FAIL может останавливать завершение работы, пока агент продолжает исправления. Это заявленная возможность интеграции, а не доказательство того, что такой цикл всегда приводит к правильному результату. Статус разумно использовать как повод изучить конкретные данные, а не как автоматическое решение о слиянии.

Что показывает пример receipt

В README приведён демонстрационный запуск npx trustbut verify со статусом WARN. В примере указаны 41 успешный тест, 0 неуспешных и 1 пропущенный. Один новый или изменённый тест обозначен как подтверждающий изменение, а ещё один проходит и без него. Это пример формата вывода, а не редакционный тест или независимое измерение эффективности.

Среди находок примера — пропущенный тест и приведение типа к any. Пропущенная проверка не была выполнена; приведение типа может ослабить контроль типов в конкретном месте. Ни одна из этих находок сама по себе не доказывает ошибочность изменения. Receipt совмещает счётчики тестов, оценку новых проверок и предупреждения, которые требуют отдельной интерпретации.

Автор README упоминает собственное измерение на 201 pull request, но не приводит в доступном описании подробностей метода и результатов. Поэтому это упоминание не позволяет судить о точности, частоте ложных срабатываний или практической эффективности инструмента. Независимой оценки этих показателей нет.

Поддержка и применение на практике

README перечисляет языки и тестовые раннеры, с которыми, по заявлению разработчика, совместим инструмент. Для Kotlin отдельно указано, что сквозной тест на Kotlin ещё предстоит; список совместимости и отметки о проверках приводит сам автор. Их нельзя считать независимой проверкой поддержки для всех конфигураций.

Практический сценарий — получить receipt после изменения, особенно если код или тесты написал агент, и посмотреть: какие тесты прошли в чистой копии, какие новые проверки не проходят на старой версии и какие предупреждения требуют ревью. Прохождение теста до и после правки не подтверждает именно эту правку по описанному критерию. Провал на старом коде и успех на новом — аргумент в пользу связи теста с изменением, но не доказательство правильности реализации.

Итог trustbut позволяет судить о наблюдаемом поведении тестов и предупреждениях в конкретном запуске. Он не устанавливает полную корректность кода и достаточность тестового покрытия. Receipt полезен как дополнительный материал к ревью, но не заменяет проверку того, что именно тест должен доказывать.