framework/rules/test-zero-residue/SKILL.md
Для DB-writing тестов обязателен zero-residue cleanup
npx skillsauth add steelmorgan/1c-agent-based-dev-framework test-zero-residueInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Триггер: проектирование, написание или ревью ЛЮБОГО теста (YaxUnit unit, серверный YaxUnit-хелпер «Vanessa-перехват», Vanessa
.feature, интеграционный, сквозной), который создаёт/изменяет/записывает объекты в БД. Применяется ко ВСЕМ видам тестов. При срабатывании — применить навыкtest-writing(framework/skills/bsl-practices/test-writing/SKILL.md) и соответствующий механизм изоляции:yaxunit-isolationдля YaxUnit,vanessa-test-isolation-policyдля Vanessa.
GUARD: тест, оставивший после прогона данные в боевой базе, НЕ принимается (Reviewer BLOCK) — даже если «зелёный».
Тест, накапливающий хвосты, засоряет реальные данные, ломает другие тесты (регламенты выбирают тестовые объекты → таймауты; идемпотентность видит чужие прогоны как дубли) и маскирует деградацию базы. Чистка постфактум — симптом; корень — отсутствие teardown в АРХИТЕКТУРЕ теста. Это закладывается в архитектуру каждого теста, а не делается разовой уборкой.
| Требование | Описание |
|-----------|----------|
| Нулевой след | Дельта количества по КАЖДОМУ затронутому справочнику / регистру / документу / набору записей до и после прогона = 0 |
| Механизм изоляции обязателен | YaxUnit — .ВТранзакции() (откат) ИЛИ явный teardown .После() при допустимом исключении (см. yaxunit-isolation). Vanessa и серверные хелперы вне транзакции — физическая зачистка созданного, устойчивая к падению Act/Assert |
| Объекты — трекаемо | Справочники создавать через ЮТест.Данные() (автотрекинг + автоудаление по .УдалениеТестовыхДанных()), а не Справочники.X.СоздатьЭлемент() мимо трекинга |
| Физическое удаление нетрекаемого | То, что не чистится транзакцией/автотрекингом (документы через Документы.X.СоздатьДокумент(), объекты из хелперов, объекты из КонструкторОбъекта().Записать()) — удалять физически: ОбменДанными.Загрузка = Истина + Удалить(), в порядке зависимые → владелец; не пометка на удаление |
| Коллектор обязателен | Тест, генерирующий данные, ОБЯЗАН регистрировать КАЖДЫЙ созданный объект в коллекторе тестовых объектов В МОМЕНТ создания; teardown (.После() / финальный шаг сценария / ПослеВсехТестов) проходит по коллектору и физически удаляет всё, что пережило откат транзакции. Работает ДАЖЕ если Act/Assert упали. Деталь механизма — навык test-writing («Коллектор тестовых объектов») |
| Запрет молчаливого проглатывания ошибки удаления | Дренаж/teardown коллектора НЕ имеет права молча проглатывать ошибку Удалить(). Удаление штатно может упасть на конфликте версии (optimistic-lock: объект конкурентно перезаписан подпиской/фоновым заданием между чтением и удалением) → ОБЯЗАН повторить с повторным свежим ПолучитьОбъект() (ограниченное число попыток), повторяя ТОЛЬКО на конфликте версии. Если после повторов объект не удалён ИЛИ ошибка не-конфликтная — записать в журнал регистрации запись УРОВНЯ Ошибка (НЕ Предупреждение) с типом+ссылкой неудалённого остатка и продолжить дренаж остальных ссылок (не прерывать дренаж исключением — иначе осиротит остальное). Ошибка удаления, погашенная в Попытке без видимого следа уровня Ошибка = невидимая утечка, которую приёмка дельта-0 по ЖР не ловит |
| Сквозной тест — шаг-зачистка | Если данные обязаны жить во время прогона (end-to-end) — единственное исключение, и тест ОБЯЗАН завершаться явным шагом, удаляющим всё созданное (через коллектор) |
| Приёмка = дельта-0 | Проверка дельты ключевых объектов до/после — часть приёмочного критерия фазы; ненулевая дельта = тест не принят |
| Запрет band-aid | Скрытие созданного от выборок/регламентов (флаг-исключение объекта, спец-префикс-фильтр) НЕ засчитывается как зачистка — объект должен быть удалён физически |
| Запрет хрупких селекторов | Зачистка перебором базы по ИМЕНИ/префиксу/регекспу («удалить всё ПОДОБНО "Тест%"», смешение алфавитов) НЕ является основным механизмом teardown: ложно-широкий отбор рискует снести боевые данные, ложно-узкий — оставляет хвост. Допустима ТОЛЬКО как разовый сметатель уже накопленного исторического мусора, не как штатный teardown теста. Штатный teardown — коллектор (точные ссылки) |
yaxunit-isolation — КАК изолировать серверный YaxUnit-тест (.ВТранзакции(), допустимые исключения, teardown .После()). Это правило задаёт ИНВАРИАНТ (дельта-0), то правило — механизм.vanessa-test-isolation-policy — изоляция Vanessa-сценариев (создание своих объектов). Усиливается требованием физической зачистки до нуля.depends_on:
development
1C server maintenance webhooks: container restart and external component cache cleanup
development
Interactive DAP debugging of a single BSL procedure
tools
Rules for using RLM tools for project search and navigation in 1C/BSL
development
Creates web applications and routes on Winow (a web server on OneScript and Autumn). Use when working with a web server on OneScript, routing, or Winow controllers.