Перечень, записанный в проверке руками, переживает дерево и уносит с собой покрытие
Проверка, которая перебирает список, набранный руками, зеленеет ровно так же после того, как дерево изменилось. Она не краснеет — ей нечему краснеть: список не связан с деревом ничем, кроме памяти того, кто его писал.
Это тот же класс, что checks-that-stopped-comparing, но с своим признаком, по которому его можно найти заранее: в теле проверки стоит константа-перечисление, а не выборка по дереву.
Два случая, найденные в один день 16 августа 2026, когда из репозитория выносили старый проект.
1. Список команд пакета. Проверка молчала про команду, молчавшую сама. flang/test/bin-through-symlink.test.mjs заведён после того, как версия 0.4.0 уехала в реестр немой: команды печатали ноль байт и завершались кодом 0. Проверка перебирала пять команд, набранных константой: flang, fts, ftsc, ftsvm, ftspec. Шестая объявленная команда — flang-lsp — в список не попала НИКОГДА. Стоило заменить константу чтением bin из package.json, как проверка тут же покраснела:
flang-lsp help → ноль байт, код возврата 0
То есть ровно тот дефект, ради которого проверка написана, всё это время жил в команде, которую она не перебирала.
2. Счёт каталогов в README. readme-layout.test.mjs сверяет фразы «у корня N каталогов» и «9 инструментов» с деревом. Первая фраза выживает любое изменение — число считается. Вторая держалась на readdirSync(корень + "tools"), и когда каталог исчез, она не покраснела, а уронила файл проверки целиком, до первой строки: ENOENT при загрузке модуля. Разница видна: считающая проверка сказала «впишите 10», а перечисляющая — просто перестала работать.
Правило. Перечень в проверке берётся из того же места, откуда его берёт рабочий код: команды — из bin пакета, каталоги — обходом дерева, цели печати — из реестра целей. Если взять неоткуда, к перечню добавляется нижняя граница («команд не меньше двух») и проверка существования каждого элемента — тогда урезание перечня краснеет вместо того, чтобы молчать.
Чем подтверждено. Ветка work/bez-fts, коммиты «Одиннадцать проверок…» и «flang-lsp перестал молчать…», 16 августа 2026. Первый случай: список из пяти команд заменён чтением package.json — проверка немедленно нашла шестую, молчащую. Второй: readdirSync по исчезнувшему каталогу, ENOENT до первой проверки.
Чем ограничено. Про перечни, у которых есть источник в дереве. Список намеренно подобранных случаев (например, сорок сломанных моделей для сверки диагностик) руками и должен быть набран — у него источника нет, и его полнота проверяется не выборкой, а числом в имени проверки.
Дополнение 20 августа 2026: тот же класс с СЛОВАРЁМ ЯЗЫКА, и он опаснее. Когда переписанный руками перечень — это не команды и не каталоги, а слова самого языка (имена числовых типов, занятые генератором имён, синонимы встроенных форм), проверка сверяет корпус с КОПИЕЙ языка вместо языка. Она зеленеет и когда язык вырос, и когда язык сузился.
Два случая, найденные в один день на ветке vypusk/shest-storozhey, коммиты 6d28909c и 6cb29848:
flang/scripts/weight-gain.mjsдержал 18 имён числовых типов множеством. Точные десятичные (сотых,тысячныхи их четыре поверхности) в копию не попали, хотя отрезок у них тот же, что унат. Замер их не считал и об этом не говорил ни словом.
flang/scripts/target-occupied-guard.mjsдержал таблицы занятых генератором имён. После перевода на настоящие таблицы компилятора счёт столкновений вырос с 0 до 2:модуль «JSON»попадает в занятое у Python (json) и у Elixir (JSON). Шапка этой самой проверки предсказывала такой случай словами «библиотека растёт, и модуль «JSON» придёт» — и не увидела его, когда он пришёл, потому что имениjsonв копии не было.
Источник у таких перечней есть всегда, и брать их неоткуда не приходится: компилятор отвечает про любую свою функцию, см. the-binary-already-answers-about-any-of-its-functions-through-the-runner.
Границу класса стоит провести точно: отношение строк («имя кончается на подчёркивание плюс запись таблицы») копией языка НЕ является — оно про то, как проверка читает ответ, а не про то, что язык считает занятым.
Связано: checks-that-stopped-comparing, a-removal-must-turn-a-test-red, a-frozen-reference-changes-the-check, the-binary-already-answers-about-any-of-its-functions-through-the-runner a-frozen-reference-changes-the-check
Поправка формы, а не сути: список бывает годным, если он про ПОДДЕЛКИ
20 августа 2026, работа vypusk/emit-ne-proveryaet. Различие, которого в этой заметке не хватало и которое стоило колебаний при написании проверки на то, что печать двоичного не печатает непроверенное.
Протухает не всякий список в проверке, а список того, чего в дереве НЕТ: «вот правила, которых двоичный не знает», «вот файлы, которые пока красные». Такой список стареет молча, потому что дерево меняется без него.
Список подделок — другого рода. Он говорит «вот программа, сломанная вот так, и она обязана быть отвергнута с названным кодом». Он не описывает состояние дерева, он ставит требование, и стареть ему не с чего: перестала подделка ловиться — проверка красная в тот же день.
Признак, по которому их различают за секунду: спросите, что случится, когда дерево починят. Список отсутствующего от починки становится ЛОЖЬЮ и молчит. Список подделок от починки не меняется вовсе, а от поломки краснеет.
Измеренное подтверждение того, что подделки держат: три снятые правки на собранных двоичных — печать перестала звать проверку (9 подделок проехали), печать зовёт проверку без ядра (проехала одна, и охват потерял два кода FLANG_PROOF_INDUCTION_*), снята строка про непроверенное (покраснела проба на слова). Каждая правка покрасила своё и только своё.