{
  "standard": "FSP",
  "module": "core",
  "version": "1.0",
  "registry": "rules",
  "title": "Нормативные правила FSP Core 1.0",
  "description": "Правила каталога услуг, категорий, параметров, метрик, габаритных профилей и целостности данных. Обязательны для соответствия модулю.",
  "in_standard": true,
  "columns": [
    "ID",
    "Правило"
  ],
  "rows": [
    {
      "ID": "CAT-001",
      "Правило": "Коды стандартных услуг неизменяемы после публикации."
    },
    {
      "ID": "CAT-002",
      "Правило": "Одна строка прайса ФФ может включать несколько стандартных услуг."
    },
    {
      "ID": "CAT-003",
      "Правило": "Материалы хранятся отдельно от операций."
    },
    {
      "ID": "CAT-004",
      "Правило": "Для каждой услуги в каталоге хранится полный закрытый список допустимых billing_metric v1: код и название. Значение вне списка требует новой версии стандарта."
    },
    {
      "ID": "CAT-005",
      "Правило": "Разделы каталога используются только для навигации и не определяют категорийную применимость услуги."
    },
    {
      "ID": "CAT-006",
      "Правило": "Применимость услуги к товарной категории задаётся только на реестре «Связи категорий» по кодам услуги и категории."
    },
    {
      "ID": "SIZE-001",
      "Правило": "Размерные классы принадлежат версионируемому профилю."
    },
    {
      "ID": "SIZE-002",
      "Правило": "ФФ может использовать собственный профиль размеров."
    },
    {
      "ID": "SIZE-003",
      "Правило": "Если товар совпал с несколькими классами профиля, выбирается класс с минимальным числовым priority. Если совпадений нет, возвращается SIZE_PROFILE_NO_MATCH."
    },
    {
      "ID": "MAP-001",
      "Правило": "Категории WB/Ozon сопоставляются отдельными версионируемыми строками."
    },
    {
      "ID": "CAT-007",
      "Правило": "Связь с категорией any распространяется на все дочерние категории; более специфичная связь не отменяет any."
    },
    {
      "ID": "CAT-008",
      "Правило": "Каждый параметр услуги обязан существовать на реестре «Параметры», а связь — на реестре «Параметры услуг»."
    },
    {
      "ID": "CAT-009",
      "Правило": "Тип услуги хранится явно: base или industry. Положение строки и название раздела не являются типом."
    },
    {
      "ID": "SIZE-004",
      "Правило": "Отсутствие обязательного входа размерного правила возвращает SIZE_PROFILE_INPUT_MISSING; null никогда не считается совпадением."
    },
    {
      "ID": "SIZE-005",
      "Правило": "sum_sides_cm, max_side_cm, volume_m3, volumetric_weight_kg и chargeable_weight_kg вычисляются только по реестру «Расчётные метрики»."
    },
    {
      "ID": "MAP-002",
      "Правило": "Для пары source_system + source_category_id периоды active-маппингов не пересекаются; результат сопоставления должен быть единственным."
    },
    {
      "ID": "DATA-001",
      "Правило": "Все id уникальны в пределах сущности; все ссылки обязаны существовать; публикация блокируется при любой ошибке на реестре «Проверки»."
    },
    {
      "ID": "CAT-010",
      "Правило": "Источник истины для допустимых billing_metric — реестр «Метрики услуг»; строковые списки каталога являются только витриной."
    },
    {
      "ID": "SIZE-006",
      "Правило": "size_class_id всегда квалифицирован как <profile>:<version>:<class>; использование S/M/L без профиля запрещено."
    },
    {
      "ID": "SIZE-007",
      "Правило": "Договорный размерный профиль и фактическая логика калькулятора хранятся раздельно; расхождение блокирует публикацию тарифа."
    },
    {
      "ID": "CAT-011",
      "Правило": "Варианты материала, размера, маршрута и объёма не создают новую услугу: они задаются материалом, параметром, метрикой или условием цены."
    },
    {
      "ID": "SCOPE-001",
      "Правило": "Позиции из реестра «Исключения» не добавляются в каталог и при импорте получают статус out_of_scope."
    },
    {
      "ID": "SCOPE-002",
      "Правило": "Самовыкуп и стимулированный отзыв не получают код услуги и не входят в предложение оператора."
    },
    {
      "ID": "PROFILE-001",
      "Правило": "Манифест публикуется по адресу /.well-known/fsp и является единственным источником сведений о поддерживаемых модулях. Договорённость вне манифеста не заменяет его."
    },
    {
      "ID": "PROFILE-002",
      "Правило": "Объявлять модуль, чьи зависимости не объявлены, запрещено: манифест с таким набором модулей недействителен."
    },
    {
      "ID": "PROFILE-003",
      "Правило": "Активны только модули, объявленные обеими сторонами. Для каждого общего модуля берётся пересечение версий и выбирается наибольшая; при пустом пересечении модуль исключается."
    },
    {
      "ID": "PROFILE-004",
      "Правило": "Исключение модуля исключает все модули, которые от него зависят, и все расширения, чей родительский модуль исключён. Пересчёт повторяется до стабилизации."
    },
    {
      "ID": "PROFILE-005",
      "Правило": "Итог согласования вычисляет и фиксирует принимающая сторона, возвращая его в ответе. При расхождении сторон действует итог принимающей."
    },
    {
      "ID": "PROFILE-006",
      "Правило": "Для модуля с уровнями соответствия согласованным считается наименьший общий уровень. Требование уровня выше согласованного не исключает сторону из обмена, а возвращается кодом непокрытия."
    },
    {
      "ID": "PROFILE-007",
      "Правило": "Имя расширения имеет вид x-<vendor>:<code> и обязано указывать родительский модуль. Расширение только добавляет поля и никогда не переопределяет поля стандарта."
    },
    {
      "ID": "PROFILE-008",
      "Правило": "Неизвестное поле, модуль или расширение игнорируется и не является ошибкой обмена. Отсутствие у другой стороны объявленного модуля тоже не ошибка."
    }
  ]
}