v2.0.0
Релиз о доверии к следу. Плагин существует, чтобы «проверено» нельзя было спутать
с «не проверялось», — и пять дефектов, найденных прогоном плагина в живой сессии,
били именно туда: проверка не падала, а тихо становилась пустой.
Контуры
code: analyzer-run.mjs считает изменённые файлы, которых движок не видел ни
разу, и заявляет их записью not_verified (reason=not_in_analyzer_report).
Раньше такой файл исчезал бесследно: находок нет, метрик нет, общий
вердикт «clean» — так молчали внешние обработки вне корня конфигурации
и файлы, отсечённые фильтром подсистем. Проверено на реальной выгрузке
с bsl-analyzer 0.2.66. В шапке инструмента описан контракт --json:
находки лежат в ключе findings, и это сказано прямо, потому что
потребитель, читающий diagnostics (имя поля во внутреннем формате
движка), получал пустоту и принимал её за «нарушений нет».
arch: без изменений.
xml: meta-validate.py находит дубль структурного узла (проверка 6a). Все
разборщики, включая сам валидатор, читают первый узел, поэтому файл со
вторым давал тот же вердикт «Validation OK», что и
целый, а объекты из второго узла в сборку не попадали. Все десять
валидаторов XML печатают готовую запись следа.
hygiene: hygiene-check.mjs печатает запись следа сам и переводит свои коды
правил в идентификаторы qg:HYG-*. Прежде это соответствие держала в
уме модель — то есть строку следа писали руками даже после прогона.
оркестратор: раздел «Контур исполняется вызовом навыка, а не по памяти» с
таблицей «проверка → инструмент». Прежде оркестратор называл навыки,
но не инструменты, и перечень выглядел самодостаточным: контур
добросовестно исполняли чтением кода, а вердикт получался
неотличимым от прогнанного.
Ломающие изменения
Отчёты, проходившие валидатор в 1.3.0, могут перестать проходить. Три причины.
-
Имена проверок берутся из закрытого словаря (tools/evidence-scopes.mjs).
Прежде проверялся только kebab-case, и одна проверка называлась тремя
именами: static-diagnostics в навыке контура, lsp-diagnostics в описании
формата, static-analysis в инструменте. Валидатор принимал все три, а
закрывала требование только точная форма. Переименованы: lsp-diagnostics и
static-diagnostics -> static-analysis, branching -> branching-dispatch,
api-signatures и common-modules -> api-verification, object-structure ->
structure-validation. Валидатор называет замену для каждого прежнего имени. -
Запись applied по проверке, у которой есть инструмент, требует отметки о
прогоне в журнале .claude/.state/qg-runs.jsonl. Инструменты печатают свою
строку следа сами и отмечаются при запуске; отметка должна быть не старше
последней правки файлов своей сессии. Проверки без инструмента
(архитектурные признаки, разбор стандартов, верификация API) journal не
требуют. Список проверок с инструментом — в навыке quality-gate. -
Молчание о файлах, которых анализатор не смотрел, блокирует снятие гейта.
Чего сверка с журналом не делает: она не доказывает, что инструмент смотрел
именно эти файлы, и не защищает от записи, дописанной вручную. Независимого
источника, из которого истину можно перевывести (как поле config выводится с
диска), здесь нет. Это обнаружение молчания, и сказано об этом прямо.
Миграция
.1c-quality-gate.json править не нужно. Практика меняется одна: строку следа для
проверки с инструментом больше не составляют по прочтении вывода — её печатает
сам инструмент, и её переносят дословно.
Отдельно про корень проекта. Инструменты определяли его четырьмя копиями одной
строки, и все сводились к рабочему каталогу: переменная CLAUDE_PROJECT_DIR в
оболочке пуста, значит это был не запасной путь, а единственный. Запуск из
подкаталога давал config=default при живых переопределениях, «гейт не взведён»
при взведённом и «снимать нечего» с кодом возврата 0. Теперь корень ищется
подъёмом до .1c-quality-gate.json, затем до .git. В проекте без файла настройки
корнем станет каталог с .git — для существующих установок это не изменит ничего,
потому что настройку плагин создаёт при первом взводе гейта.
Закреплённая версия анализатора
bsl-analyzer 0.2.66
Минимальная версия Claude Code
Не изменилась.