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

До сих пор tri test <spec> не запускал тесты спеки. Он вызывал t27c test, который только перечисляет их, и печатал «tests passed», что бы с ними ни было. Посаженная ошибка оставалась зелёной. gHashTag/t27#7400 это меняет: tri test теперь запускает тесты, а новая команда tri mutate plant записывает одну мутацию, сделанную руками, и называет тесты, которые она роняет. #7400 открыт и ещё не влит.
Он запускает 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 --file <spec> --line <N> --from <old> --to <new> [--expect <test>] делает одного мутанта и отчитывается о нём:
tri mutate spec, поэтому use по-прежнему находит модули. Оригинал не правится.В демонстрации мутант 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. Первый модуль проверки — бесплатно.