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 года скриптом, который повторяет логику сервиса, на версиях датасета до правок и после них. Это влияние на ответы сервиса, а не на чьи-то решения.
Семь новых строк изменили вердикт на 27 страницах новых кодов, потому что для нового кода сервис берет самый строгий вердикт среди старых кодов, которые в него переходят. Больше всего дал 82.99: в таблице соответствия сервиса он расходится на 24 новых кода.
Попала ли версия без правок на живой сайт за эти 57 минут, мы не сверяли, поэтому не утверждаем, что ошибочный вердикт кто-то увидел. По состоянию на 16 сентября 2026 года страница кода 45.40 на kvednace.com.ua показывает «Разрешено частично» с основанием из кодекса.
Как проверить собственный справочник
Подходит для любой таблицы, которую заполняла модель: вердикты, совместимость запчастей, таблицы размеров, правила доставки по регионам. Первые два шага — это быстрая проверка, которая дает больше всего. Остальное — уже изменения в продукте и в том, как вы ставите задачу аудита.
- Найдите значение по умолчанию. Поищите в коде
??, || , .get(key, default) или ветку else после поиска в таблице. Запишите, что получает ключ, которого в таблице нет.
- Посчитайте, сколько ключей попадает в эту ветку. Возьмите полный перечень (классификатор, каталог, список городов) и прогоните каждый ключ через ту же функцию поиска, что и на сайте. У нас это 523 кода из 615. Само число неважно, важно знать его и понимать, все ли эти ключи действительно должны получать типовой ответ.
- Сделайте отсутствие видимым. Хотя бы во внутреннем режиме показывайте «нет в справочнике» отдельным состоянием, а не тем же «да», что и для проверенной строки.
- Сверьте описание с файлом. Сколько строк обещает сообщение коммита, README или отчет агента, и сколько их на самом деле. Хватит
grep -c по ключевому полю. У нас вышло 87 против 70.
- Дайте аудитору другую задачу, чем сборщику. Не «проверь эти строки», а «вот правило, найди все ключи, которых оно касается, и скажи, каких из них в таблице нет».
- Записывайте отклоненные находки вместе с причиной. Наш 47.19 лежит в сообщении коммита с объяснением, и следующий аудит не будет поднимать его снова без новых аргументов.
Что мы изменили и чего это не исправило
Семь кодов добавлено, примечание к 71.20 уточнено, 4 группа для запрещенной деятельности больше не показывается. Все это лежит в одном коммите в истории репозитория.
Сама конструкция осталась: 523 кода, как и раньше, получают «разрешено» без строки, и на экране это до сих пор не отличается от проверенного разрешения. Аудит закрыл пропуски, которые нашел, но не доказал, что других нет. Поэтому на странице единого налога стоит напоминание: запрет действует по фактическому виду деятельности, а не по самому коду.
Владельцу бизнеса из этой истории стоит вынести одно: справочник по коду не защищает от запрета по тому, что вы делаете на самом деле. Если сервис показывает код как разрешенный, торговать под ним товаром, который кодекс запрещает на едином налоге, все равно нельзя.
Техническому читателю другое: данные от AI надо проверять не только на то, что в них записано, но и на то, чего в них не хватает. О похожей ловушке в коде, когда результат выглядит правильным, а ошибку ловит лишь внешняя проверка, мы писали в разборе ассистентов для разработки. А справочные сервисы, где каждая страница отвечает на один вопрос, мы делаем как базы знаний.