fix(build): отрицательные сканы приёмки проверяют форму кода, а не прозу

Комментарий, объясняющий, почему чего-то больше нет, обязан называть это по
имени. Скан по голой подстроке такой комментарий от кода не отличает и падает
на документации к выполненной им же работе. Найдено три таких гейта, все на
пути ближайшей сборки:

    скан иконок             -> блочный комментарий в SvgIcon/sprite.ts
    скан имён раннеров      -> слово `systemd-run` в прозе firewall.ts
    скан cancelFirewall...  -> комментарий о разделении функции

Второй сломан моим же комментарием из 2259f7c. Третий сломан с момента своего
появления (330a63b) и не падал только потому, что сборка до него не доходила:
её останавливали более ранние гейты.

Исправления по форме, а не удалением комментариев:

- скан прежних имён раннеров требует, чтобы перед именем не стоял дефис. В
  JavaScript идентификатор после дефиса не начинается, поэтому исключение
  точное и ни один настоящий вызов не пропускает;
- скан cancelFirewallRollback ищет имя со скобкой, то есть объявление или
  вызов, а не упоминание;
- литеральный скан по virtual:svg-icons-register удалён: его роль исполняет
  более сильный и более ранний гейт — production `vite build`, где активный
  импорт неразрешимого виртуального модуля роняет сборку bundle. Оставлены две
  точные проверки: отсутствие плагина в package.json и вызов registerSvgIcons
  в main.ts.

В шапке acceptance.sh зафиксировано правило для отрицательных сканов и
ограничение code_without_comments: строчные комментарии он отбрасывает,
блочные — нет, и блок-парсер сознательно не заводится (наивный стриппер
спотыкается о `/*` внутри строк и регулярных выражений, а это ложный PASS).

Все отрицательные сканы приёмки прогнаны по текущему дереву: срабатываний
больше нет; новые шаблоны проверены на синтетическом регрессе — ловят.
This commit is contained in:
2026-09-01 04:44:23 +05:00
parent a1c74caa0c
commit d32811b804
3 changed files with 98 additions and 8 deletions
+21
View File
@@ -79,6 +79,27 @@ Hardening-проход перед релизом `1.0.0`. Основная те
первый же, кто убрал бы маскировку ошибок. Введён `code_has`, читающий код в
переменную отдельным оператором.
- **Три отрицательных скана падали на прозе, а не на коде.** Комментарий,
объясняющий, почему чего-то больше нет, называет это по имени — и скан по
голой подстроке не отличает такой комментарий от кода:
```text
скан иконок -> блочный комментарий о замене плагина
скан имён раннеров -> слово `systemd-run` в прозе
скан cancelFirewall… -> комментарий о разделении функции
```
Все три исправлены по форме, а не удалением комментариев: скан раннеров
требует, чтобы перед именем не стоял дефис (в JavaScript идентификатор после
дефиса не начинается, поэтому ни один настоящий вызов не пропускается); скан
`cancelFirewallRollback` ищет имя со скобкой, то есть объявление или вызов;
литеральный скан по `virtual:svg-icons-register` удалён, потому что его роль
исполняет более сильный и более ранний гейт — production `vite build`, где
неразрешимый виртуальный модуль роняет сборку bundle.
Из них скан `cancelFirewallRollback` был сломан с момента появления и не
падал только потому, что сборка до него не доходила.
- **Несуществующий путь в скане означал успех.** `2>/dev/null || true` в
`code_without_comments` превращал опечатку в имени файла в пустой вывод, а
пустой вывод для проверки «запрещённой конструкции здесь нет» — это PASS.