---
name: sku-number-check
description: Локальная сверка чисел в черновике описания товара с подтверждёнными характеристиками и поиск заданных запретных фраз. Применять перед ручной вычиткой карточки, когда есть список проверенных характеристик и текст черновика. Не проверяет смысл, единицы и принадлежность числа полю; не разрешение на публикацию.
---

# sku-number-check — сверка чисел черновика с характеристиками

Небольшой детерминированный скрипт. Он находит в черновике описания товара числа, которых нет среди подтверждённых характеристик, и заданные вами запретные фразы. Модель для проверки не нужна; это вспомогательный шаг перед вычиткой человеком.

## Когда применять

- Есть список характеристик товара, которые вы уже проверили (из карточки поставщика, паспорта, своей таблицы).
- Есть черновик описания — написанный вручную или нейросетью.
- Нужно быстро увидеть числа, которые в черновике появились «из ниоткуда» или были подменены (500 → 750).

## Шаги

1. Соберите файл `INPUT.json` в UTF-8:

   ```json
   {
     "facts": ["Объём: 500 мл", "Гарантия: 12 месяцев"],
     "draft": "Объём 500 мл. Гарантия 12 месяцев.",
     "forbidden_phrases": ["лечит", "лучший в мире"]
   }
   ```

   - `facts` — непустой список непустых строк, только подтверждённые характеристики;
   - `draft` — непустая строка, текст черновика;
   - `forbidden_phrases` — необязательный список непустых строк. Скрипт сам ничего не запрещает: ищутся только фразы, которые вы перечислили.
   - Другие поля не допускаются (опечатка в имени поля даёт ошибку входа, а не молча отключённую проверку).

2. Запустите из папки скилла:

   ```sh
   python3 scripts/check.py INPUT.json
   ```

3. Прочитайте JSON в выводе и код выхода:

   | Код | `status` | Что значит |
   |---|---|---|
   | 0 | `no_signals` | Сигналов нет. **Это не разрешение на публикацию.** |
   | 1 | `signals` | Есть числа, которых нет в `facts` (`unmatched_numbers`), и/или найдены запретные фразы (`forbidden_hits`). Проверьте каждое место вручную. |
   | 2 | `invalid_input` | Вход некорректен: нет файла, не JSON, пустые или неверные типы полей, лишние поля. Причина — в `message`. |

4. Каждый сигнал разберите по первоисточнику характеристики. После этого текст всё равно вычитывает человек.

## Как сравниваются числа

- Число — подряд идущие цифры с необязательной дробной частью через точку или запятую: `500`, `0,5`, `1.25`.
- `0,5`, `0.5` и `0,50` считаются одним числом; `500` и `500.0` — тоже.
- Цифры других систем Unicode (например, полноширинные `５００` или арабские `٥٠٠`) приводятся к обычным.
- Число из черновика проходит, если такое же значение встречается **в любом** из фактов.

## Чего скрипт не делает — обязательно учитывайте

- **Не проверяет смысл.** Если в фактах «Объём: 500 мл», а в черновике «Вес 500 г», число 500 пройдёт: скрипт не знает, к какой характеристике оно относится.
- **Не проверяет единицы измерения.** «500 мл» и «500 л» для него одинаковы.
- **Не распознаёт числа прописью** («пятьсот», «поллитра») и разряды через пробел: «1 000» читается как два числа, 1 и 000.
- **Не ловит синонимы и другие словоформы** запретных фраз: при фразе «лечит» слово «лечебный» не будет найдено. Перечисляйте нужные формы сами.
- **Не ловит новые качественные обещания** без чисел («не протекает никогда», «подходит всем»), если вы не внесли их в `forbidden_phrases`.
- Не проверяет, что сами `facts` верны: он сверяет черновик только с тем, что вы ему дали.
- Не обращается к сети, кабинетам маркетплейсов и нейросетям, ничего не публикует и не исправляет текст.

Код 0 означает только «по этим двум механическим правилам сигналов нет».

## Границы работы

- Читает только указанный `INPUT.json` (до 5 МБ), пишет только в stdout.
- Без ключей, сети и сторонних пакетов: Python 3, стандартная библиотека.

## Готовность

Скилл отработал, если получен JSON с полем `status` и код выхода 0, 1 или 2, а каждый сигнал при коде 1 разобран вручную.

## Примеры

Учебные входы — `examples/`, тесты — `python3 -m unittest discover -s tests -v`.
