Releases: Romandredan/1c-quality-gate
Release list
v2.0.0
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
Не изменилась.
v1.3.0
v1.3.0
Контуры
code: две новые механические проверки. qg:QRY-TOP-WITHOUT-ORDER — «ПЕРВЫЕ N»
без «УПОРЯДОЧИТЬ ПО»: какие именно N строк вернутся, задаёт СУБД, и набор
меняется между прогонами и движками. Законные формы вшиты в код: «ПЕРВЫЕ 1»
как проверка существования и «АВТОУПОРЯДОЧИВАНИЕ»; «ПОМЕСТИТЬ» исключением
не является — недетерминирован сам отбор, до помещения во временную таблицу.
qg:BSL-TXN-IN-HANDLER (новый tools/bsl-lint.mjs) — собственная
«НачатьТранзакцию» внутри обработчика, который платформа и так выполняет
в транзакции: «ОтменитьТранзакцию» там отменяет внешнюю целиком, и падение
случается в месте, не связанном с причиной (#std783 п.1.4 и 1.4.1).
Проверяются только модули объекта и набора записей — у формы «ПередЗаписью»
это другое событие.
arch: без изменений.
xml: новая проверка уникальности UUID объектов метаданных
(tools/xml/uuid-unique.mjs, scope=uuid-uniqueness). Объект, скопированный
вместе с uuid, платформа при загрузке либо отвергает, либо оставляет один
из двух — второй исчезает бесшумно, как файл вне состава. Валидаторы
структуры этого не видят: каждый разбирает свой файл. Проверяется и повтор
внутри одного файла. Область измерена на полной выгрузке УТ: 19 693 файла
метаданных, 63 837 идентификаторов, дублей ноль, все повторы пришлись на
карты маршрута бизнес-процессов — поэтому графические схемы не читаются.
hygiene: без изменений.
оркестратор: без изменений.
Работа над плагином
validate-package.mjs проверяет frontmatter субагентов и команд (обязательные поля,
имя = имя файла, модель из набора, camelCase-поля команд), ссылки на разделы чужих
навыков и предел размера SKILL.md. Битая ссылка на файл теперь ошибка, а не
предупреждение: предупреждения не влияли на код возврата, и проверка ничего не
запрещала. Флаг --root позволяет прогнать проверки на заведомо испорченном дереве.
Тестов: 241 -> 286.
Ломающие изменения
Нет. Записи следа прежнего формата принимаются валидатором без изменений; новые
scope (uuid-uniqueness, query-top-order, transaction-nesting) добавляются к
словарю, ничего не переименовано.
Миграция
Не требуется. Новые проверки работают на умолчаниях, .1c-quality-gate.json править
не нужно.
Закреплённая версия анализатора
bsl-analyzer 0.2.66
Минимальная версия Claude Code
Не изменилась.
v1.2.0
v1.2.0
Контуры
code: новая проверка qg:QRY-ALIAS-SHADOWS-FIELD (tools/query-lint.mjs) — псевдоним
источника, совпадающий с именем колонки временной таблицы пакета. Обращение
«Псевдоним.Поле» становится двояким, и платформа отказывается выполнять запрос
с ошибкой «Неоднозначное поле». Разыменование коллидирующего имени — Critical,
коллизия без обращения через точку — Major. Разбор лексический: только литералы
в .bsl; тексты запросов из XML, собранные конкатенацией, и коллизии с
реквизитами реальных таблиц не покрываются и заявлены как непокрытые.
Справка исправлена: правило «всегда давать псевдонимы через КАК» называло не ту
пару имён и провоцировало ложную находку на неголовной ветке ОБЪЕДИНИТЬ ВСЕ, где
псевдонимы не требуются — имена колонок берёт первая выборка.
arch: без изменений
xml: без изменений
hygiene: без изменений
оркестратор: архетип «Запрос» обязывает выполнить запрос хотя бы вхолостую до вердикта;
если выполнить негде — это записывается, а не замалчивается. У таблицы архетипов
появилась колонка «Метка в следе»: метки канонизированы, и валидатор их сверяет.
Ломающие изменения
Формально grammar следа не менялась, но требования строгого режима ужесточены — отчёт,
проходивший --gate в v1.1.0, может быть отклонён:
- вердикт «всё clean» теперь закрывается именно измерением compilation. Раньше годилась
любая запись not_verified, из-за чего заявленная непроверяемость чего угодно (например
static-analysis от анализатора) маскировала умолчание о компилируемости; - archetypes с меткой query требует закрытого измерения query-execution: либо
[qg applied: layer=code, scope=query-execution, ...], либо
[qg not_verified: dimension=query-execution, reason=no_platform]; - метка архетипа вне таблицы навыка и вне archetypes.custom проекта блокирует снятие.
Раньше опечатка в метке молча отключала привязанные к архетипу требования.
Миграция
В .1c-quality-gate.json править нечего: новых ключей нет, пороги не менялись. Проектные
архетипы из archetypes.custom остаются законными метками следа — валидатор читает настройку.
Закреплённая версия анализатора
0.2.66
Минимальная версия Claude Code
не меняется
v1.1.0
v1.1.0
Контуры
code: РАЗРЕШЕННЫЕ приведено к #std415. Справка контура в двух местах советовала
применять ключевое слово по умолчанию, тогда как стандарт запрещает его там,
где скрытая строка меняет результат: в расчётных и проводящих запросах строки
отбрасываются молча, и один документ у пользователей с разными правами
проводится по-разному. Правило собрано в bsl-query-optimization.md вместе с
контр-сигналом (законная форма — запрос, скрытые строки которого не участвуют
в бизнес-логике) и с симптомом, который чинят неправильно: «под админом
работает, у пользователя Недостаточно прав» — это повод разобраться с правами,
а не дописать ключевое слово. Чеклист кода получил пункт в разделах 6 и 14.
Новый признак: локальная переменная с именем реквизита формы. Присваивание
голому имени в контекстном методе модуля формы пишет реквизит, а не заводит
переменную; значение уезжает на клиент, и при несовпадении типа форма падает в
другом методе и на другом действии. Контр-сигналы: методы без контекста формы
реквизитов не видят, намеренная запись в реквизит законна. Без состава
реквизитов из Form.xml признак не выпускается, а отмечается как непроверенный.
arch: без изменений
xml: без изменений
hygiene: без изменений
оркестратор: без изменений
Ломающие изменения
Нет. Формат следа, причины skipped и контракт снятия гейта не менялись; отчёты,
собранные v1.0.x, проходят валидатор без правок.
Миграция
Не требуется, .1c-quality-gate.json не менялся. Учесть при чтении отчётов: на том же
коде контур кода теперь может выдать находки, которых не выдавал раньше.
Закреплённая версия анализатора
0.2.66
Минимальная версия Claude Code
Не изменилась.
v1.0.1
v1.0.1
Контуры
code: без изменений
arch: без изменений
xml: без изменений
hygiene: без изменений
оркестратор: без изменений
Только README: подготовка репозитория к публикации. Плашки состояния и среды,
содержание, раздел «Как выглядит прогон» с примером блокировки, находок и следа,
раздел «Рекомендуемый харнесс» (v8std, bsl-analyzer, lxml, индекс кода, справочник
API платформы, платформа) с указанием, какая запись следа появляется без каждого
из них. Порядок разделов переставлен: сначала что это даёт, потом установка.
В описание отчёта вернулись шкала severity целиком (🔴 Critical и 🟠 Major
блокируют вердикт «чисто», 🟡 Minor не блокирует) и формат ключа находки
путь::Метод:строка — при реструктуризации они выпали вместе со старым разделом.
Пример следа в README проходит evidence-validator.mjs --gate: 8 записей, 0 ошибок.
Ломающие изменения
нет; формат следа не менялся, отчёты предыдущей версии проходят валидатор
Миграция
не требуется
Закреплённая версия анализатора
bsl-analyzer 0.2.66
Минимальная версия Claude Code
не изменилась
v1.0.0
v1.0.0
Исправление нумерации. Кода в этом релизе ровно столько же, сколько в v0.11.0: дерево
то же, тесты те же. Меняется только номер.
Причина: в v0.11.0 уехало изменение контракта снятия гейта — запись scope без поля config
больше не снимает гейт. По таблице нумерации в docs/RELEASING.md это MAJOR («меняется
контракт снятия гейта»), а выпущено было под MINOR. Отправленный тег не снимается: v0.11.0
остаётся пригодным и содержит корректное описание, но границей контракта следует считать
эту версию.
Заодно 1.0.0 — заявление о том, что формат следа и контракт гейта дальше меняются только
по правилам таблицы нумерации, а не «по ходу дела».
Контуры
code: без изменений против v0.11.0
arch: без изменений против v0.11.0
xml: без изменений против v0.11.0
hygiene: без изменений против v0.11.0
оркестратор: без изменений против v0.11.0
Что вошло в контракт, начиная с этой версии
Запись scope обязана нести поле config — применённую настройку проекта: default либо
custom:<секция>[+<секция>]. Строку печатает tools/config.mjs show, и валидатор
пересчитывает её сам, отвергая расхождение с фактической настройкой: заявление, которое
никто не сверяет, ничем не отличается от подписи под непрогнанной проверкой.
Сам файл .1c-quality-gate.json заводит плагин при первом взводе гейта (v0.10.0), и
читаются все его секции, а не одна.
Ломающие изменения
Против v0.11.0 — нет. Против v0.10.0 и старше: отчёт без поля config гейт не снимет,
прогон надо повторить. Чтение и линт прежних отчётов сохранены — при обычном линте
отсутствие поля даёт предупреждение, а не ошибку.
Миграция
Правок в .1c-quality-gate.json не требуется. Перечень переопределённых секций плагин
считает сам.
Закреплённая версия анализатора
0.2.66
Минимальная версия Claude Code
не изменилась
v0.11.0
v0.11.0
Контуры
code: чеклист дополнен 12 стандартами — блокировки в транзакции (#std659, #std661),
запись и активность движений (#std450, #std633), регистры (#std792, #std708,
#std663, #std664), таймауты внешних ресурсов (#std748), поведение формы
(#std492, #std710), реквизит «Комментарий» (#std531). Свойства метаданных
помечены отдельно: проверяются по XML объекта, а не по тексту модуля.
AI-07 дополнен: ЗаполнитьЗначенияСвойств копией структуры не является.
arch: без изменений.
xml: исправлено ложное срабатывание role-validate.py — право Use у точки вызова
сервиса (HTTPService.<имя>.URLTemplate.<шаблон>.Method.<метод>,
WebService.<имя>.Operation.<имя>) разбиралось как вложенный реквизит и
требовало View/Edit. Типы без объектных прав (Enum, ScheduledJob) названы
прямо вместо «неизвестного типа». Добавлены два справочника: модель прав
ролей и семантика заимствования в расширении (собственный элемент опознаётся
по отсутствию тега ObjectBelonging). Новый раздел «Дефекты, которые проходят
валидацию»: Autofill с вложенным ExtendedTooltip внутри AutoCommandBar
таблицы вешает загрузку обработки, а form-validate.py даёт «OK».
hygiene: без изменений.
оркестратор: запись scope получает обязательное поле config — применённая настройка
проекта (default либо custom:<секция>[+<секция>]). Строку печатает
tools/config.mjs show; валидатор пересчитывает поле сам и отвергает
расхождение с фактической настройкой.
Ломающие изменения
Поле config записи scope обязательно для снятия гейта. Отчёт, собранный версией 0.10.0,
гейт не снимет — прогон надо повторить. Чтение и линт прежних отчётов сохранены:
при обычном линте отсутствие поля даёт предупреждение, а не ошибку.
Миграция
Правок в .1c-quality-gate.json не требуется. Проектам с переопределёнными порогами
ничего настраивать не нужно: перечень изменённых секций плагин считает сам.
Закреплённая версия анализатора
0.2.66
Минимальная версия Claude Code
не изменилась
v0.10.0
v0.10.0
Проектная настройка перестала быть декларацией. Файл .1c-quality-gate.json заводит
плагин, а не пользователь, и читаются все его секции, а не одна.
Контуры
code: без изменений
arch: без изменений
xml: без изменений
hygiene: без изменений
оркестратор: выполняет config.mjs show до расчёта осей — пороги берутся из проекта,
а не из таблиц навыка по памяти; часовой запрашивает номер стандарта из
sentinel.id вместо зашитого std454; архетипы из archetypes.custom
участвуют в выборе глубины наравне со встроенными.
Что изменилось по существу
Файл создаётся при первом взводе гейта — в единственной точке, где уже известно, что
проект на 1С. Создание разовое: существующий файл не переписывается никогда, удалённый
не заводится заново. Секции пустые, с описанием ключей внутри: проставленное умолчание
закрепилось бы навсегда и пережило бы обновление, которое это умолчание меняет.
tools/config.mjs — единственный читатель настройки: умолчания, затем файл, затем
переменные окружения, с источником каждого значения в выводе. Список ключей закрытый:
опечатка в имени называется вслух, а не проглатывается. Повреждённый JSON не роняет
прогон и не выдаёт себя за применённую настройку.
До этой версии читалась только секция analyzer. Пороги осей, проектные архетипы и
номер часового были описаны в документации, но не читались ничем.
Ломающие изменения
Нет. Формат следа не менялся, отчёты предыдущих версий проходят валидатор.
Миграция
Не требуется. Настройка, написанная руками, остаётся на месте и не переписывается.
Секции volume, complexity, archetypes.custom и sentinel.id, заданные раньше
вслепую, начинают действовать — проверьте config.mjs show, если они там были.
Справочник ключей: docs/CONFIG.md.
Закреплённая версия анализатора
0.2.66
Минимальная версия Claude Code
Не менялась.
v0.9.0
v0.9.0
Контур архитектуры
Новый признак ARCH-A11 «Проверки по обе стороны вопроса пользователю». Ловит форму, в
которой обработчик команды идёт на сервер за частью проверок, возвращается на клиент,
спрашивает пользователя, а обработчик ответа снова идёт на сервер за оставшимися
проверками. Каждая половина идиоматична, дефект существует только в композиции и при
чтении по одной процедуре невидим.
Сигнал построен не на повторе предикатов: проверки обычно не дублируются, они разной
критичности и раскладываются «по важности» на до и после подтверждения. Порог
срабатывает, если после ответа осталась проверка, вход которой был доступен до вопроса.
Цена двойная: лишние рейсы на сервер за одно действие пользователя (#std487 требует
обосновывать даже один дополнительный вызов) и, что серьёзнее, пользователь
подтверждает действие на неполной информации, узнавая о непройденной проверке после «да».
Контр-сигнал: после ответа данные перечитываются под блокировкой перед необратимой
операцией; либо вход проверки появляется только из самого ответа пользователя.
Признак помечен requires: call-graph. Проверки живут в общих модулях, а вызывает их
модуль формы, поэтому цепочка пересекает границы и без индекса кода признак уходит в
skipped, а не в «чисто». Таких признаков теперь четыре: A1, A7, A9, A11.
Пороги архетипов
Архетипу «Клиент-сервер» поднят минимум arch с «—» до уровня 1. Добавлен архетип
«Диалог посреди логики» с маркерами ПоказатьВопрос, ВопросАсинх, ОповещениеОЗавершении.
Без этого на правке модуля формы класса C1-C2 архитектурный контур не запускался бы и
новый признак остался бы мёртвой строкой в карте.
Своды антипаттернов
Добавлен ARCH-AI-07 с разбором случая и целевой структурой: все проверки одним серверным
вызовом, результаты вместе с вопросом включая некритичные предупреждения, после
положительного ответа только выполнение.
Ломающие изменения
Нет. Формат следа и контракт снятия гейта не менялись. Поднятый порог архетипа
«Клиент-сервер» означает, что на правках модулей форм архитектурный контур теперь
запускается там, где раньше пропускался: прогон станет чуть дольше, вердикт полнее.
Миграция
Не требуется, достаточно /plugin marketplace update.
Закреплённая версия анализатора
0.2.66 (assets/analyzer/runtime-manifest.json)
Минимальная версия Claude Code
Не повышалась.
v0.8.0
v0.8.0
Субагенты
Добавлены два дешёвых субагента, оба только читают и оба вписаны в свои контуры.
bsl-scout собирает факты для признаков ARCH-A1, ARCH-A7 и ARCH-A9: вызывающие, экспорты
модуля, триггеры экспорта в XML. Раньше контур архитектуры добывал это сам, тратя
контекст и бюджет обращений к индексу кода. Отдельное правило: пока триггеры в XML
(подписки, команды, регламентные задания) не проверены, ответ «вызывающих нет» не
выдаётся, иначе контур предложит удалить работающий механизм.
xml-runner прогоняет сверку «диск ↔ состав» и валидаторы структуры и разбирает их вывод.
Валидаторы печатают до тридцати ошибок на файл, и на классе C3 это вытесняло из контекста
всё остальное раньше отчёта. Отдельно отделяет недоступность инструмента (нет lxml, нет
Python) от дефекта в проверяемом файле.
Ни один субагент не пишет записи следа сам: факты возвращает агент, запись формирует
контур, иначе непроверяемо, кто что утверждал.
Контур кода
Верификация API стала явным шагом с условием запуска, поведением без субагента и
обязательной записью следа. Раньше это было приглашение «хорошо делегируется агенту»,
спрятанное в подшаге, а пропуск не оставлял следа.
Слой 2 дополнен холодным читателем: вход противоположен входу advisor(), поэтому ему
передаются только дифф и файлы, а постановка задачи и выводы — нет. Модель здесь не
дешёвая, выносится суждение о логике.
Состязательный аудит
Объявлен потолок параллелизма: 8 одновременных задач, 4 в среде с жёстким лимитом. Веер
идёт волнами, недобранная волна даёт skipped, а не «проверено». Ограничение «20 находок
за круг» бьёт по объёму работы, но не по числу одновременных задач.
Исправления
bsl-verifier не имел Bash в списке инструментов, хотя его карта проверок начинается с
запуска analyzer-run.mjs. Агент не мог выполнить команду и молча уходил в ручные
проверки, теряя детерминированную часть вердикта.
Ломающие изменения
Нет. Формат следа, контракт снятия гейта и пороги контуров не менялись.
Миграция
Не требуется, достаточно /plugin marketplace update.
Закреплённая версия анализатора
0.2.66 (assets/analyzer/runtime-manifest.json)
Минимальная версия Claude Code
Не повышалась.