Веб-разработка

Датасет от AI-агентов: аудит нашел 7 кодов, которые молча становились «разрешено»

21 июля 2026 мы добавили в kvednace.com.ua таблицу вердиктов «можно ли КВЭД на едином налоге», собранную AI-агентами. Через 57 минут закоммитили правки по независимому аудиту: семи кодов в таблице не хватало, и сервис показывал их как разрешенные. Почему пропуск выглядел как проверенный ответ.

21 июля 2026 года в 11:04 по UTC в репозитории нашего сервиса kvednace.com.ua появилась новая функция: для каждого кода КВЭД сервис начал показывать, можно ли вести такую деятельность на едином налоге и в какой группе. В 12:01 того же дня в том же репозитории появился второй коммит, с правками по результатам независимого аудита данных. Между ними прошло 57 минут.

Этот текст о том, что нашел аудит, почему этого не заметили во время сбора и как проверить собственный справочник, собранный моделями, пока им не начали пользоваться люди. Налоговых советов здесь нет: какую группу выбрать, решаете вы вместе с бухгалтером.

Как собрали датасет и что о нем написали

Датасет — это таблица вердиктов. В каждой строке код КВЭД-2010, название деятельности, уровень («разрешено», «только 3 группа», «частично», «запрещено»), основание в Налоговом кодексе, отметка, прямая это норма закона или толкование, и степень уверенности.

Собирали его AI-агенты. В шапке файла записано: «собрано и адверсарно проверено исследовательским пайплайном (18 агентов…)». Там же стоит оговорка, которая есть и на странице сервиса: запрет в законе действует по фактическому виду деятельности, а код лишь ориентир.

Когда мы сверили описание с самим файлом, первое расхождение нашлось сразу. Сообщение первого коммита обещает «87 вердиктов по кодам КВЭД-2010», а в файле из того коммита 70 строк. Сервис от этого не ломался. Но расхождение показало, что описание, которое агент пишет о собственной работе, проверкой этой работы не является. Слова «адверсарно проверено» в шапке тоже.

Что нашел аудит

Аудит запускали отдельно от сбора. Согласно сообщению коммита с правками, его делали четыре аудитора, каждый по своей категории, с установкой «не доверяй, проверяй», а каждую находку потом отдельно сверяли с кодексом и разъяснениями ГНС.

В заголовке коммита стоит «8 правок». Если считать по списку в том же сообщении, изменений девять:

  • семь кодов, которых в датасете не было вообще: 45.40 (торговля мотоциклами), 46.39 (неспециализированный опт продуктов, напитков и табака), 29.20 (кузова и прицепы), 30.91 (производство мотоциклов), 90.04 (концертные залы), 82.99 (среди прочего, независимые аукционисты), 01.15 (выращивание табака);
  • уточненное примечание к 71.20 (технические испытания): запрет из кодекса касается только ФЛП, а юридическое лицо на 3 группе такие работы выполнять может;
  • исправленная функция, которая решает, показывать ли 4 группу.

Два последних изменения связаны между собой. Код 01.15 относится к сельскохозяйственным, для которых сервис предлагает 4 группу. Когда выращивание табака получило «запрещено», без правки логики карточка показывала бы одновременно запрет на едином налоге и доступную 4 группу.

Одну находку аудита мы отклонили. Это 47.19, «Прочие виды розничной торговли в неспециализированных магазинах». Аудит предлагал пометить код как ограниченный, но запрет здесь зависит от фактической операции, а не от кода, так что пометка на весь класс была бы избыточной. Строки для 47.19 так и нет, значит, сервис показывает «разрешено».

Почему пропусков никто не заметил

Пропуск выглядел точь-в-точь как проверенный ответ.

Логика сервиса такая: ищем строку для кода; если ее нет, ищем строку для раздела (первые две цифры); если нет и ее, возвращаем «разрешено». Для большинства кодов это правильный ответ, потому что единый налог разрешает большинство видов деятельности и прописывать сотни одинаковых строк нет смысла.

Проблема в другом. «Строки нет, потому что все разрешено» и «строки нет, потому что ее забыли» на экране не отличались. Было даже хуже: строку, помеченную как толкование, а не прямая норма, сервис подписывает «ориентировочно», а отсутствующая строка такой подписи не получает. Забытый код выглядел увереннее честно помеченного спорного. Единственная видимая разница: в карточке без строки нет пункта «Основание».

Как именно агенты распределяли работу, мы воспроизводить не будем: журнала их шагов в репозитории нет. Наше объяснение такое. Поиск запретов порождает строки, а проверка строк видит лишь то, что уже записано. Пропуск можно найти только тогда, когда кто-то идет от правила к кодам, а не от кодов к правилу.

Сколько это затронуло

Цифры ниже мы посчитали 16 сентября 2026 года скриптом, который повторяет логику сервиса, на версиях датасета до правок и после них. Это влияние на ответы сервиса, а не на чьи-то решения.

До аудита После
Строк в датасете 70 77
Кодов КВЭД-2010 (из 615), у которых есть своя строка или строка раздела 85 92
Кодов, которые получают «разрешено» без единой строки 530 523
Кодов NACE 2.1-UA (из 650), где вердикт изменился с «разрешено» — 27

Семь новых строк изменили вердикт на 27 страницах новых кодов, потому что для нового кода сервис берет самый строгий вердикт среди старых кодов, которые в него переходят. Больше всего дал 82.99: в таблице соответствия сервиса он расходится на 24 новых кода.

Попала ли версия без правок на живой сайт за эти 57 минут, мы не сверяли, поэтому не утверждаем, что ошибочный вердикт кто-то увидел. По состоянию на 16 сентября 2026 года страница кода 45.40 на kvednace.com.ua показывает «Разрешено частично» с основанием из кодекса.

Как проверить собственный справочник

Подходит для любой таблицы, которую заполняла модель: вердикты, совместимость запчастей, таблицы размеров, правила доставки по регионам. Первые два шага — это быстрая проверка, которая дает больше всего. Остальное — уже изменения в продукте и в том, как вы ставите задачу аудита.

  1. Найдите значение по умолчанию. Поищите в коде ??, || , .get(key, default) или ветку else после поиска в таблице. Запишите, что получает ключ, которого в таблице нет.
  2. Посчитайте, сколько ключей попадает в эту ветку. Возьмите полный перечень (классификатор, каталог, список городов) и прогоните каждый ключ через ту же функцию поиска, что и на сайте. У нас это 523 кода из 615. Само число неважно, важно знать его и понимать, все ли эти ключи действительно должны получать типовой ответ.
  3. Сделайте отсутствие видимым. Хотя бы во внутреннем режиме показывайте «нет в справочнике» отдельным состоянием, а не тем же «да», что и для проверенной строки.
  4. Сверьте описание с файлом. Сколько строк обещает сообщение коммита, README или отчет агента, и сколько их на самом деле. Хватит grep -c по ключевому полю. У нас вышло 87 против 70.
  5. Дайте аудитору другую задачу, чем сборщику. Не «проверь эти строки», а «вот правило, найди все ключи, которых оно касается, и скажи, каких из них в таблице нет».
  6. Записывайте отклоненные находки вместе с причиной. Наш 47.19 лежит в сообщении коммита с объяснением, и следующий аудит не будет поднимать его снова без новых аргументов.

Что мы изменили и чего это не исправило

Семь кодов добавлено, примечание к 71.20 уточнено, 4 группа для запрещенной деятельности больше не показывается. Все это лежит в одном коммите в истории репозитория.

Сама конструкция осталась: 523 кода, как и раньше, получают «разрешено» без строки, и на экране это до сих пор не отличается от проверенного разрешения. Аудит закрыл пропуски, которые нашел, но не доказал, что других нет. Поэтому на странице единого налога стоит напоминание: запрет действует по фактическому виду деятельности, а не по самому коду.

Владельцу бизнеса из этой истории стоит вынести одно: справочник по коду не защищает от запрета по тому, что вы делаете на самом деле. Если сервис показывает код как разрешенный, торговать под ним товаром, который кодекс запрещает на едином налоге, все равно нельзя.

Техническому читателю другое: данные от AI надо проверять не только на то, что в них записано, но и на то, чего в них не хватает. О похожей ловушке в коде, когда результат выглядит правильным, а ошибку ловит лишь внешняя проверка, мы писали в разборе ассистентов для разработки. А справочные сервисы, где каждая страница отвечает на один вопрос, мы делаем как базы знаний.

Теги

AIАналитика

Вам понравилась статья?

Ваше мнение помогает нам создавать лучший контент

Поделитесь с друзьями

Нашли что-нибудь полезное?

Помогите другим узнать это — поделитесь статьей в социальных сетях

Спасибо, что помогаете нам расти

Основатель LIONEX

Владислав Чистяков

Пишет о том, что делает руками: интернет-магазины на OpenCart, приложения на Next.js, интеграции и скорость сайтов. В статьях — замеры и проверки, которые читатель может повторить на своём проекте, а не общие советы. Коммерческая разработка с 2015 года.

Вопросы

Частые вопросы

Ответы на популярные вопросы по теме

Что именно нашел аудит датасета единого налога?

Семь кодов КВЭД, которых в таблице не было вообще: 45.40, 46.39, 29.20, 30.91, 90.04, 82.99 и 01.15. Сервис показывал их как разрешенные, потому что код без строки получает «разрешено» по умолчанию. Кроме того, аудит уточнил примечание к 71.20 и исправил логику показа 4 группы.

Почему пропущенный код никто не заметил во время сбора?

На экране «строки нет, потому что все разрешено» и «строки нет, потому что ее забыли» выглядели одинаково. Спорные строки сервис подписывает «ориентировочно», а отсутствующая строка такой подписи не получает, так что забытый код выглядел даже увереннее. Внешне не хватало лишь пункта «Основание».

Все ли находки аудита приняли?

Нет. Предложение ограничить код 47.19 отклонили: запрет там зависит от фактической операции, а не от кода, так что пометка на весь класс была бы избыточной. Причина записана в сообщении коммита, чтобы следующий аудит не поднимал этот вопрос снова без новых аргументов.

Если сервис показывает мой код как разрешенный, можно ли не беспокоиться о запрете?

Нет. Запрет на едином налоге действует по фактическому виду деятельности, а не по зарегистрированному коду, и справочник по коду от него не защищает. Даже после аудита большинство кодов получают «разрешено» без отдельной строки. Какую группу выбрать, решайте вместе с бухгалтером.

Как быстро проверить собственный справочник, который заполняла модель?

Найдите в коде, что возвращается для ключа, которого в таблице нет, и прогоните полный перечень ключей через ту же функцию поиска, чтобы знать, сколько из них получают типовой ответ. Дальше покажите отсутствие отдельным состоянием, сверьте количество строк с описанием в коммите или отчете и дайте аудитору задачу идти от правила к ключам.

Получайте лучшие статьи на почту

Подпишитесь на нашу рассылку и получайте полезные советы, инсайты и новости о веб-разработке, маркетинге и бизнесе.

Мы уважаем вашу конфиденциальность. Отписаться можно в любой момент.

Ещё в блоге

Похожие статьи

154 ошибки типов, которые выбрасывала сборка: что в них нашлосьВеб-разработка

154 ошибки типов, которые выбрасывала сборка: что в них нашлось

21 сентября 2026 года проверка типов на нашем сайте показала 154 ошибки, хотя сборка каждый раз была зелёной: результат проверки просто выбрасывался. Внутри нашлись нули в статистике ссылок и в экспорте аналитики, сортировка, которая не сортировала, и тесты, которые не запускались. Рассказываем, как разбирали, что изменили и как проверить свой проект.

Читать дальше
Сертификаты продлеваются сами: TLS на 116 сайтах и один, который не продлилсяВеб-разработка

Сертификаты продлеваются сами: TLS на 116 сайтах и один, который не продлился

22 сентября 2026 года мы проверили HTTPS-сертификаты на 116 сайтах, которые уже измеряли для рыночных исследований, и для 104 из них сравнили состояние с августовским. Все 116 прошли проверку, 108 стоят на 89- и 90-дневных бесплатных сертификатах, и только у одного сайта сертификат до сих пор не продлился, хотя при типичных настройках уже должен был. Разбираем замеры, границы метода и показываем, как проверить свой сайт одной командой.

Читать дальше
Healthcheck дал 60 % запросов приложения: что показали первые сутки метрикВеб-разработка

Healthcheck дал 60 % запросов приложения: что показали первые сутки метрик

21 сентября 2026 года, в первые сутки учёта запросов по маршрутам, служебный /api/health получил 13 666 запросов — 60 % трафика приложения, и каждый шёл в общую базу. Рассказываем, какие две настройки это убрали, какую цену мы за них платим и как проверить свой healthcheck.

Читать дальше