{"slug":"bsl-code-review","title":"bsl-code-review","summary":"Контур проверки кода BSL: диагностики статического анализатора, антипаттерны производительности и механики платформы, стандарты разработки #stdNNN, именование, верификация сигнатур API и существования общих модулей. Уровень «внутри тела метода» — то, что чинится заменой строк. Вы","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-09-14T21:09:26.867509Z","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: bsl-code-review\ndescription: &gt;-\nКонтур проверки кода BSL: диагностики статического анализатора, антипаттерны производительности\nи механики платформы, стандарты разработки #stdNNN, именование, верификация сигнатур API и\nсуществования общих модулей. Уровень «внутри тела метода» — то, что чинится заменой строк.\nВызывается оркестратором quality-gate с готовым профилем изменения; напрямую — по запросу\n«проверь код», «отревьюй что я написал», «проверь на антипаттерны».\nlicense: MIT</h2>\n<h1>bsl-code-review — контур кода</h1>\n<p>Проверяет то, что чинится <strong>внутри тела метода</strong>: замена строк, без нового шва. Всё, что\nтребует выделения метода, переноса в другой модуль, нового экспорта или изменения «кто кого\nвызывает», принадлежит контуру <code>bsl-architecture-review</code> — граница и правила отсева повторов\nнаходок в <code>shared/routing-contract.md</code>.</p>\n<p>&lt;ЖЁСТКИЙ-ШЛЮЗ&gt;\nТолько проверка и отчёт. НЕ переписывай логику, запросы, транзакции и права по своей\nинициативе. В режиме <code>--fix</code> допустимы лишь безопасные категории (см. ниже).\n&lt;/ЖЁСТКИЙ-ШЛЮЗ&gt;</p>\n<h2>Инварианты контура</h2>\n<p>Пять утверждений, без которых прогон контура недействителен.</p>\n<ol>\n<li><strong>Каталог антипаттернов проходится всегда</strong> — читателем либо самостоятельно, но след\nпечатает <code>catalog.mjs attest</code>.</li>\n<li><strong>Строку следа инструментальной проверки печатает инструмент</strong> — переноси дословно,\nсвоих находок этого класса не добавляй: результат детерминирован.</li>\n<li><strong>Каждое замечание доказуемо</strong>: номер стандарта, код диагностики или название\nантипаттерна плюс строка кода. «Так лучше» — не находка.</li>\n<li><strong>Пропуск фиксируется.</strong> Недоступный инструмент или субагент даёт <code>skipped</code> с причиной;\nмолчание неотличимо от выполнения.</li>\n<li><strong>Файл, который анализатор не разобрал, не проверен</strong> — вердикт «чисто» по нему\nневозможен, и в отчёте он назван поимённо.</li>\n</ol>\n<h2>Вход</h2>\n<p>От оркестратора: класс изменения (C0…C3), сработавшие архетипы, список изменённых файлов.\nГлубину (Слой 1 / Слой 1+2 / Слой 1+2 с предложением Слоя 3) печатает план (<code>gate.mjs plan</code>,\nполе <code>resolved: code=...</code>) — архетип может поднять её сверх класса, понизить нельзя. При\nпрямом вызове — определи профиль сам по правилам <code>quality-gate</code>.</p>\n<hr>\n<h2>Слой 1а — статический анализ</h2>\n<p>Строка плана для <code>analyzer-run.mjs</code> — одна команда: она находит корень конфигурации, прогоняет\nтолько изменённые файлы, проверяет часового и формирует записи следа. Вывод — находки по\nфайлам и готовый блок <code>## quality evidence</code>. Перенеси его в отчёт как есть: записи следа по\nслою <code>code</code> сочинять руками не нужно и нельзя.</p>\n<p><strong>Твоя работа здесь — триаж, а не припоминание.</strong> Список нарушений детерминирован. От тебя\nтребуется отделить то, что надо чинить сейчас, от того, что является осознанной нормой этого\nпроекта, и назвать последствие каждой оставленной находки. Коды расшифровывай через\n<code>v8std_explain_diagnostics</code> и привязывай к номеру стандарта.</p>\n<p>Четыре режима вывода, каждый из которых меняет то, что можно утверждать по результату:</p>\n<ul>\n<li><strong>Информационные находки свёрнуты</strong> в одну строку, полный список — флаг <code>--all</code>. В след\nкоды попадают в любом случае.</li>\n<li><strong>Проект без основной конфигурации</strong> (репозиторий одного расширения): диагностики о\nнеразрешённых именах понижены до информационных — обратно <strong>не поднимай</strong>, отличить их от\nнастоящих ошибок в этом режиме нечем.</li>\n<li><strong>«НЕ РАЗОБРАНО файлов»</strong> — по этим файлам не проверено <strong>ничего</strong>. Назови их в отчёте\nпоимённо: вердикт «чисто» по ним невозможен.</li>\n<li><strong>Часовой <code>status=not_found</code></strong> — прогон недостоверен, вердикт «чисто» запрещён; разберись\nс анализатором и повтори.</li>\n</ul>\n<p>Что стоит за каждым режимом и известные случаи — <code>references/analyzer-output.md</code>. Гейтовый\nанализ идёт с конфигом из состава плагина: проектный <code>subsystemsFilter</code> вывести изменённые\nфайлы из проверки не может.</p>\n<p><strong>Если анализатор недоступен</strong> — команда сама запишет\n<code>[qg skipped: layer=code, scope=static-analysis, planned=[bslls:*], reason=analyzer_unavailable]</code>\nи вернёт код 1. Продолжай со Слоя 1б: он ловит другое и от анализатора не зависит.</p>\n<h3>Второй движок — сверка со справочником платформы</h3>\n<p>Строка плана для <code>platform-context-run.mjs</code>. Ловит то, чего анализатор не видит вовсе:\nнесуществующий член платформенного типа, значение системного перечисления, конструктор,\nсвойство объекта. Всё это компилируется и падает при выполнении. Сервер справки движок\nзаводит сам: ищет поднятый, а не найдя — ставит закреплённый релиз и поднимает свой по\nустановленной платформе. Где платформы на машине нет, пишет <code>skipped</code> с причиной и\nвозвращает код 1 — это законный исход.</p>\n<p>Два правила: <strong><code>info</code> «низкая уверенность» не отбрасывать</strong> (класс смешанный) и <strong>часовой\n<code>not_found</code> — «чисто» запрещено</strong>. Остальное — <code>references/platform-api.md</code>.</p>\n<h2>Слой 1б — то, чего анализатор не видит</h2>\n<h3>1. Каталог антипаттернов — субагент <code>antipattern-reader</code></h3>\n<p>Строка плана для <code>catalog.mjs index</code> печатает индекс триггеров; полная карточка читается по\nпопаданию, не заранее. <strong>Сначала сохрани <code>git diff HEAD --</code> по изменённым <code>.bsl</code> в файл</strong> —\nпризнаку <code>qg:AI-11</code> нужно сравнение версий — у читателя нет оболочки, чтобы построить его\nсамому, а <code>attest</code> вычисляет diff сам и без него карточку не пропустит; переданный файл лишь\nсверяется. Сравнивать не с чем (новый файл без истории) — <code>attest --no-diff-available</code>\nпечатает честный <code>skipped</code> вместо молчания.</p>\n<p><strong>Делегируй субагенту <code>antipattern-reader</code></strong>: передай вывод <code>index</code>, список изменённых <code>.bsl</code>\nи путь к файлу диффа. Он не знает задачи и возвращает JSON — сохрани в файл: путь к нему,\nсписок файлов и путь к диффу — в строку плана <code>\"$QG/tools/catalog.mjs\" attest --diff &lt;файл&gt;</code>.</p>\n<p>Инструмент сверяет полноту списка проверенных признаков, состав файлов и цитату каждой\nнаходки с самим файлом, после чего печатает строки следа <code>ai-antipatterns</code> и\n<code>platform-antipatterns</code> и пишет журнал. Отвергнутый результат — повтори запуск читателя с\nего замечаниями, не правь JSON руками. Читателя в среде нет — прогони индекс сам по той же\nпроцедуре и аттестуй так же: строку следа в обоих случаях печатает инструмент.</p>\n<p>Признаки с инструментом (<code>bsl-lint</code>, <code>query-lint</code>, <code>rename-check</code>) в проход не входят — их\nстроки печатают инструменты, а карточка нужна для «как чинить»:\n<code>node \"$QG/tools/catalog.mjs\" card &lt;ID&gt;</code>.</p>\n<h3>2. Проверки по тексту кода</h3>\n<p>Команды — строки плана для <code>query-lint.mjs</code>, <code>bsl-lint.mjs</code>, <code>rename-check.mjs</code>: план\nпечатает их только когда применимо, а полный список признаков с разбором каждого — в\n<code>references/catalog/INDEX.md</code> (<code>qg:BSL-UNBOUNDED-STRING-COLUMN</code> там же — механическая\nполовина AI-16). XML идёт в <code>query-lint</code> наравне с <code>.bsl</code>: <code>&lt;query&gt;</code> СКД и <code>&lt;QueryText&gt;</code>\nдинамического списка — тоже носитель запроса.</p>\n<p><strong><code>attribute-access</code> покрыт инструментом лишь частично.</strong> Доказать ссылочность в пределах\nодного файла удаётся не всегда: ссылка из чужой функции или из недокументированного параметра\nостаётся неопознанной. <code>clean</code> здесь означает «механическая часть чиста» и разбора #std437\nглазами не отменяет — инструмент задаёт нижнюю границу, а не верхнюю.</p>\n<p>Записи следа обоих — по инварианту 2, дословно, без своих находок.</p>\n<p>Граф вызовов оба не строят: запрос, собранный конкатенацией или <code>СтрШаблон</code>, виден им лишь\nчастями, и вердикт «чисто» этого не закрывает — разбор приближений в справочнике правила.</p>\n<h3>3. Стандарты под архетип</h3>\n<p>Не весь свод подряд — только релевантное: справочники и разделы <code>checklist-code.md</code>\nпечатает план (<code>gate.mjs plan</code>) — общие разделы всегда, прочие под архетип; перечень —\n<code>BASE_CHECKLIST</code> и <code>ARCHETYPES</code> в <code>tools/profile.mjs</code>. Глубокая\nвложенность и длинные методы архетипом не считаются и в план не попадают — при такой правке\nоткрывай <code>bsl-refactoring.md</code> сам. Тексты самих стандартов запрашивай через MCP <code>v8std</code> по\nномеру.</p>\n<h3>4. Именование</h3>\n<p><code>#std454</code> — частая и легко пропускаемая ошибка: сокращения-префиксы, не-CamelCase,\nбулево не в утвердительной форме. Детали и примеры — в <code>references/checklist-code.md</code>.</p>\n<h3>5. Символы в исходнике</h3>\n<p>В коде и комментариях только ASCII-дефис. Длинное тире и его родственники дают у анализатора\nошибку недопустимого символа. Кавычки-ёлочки допустимы.</p>\n<h3>6. Верификация API — субагент <code>bsl-verifier</code></h3>\n<p>Сигнатуры платформенных методов, существование и экспортность общих модулей, состав объектов\nметаданных. Процедура — <code>references/api-verification.md</code>.</p>\n<p><strong>Делегируй субагенту <code>bsl-verifier</code></strong>, передав ему список изменённых <code>.bsl</code>-файлов. Он\nдешёвый, работает по той же процедуре и возвращает вердикт, список нарушений с локациями и\nраздел «Не проверено». Вызов <strong>один на весь список</strong>: каждый лишний инстанс поднимает свою\nсессию индекса кода, а справочник платформы на stdio-транспорте вдобавок не переносит\nпараллельных обращений.</p>\n<p>Если прогнан второй движок слоя 1а, платформенная часть уже закрыта: субагенту остаются\nобщие модули, метаданные и контекст доступности.</p>\n<p>Субагента в среде может не быть — тогда прогоняй <code>api-verification.md</code> сам. <strong>Результат\nобязан попасть в след одинаково в обоих случаях</strong> (инвариант 4):</p>\n<pre><code>[qg applied: layer=code, scope=api-verification, ids=[qg:API-SIGNATURE,qg:API-MODULE], verdict=clean]\n[qg skipped: layer=code, scope=api-verification, reason=platform_unavailable]\n</code></pre>\n<blockquote>\n<p>Для класса C1 на этом контур завершается — переходи к отчёту.</p>\n</blockquote>\n<hr>\n<h2>Слой 2 — ревью логики моделью</h2>\n<p>Вызови <code>advisor()</code>. Более сильная модель видит весь транскрипт: задачу, шаги, написанный код.\nЛовит то, что статика не видит в принципе — неверную бизнес-логику, упущенные сценарии,\nнеучтённые состояния. Замечаниям давай весомый вес.</p>\n<h3>Холодный читатель — второй взгляд с противоположным входом</h3>\n<p>Дополнительно к <code>advisor()</code>, когда цена ошибки высока: класс C3 либо затронуты проведение,\nденьги, права, необратимые операции. Ценность даёт противоположность входов, а не второе\nмнение — почему, разбирает <code>references/cold-reader.md</code>.</p>\n<p><strong>Передавать:</strong> только сравнение версий и содержимое изменённых файлов. <strong>Не передавать:</strong> формулировку\nзадачи, свои выводы, названия найденных проблем — узнавший намерение читатель перестаёт\nбыть холодным.</p>\n<p>Три вопроса, на которые он отвечает:</p>\n<ol>\n<li>Что этот код делает <strong>как написан</strong>, а не как задуман?</li>\n<li>На каких входных данных он ломается или ведёт себя неожиданно?</li>\n<li>Какое ожидаемое поведение из него не следует?</li>\n</ol>\n<p><strong>Модель не дешевле основной:</strong> уровень не ниже модели сессии. Расхождение с <code>advisor()</code> —\nсигнал, а не шум: код допускает два прочтения.</p>\n<p><strong>Слой заканчивается записью следа</strong> — иначе его пропуск на C3 неотличим от прогона; дефект\nбез своего признака — <code>qg:LOGIC-CONTRACT</code> или <code>qg:LOGIC-CASE-LOSS</code>:</p>\n<pre><code>[qg applied: layer=code, scope=logic-review, ids=[qg:LOGIC-CONTRACT], verdict=violation:qg:LOGIC-CONTRACT]\n[qg skipped: layer=code, scope=logic-review, reason=advisor_unavailable]\n</code></pre>\n<h2>Слой 3 — состязательный аудит (только по подтверждению)</h2>\n<p><strong>Никогда не запускается сам</strong> — контур лишь предлагает его в отчёте и ждёт явного согласия.</p>\n<p>Суть: веер независимых ревьюеров по измерениям, затем по каждой находке несколько\nпроверяющих, которым поставлена задача её <strong>опровергнуть</strong>. Проходит только то, что\nопровергнуть не удалось.</p>\n<p>Состав измерений, пороги, правила голосования, асимметрия для находок \uD83D\uDD34 и порядок действий,\nкогда оркестрация недоступна, — в <code>../quality-gate/references/adversarial-audit.md</code>.</p>\n<hr>\n<h2>Автофикс (<code>--fix</code>)</h2>\n<p><strong>Можно:</strong> именование (через переименование символа анализатором, не текстовой заменой),\nформатирование и отступы, канонические ключевые слова, магические литералы на системные\nконстанты, очевидные quick-fix анализатора.</p>\n<p><strong>Нельзя без подтверждения:</strong> любая правка логики, проведения, запросов; транзакции и\nблокировки; права и привилегированный режим; всё, помеченное \uD83D\uDD34; сигнатуры экспортных методов\n(ломает вызывающих).</p>\n<p>После автофикса прогони Слой 1 заново — правки могли внести новые диагностики.</p>\n<hr>\n<h2>Выход</h2>\n<h3>Находки</h3>\n<pre><code>[\uD83D\uDD34/\uD83D\uDFE0/\uD83D\uDFE1] &lt;краткая суть&gt;\nГде: &lt;путь:строка&gt;\nПравило: #stdNNN п.X | антипаттерн «&lt;название&gt;» | #bslls:&lt;Код&gt;\nПроблема: &lt;что именно не так здесь&gt;\nКак исправить: &lt;конкретно; для \uD83D\uDD34 — со ссылкой на пример из справочника&gt;\nУверенность: средняя | требует проверки — опускается при высокой\n</code></pre>\n<p>При не-высокой уверенности следом — проверка, которая находку закроет. Довод, снимающий\nнаходку без такой проверки, обязан опираться на прочитанный источник — правило и пример в\n<code>../quality-gate/references/evidence-format.md</code>.</p>\n<p>Ключ локации <code>&lt;путь&gt;::&lt;Метод&gt;:&lt;строка&gt;</code> обязателен — по нему оркестратор дедуплицирует\nнаходки с архитектурным контуром (правила — в <code>shared/routing-contract.md</code>).</p>\n<h3>Записи следа</h3>\n<p>Минимум одна на каждый слой — выполненный или пропущенный:</p>\n<pre><code>[qg applied: layer=code, scope=query-in-loop, ids=[std436,bslls:QueryInLoop], verdict=clean]\n[qg applied: layer=code, scope=attribute-access, ids=[qg:BSL-REF-DOT-ACCESS,std437], verdict=violation:qg:BSL-REF-DOT-ACCESS]\n[qg skipped: layer=code, scope=static-analysis, planned=[bslls:*], reason=analyzer_unavailable]\n</code></pre>\n<p>Вторую строку печатает инструмент: написанная руками, она валидатор не проходит.</p>\n<p>Формат — <code>../quality-gate/references/evidence-format.md</code>.</p>\n<p>Два измерения контур закрыть не может и обязан об этом сказать. <strong>Компилируемость тел\nмодулей</strong> проверяет только платформа: без запуска проверки конфигурации нужна запись\n<code>[qg not_verified: dimension=compilation, reason=no_platform]</code>, иначе полностью чистый вердикт\nвалидатор отклонит. <strong>Выполнимость запроса</strong> — то же самое при сработавшем архетипе «Запрос»:</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>Проверка по тексту кода (пункт 2 Слоя 1б) её не заменяет — «Поле не найдено» и\nнесовместимость типов в <code>ОБЪЕДИНИТЬ</code> всплывают только при выполнении. Почему оба измерения\nустроены так — <code>../quality-gate/references/evidence-format.md</code>.</p>\n","files":[{"path":"references/analyzer-output.md","sizeBytes":5398,"isText":true},{"path":"references/api-verification.md","sizeBytes":7439,"isText":true},{"path":"references/bsl-async.md","sizeBytes":9436,"isText":true},{"path":"references/bsl-coding-standards.md","sizeBytes":14862,"isText":true},{"path":"references/bsl-form-module-rules.md","sizeBytes":11381,"isText":true},{"path":"references/bsl-query-optimization.md","sizeBytes":15341,"isText":true},{"path":"references/bsl-query-reference.md","sizeBytes":29076,"isText":true},{"path":"references/bsl-refactoring.md","sizeBytes":7253,"isText":true},{"path":"references/bsp-common-modules.md","sizeBytes":17516,"isText":true},{"path":"references/catalog/AI-01.md","sizeBytes":4772,"isText":true},{"path":"references/catalog/AI-02.md","sizeBytes":3029,"isText":true},{"path":"references/catalog/AI-03.md","sizeBytes":3222,"isText":true},{"path":"references/catalog/AI-04.md","sizeBytes":2604,"isText":true},{"path":"references/catalog/AI-05.md","sizeBytes":3419,"isText":true},{"path":"references/catalog/AI-06.md","sizeBytes":2040,"isText":true},{"path":"references/catalog/AI-07.md","sizeBytes":5838,"isText":true},{"path":"references/catalog/AI-08.md","sizeBytes":3496,"isText":true},{"path":"references/catalog/AI-09.md","sizeBytes":3106,"isText":true},{"path":"references/catalog/AI-10.md","sizeBytes":3157,"isText":true},{"path":"references/catalog/AI-11.md","sizeBytes":3126,"isText":true},{"path":"references/catalog/AI-12.md","sizeBytes":3380,"isText":true},{"path":"references/catalog/AI-13.md","sizeBytes":3644,"isText":true},{"path":"references/catalog/AI-14.md","sizeBytes":2138,"isText":true},{"path":"references/catalog/AI-15.md","sizeBytes":1911,"isText":true},{"path":"references/catalog/AI-16.md","sizeBytes":6212,"isText":true},{"path":"references/catalog/AI-17.md","sizeBytes":8968,"isText":true},{"path":"references/catalog/AI-18.md","sizeBytes":10302,"isText":true},{"path":"references/catalog/AI-19.md","sizeBytes":3348,"isText":true},{"path":"references/catalog/AI-20.md","sizeBytes":2446,"isText":true},{"path":"references/catalog/AI-21.md","sizeBytes":2721,"isText":true},{"path":"references/catalog/AI-22.md","sizeBytes":4194,"isText":true},{"path":"references/catalog/BSL-CONTEXT-CALL-UNNEEDED.md","sizeBytes":1634,"isText":true},{"path":"references/catalog/BSL-CORRELATED-SUBQUERY.md","sizeBytes":2819,"isText":true},{"path":"references/catalog/BSL-DB-READ-IN-LOOP.md","sizeBytes":5838,"isText":true},{"path":"references/catalog/BSL-DEEP-NESTING.md","sizeBytes":1219,"isText":true},{"path":"references/catalog/BSL-DISPATCH-NO-FALLBACK.md","sizeBytes":6549,"isText":true},{"path":"references/catalog/BSL-ENUM-STRING-ASSIGN.md","sizeBytes":2064,"isText":true},{"path":"references/catalog/BSL-FORM-ATTR-SHADOW.md","sizeBytes":5513,"isText":true},{"path":"references/catalog/BSL-MESSAGE-AS-NOTIFY.md","sizeBytes":2587,"isText":true},{"path":"references/catalog/BSL-MULTI-SERVER-CALLS.md","sizeBytes":2346,"isText":true},{"path":"references/catalog/BSL-NESTED-LOOP-SEARCH.md","sizeBytes":2196,"isText":true},{"path":"references/catalog/BSL-NO-CACHE.md","sizeBytes":2113,"isText":true},{"path":"references/catalog/BSL-NO-TOP-LIMIT.md","sizeBytes":1940,"isText":true},{"path":"references/catalog/BSL-QUERY-IN-LOOP.md","sizeBytes":2433,"isText":true},{"path":"references/catalog/BSL-REF-DOT-ACCESS.md","sizeBytes":5369,"isText":true},{"path":"references/catalog/BSL-STALE-LOCAL-CALL.md","sizeBytes":4498,"isText":true},{"path":"references/catalog/BSL-SUBQUERY-IN-SELECT.md","sizeBytes":2166,"isText":true},{"path":"references/catalog/BSL-TEMPTABLE-NO-INDEX.md","sizeBytes":2011,"isText":true},{"path":"references/catalog/BSL-TXN-IN-HANDLER.md","sizeBytes":4355,"isText":true},{"path":"references/catalog/BSL-TXN-INSIDE-TRY.md","sizeBytes":3147,"isText":true},{"path":"references/catalog/BSL-UNBOUNDED-STRING-COLUMN.md","sizeBytes":2019,"isText":true},{"path":"references/catalog/BSL-VT-FILTER-IN-WHERE.md","sizeBytes":2035,"isText":true},{"path":"references/catalog/INDEX.md","sizeBytes":11942,"isText":true},{"path":"references/catalog/QRY-ALIAS-RESERVED-WORD.md","sizeBytes":2359,"isText":true},{"path":"references/catalog/QRY-ALIAS-SHADOWS-FIELD.md","sizeBytes":2237,"isText":true},{"path":"references/catalog/QRY-ALIAS-SHADOWS-NESTED-TABLE.md","sizeBytes":1893,"isText":true},{"path":"references/catalog/QRY-TOP-WITHOUT-ORDER.md","sizeBytes":2122,"isText":true},{"path":"references/checklist-code.md","sizeBytes":18981,"isText":true},{"path":"references/cold-reader.md","sizeBytes":8367,"isText":true},{"path":"references/platform-api.md","sizeBytes":9701,"isText":true},{"path":"SKILL.md","sizeBytes":22439,"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.241303Z","sha256":"570EA8271B8E402B60AED8F1A817A67E55337D320758BFFC6E1BE93A5BC83E1F","sizeBytes":128626},"review":null,"source":{"repositoryUrl":"https://github.com/Romandredan/1c-quality-gate","path":"skills/bsl-code-review","license":null,"commit":"d27fc8f7f27bb109c5d8977a7452184e7c3da851","subtreeSha":"2E87A9973977B5A04806106BEAA8AE3613BCA6C04DAF234AF3294AED7921CAC9","lastSyncedAt":"2026-09-27T19:47:56.426024Z"},"reviewedAt":"2026-09-27T19:48:21.068223Z","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/bsl-code-review"},{"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"}]}