Что вообще меряет такой гард
Замер способностей модели имеет смысл ровно до тех пор, пока ответ не лежал у неё перед глазами. Наш агент работает внутри репозитория: часть файлов приезжает в контекст автоматически — проектные инструкции, файлы памяти, заметки прошлых сессий. Когда верный ответ живёт в одном из них, вопрос «умеет ли модель» подменяется вопросом «дочитала ли она до нужной строки».
Гард сверяет две вещи: что лежало в автоматическом контексте на момент прогона и что модель ответила. Совпало без единого обращения к инструментам — прогон помечается недействительным. Метка не значит «модель сжульничала». Метка значит «этот замер ничего не измерил».
Скан истории: 19 из 24
| Серия прогонов | Строк | Забраковано | Причина |
|---|---|---|---|
| Гео-задачи | 3 | 2 | ответ присутствовал в автоконтексте |
| Нишевая серия | 5 | 1 | то же |
| Батарея правил | 12 | 12 | асимметричные условия: часть участников видела материал, часть нет |
| Бренд-серия | 4 | 4 | ответ присутствовал в автоконтексте |
| Итого | 24 | 19 | уцелело 5, все — внешние модели |
Самая крупная потеря — батарея из двенадцати прогонов, забракованная целиком не за утечку ответа, а за асимметрию условий: участники находились в разном положении относительно материала. Сравнивать их между собой нельзя, даже если каждый по отдельности отвечал честно.
Правило было — и не сработало ни разу
Обратная находка того же дня. В файле результатов батареи — 12 строк, все PASS, ни одной метки «недействительно». Причина не в чистоте прогонов: поля, по которому метка выставляется — счётчика обращений к инструментам, — в схеме файла просто нет. Правило описано в документации, применять его нечем.
В соседнем срезе то же самое сформулировано иначе: метка не выставлялась ни разу на 26 прогонах.
Три знаменателя, которые нельзя путать. По этой теме у нас ходят 24, 26 и 12 — разные множества: 24 — строки в истории, которую сканировал гард; 26 — прогоны в срезе, где метка ни разу не выставлена; 12 — строки в файле результатов одной батареи. Пока знаменатель не назван, любая доля из этих чисел — случайная арифметика.
Разница между двумя половинами материала важнее самих чисел. Гард, который сканирует историю, существует как работающий код и потому режет по живому. Правило, которое живёт в документе, не режет никогда — и выглядит при этом как соблюдаемое.
Гард сам оказался завышен
Проверка прибора дала ожидаемое: он ловил лишнее. В список «всегда в контексте» попали все файлы памяти — около 20 штук, — хотя автоматически подгружаются не все. Две тестовые фикстуры числились заражёнными ошибочно.
После правки в списке остались три файла проектных инструкций и один файл памяти. Мутационный тест прогнали заново, историю пересчитали — вердикты не изменились: те же 19 из 24.
Честная оговорка. Размер корпуса, по которому считался охват гарда, записан у нас двумя разными числами — 629 и 633. Расхождение не снято, поэтому приводим оба и не строим на них ни одной доли.
Что забрать себе
- Зафиксируйте, что лежало в контексте на момент замера. Не «примерно те же файлы», а список на дату прогона. Без него вопрос «был ли ответ перед глазами» неразрешим задним числом.
- Считайте обращения к инструментам. Ноль обращений при верном ответе на факт, которого модель знать не может, — самый дешёвый детектор утечки. Поля нет в схеме — детектора нет, сколько бы правил ни было записано.
- Проверяйте симметрию условий, а не только честность участников. Двенадцать корректных прогонов в неравных условиях дают ноль сравнимых результатов.
- Прогоняйте гард по прошлому, а не только по новому. Наши 19 недействительных замеров были уже опубликованы внутри — их отзывали ретроспективно.
- После починки прибора пересчитайте старые вердикты. Не изменились — результат устойчив. Изменились — публиковать надо новые, а не оба набора.