T27.AI

Блог

tri test теперь запускает тесты

2026-10-07 · 4 мин чтения

[t27#7400 открыт и не влит; демонстрация — одна спека на лаборатории t27c; t27c test-report всё ещё возвращает 0 при упавшем тесте (t27#7370); инструмент MCP tri.test по-прежнему пустой] До сих пор tri test только перечислял тесты спеки и печатал, что они прошли, поэтому посаженная ошибка оставалась зелёной. t27#7400 заставляет его запускать их, читать отчёт и возвращать ненулевой код при падении, при спеке BLOCKED или когда не прошёл ни один тест. Ещё он добавляет tri mutate plant: один записанный мутант на копии, сначала чистый прогон, названные упавшие тесты, проверка хеша оригинала. Девять уроков курса AI numbers ждут этих двух команд для своих записей.

Гравюрный триптих к статье: tri test теперь запускает тесты
Открыть полный триптих в исходном размере
#t27#tri#MutationTesting#Courses

До сих пор tri test <spec> не запускал тесты спеки. Он вызывал t27c test, который только перечисляет их, и печатал «tests passed», что бы с ними ни было. Посаженная ошибка оставалась зелёной. gHashTag/t27#7400 это меняет: tri test теперь запускает тесты, а новая команда tri mutate plant записывает одну мутацию, сделанную руками, и называет тесты, которые она роняет. #7400 открыт и ещё не влит.

Что теперь делает tri test

Он запускает t27c test-report <spec>, печатает отчёт и затем одну строку tests: N, pass: P, fail: F (имена). Код возврата ненулевой, если тест упал, если спека BLOCKED или если не прошёл ни один тест; спеке только с инвариантами прямо говорится, что инвариант — не тест.

Вердикт читается из текста отчёта, потому что сам t27c test-report возвращает 0, даже когда тесты падают. Этот код возврата — отдельная задача, t27#7370, она ещё открыта. Разбор при сбое закрывается: отчёт без итогов, итоги, которые не сходятся, или число FAIL, не совпадающее с именами FAIL, — это ошибка, а не успех.

В демонстрации PR на лаборатории t27c gft_relu.t27 проходит 4 из 4. Черновая копия, где строка 12 изменена так, что отрицательный вход возвращается вместо 0, даёт 3 из 4, падает negz, и команда возвращает 1.

tri mutate plant

tri mutate plant --file <spec> --line <N> --from <old> --to <new> [--expect <test>] делает одного мутанта и отчитывается о нём:

В демонстрации мутант relu с --expect negz печатает «KILLED as expected by: negz» и возвращает 0. Тот же мутант с --expect pos возвращает 1 и говорит, какой тест ожидался, но прошёл, и какой упал неожиданно. Хеш исходного файла до и после обоих прогонов один и тот же.

Как проверили саму правку

Тесты Rust для mutate:: из PR прогнаны на лаборатории: 43 прошли, 0 упали, 9 из них новые. В правку посадили двух мутантов и откатили их через git: правило «зелёный», не смотрящее на FAIL, уронило 3 теста, а пропуск проверки оригинала — 1. После обоих откатов снова прошли 43.

Почему курс ждёт этого

Уроки 13–21 курса «AI numbers» (gft_smul, gft_sadd, gft_signed_mac, gft_relu, gft_exp2, gft_argmax4, gft_nll, gft_sgd_step и gft_xornet) заканчиваются записью: тесты спеки проходят, меняется одна строка, и падает ровно один названный тест. Запись запускает tri test и tri mutate plant. До #7400 первая команда вообще не могла показать падение, а второй не было. Пока #7400 не влит, эти девять уроков открывают заглушку, которая говорит, что запись ещё не готова, и не показывает никакого прогона.

Не входит в #7400: инструмент MCP tri.test в cli/tri-mcp по-прежнему вызывает t27c test и по-прежнему пустой, а код возврата t27c test-report оставлен задаче t27#7370.

Чего это не решает

Пруфы

Поработаем вместе

Хотите так же проверить собственный дизайн?

Я аудирую RTL и строю независимые побитово точные модели, затем провожу результат через синтез и, когда это полезно, проверяю на плате Artix-7. Первый модуль проверки — бесплатно.