{"slug":"quality-gate","title":"quality-gate","summary":"Оркестратор контроля качества 1С-разработки. Определяет профиль изменения по трём осям (объём правки, архетипы кода, сложность), выбирает глубину каждого контура, запускает проверки, формирует отчёт с машиночитаемым следом и снимает блокирующий гейт. Вызывать после правок BSL или","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-09-14T21:09:27.214881Z","repo":{"url":"https://github.com/Romandredan/1c-quality-gate","stars":28,"forks":6,"license":null,"updatedAt":"2026-09-25T07:40:14Z"},"bodyHtml":"<hr>\n<h2>name: quality-gate\ndescription: &gt;-\nОркестратор контроля качества 1С-разработки. Определяет профиль изменения по трём осям\n(объём правки, архетипы кода, сложность), выбирает глубину каждого контура, запускает\nпроверки, формирует отчёт с машиночитаемым следом и снимает блокирующий гейт.\nВызывать после правок BSL или XML метаданных 1С, перед завершением работы и коммитом.\nТриггеры: «прогони гейт качества», «проверь код перед коммитом», «сними гейт»,\n«отревьюй что я написал», «проверь по стандартам», «готов ли код к коммиту».\nlicense: MIT</h2>\n<h1>quality-gate — оркестратор контроля качества 1С</h1>\n<p>Единственная точка входа плагина. Контуры (<code>code</code>, <code>arch</code>, <code>xml</code>, <code>hygiene</code>) не вызываются\nнапрямую: сначала считается <strong>профиль изменения</strong>, он решает глубину.</p>\n<blockquote>\n<p><strong>Главное правило.</strong> Полный прогон на правке комментария — налог, из-за которого гейт\nначинают обходить; пропуск без следа — ложная зелень. Глубина адаптивная, но <strong>любой\nпропуск фиксируется явной записью с причиной</strong>.</p>\n</blockquote>\n<p>&lt;ЖЁСТКИЙ-ШЛЮЗ&gt;\nПо умолчанию — только проверка и отчёт. НЕ переписывай бизнес-логику и НЕ меняй метаданные по\nсвоей инициативе. Правки — только в режиме <code>--fix</code>, из безопасных категорий. Critical и любые\nизменения логики, проведения, запросов, прав — никогда без явного подтверждения пользователя.\n&lt;/ЖЁСТКИЙ-ШЛЮЗ&gt;</p>\n<hr>\n<h2>Инварианты прогона</h2>\n<p>Девять утверждений: усвоен только этот блок — прогон ещё имеет смысл; нарушено любое —\nуже нет.</p>\n<ol>\n<li><strong>Профиль считается один раз</strong>, до контуров; контуры его не пересчитывают.</li>\n<li><strong>Глубина — по профилю, не по привычке</strong>: не гонять архитектуру на опечатке, не\nограничиваться гигиеной на новом модуле проведения.</li>\n<li><strong>Контур исполняется вызовом навыка</strong>, а не по памяти.</li>\n<li><strong>Строку следа печатает инструмент</strong>, где он есть — не модель по смыслу.</li>\n<li><strong>Любой пропуск — запись <code>skipped</code> с причиной.</strong> Молчание неотличимо от выполнения.</li>\n<li><strong>Вердикт «чисто» признаёт непроверяемое</strong> — записью <code>not_verified</code>.</li>\n<li><strong>Находка — с номером стандарта, кодом диагностики или эвристикой</strong> и значением против\nпорога; \uD83D\uDD34/\uD83D\uDFE0 блокируют «Чисто», вне <code>--fix</code> — только отчёт.</li>\n<li><strong>Гейт снимается утилитой</strong> <code>gate.mjs release</code>, а не удалением файла состояния.</li>\n<li><strong>План печатает <code>gate.mjs plan</code></strong>; модель вправе поднять глубину с причиной, понизить —\nнет.</li>\n</ol>\n<hr>\n<h2>Шаг 1. План</h2>\n<h3>Путь к инструментам плагина (<code>$QG</code>)</h3>\n<p>Все команды ниже используют <code>$QG</code> — каталог плагина. Под OpenCode он готов в <code>QG_ROOT</code>; в\nClaude Code <code>CLAUDE_PLUGIN_ROOT</code> доступна хукам, но не оболочке — путь через неё схлопнулся\nбы в <code>/tools/...</code>.</p>\n<p>Разреши путь <strong>первой командой прогона</strong>, дальше подставляй значение буквально. Кандидат —\nтолько после <code>test -d \"$QG/tools\"</code>: переменная сама по себе не гарантирует актуальный плагин.</p>\n<pre><code>QG=\"${QG_ROOT:-}\"\n[ ! -d \"$QG/tools\" ] &amp;&amp; QG=\"${CLAUDE_PLUGIN_ROOT:-}\"\n[ ! -d \"$QG/tools\" ] &amp;&amp; QG=\"$(node -e \"const p=require(require('node:os').homedir()+'/.claude/plugins/installed_plugins.json').plugins;const k=Object.keys(p).find(n=&gt;n.startsWith('1c-quality-gate@'));if(k&amp;&amp;p[k][0])process.stdout.write(p[k][0].installPath)\" 2&gt;/dev/null)\"\n[ ! -d \"$QG/tools\" ] &amp;&amp; QG=\"$(ls -d ~/.claude/plugins/cache/*/1c-quality-gate/*/ 2&gt;/dev/null | sort -V | tail -1)\" &amp;&amp; QG=\"${QG%/}\"\ntest -d \"$QG/tools\" &amp;&amp; echo \"$QG\" || { echo \"Плагин не найден ни в одном харнессе\" &gt;&amp;2; exit 1; }\n</code></pre>\n<p><code>sort -V</code> не декоративен: без него сессия честно отчитывается, что проверок «не существует»,\nработая инструментами устаревшей версии. Разбор — <code>references/run-environment.md</code>.</p>\n<h3>Профиль и план прогона</h3>\n<pre><code>node \"$QG/tools/gate.mjs\" plan --files &lt;f&gt; [&lt;f&gt; ...] [--no-analyzer]\n</code></pre>\n<p>Без <code>--files</code> — состав из взведённой сессии (<code>gate.mjs status</code>). Печатает профиль по трём\nосям, строку <code>scope</code> (с <code>config=...</code>), инструменты по порядку, что закрыть в следе.\n<code>--no-analyzer</code> — когда анализатор недоступен или падает; ось сложности тогда <code>not_computed</code>,\n<code>driver</code> не бывает <code>complexity:*</code>.</p>\n<p><strong>Строку <code>[qg scope: ...]</code> перенеси в отчёт дословно</strong> — валидатор пересчитывает профиль сам.\nРасхождение — сверь порог: <code>node \"$QG/tools/config.mjs\" show</code>. <strong>Профиль можно поднять,\nнельзя понизить</strong>: увидел то, чего план не видит (правка тише архетипа, но трогает деньги) —\nподними, добавь «глубина поднята: &lt;причина&gt;»; обратное валидатор не пропустит.</p>\n<p>Почему оси устроены так — <code>references/profile-axes.md</code>; данные — <code>tools/profile.mjs</code>,\n<code>tools/gate.mjs</code>.</p>\n<hr>\n<h2>Шаг 2. Инструменты</h2>\n<p>Выполни команды раздела «## Инструменты» плана по порядку — файлы уже подставлены. У части\nесть исполняемый инструмент: он печатает строку следа (<code>[qg applied: ...]</code> / <code>[qg skipped: ...]</code>) сам — переноси дословно, не сочиняй.</p>\n<p>Прогон отмечается в журнале <code>qg-runs.jsonl</code>: валидатор сверяет по нему каждую запись\n<code>applied</code> — инструмент видел <strong>весь</strong> состав правки, а не файл из десяти; <code>skipped ... reason=not_applicable</code> — тоже утверждение о работе. Прогоны по частям складываются.\n<code>platform-context-run.mjs</code>, когда включён планом, обязателен: анализатор знает имена\nконфигурации, но не платформы. <code>query-lint</code> берёт и изменённые XML, не только <code>.bsl</code>.</p>\n<p><strong>Перед повторным прогоном слоя проверь <code>gate.mjs status</code>:</strong> отработавший по этому\nсодержимому слой пропускается с причиной <code>verified_earlier</code> (<code>references/evidence-format.md</code>).</p>\n<hr>\n<h2>Шаг 3. Контуры</h2>\n<p>Запускай контуры и глубины из <code>resolved: code=... arch=... xml=... hygiene=...</code> плана.\nКаждый контур обязан вернуть <code>applied</code> либо <code>skipped</code> — <strong>молчание не допускается</strong>.</p>\n<table>\n<thead>\n<tr>\n<th>Контур</th>\n<th>Навык</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>code</code></td>\n<td><code>bsl-code-review</code></td>\n</tr>\n<tr>\n<td><code>arch</code></td>\n<td><code>bsl-architecture-review</code></td>\n</tr>\n<tr>\n<td><code>xml</code></td>\n<td><code>xml-structure-review</code></td>\n</tr>\n<tr>\n<td><code>hygiene</code></td>\n<td><code>file-hygiene</code></td>\n</tr>\n</tbody>\n</table>\n<p>Передавай контуру профиль целиком: класс, архетипы, файлы.</p>\n<h3>Контур исполняется вызовом навыка, а не по памяти</h3>\n<p>Таблица называет навыки, а не проверки: чем проверяется признак — в SKILL.md контура. Прогон\nбез открытия навыка — чеклист для чтения глазами, не проверка\n(<code>references/run-environment.md</code>).</p>\n<h3>Субагенты в составе прогона</h3>\n<p>Четыре штатных, <strong>только читающие</strong>: возвращают факты, запись формирует контур. Три дешёвые;\n<code>antipattern-reader</code> — на модели уровня контура: семантика LLM-антипаттернов не\nмеханизируется до haiku.</p>\n<table>\n<thead>\n<tr>\n<th>Субагент</th>\n<th>Вызывает</th>\n<th>Факты</th>\n<th>Спавнов</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>bsl-verifier</code></td>\n<td><code>code</code></td>\n<td>сигнатуры платформы, экспортность модулей, метаданные</td>\n<td>на список файлов</td>\n</tr>\n<tr>\n<td><code>antipattern-reader</code></td>\n<td><code>code</code></td>\n<td>кандидаты с цитатами; аттестует <code>tools/catalog.mjs</code></td>\n<td>на контур</td>\n</tr>\n<tr>\n<td><code>bsl-scout</code></td>\n<td><code>arch</code></td>\n<td>вызывающие, экспорты, триггеры XML</td>\n<td>по вопросу</td>\n</tr>\n<tr>\n<td><code>xml-runner</code></td>\n<td><code>xml</code></td>\n<td>«диск ↔ состав», валидаторы структуры</td>\n<td>на контур</td>\n</tr>\n</tbody>\n</table>\n<p>Недоступность субагента, контура или инструмента проверку не отменяет — она проходит сама\nлибо получает <code>skipped</code> с причиной (<code>references/run-environment.md</code>).</p>\n<hr>\n<h3>Слой 3: состязательный аудит</h3>\n<p>Самая дорогая проверка, никогда не запускается сама: контуры предлагают её при классе C3 с\nнаходками \uD83D\uDD34/\uD83D\uDFE0, запуск — только по явному согласию пользователя\n(<code>references/adversarial-audit.md</code>).</p>\n<hr>\n<h2>Шаг 4. Sentinel — проверка живости источника стандартов</h2>\n<p>Один раз за прогон запроси через MCP <code>v8std</code> стандарт, чей номер — <code>sentinel.id</code> настройки\n(умолчание <code>std454</code>): <code>v8std_get_page(\"&lt;id&gt;\")</code>, ожидание — страница найдена.</p>\n<p>Без неё «нарушений не найдено» неотличимо от «сервис недоступен»: неподтверждённый часовой\nделает прогон недостоверным (<code>references/run-environment.md</code>).</p>\n<hr>\n<h2>Шаг 5. Отчёт и след</h2>\n<p>Отчёт для человека — находки по важности (\uD83D\uDD34 Critical / \uD83D\uDFE0 Major / \uD83D\uDFE1 Minor). Ниже, в\n<code>## quality evidence</code>, — машиночитаемый след: строка на проверку\n(<code>references/evidence-format.md</code>).</p>\n<p><strong>Каждая запись <code>not_verified</code> повторяется в человекочитаемой части фразой</strong>: «Ошибок: 0»\nрядом с невидимым <code>not_verified</code> читается как «проверено».</p>\n<p>Минимум следа: <code>scope</code> (Шаг 1), <code>sentinel</code> (Шаг 4), запись от каждого контура и всё из плана\n«Закрыть в следе» — включая <code>not_verified: dimension=compilation</code>, если платформа не\nзапускалась (её не проверяет ничто другое).</p>\n<p><strong>Сработал архетип «Запрос» — выполни запрос до вердикта</strong> (консоль запросов, тестовые\nпараметры): текст остаётся строковым литералом, «Неоднозначное поле» доживает до продуктива.\nВыполнить негде — законный исход, но записанный:</p>\n<pre><code>[qg applied: layer=code, scope=query-execution, ids=[qg:QRY-EXECUTED], verdict=clean]\n[qg not_verified: dimension=query-execution, reason=no_platform]\n</code></pre>\n<p><strong>Файл, до которого не добрался анализатор, не проверен</strong> — <code>analyzer-run.mjs</code> печатает\nзапись сам, переноси дословно.</p>\n<pre><code>node \"$QG/tools/evidence-validator.mjs\" &lt;файл отчёта&gt; --gate\n</code></pre>\n<hr>\n<h2>Шаг 6. Снятие гейта</h2>\n<p>Гейт снимается <strong>только</strong> утилитой, не удалением файла состояния:</p>\n<pre><code>node \"$QG/tools/gate.mjs\" release --evidence &lt;файл отчёта&gt;        # по результатам прогона\nnode \"$QG/tools/gate.mjs\" release --class C0 --reason \"&lt;почему&gt;\"  # C0/C1 без прогона\n</code></pre>\n<p>НЕ снимай гейт, если прогон прерван на полпути и отчёт не сформирован: он должен остаться\nдля повторной проверки.</p>\n<p><strong>Чужие сессии не трогай.</strong> Гейт разделён по сессиям: несколько в <code>gate.mjs status</code> —\n<code>verify</code>/<code>release</code> без <code>--session &lt;id&gt;</code> отказывают, «самая свежая» может быть чужой.\nИдентификатор — в подсказке при взводе и в сообщении о блокировке\n(<code>references/run-environment.md</code>).</p>\n","files":[{"path":"references/adversarial-audit.md","sizeBytes":9708,"isText":true},{"path":"references/evidence-format.md","sizeBytes":44040,"isText":true},{"path":"references/glossary.md","sizeBytes":6782,"isText":true},{"path":"references/profile-axes.md","sizeBytes":20659,"isText":true},{"path":"references/run-environment.md","sizeBytes":12519,"isText":true},{"path":"SKILL.md","sizeBytes":14829,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-09-27T19:48:11.719468Z","sha256":"AADE13753785C5FDB277B5FA6341B3DD3B32F8EAEA1BF7E21113225C4F7DF923","sizeBytes":37514},"review":null,"source":{"repositoryUrl":"https://github.com/Romandredan/1c-quality-gate","path":"skills/quality-gate","license":null,"commit":"d27fc8f7f27bb109c5d8977a7452184e7c3da851","subtreeSha":"382A29D0B50B1881BC0147DE0ACAE3895282418EBD27D99D416ABFF00C5DEB54","lastSyncedAt":"2026-09-27T19:47:56.426024Z"},"reviewedAt":"2026-09-27T19:48:21.147578Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/Romandredan/1c-quality-gate/tree/main/skills/quality-gate"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install romandredan-1c-quality-gate@llmmart"},{"target":"git","command":"git clone https://github.com/Romandredan/1c-quality-gate.git"}]}