Перейти к основному содержимому

Система: границы и контракт

Эта страница — живой системный контракт текущего продукта «Колорика». Она фиксирует поддерживаемую границу решения, роли, возможности и инварианты, но не заменяет ролевые инструкции, спецификации отдельных изменений, QA-проверки и техническую документацию.

Оглавление​

  1. Как читать этот документ
  2. Назначение, бизнес-результаты и не-цели
  3. Граница и контекст решения
    1. Что входит в продукт
    2. Что находится вне продукта
    3. Контекстная диаграмма
    4. Операционная среда верхнего уровня
  4. Заинтересованные стороны, роли и права
  5. Карта возможностей
    1. Каталог и контент
    2. Покупатель, аккаунт, корзина и избранное
    3. Checkout, платёж и заказ
    4. Доставка, отмена и возврат
    5. Управление каталогом, заказами и доступами
    6. Учёт, остатки и операционная синхронизация
    7. Управление контентом
    8. Платформенная эксплуатация
  6. Критические сквозные сценарии и состояния
  7. Бизнес-правила и инварианты
  8. Доменная модель и данные
    1. Концептуальная модель объектов
    2. Состояния и жизненные циклы
    3. Владение, копии и согласованность данных
    4. Получение, целостность, хранение и удаление
  9. Внешние интерфейсы
  10. Атрибуты качества
    1. Безопасность и приватность
    2. Производительность и ёмкость
    3. Надёжность, доступность и восстановление
    4. Согласованность и идемпотентность
    5. Удобство и доступность интерфейсов
    6. Наблюдаемость и сопровождаемость
    7. Развёртываемость и переносимость
  11. Ограничения, предположения и зависимости
  12. Инварианты продукта и настройки компании
  13. Известные отклонения и уровень доказательств
  14. Архитектура требований и порядок сопровождения
  15. Термины и ссылки

1. Как читать этот документ​

Статус и область действия​

В основном тексте описан поддерживаемый текущий контракт:

  • действующая возможность формулируется как наблюдаемый результат, а не как экран, маршрут API или элемент кода;
  • слово «должна» или «не должна» обозначает нормативное требование;
  • известное нарушение требования не переписывает норму: рядом указывается только ID из docs/qa/active-limitations.md;
  • ЖИВ-* означает, что интерфейс реализован, но ещё не доказан на целевом договоре или аккаунте; это не подтверждение и не описание дефекта;
  • задуманная, но не реализованная функция в текущий baseline не входит;
  • пометка (*) в docs/feature-inventory.md — сигнал проверить отклонение, а не основание объявить функцию работающей.

Обозначения​

ОбозначениеСмыслГде используется
SYS-CAP-NNУстойчивая группа возможностей и результат для ролиРаздел 5
SYS-BR-NNДолговечное бизнес-правило или инвариантРаздел 7
SYS-DAT-NNТребование к доменным даннымРаздел 8
SYS-INT-NNКонтракт пересечения внешней границыРаздел 9
SYS-QLT-NNПроверяемый атрибут качестваРаздел 10
SYS-CON-NNУстойчивое ограничение или зависимостьРаздел 11
ОГР-*Подтверждённое активное отклонениеdocs/qa/active-limitations.md
ЖИВ-*Не завершённая проверка на живой внешней системеdocs/qa/active-limitations.md
ПЛТ-*Осознанное ограничение платформы, а не дефектdocs/qa/active-limitations.md
ПУТ-*Пользовательский или операционный путь и его бизнес-рискdocs/qa/user-journeys.md
TBDРешение нельзя достоверно вывести из реализации; его должен принять владелецБлок открытых вопросов в конце страницы

ID сохраняются при изменении формулировки и не выдаются другому требованию после удаления. Git хранит историю версий; ручной номер документа и журнал правок здесь не ведутся.

Где искать подробности​

ВопросКанонический источник
Где заканчивается продукт и какие инварианты действуют?Эта страница
Как выполнить действие покупателю или сотруднику?Раздел покупателя, администратора, владельца или склада
Что именно менялось и по каким критериям принималось?docs/specs/<feature>/spec.md; завершённые контракты — docs/specs/_archive/
Каков бизнес-риск, как проверить поведение и какие отклонения активны?docs/qa/user-journeys.md, docs/qa/test-cases/, docs/qa/active-limitations.md
Что фактически найдено в коде?docs/feature-inventory.md
Как устроены API, фоновые процессы, окружение и эксплуатация?Раздел разработчика, а также README.md, CLAUDE.md и docs/known-quirks.md
Какие общие инженерные и UX-принципы применяются?docs/specs/constitution.md и docs/specs/storefront-ux-core.md

При расхождении нормативное ожидание берётся отсюда, текущее отклонение — из docs/qa/active-limitations.md, а фактическое поведение подтверждается QA, кодом и живым прогоном. Архивная feature spec объясняет принятое тогда решение, но не переписывается под новое состояние системы.

2. Назначение, бизнес-результаты и не-цели​

Назначение решения​

«Колорика» — интернет-магазин лакокрасочных изделий и сопутствующих товаров для автомобилей. Решение связывает публичный путь покупки, управление магазином, складской учёт, оплату, доставку и контент в одном разворачиваемом экземпляре для одной компании.

Наблюдаемые результаты действующего решения​

Эти результаты подтверждены реализацией и документацией, но источники не задают владельческие KPI и не доказывают, что перечень является утверждённой бизнес-стратегией.

Поддерживаемый результатКак система его обеспечиваетОсновные возможности
Покупатель может найти товар и оформить физический заказ без обязательной регистрацииКаталог, актуализация корзины, выбор доставки, опциональная онлайн-оплата и создание заказаSYS-CAP-01–SYS-CAP-04
Деньги, корзина и заказ не расходятся при повторных или параллельных сигналах оплатыСверка с платёжным провайдером, блокировки, резервы и идемпотентная финализацияSYS-CAP-03
Сотрудники могут вести магазин и восстанавливать критические интеграционные операцииПанель магазина, журнал синхронизации, статусы отправлений, ручные повторы и разграничение доступовSYS-CAP-04–SYS-CAP-06
Компания может управлять публичным контентом отдельно от выпуска кодаЧерновики и публикация CMS, проверка целей и устойчивый снимок для витриныSYS-CAP-07
Один и тот же программный комплект можно развернуть как отдельный экземпляр другой компанииАвтонастройка базового commerce-контура и конфигурируемые подключения при изоляции данных и секретов экземпляраSYS-CAP-08

TBD (решение владельца): [TBD-01] Утвердить, являются ли пять результатов выше целевыми бизнес-результатами продукта, кто владеет каждым результатом и по каким метрикам или наблюдаемым исходам оценивается успех.

Не-цели​

Текущая граница не включает встроенную финансовую BI-аналитику, международную доставку, единый мультитенантный runtime для нескольких компаний и полную двустороннюю синхронизацию каталога с МойСклад. Отсутствие этих возможностей само по себе не делает их постоянными не-целями: такого решения владельца в источниках нет.

TBD (решение владельца): [TBD-02] Какие из направлений — международная доставка, встроенная финансовая аналитика, мультитенантность, фискализация онлайн-платежей и полная двусторонняя синхронизация каталога с МойСклад — являются постоянными не-целями, а какие остаются возможным будущим развитием?

Система запрашивает согласие на обработку данных, но действующий юридический и safety-контракт в репозитории не утверждён; видимое отклонение страницы политики зафиксировано как ОГР-14.

TBD (решение владельца): [TBD-03] Какие юридические, приватностные и отраслевые обязательства продукт должен выполнять, включая текст и срок действия согласия, сроки хранения и удаления персональных данных, правила рассылок и ограничения для лакокрасочных или опасных грузов?

3. Граница и контекст решения​

3.1. Что входит в продукт​

Часть решенияОтветственность продуктаСтатус в границе
Публичная витринаПоказ каталога и контента, работа с серверной корзиной, checkout, аккаунт и понятные состояния успеха, ошибки и недоступностиДоменная часть продукта
Commerce backend и панель магазинаИстина по товарам, вариантам, ценам, продаваемому остатку, корзинам и заказам; серверная валидация, права и оркестрация интеграцийДоменное ядро продукта
Панель контентаЧерновики и публикация главной, настроек сайта, медиа и SEO-записей; действующие ограничения результата перечислены ссылочно в docs/qa/active-limitations.mdДоменная часть продукта
Управляемые фоновые процессыОбновление остатков, повтор передачи заказов, истечение платёжных корзин, обновление статусов и ПВЗ, снимок CMS, напоминанияДоменная автоматика продукта
PostgreSQL, Redis, Meilisearch и S3-совместимое хранилищеПостоянное хранение, координация процессов, поисковая копия и файлы; доменные решения остаются в приложенияхОбязательные классы runtime-сервисов в поставляемом комплекте, но не самостоятельные бизнес-возможности
База знанийРолевые инструкции, системный контракт и технические runbook-страницыСопровождающая часть поставки, не участник commerce-транзакций

Наличие сервиса в поставляемом комплекте не делает его источником доменной истины. Например, Meilisearch ускоряет выдачу, но не решает, существует ли товар и можно ли его продать.

3.2. Что находится вне продукта​

Внешняя сторонаЗа что она отвечаетЗа что продукт всё равно отвечает на границе
Покупатель и сотрудникКорректный ввод данных, выбор действий и сохранность собственных учётных данныхПроверить ввод и право на сервере, применить действие не более одного раза и показать однозначный исход
МойСкладФизический складской учёт, номенклатура, доступный остаток и дальнейшая обработка документа заказаОднозначно сопоставить данные, перенести остаток в продаваемый inventory, передать заказ, не потерять ошибку и дать повтор
ЮKassaПриём и фактический статус онлайн-платежа, возврат средств на стороне эквайрингаНе хранить данные карт, сверить статус и сумму через авторизованный API, создать не более одного заказа и не выполнить двойной возврат
СДЭК и ApiShipРасчёт перевозчика, регистрация и фактическое состояние отправления, печатные формыНормализовать варианты, сохранить связь с заказом, не регрессировать статус, обеспечить безопасный повтор и понятную деградацию
YouTube и VimeoВидеоплеер, доступность видео и обработка прямого запроса браузераДопускать встраивание только для распознанных источников, обозначить privacy-границу и сохранить внешнюю ссылку как fallback
SMTP-сервис и почтовая сетьДоставка сообщения в почтовый ящикСформировать разрешённое уведомление, не раскрыть секреты и не разрушить основную операцию при сбое; активные пробелы повторов перечислены в docs/qa/active-limitations.md
Reverse proxy, DNS и TLS-терминацияПубличная маршрутизация, сертификаты и защищённый транспорт до приложенийКорректно работать за доверенной границей, ограничивать разрешённые origins и не считать клиентскую конфигурацию авторизацией
Хостинг и внешняя реализация PostgreSQL/Redis/S3/поискаРесурсы, сеть, диски, резервирование и доступность выбранного сервисаСоблюдать доменную модель владения, корректно переживать известные классы отказов и не переносить секреты в публичные данные

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

3.3. Контекстная диаграмма​

Стрелка показывает пересечение границы, а не владение внешней системой. CMS и инфраструктурные сервисы показаны внутри поставляемого решения; при использовании внешнего managed-сервиса ответственность провайдера начинается только с его доступности и ресурсов, а доменный контракт приложения не меняется.

3.4. Операционная среда верхнего уровня​

СлойКонтракт среды
КлиентСовременный браузер открывает публичную витрину, панель магазина, панель контента или базу знаний; права всегда подтверждаются сервером
ПриложенияВитрина, backend/admin, CMS и документация развёртываются как отдельные серверные приложения и связываются по сетевым интерфейсам
СостояниеPostgreSQL хранит постоянные данные приложений; Redis обязателен для production-координации backend; поиск и файлы вынесены в специализированные сервисы
СетьПубличный экземпляр предполагает HTTPS и reverse proxy; исходящие соединения нужны к платёжной, учётной, доставочным и почтовой системам
ИзоляцияОдин deployment представляет одну компанию. Данные, домены, реквизиты и секреты разных компаний не разделяются внутри общего мультитенантного экземпляра
ВосстановлениеКритические асинхронные операции имеют устойчивое состояние, повтор или ручное восстановление там, где это является частью доменного контракта

Версии, команды, порты, переменные и порядок запуска находятся в архитектуре, инфраструктуре, развёртывании и корневом README.md.

4. Заинтересованные стороны, роли и права​

Роли людей​

Роль / профильЦель и поверхностьРазрешённый результатЧто не разрешено этой ролью
Покупатель без аккаунтаПубличная витринаКаталог, серверная корзина, checkout и оплата без регистрацииИстория заказов, профиль, постоянное избранное, отмена, возврат и отслеживание через кабинет
Зарегистрированный покупательВитрина и личный кабинетВсё гостевое плюс профиль, избранное, собственные заказы, отслеживание, допустимая отмена и заявка на возвратДанные и заказы других покупателей; административные операции
Администратор магазинаПанель магазинаРазрешённые ролью стандартные операции с каталогом, заказами, клиентами и доступами; все проектные страницы после входаРеквизиты оплаты при включённом RBAC без роли Super Admin; любой доступ в панель контента без отдельного аккаунта
Супер-администраторПанель магазинаПолный административный контур, пользователи/роли и реквизиты оплатыПубликация CMS без отдельной учётной записи Publisher
Редактор контентаПанель контентаСоздание, чтение и изменение черновиков Homepage, SEO entry, Site settings и работа с медиатекойПубликация и удаление записей
Публикатор контентаПанель контентаВозможности редактора плюс публикацияУдаление записей; операции панели магазина без отдельного аккаунта
Владелец продукта / магазинаУтверждение контракта и операционные кабинетыПринимает решения о целях, границе, правилах и настройках; runtime-действия выполняет через назначенные аккаунтыОтдельной встроенной роли «владелец» нет; название профиля само по себе прав не даёт
Складской операторПанель магазина и внешняя учётная системаКонтроль передачи заказов, остатков, этикеток и физической отгрузки в пределах назначенной Medusa-ролиОтдельной встроенной роли «склад» нет; доступ к МойСклад и Medusa выдаётся независимо
Сопровождающий разработчик / операторТехническая среда и база знанийРазвёртывание, конфигурация, диагностика и восстановление в пределах внешне выданного инфраструктурного доступаИнфраструктурный доступ не создаётся и не ограничивается ролями покупателя, Medusa Admin или Strapi

«Владелец» и «складской оператор» — заинтересованные профили, а не дополнительные механизмы авторизации. Инструкции по назначению прав находятся на страницах пользователей админки и доступов владельца.

Серверные границы привилегированных действий​

Привилегированное действиеКто вправе инициироватьГде принимается решениеОбязательная серверная граница
Читать и менять профиль, избранное и список заказовЗарегистрированный покупательCustomer/Auth и Store API backendДействующая customer-сессия или bearer-токен; выборка ограничена владельцем ресурса
Читать и менять незавершённую корзинуБраузер или получатель ссылки восстановления, знающий идентификатор корзиныStore API backendИдентификатор корзины действует как bearer capability: customer-сессия, отдельная подпись и срок действия ссылки не проверяются; разглашение идентификатора передаёт доступ к чтению и изменениям
Отменить заказ, запросить возврат или отслеживаниеЗарегистрированный покупатель — владелец заказаЗащищённый Store API и доменный workflowАутентификация, принадлежность заказа и проверка его текущих состояний выполняются до внешнего или необратимого действия
Вести товары, варианты, цены, категории, клиентов, заказы, пользователей и ролиПри включённом RBAC — администратор с назначенными разрешениями или Super Admin; при выключенном — вошедший администраторAdmin API MedusaAdmin-аутентификация и, когда RBAC включён, серверные разрешения стандартного ресурса; скрытая кнопка не заменяет проверку
Повторить финансовый возврат из заказаАдминистратор с разрешением order:updateAdmin API и workflow возвратаСерверное разрешение, блокировка заказа и идемпотентность возврата
Читать или менять реквизиты оплатыПри включённом RBAC — только Super Admin; при выключенном — любой вошедший администраторAdmin API настройки платежейСерверная проверка режима RBAC и роли; сохранённый секрет наружу не возвращается
Настраивать МойСклад, доставку, заявки на возврат и legacy-контент панели магазинаЛюбой вошедший пользователь Medusa Admin в текущей реализацииПроектные Admin API и страницыЕсть admin-аутентификация, но отдельных permission-проверок по роли для этих страниц нет
Создавать и менять черновики CMSEditor или PublisherStrapi AdminОтдельная Strapi-аутентификация и права content type; роли восстанавливаются к заданному набору при старте CMS
Публиковать CMS-контентТолько PublisherStrapi AdminСерверное право публикации; Editor не может обойти его прямым запросом
Удалять записи Homepage, SEO entry и Site settingsНикто из Editor/PublisherStrapi AdminПраво удаления этим ролям не выдаётся
Менять deployment, инфраструктурные секреты или production-данныеТолько внешний оператор с отдельно выданным доступомХостинг, secret store, БД и поставочная система вне приложенийНи одна прикладная роль автоматически не даёт такого доступа

Идентификатор незавершённой корзины является possession-boundary: браузер хранит его локально, а ссылка восстановления передаёт его без подписи и срока действия. Держатель идентификатора может без customer-аутентификации читать состав и менять корзину до её завершения или недоступности. Отдельный публичный запрос проверки статуса платежа также принимает идентификатор корзины без customer-аутентификации, но не должен возвращать профиль или данные чужого заказа. Ни одна из этих границ не является правом роли покупателя.

TBD (решение владельца): [TBD-04] Считать ли текущий доступ любого вошедшего администратора к проектным страницам «МойСклад», «Доставка», «Возвраты» и legacy- контенту допустимым постоянным контрактом или ввести отдельные серверные разрешения?

TBD (решение владельца): [TBD-05] Нужны ли формальные профили прав для владельца и склада, или для каждого сотрудника достаточно индивидуально назначать существующие права Medusa и отдельный доступ к МойСклад?

TBD (решение владельца): [TBD-06] Достаточно ли знания непредсказуемого идентификатора корзины для публичной проверки статуса платежа, или этот read-path должен требовать дополнительное подтверждение покупателя?

TBD (решение владельца): [TBD-13] Допустим ли текущий bearer-доступ к незавершённой корзине по одному идентификатору из ссылки восстановления, или ссылка должна получить подпись, срок действия либо одноразовость?

Машинные участники​

Вебхуки ЮKassa, СДЭК и CMS не получают пользовательскую роль. Их право инициировать обработку ограничивается отдельной доверительной границей: проверкой источника, подписи, свежести или последующим чтением факта из авторизованного API. Фоновые задания действуют как часть backend и не расширяют права людей.

5. Карта возможностей​

Карта группирует функциональность по наблюдаемому результату. UI, API, workflow, job и хранилище, которые вместе дают один результат, не считаются отдельными возможностями.

SYS-CAP-01. Каталог и контент​

  • Роли и результат: гость и зарегистрированный покупатель открывают главную, каталог, категории и карточку; ищут и фильтруют товары; видят цену, вариант, наличие, описание и доступные материалы.
  • Входы / выходы: опубликованные товары Medusa с непустыми ID, названием, положительной ценой и названием хотя бы одной категории, продаваемый inventory и действующий снимок контента превращаются в навигацию, выдачу, карточку товара и информационные страницы.
  • Ключевые правила и данные: SYS-BR-01–SYS-BR-04, SYS-BR-06; SYS-DAT-01, SYS-DAT-02, SYS-DAT-08.
  • Основной и альтернативный исходы: доступный товар ведёт к действиям корзины; страница категории дополнительно скрывает неактивную или внутреннюю категорию и ветку с непубличным предком, хотя общие выдача, карточка и проверка корзины этих признаков категории не учитывают; отсутствующая карточка даёт 404, пустая выдача отличается от отказа поиска, а отказ отдельной секции не должен скрывать остальную страницу.
  • Внешние интерфейсы: SYS-INT-06, SYS-INT-09–SYS-INT-11, SYS-INT-14.
  • Требования к качеству: SYS-QLT-06, SYS-QLT-11, SYS-QLT-15–SYS-QLT-17, SYS-QLT-19, SYS-QLT-26; UX-инварианты — docs/specs/storefront-ux-core.md.
  • Проверка / свидетельства: docs/feature-inventory.md, разделы 1.1–1.5, 1.13, 2.1 и 2.8; ПУТ-9–ПУТ-11, ПУТ-23–ПУТ-25; каталог, категории и карточка товара.

Множественная галерея, переход баннера на коллекцию, онлайн-подбор цвета и неограниченные справочники брендов/категорий не заявляются работающими: см. ОГР-07, ОГР-13, ОГР-22, ОГР-24 и ОГР-29 в docs/qa/active-limitations.md. Нарушение требования к состояниям чтения — ОГР-33.

SYS-CAP-02. Покупатель, аккаунт, корзина и избранное​

  • Роли и результат: гость ведёт серверную корзину без регистрации; покупатель с аккаунтом управляет профилем, избранным и списками своих заказов, а гостевая корзина при входе объединяется с аккаунтной.
  • Входы / выходы: идентификатор корзины в браузере или ссылке восстановления, customer-сессия, профиль и действия над товарами превращаются в серверную корзину, избранное, подстановку контактов и восстановимый покупательский контекст.
  • Ключевые правила и данные: SYS-BR-03, SYS-BR-04, SYS-BR-06, SYS-BR-20; SYS-DAT-03–SYS-DAT-05.
  • Основной и альтернативный исходы: регистрация и вход открывают кабинет; ссылка из напоминания восстанавливает корзину без customer-аутентификации, а её идентификатор передаёт bearer-доступ к чтению и изменениям; сбой записи не должен выдаваться за применённое действие, а повреждённая локальная ссылка на корзину заменяется новой без утраты серверной модели.
  • Внешние интерфейсы: SYS-INT-05, SYS-INT-07, SYS-INT-08, SYS-INT-11.
  • Требования к качеству: SYS-QLT-01, SYS-QLT-06, SYS-QLT-17–SYS-QLT-20.
  • Проверка / свидетельства: docs/feature-inventory.md, разделы 1.6, 1.10–1.12, 1.14, 2.4 и соответствующие части 2.5/2.10/2.11; ПУТ-12, ПУТ-15–ПУТ-19, ПУТ-21, ПУТ-22, ПУТ-26 и ПУТ-37; аккаунт, корзина и избранное.

Повторный доступ гостя к заказу, устойчивость UI-состояния «в корзине» и часть почтовых исходов ограничены ОГР-02, ОГР-08, ОГР-09, ОГР-25, ОГР-26 и ОГР-31. Допустимость текущей границы ссылки восстановления корзины требует решения TBD-13.

SYS-CAP-03. Checkout, платёж и заказ​

  • Роли и результат: гость или зарегистрированный покупатель проходит единую форму checkout, выбирает доступные получение и оплату и получает ровно один заказ; администратор настраивает онлайн-оплату и видит её состояние.
  • Входы / выходы: актуальная корзина, контакты, адрес, выбранная доставка и способ оплаты превращаются в платёжную сессию, заказ, номер и зафиксированный состав с суммой.
  • Ключевые правила и данные: SYS-BR-03, SYS-BR-08–SYS-BR-14; SYS-DAT-03, SYS-DAT-05, SYS-DAT-06.
  • Основной и альтернативный исходы: успешная онлайн-оплата финализирует заказ из возврата покупателя или вебхука; без онлайн-провайдера заказ создаётся в ожидании оплаты; отказ или прерывание оплаты сохраняет корзину для новой попытки.
  • Внешние интерфейсы: SYS-INT-02–SYS-INT-05, SYS-INT-07, SYS-INT-08, SYS-INT-11.
  • Требования к качеству: SYS-QLT-02, SYS-QLT-03, SYS-QLT-05, SYS-QLT-08– SYS-QLT-10, SYS-QLT-12, SYS-QLT-16–SYS-QLT-18, SYS-QLT-21.
  • Проверка / свидетельства: docs/feature-inventory.md, разделы 1.7–1.9, 2.2, платёжно-заказная часть 2.5 и раздел 5; ПУТ-1–ПУТ-5 и ПУТ-13; оформление заказа и настройка оплаты.

Подтверждающее письмо, маркировка иной валюты как рублей, повторная проверка тарифа ApiShip, фактический режим платёжного подключения, истечение отдельных корзин и объяснение расхождения оплаченной суммы имеют отклонения ОГР-01, ОГР-03, ОГР-04, ОГР-06, ОГР-27 и ОГР-30.

SYS-CAP-04. Доставка, отмена и возврат​

  • Роли и результат: покупатель выбирает тариф/ПВЗ и отслеживает заказ; покупатель с аккаунтом инициирует допустимую отмену или возврат; администратор восстанавливает отправление, получает этикетку, решает заявку и повторяет финансовый возврат.
  • Входы / выходы: корзина и адрес, конфигурация провайдера, заказ, события перевозчика и решение администратора превращаются в выбранный тариф, отправление, трекинг, отмену либо обратную отправку.
  • Ключевые правила и данные: SYS-BR-08, SYS-BR-15–SYS-BR-19; SYS-DAT-05, SYS-DAT-07.
  • Основной и альтернативный исходы: сбой одного провайдера оставляет варианты другого; ошибка создания отправления не откатывает заказ и допускает повтор; после приёма СДЭК отмена становится заявкой на возврат.
  • Внешние интерфейсы: SYS-INT-02–SYS-INT-05, SYS-INT-07, SYS-INT-08, SYS-INT-11.
  • Требования к качеству: SYS-QLT-01–SYS-QLT-03, SYS-QLT-05, SYS-QLT-08– SYS-QLT-10, SYS-QLT-12–SYS-QLT-15, SYS-QLT-17–SYS-QLT-19, SYS-QLT-21.
  • Проверка / свидетельства: docs/feature-inventory.md, разделы 2.3, 2.6 и shipping/cancel/return-части 1.7, 1.11, 2.4, 2.5, 2.10, 2.11 и 4; ПУТ-6–ПУТ-8, ПУТ-20, ПУТ-29–ПУТ-32; заказы покупателя и обработка заказа.

Действующий baseline ограничен ОГР-10, ОГР-18, ОГР-20 и ОГР-25; доказательство на целевых подключениях — ЖИВ-01, ЖИВ-02 и ЖИВ-04. ПЛТ-01 и ПЛТ-03 описывают ожидаемую асимметрию адреса и трекинга.

SYS-CAP-05. Управление каталогом, заказами и доступами​

  • Роли и результат: администратор с назначенными правами ведёт товары, варианты, категории, цены, остатки, промо, клиентов и заказы; Super Admin управляет пользователями/ролями и полным контуром настроек.
  • Входы / выходы: проверенные административные изменения превращаются в канонические commerce-данные, операционные статусы, выгрузки и публично доступный каталог.
  • Ключевые правила и данные: SYS-BR-01, SYS-BR-02, SYS-BR-05, SYS-BR-06, SYS-BR-20, SYS-BR-21; SYS-DAT-01, SYS-DAT-02, SYS-DAT-05, SYS-DAT-07.
  • Основной и альтернативный исходы: валидное действие применяется сервером и инициирует связанные обновления; нарушение уникальности, формата файла или права отклоняется до изменения канонических данных.
  • Внешние интерфейсы: SYS-INT-07, SYS-INT-08, SYS-INT-10, SYS-INT-11.
  • Требования к качеству: SYS-QLT-01, SYS-QLT-02, SYS-QLT-04, SYS-QLT-09, SYS-QLT-21, SYS-QLT-27.
  • Проверка / свидетельства: docs/feature-inventory.md, commerce-части разделов 2.13, 4.2 и 4.3; ПУТ-28, ПУТ-34 и ПУТ-35; создание товара, организация каталога и пользователи админки.

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

SYS-CAP-06. Учёт, остатки и операционная синхронизация​

  • Роли и результат: администратор или складской оператор настраивает подключение, видит качество сопоставления и восстанавливает обмен; система получает остатки, передаёт заказ и отмечает его отмену.
  • Входы / выходы: код номенклатуры МойСклад, SKU варианта, внешний остаток и заказ магазина превращаются в продаваемый inventory, внешний документ заказа, журнал и диагностику несопоставленных позиций.
  • Ключевые правила и данные: SYS-BR-05–SYS-BR-07, SYS-BR-15; SYS-DAT-01, SYS-DAT-02, SYS-DAT-05.
  • Основной и альтернативный исходы: однозначные позиции синхронизируются; сомнительная связь не изменяет остаток и видна сотруднику; сбой заказа не откатывает заказ магазина и уходит в автоматический либо ручной повтор.
  • Внешние интерфейсы: SYS-INT-01, SYS-INT-07, SYS-INT-08, SYS-INT-11.
  • Требования к качеству: SYS-QLT-01, SYS-QLT-02, SYS-QLT-07, SYS-QLT-09, SYS-QLT-10, SYS-QLT-15, SYS-QLT-16, SYS-QLT-21, SYS-QLT-27.
  • Проверка / свидетельства: docs/feature-inventory.md, разделы 2.7 и доменные части 2.11/4.1/4.2/7; ПУТ-8, ПУТ-31 и ПУТ-33; работа с МойСклад, docs/specs/moysklad-live-fixes/spec.md.

Читающий доступ подтверждён, но полный живой цикл записи и остатков на целевом аккаунте не принят: ЖИВ-03.

SYS-CAP-07. Управление контентом​

  • Роли и результат: Editor готовит, Publisher публикует главную и настройки сайта; администратор отдельно ведёт фактически используемые legacy-тексты контактов и доставки.
  • Входы / выходы: черновики, медиа и типизированные commerce-цели превращаются после проверки в опубликованную ревизию и снимок, который безопасно читает витрина.
  • Ключевые правила и данные: SYS-BR-01, SYS-BR-06, SYS-BR-20, SYS-BR-21; SYS-DAT-08.
  • Основной и альтернативный исходы: валидная публикация обновляет снимок; недоступная внутренняя цель закрывается fail-closed; сбой webhook компенсируется периодическим чтением, а витрина сохраняет последний успешный снимок.
  • Внешние интерфейсы: SYS-INT-06, SYS-INT-07, SYS-INT-10, SYS-INT-11.
  • Требования к качеству: SYS-QLT-01–SYS-QLT-03, SYS-QLT-11, SYS-QLT-15–SYS-QLT-17, SYS-QLT-21, SYS-QLT-27, SYS-QLT-29.
  • Проверка / свидетельства: docs/feature-inventory.md, разделы 1.2, 1.13, 1.15, 2.9, 3 и content-часть 4.1; ПУТ-24, ПУТ-25, ПУТ-27, ПУТ-34 и ПУТ-36; контент главной и схема публикации.

Полнота preview, применение SEO-записей, часть legacy-полей и атомарность обновления снимка ограничены ОГР-15, ОГР-16, ОГР-23 и ОГР-28.

SYS-CAP-08. Платформенная эксплуатация​

  • Роли и результат: сопровождающий поддерживает развёрнутый комплект; приложения получают обязательную базовую конфигурацию, фоновые механизмы и возможность восстановить поисковую копию.
  • Входы / выходы: конфигурация экземпляра и доступность runtime-сервисов превращаются в работающие web/backend/CMS/docs, инициализированный commerce-контур, индекс и файлы.
  • Ключевые правила и данные: SYS-BR-06, SYS-BR-15, SYS-BR-21; SYS-DAT-01–SYS-DAT-08.
  • Основной и альтернативный исходы: штатный запуск подготавливает постоянное состояние до приёма трафика; временный отказ не должен менять источники истины на кэш или индекс.
  • Внешние интерфейсы: SYS-INT-07–SYS-INT-11; runtime-сервисы могут поставляться рядом или как managed dependencies.
  • Требования к качеству: SYS-QLT-02, SYS-QLT-10, SYS-QLT-11, SYS-QLT-15, SYS-QLT-16, SYS-QLT-21, SYS-QLT-22, SYS-QLT-24–SYS-QLT-27.
  • Проверка / свидетельства: docs/feature-inventory.md, служебные части 1.1/1.16, 2.8/2.11–2.13, инфраструктурные части 3.3/4.3, разделы 6 и 7; архитектура, инфраструктура и развёртывание.

Покрытие реестра функциональности​

Таблица ниже — контроль классификации docs/feature-inventory.md. Если раздел смешанный, перечислены именно его части; одна и та же наблюдаемая функция не должна получать две группы.

Область реестраЕдинственный владелец результата
1.1: навигация и публичный shellSYS-CAP-01; счётчик/связь с корзиной — SYS-CAP-02; telemetry и proxy-механика — SYS-CAP-08
1.2–1.5: главная, каталог, категории, чтение карточкиSYS-CAP-01; изменение корзины/избранного — SYS-CAP-02; «Купить в 1 клик» как вход в checkout — SYS-CAP-03
1.6: корзинаSYS-CAP-02; проверка перед финальным оформлением — SYS-CAP-03
1.7: форма и оркестрация checkoutSYS-CAP-03; расчёт тарифов и ПВЗ — SYS-CAP-04
1.8–1.9: платёжный возврат и подтверждение заказаSYS-CAP-03
1.10–1.12: auth, профиль, списки заказов, избранноеSYS-CAP-02; отмена, возврат и tracking заказа — SYS-CAP-04
1.13–1.15: информационные страницы, отписка, previewчтение страниц — SYS-CAP-01; отписка — SYS-CAP-02; preview — SYS-CAP-07; неработающие обещания остаются только в ОГР-*
1.16: health, proxy, cache, error boundary и общие примитивывнутренние/служебные механизмы SYS-CAP-08; пользовательский 404 и рекомендации — SYS-CAP-01
2.1: публичные операциичтение каталога — SYS-CAP-01; проверка корзины и оформление — SYS-CAP-03; выдача контента сайта и CMS-снимка — SYS-CAP-07; runtime-конфигурация и CORS — SYS-CAP-08
2.2 и 5: платёжные операции и ЮKassaSYS-CAP-03
2.3 и 2.6: доставкаSYS-CAP-04
2.4: профиль, auth, wishlist, merge и unsubscribeSYS-CAP-02; cancel/return/tracking — SYS-CAP-04
2.5: заказ, оплата, резервы и промоSYS-CAP-03; merge/wishlist — SYS-CAP-02; cancel/refund — SYS-CAP-04; безопасная очистка файлов товара — служебная часть SYS-CAP-05
2.7: МойСкладSYS-CAP-06
2.8: поисковая выдача и её семантикаSYS-CAP-01; поддержание и восстановление индекса — SYS-CAP-08
2.9: снимок и проверка контентаSYS-CAP-07
2.10: письмаreset/брошенная корзина — SYS-CAP-02; отмена/возврат — SYS-CAP-04; транспорт провайдера — внутренний механизм SYS-CAP-08
2.11: доменные jobsabandoned cart — SYS-CAP-02; payment expiry — SYS-CAP-03; shipping/PVZ — SYS-CAP-04; МойСклад — SYS-CAP-06; CMS snapshot — SYS-CAP-07; scheduler/event bus — SYS-CAP-08
2.12–2.13: первый запуск и runtimeSYS-CAP-08; SKU и документы товара — проверки SYS-CAP-05
3.1–3.3: CMS-модели, роли и публикацияSYS-CAP-07; БД, S3, runtime-конфигурация и миграционные/seed-скрипты — внутренние механизмы SYS-CAP-08
4.1: проектные разделы админкиpayment — SYS-CAP-03; shipping/returns — SYS-CAP-04; site content — SYS-CAP-07; МойСклад — SYS-CAP-06
4.2: виджетыorder details/product content — SYS-CAP-05; shipping/refund — SYS-CAP-04; МойСклад — SYS-CAP-06
4.3: пользователи, роли и RBACSYS-CAP-05; клиент и локализация расширений — внутренний механизм SYS-CAP-08
6: инфраструктуравнутренние/служебные механизмы SYS-CAP-08, не отдельные продуктовые возможности
7: служебные инструментыимпорт из МойСклад поддерживает SYS-CAP-06; probes, benchmark, reindex и seeds — внутренние инструменты соответствующих групп, не самостоятельные возможности

6. Критические сквозные сценарии и состояния​

Здесь оставлены семь P0 или сложных межсистемных сценариев. Подробные шаги и Given/When/Then не повторяются: они принадлежат docs/qa/user-journeys.md и docs/qa/test-cases/.

Критические сценарии​

СценарийОсновной результатАльтернатива или отказСвязи и доказательство
Актуализация корзины перед покупкойПри показе корзины и в начале checkout система читает текущую каталоговую цену, публикацию и остаток; на серверной границе блокируются неопубликованные, непродаваемые или превышающие управляемый остаток позицииПроблемная позиция остаётся видимой, оформление блокируется до уменьшения количества или удаления. При финализации уже оплаченной корзины текущая каталоговая цена и публикация повторно не сверяютсяSYS-CAP-01–SYS-CAP-03; SYS-BR-01–SYS-BR-04; ПУТ-5, ПУТ-13
Доставка и онлайн-оплата до одного заказаПокупатель выбирает курьера или ПВЗ, платит у ЮKassa; возврат на сайт и webhook сходятся в одну идемпотентную финализациюОшибка одного перевозчика оставляет второго; прерванная/отклонённая оплата не создаёт заказ и сохраняет корзинуSYS-CAP-03, SYS-CAP-04; SYS-BR-08, SYS-BR-10–SYS-BR-13; ПУТ-1, ПУТ-2, ПУТ-4
Заказ без онлайн-оплатыПри отсутствии доступного online-провайдера валидная корзина с доставкой становится заказом, ожидающим оплатуОтсутствие доставки остаётся блокером; отсутствие онлайн-оплаты — нетSYS-CAP-03; SYS-BR-08, SYS-BR-09; ПУТ-3
Остаток из МойСклад до статуса на витринеОднозначно сопоставленный остаток переносится в Medusa, наличие вычисляется и индекс обновляется как копияНеоднозначная позиция не применяется и попадает в диагностику; карточка и checkout опираются на Medusa, даже если индекс отстаётSYS-CAP-01, SYS-CAP-06, SYS-CAP-08; SYS-BR-02, SYS-BR-05–SYS-BR-07; ПУТ-13, ПУТ-33
Автоматика после создания заказаОтдельные обработчики создают отправление и передают копию заказа в МойСклад; сотрудник получает этикетку и контрольные статусыСбой одной интеграции не откатывает заказ и не блокирует вторую; ошибка видна и восстанавливается автоматическим или ручным повторомSYS-CAP-04, SYS-CAP-06; SYS-BR-15; ПУТ-8, ПУТ-31, ПУТ-32
Отмена заказа и возврат оплатыДопустимая отмена сначала согласуется с перевозчиком, затем отменяет заказ; оплаченная отмена запускает идемпотентный возврат денегОтказ перевозчика не меняет состояния; после приёма СДЭК создаётся заявка на возврат; сбой денег виден для ручного повтораSYS-CAP-04; SYS-BR-16–SYS-BR-18; ПУТ-6, ПУТ-7
Возврат после передачи отправленияПокупатель с аккаунтом создаёт одну заявку; администратор отклоняет её или подтверждает создание обратной отправкиПовтор решения не создаёт дубль, смена принятого решения запрещена; денежный возврат выполняется отдельно после операционного решенияSYS-CAP-04; SYS-BR-17–SYS-BR-19; ПУТ-20, ПУТ-30

Независимые оси состояния​

Состояние заказа, платежа, отправления и возврата не сворачивается в один общий статус. Вкладки «в работе» и «история» — представление для покупателя, а не новое состояние заказа.

Переход на диаграмме показывает подтверждённое проектом направление. Статусы «требует действия» и «в архиве» видимы в кабинете, но проект не задаёт для них свою схему переходов поверх стандартной модели Medusa. Переход не означает, что соседняя ось меняется автоматически: например, подтверждение заявки создаёт обратную отправку, но само по себе не возвращает деньги и не меняет финансовый статус.

7. Бизнес-правила и инварианты​

Продаваемость, цена и источник истины​

IDТребованиеОснование / источникПроверка / свидетельство
SYS-BR-01Общая граница публичной продажи должна принимать товар только при статусе published, непустых ID и названии, положительной цене и непустом названии хотя бы одной категории; показанная валюта должна соответствовать валюте выбранной цены. Страница категории дополнительно должна принимать только активную невнутреннюю категорию, все предки которой также публичны; общие выдача, карточка и проверка корзины эти признаки категории не проверяют. Текущее нарушение маркировки валюты — ОГР-03.docs/feature-inventory.md, §2.1; финансовая однозначностьdocs/qa/test-cases/01-catalog-search.md, 02-product-cart.md; ОГР-03
SYS-BR-02Система должна вычислять наличие, а не хранить его как редактируемое бизнес-поле: вариант без управляемого inventory — «в наличии» без количественного ограничения; при управляемом inventory остаток больше нуля — «в наличии»; нулевой остаток с backorder — «под заказ»; иначе — «нет в наличии».docs/specs/storefront-ux-core.md; CLAUDE.md; стандартный inventory Medusadocs/qa/test-cases/01-catalog-search.md, 02-product-cart.md
SYS-BR-03При начале checkout и прямом создании заказа без онлайн-оплаты сервер повторно проверяет публикацию, продаваемость и доступный управляемый остаток; недопустимая позиция блокирует действие. Общей сверки текущей каталоговой цены с ценой позиции корзины нет; при финализации оплаченной корзины повторная каталоговая проверка не выполняется, а заказ получает сохранённую цену корзины.Текущая граница валидации checkout; docs/specs/storefront-ux-core.mdПУТ-5, ПУТ-13; docs/qa/test-cases/02-product-cart.md, 03-checkout-shipping.md
SYS-BR-04Штатная витрина ограничивает количество одной позиции целым значением от 1 до 99. Checkout на сервере приводит положительное конечное значение к целому без верхнего предела и блокирует превышение доступного остатка только для управляемого inventory без backorder. Повторное добавление в штатной витрине увеличивает существующую позицию.docs/feature-inventory.md, §1.5–1.6; docs/specs/storefront-ux-core.mdПУТ-11–ПУТ-13; docs/qa/test-cases/02-product-cart.md
SYS-BR-05SKU варианта необязателен, но после удаления внешних пробелов должен быть уникален; для обмена с МойСклад он обязан однозначно совпадать с полем «Код» номенклатуры. Неоднозначное соответствие не применяется.CLAUDE.md; docs/specs/moysklad-live-fixes/spec.md; целостность каталогаПУТ-33; docs/qa/test-cases/09-admin-operations.md; диагностика МойСклад
SYS-BR-06При расхождении данные разрешаются по владельцу: Medusa/PostgreSQL — товары, категории, цены, продаваемый inventory, корзины и заказы; ЮKassa — факт оплаты; перевозчик — факт отправления; Strapi — опубликованный CMS-контент. Meilisearch и локальные интеграционные записи являются копиями.Матрица владения docs/qa/business-overview.mdКарточка товара против устаревшего индекса; сверка платежа; tracking; обновление CMS-снимка
SYS-BR-07При переносе остатка из МойСклад система должна вычесть неотменённые заказы витрины за последние 48 часов и ограничить результат снизу нулём, чтобы задержка внешнего учёта не создавала повторную продажу уже обещанного товара.docs/feature-inventory.md, §2.7; складской контурПУТ-13, ПУТ-33; отчёт полного цикла синхронизации

Checkout, платёж и заказ​

IDТребованиеОснование / источникПроверка / свидетельство
SYS-BR-08Заказ должен иметь реально выбранный серверный способ получения. Сбой одного включённого провайдера не должен скрывать успешные тарифы других; без успешного варианта доставка блокирует checkout. Повторная проверка цены ApiShip сейчас нарушена — ОГР-04.docs/specs/shipping-providers/spec.md; защита исполнимости заказаПУТ-1, ПУТ-2, ПУТ-5; docs/qa/test-cases/03-checkout-shipping.md; ОГР-04
SYS-BR-09Если магазин не предлагает ни одного онлайн-способа оплаты, валидный заказ должен создаваться без онлайн-платежа со статусом ожидания оплаты; отсутствие оплаты не отменяет требование доставки.Действующий режим продажи без эквайрингаПУТ-3; docs/qa/test-cases/04-checkout-payment.md
SYS-BR-10Отклонённая, отменённая или не найденная онлайн-оплата не должна создавать заказ; корзина должна оставаться доступной для новой попытки.Защита от заказа без подтверждённых денегПУТ-4; docs/qa/test-cases/04-checkout-payment.md
SYS-BR-11Webhook или возврат браузера должен быть только триггером проверки: перед финализацией backend обязан перечитать ЮKassa через авторизованный API и сверить payment/session ID, сумму и валюту с локальной сессией и неизменившейся корзиной.Доверительная граница платежей; docs/feature-inventory.md, §2.2 и §5ПУТ-1, ПУТ-4; платёжные контрактные тесты; ОГР-30 для видимой ошибки расхождения
SYS-BR-12Для одной корзины система должна создать не более одного заказа независимо от числа параллельных возвратов, webhook и повторов; повторная финализация возвращает существующий заказ и не дублирует использование промокода.Финансовая идемпотентность и связь cart–orderПУТ-1, ПУТ-4; тесты конкурентной финализации
SYS-BR-13До перехода к онлайн-оплате система должна зарезервировать продаваемый остаток; при заказе резерв переносится на заказ без промежуточного освобождения. Неоплаченная платёжная сессия становится кандидатом на истечение через 24 часа и проверяется часовым заданием; сбой может отложить освобождение до следующего цикла.Защита от перепродажи и вечной блокировки товараПУТ-1, ПУТ-4, ПУТ-13; job истечения; ОГР-27 для изоляции сбоя цикла
SYS-BR-14Отключение платёжного провайдера должно запретить только новые платежи; проверка, capture/cancel и возврат ранее начатых платежей продолжаются с сохранёнными реквизитами.Безопасное завершение уже принятых финансовых обязательствПУТ-7, ПУТ-28; платёжные provider-тесты

Отправление, отмена и возврат​

IDТребованиеОснование / источникПроверка / свидетельство
SYS-BR-15Уже созданный заказ не должен откатываться из-за сбоя создания отправления, передачи в МойСклад или отправки уведомления. Ошибка доменной интеграции сохраняется для автоматического или ручного восстановления, если такой повтор предусмотрен её контрактом.Заказ Medusa — канонический факт продажи; docs/qa/business-overview.mdПУТ-8, ПУТ-31; docs/qa/test-cases/09-admin-operations.md; почтовые отклонения ОГР-01/25/31
SYS-BR-16Отменить собственный незавершённый и неотменённый заказ может только зарегистрированный покупатель. При активном поддерживаемом отправлении система сначала получает успех отмены перевозчика и только затем меняет заказ; отказ оставляет заказ, оплату и доставку без изменений.Предотвращение отмены уже исполняемого или чужого заказаПУТ-6; docs/qa/test-cases/06-orders-returns.md
SYS-BR-17Если СДЭК уже принял отправление, запрос отмены должен стать одной ожидающей заявкой на возврат; активное отправление неподдерживаемого типа должно блокировать автоматическую отмену без изменения состояний.Контракт перевозчика и недопустимость фиктивной отменыПУТ-6, ПУТ-20; docs/qa/test-cases/06-orders-returns.md; ОГР-20
SYS-BR-18Отмена оплаченного заказа должна запустить возврат денег. Повтор не должен создавать второе зачисление или превышать невозвращённую сумму; ошибка должна остаться видимой администратору и допускать безопасный ручной повтор.Защита денег покупателя и магазинаПУТ-7; docs/qa/test-cases/06-orders-returns.md, 09-admin-operations.md
SYS-BR-19Заявка покупателя допустима только для собственного заказа с принятой и неотменённой отправкой СДЭК; одновременно может ожидать одно решение. Решение администратора после принятия не меняется, подтверждение идемпотентно создаёт обратную отправку, но не возвращает деньги автоматически.Разделение обратной логистики и финансового возвратаПУТ-20, ПУТ-30; docs/qa/test-cases/06-orders-returns.md, 09-admin-operations.md; ОГР-10 для причины

Доступ и чувствительные действия​

IDТребованиеОснование / источникПроверка / свидетельство
SYS-BR-20Каждое привилегированное действие должно быть разрешено сервером только актору и границе из раздела 4: незавершённая публичная корзина — держателю bearer-идентификатора; customer — только для собственных ресурсов; Medusa Admin — по admin-аутентификации и применимым permissions; CMS — по отдельной роли. Видимость UI не является авторизацией.docs/specs/constitution.md; матрица ролей раздела 4Auth/RBAC/CMS-тесты; ПУТ-15–ПУТ-21, ПУТ-26, ПУТ-28–ПУТ-36; TBD-13
SYS-BR-21Приложение не должно получать или хранить данные банковских карт. Секреты платёжных, доставочных, учётных и инфраструктурных подключений должны храниться зашифрованно или во внешнем secret store и не возвращаться пользователю после сохранения. Текущее нарушение — ОГР-32.docs/specs/constitution.md; минимизация чувствительных данныхТесты API конфигурации и маскирования; security review; ОГР-05 для невозможности штатной очистки платёжных реквизитов; ОГР-32

8. Доменная модель и данные​

8.1. Концептуальная модель объектов​

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

IDТребованиеОснование / источникПроверка / свидетельство
SYS-DAT-01Товар должен объединять общие сведения и категорию, а продаваемые цена, SKU, остаток и backorder должны относиться к конкретному варианту. Товар без явного выбора конфигурации всё равно имеет один вариант.SYS-BR-01, SYS-BR-02, SYS-BR-05; docs/specs/storefront-ux-core.mdПУТ-9–ПУТ-11, ПУТ-34; docs/qa/test-cases/01-catalog-search.md, 09-admin-operations.md
SYS-DAT-02Для варианта с управляемым inventory продаваемый остаток является количественным состоянием; вариант без управляемого inventory продаётся без количественного ограничения. Наличие вычисляется из режима управления, остатка и backorder и не становится независимо редактируемым объектом.SYS-BR-02, SYS-BR-06, SYS-BR-07ПУТ-13, ПУТ-33; сверка карточки, checkout и отчёта синхронизации
SYS-DAT-03Корзина должна содержать позиции вариантов, выбранное получение и, при онлайн-оплате, резервы и платёжную сессию. Финализация связывает одну корзину не более чем с одним заказом. Идентификатор незавершённой корзины в браузере или ссылке восстановления является bearer capability: его держатель может читать и менять корзину без customer-аутентификации.SYS-BR-03, SYS-BR-04, SYS-BR-12, SYS-BR-13; граница владения раздела 4ПУТ-1, ПУТ-4, ПУТ-5, ПУТ-13, ПУТ-26; тесты конкурентной финализации; TBD-13
SYS-DAT-04Покупатель может существовать как гостевая запись или как аккаунт. Регистрация с email прежнего гостя должна переиспользовать его запись, а доступ к профилю, избранному и заказам ограничивается владельцем.SYS-BR-20; docs/feature-inventory.md, §2.4–2.5ПУТ-15–ПУТ-22; auth- и ownership-тесты
SYS-DAT-05Заказ должен фиксировать состав, сохранённые цены позиций корзины, валюту, контактные данные и выбранное получение. Такая фиксация не означает сверку цены позиции с текущей ценой каталога при создании заказа. Последующие платёж, отправление, отмена и возврат меняют собственные оси, а не переписывают историю корзины.SYS-BR-03, SYS-BR-08–SYS-BR-19; независимые состояния раздела 6ПУТ-1–ПУТ-8, ПУТ-20; docs/qa/test-cases/04-checkout-payment.md, 06-orders-returns.md
SYS-DAT-06Локальная платёжная сессия должна связывать корзину с идентификатором операции провайдера, суммой и валютой; факт денег принадлежит провайдеру и подтверждается повторным чтением. Данные банковской карты в модель не входят.SYS-BR-11, SYS-BR-12, SYS-BR-18, SYS-BR-21Платёжные контрактные тесты; ПУТ-1, ПУТ-4, ПУТ-7
SYS-DAT-07Отправление должно быть связано с заказом и провайдером и хранить последний принятый статус. Заявка на возврат и денежный возврат — разные объекты; подтверждение заявки создаёт обратную отправку, но не возвращает деньги.SYS-BR-15–SYS-BR-19ПУТ-6–ПУТ-8, ПУТ-20, ПУТ-29–ПУТ-32
SYS-DAT-08Публичный CMS-контент должен читаться как целостная ревизия: черновик и публикация принадлежат CMS, а витрина получает только принятый backend снимок и связанные публичные медиа.SYS-BR-06, SYS-BR-20; docs/feature-inventory.md, §2.9 и §3ПУТ-24, ПУТ-25, ПУТ-27, ПУТ-36; тесты ревизий и preview

8.2. Состояния и жизненные циклы​

ОбъектПоддерживаемые переходыЗапрещённое смешение или переход
Товар и вариантЧерновик или скрытый товар → опубликованный → скрытый либо удалённый; вариант создаётся, изменяется или удаляется внутри товараПубликация сама по себе не делает неполный товар продаваемым; удалённый или скрытый товар не должен оставаться доступным из поисковой копии
ОстатокТекущее количество изменяется административно или очередным циклом МойСклад; резерв временно уменьшает доступное количество и переносится с корзины на заказНельзя редактировать отдельный статус наличия или отпускать резерв между оплаченной корзиной и заказом
КорзинаАктивна → ожидает онлайн-оплату → завершена заказом либо платёж истёк; после отказа оплаты возвращается к новой попыткеОтказ оплаты не создаёт заказ; истечение освобождает резерв, но не считается удалением корзины
ПокупательГость → аккаунт после регистрации; аккаунт → активная или истёкшая сессияРегистрация прежнего гостя не должна создавать вторую покупательскую личность с тем же нормализованным email
ЗаказВ кабинет без преобразования передаются и показываются статусы ожидания обработки, завершения, архива, отмены и требуемого действия. Проектные пути явно создают заказ в ожидании, а затем могут завершить или отменить его; другие переходы остаются стандартной границей Medusa«В работе» и «История» — группы кабинета, а не состояния заказа: отменённый заказ или заказ с отменённой/доставленной доставкой попадает в историю, всё остальное — в работу. Сбой отправления, учёта или письма не откатывает заказ
ПлатёжНе начат → ожидается → авторизован/подтверждён либо отменён; подтверждён → возврат в обработке → возвращён либо ошибка возврата → повторСигнал webhook не равен подтверждённым деньгам; повтор не создаёт новый заказ или второй возврат той же суммы
ОтправлениеНе создано → создаётся → создано/ошибка → принято → в пути → доставлено либо отменено; ошибка допускает повторНеизвестный, устаревший или регрессирующий статус не перезаписывает принятый; состояние отправления не заменяет состояние заказа
Заявка на возвратНет → ожидает решения → отклонена либо подтверждена → обратная отправка → завершение обратной доставкиОдновременно ожидает не более одной заявки; принятое решение не меняется; финансовый возврат выполняется отдельно
КонтентЧерновик → публикация → согласованный снимок; новая публикация заменяет публичную ревизию после проверкиБолее старая или нестабильная ревизия не перезаписывает новый снимок; preview не становится публикацией

8.3. Владение, копии и согласованность данных​

ОбъектВладелец данныхКопии и внешние представленияРазрешение расхождения и окно согласованияЧувствительность
Товар, вариант, категория и ценаCommerce backend / MedusaMeilisearch; разовый импорт может создать исходную копию из МойСкладMedusa побеждает; индекс обновляется событием или полной переиндексацией. Копия не подтверждает продаваемостьПубличные после публикации; черновики и закупочная информация — административные
Остаток и наличиеMedusa принимает решение о продаже; МойСклад поставляет физический остаток для включённого обмена; для варианта без управляемого inventory количественный остаток не ограничивает продажуMeilisearch хранит вычисленное наличие; МойСклад хранит внешний складской фактСледующий цикл МойСклад — каждые 15 минут; из внешнего остатка вычитаются заказы последних 48 часов. Карточка и checkout читают Medusa, индекс исправляется повторной синхронизациейОперационные данные магазина
Корзина и резервMedusaВ браузере и ссылке восстановления хранится идентификатор корзины; платёжный провайдер знает связанную операциюСерверная корзина перечитывается перед покупкой; потеря идентификатора теряет ссылку, а не серверные данные, тогда как его разглашение передаёт bearer-доступ к чтению и изменениям без customer-аутентификации. Неоплаченная сессия попадает в выборку истечения после 24 часов и обрабатывается часовым заданиемКонтакты и адрес могут быть персональными
Покупатель и избранноеMedusa Customer/AuthSMTP получает адрес и содержание отдельного письмаНормализованный email связывает гостевые и аккаунтные заказы; серверное владение ресурса сильнее локального состояния браузераПерсональные и аутентификационные данные
ЗаказMedusaДокумент заказа в МойСклад; письмо покупателю; представление в кабинетеЗаказ Medusa не удаляется и не откатывается из-за сбоя копии; журнал обмена и ручной повтор исправляют МойСкладПерсональные, коммерческие и финансовые данные
Платёж и денежный возвратЮKassa владеет фактом списания и возврата; Medusa — связью с корзиной/заказом и локальным состояниемWebhook и browser-return — только сигналы; локальные транзакции — подтверждённое представлениеПеред финализацией или возвратом Medusa перечитывает провайдера и сверяет ID, сумму и валюту; расхождение блокирует действиеФинансовые данные без реквизитов банковской карты
ОтправлениеСДЭК или перевозчик за ApiShip владеет фактическим исполнениемMedusa хранит связь, последний статус, трек-номер и журнал событий; локальная копия ПВЗ СДЭКСДЭК сходится по webhook, ApiShip — прямым чтением с 60-секундным кэшем и часовым опросом; регрессии игнорируютсяАдрес, телефон и состав отправления — персональные/операционные
Заявка на возвратMedusa владеет решением; СДЭК исполняет обратную отправкуОбратный заказ СДЭК и локальный последний статусСтабильный номер позволяет найти уже созданную обратную отправку; повтор решения не создаёт копиюПерсональные и операционные данные; причина возврата может быть чувствительной
Контент и медиаStrapi владеет черновиком и публикацией; Medusa — принятым снимкомВитрина читает снимок; S3 хранит публичные файлы; legacy-тексты контактов и доставки отдельно принадлежат Medusa AdminВалидная публикация подхватывается webhook или минутным чтением; при сбое остаётся предыдущий снимок. Повреждение одной записи влияет на весь снимок — ОГР-28Черновик и preview не входят в публичный снимок, но байты загруженного CMS-медиа доступны по известному объектному URL независимо от публикации

8.4. Получение, целостность, хранение и удаление​

ОбъектКак возникает или обновляетсяКонтроль целостностиХранение и удаление
Товар и вариантАдминистративное действие либо отдельный разовый импортДля общей границы продажи — публикация, непустые ID, название и имя хотя бы одной категории, положительная цена; для страницы категории — также активность, отсутствие внутреннего признака и публичность предков; SKU уникален, когда заданЖивут до административного скрытия/удаления; удаление товара очищает только больше нигде не используемые документы. Автоматический срок удаления не установлен
ОстатокАдминистративное изменение или однозначное сопоставление с МойСкладОдин SKU ↔ один код; неоднозначная позиция пропускается; результат не ниже нуляХранится текущее значение inventory; отдельная история остатков и срок её хранения не входят в подтверждённый контракт
Корзина и резервСерверные действия покупателя; идентификатор сохраняется браузером или передаётся ссылкой восстановленияВитрина ограничивает количество 1–99; сервер в checkout приводит положительное значение к целому и проверяет публикацию/остаток, но не универсально повторно сверяет текущую цену и не применяет верхний предел 99; оплата и финализация защищены блокировками; владение незавершённой корзиной определяется знанием bearer-идентификатора — TBD-13Платёжная сессия становится кандидатом на истечение через 24 часа и проверяется часовым заданием. Срок удаления самой корзины и её персональных данных не утверждён — TBD-03 и TBD-09
ПокупательГостевой checkout, регистрация или изменение профиляEmail нормализуется; права проверяются сервером; wishlist защищён от дублейСрок хранения, удаление аккаунта и обезличивание заказов не утверждены — TBD-03
ЗаказТолько успешная серверная финализация валидной корзиныОдна связь корзина–заказ, фиксированные сумма/валюта, перенос резервов без окна освобожденияАвтоматическое удаление не заявлено. Юридический срок и порядок удаления/обезличивания персональных данных — TBD-03
ПлатёжОтвет ЮKassa после сверки с локальной сессиейСовпадение ID, суммы и валюты; возврат не выше невозвращённой суммы; повтор не создаёт вторую транзакциюКарточные данные не поступают. Состояние отдельных workflow хранится 3 или 90 дней, но это не утверждённый срок хранения платёжных данных; решение — TBD-03 и TBD-09
Отправление и возвратОтвет/событие перевозчика и решение покупателя или администратораУникальность активного отправления и ожидающей заявки, монотонность статуса, идемпотентное решениеАвтоматическое удаление не заявлено; срок хранения связи заказа, адреса, журналов и заявок — TBD-03 и TBD-09
Контент и медиаЧерновик и публикация CMS либо изменение двух legacy-страниц в Medusa AdminСтрогая схема, допустимые цели и форматы, совпавшие ревизии, запрет отката снимкаТекущий снимок заменяется принятой ревизией; Editor/Publisher не могут удалять записи. Общий срок хранения черновиков, старых ревизий и неиспользуемых CMS-медиа не утверждён — TBD-09

9. Внешние интерфейсы​

Карточки описывают ответственность на границе. Протокольные поля, маршруты и операционные команды находятся в dev-документации.

SYS-INT-01. МойСклад​

ПолеКонтракт
Назначение и направлениеМойСклад → продукт: физические остатки. Продукт → МойСклад: копия нового заказа и отметка его отмены. Регулярного двустороннего обмена каталогом, ценами и статусами исполнения нет
Данные и источник истиныSKU варианта сопоставляется только с кодом номенклатуры. Medusa остаётся владельцем продаваемого inventory и заказа; МойСклад — внешний источник физического остатка и исполнитель учётного документа
Авторизация / доверительная границаРеквизиты проверяются перед сохранением, хранятся зашифрованно и целиком обратно не выдаются; доступ задаётся отдельным аккаунтом компании
Триггер и синхронностьЗаказ отправляется событием после оформления; необходимость повтора проверяется каждую минуту. Остатки читаются фоновым циклом каждые 15 минут
УспехЗаказ связан с единственным внешним документом; отмена отмечена отдельно; цикл остатков завершён отчётом, а все однозначные позиции применены
Таймаут, повтор, идемпотентностьТекущий HTTP-таймаут — 30 секунд; общий вес запросов — не более 45 за 3 секунды; при 429 — до трёх транспортных повторов. Доменный повтор заказа идёт через 1, 5, 30, 120 и 720 минут, всего до шести попыток с первой. Повтор ищет уже созданный документ и не делает второй
Деградация и действия оператораЗаказ магазина сохраняется. После исчерпания автоматических попыток запись остаётся с ошибкой; складской оператор исправляет реквизиты/SKU или внешний документ и запускает ручной повтор. При сбое остатков покупатель видит последнее значение Medusa; оператор сверяет отчёт
Настройка экземпляраАдминистратор или складской оператор вводит реквизиты и включает обмен; ключ шифрования задаёт оператор deployment. Полный живой цикл «Колорики» ещё не принят — ЖИВ-03
Подробности и свидетельстваУстройство МойСклад, инструкция склада, docs/specs/moysklad-live-fixes/, ПУТ-8, ПУТ-31, ПУТ-33

SYS-INT-02. ЮKassa​

ПолеКонтракт
Назначение и направлениеПродукт создаёт и проверяет онлайн-платёж, отменяет его и запрашивает полный или частичный возврат; ЮKassa присылает уведомление об изменении
Данные и источник истиныЮKassa владеет фактом денег. Продукт хранит связь операции с корзиной/заказом, сумму, валюту и локальное состояние; уведомление не является источником статуса
Авторизация / доверительная границаИсходящие операции используют сохранённые зашифрованные реквизиты. Входящий webhook допускается только от доверенного адреса/цепочки proxy, затем факт перечитывается через авторизованный API. Данные карт продукту не передаются
Триггер и синхронностьПокупатель синхронно начинает оплату и проверяет статус; browser-return и webhook независимо публикуют запрос асинхронной финализации. Возврат после отмены также выполняется асинхронно
УспехID операции, сумма и валюта совпали с локальной сессией; одна корзина дала не более одного заказа, а подтверждённый возврат увеличил общую возвращённую сумму на ожидаемое значение
Таймаут, повтор, идемпотентностьПродуктовый таймаут внешнего API в источниках не закреплён. Повтор инициации переиспользует пригодную сессию; финализация блокируется по корзине; webhook дедуплицируется; временный отказ просит провайдера повторить; event bus повторяет выброшенную ошибку до пяти раз. Возврат имеет ключ идемпотентности
Деградация и действия оператораСпособ остаётся видимым по настройке, даже когда API недоступен; ошибка проявляется при операции, корзина сохраняется. Super Admin проверяет включение и реквизиты, затем состояние провайдера; ошибку возврата повторяет из заказа
Настройка экземпляраSuper Admin сохраняет реквизиты и включает способ; оператор deployment задаёт отдельный ключ шифрования и доверенную proxy-границу. Подпись «тестовый/боевой» не выбирает фактический контур — ОГР-06
Подробности и свидетельстваУстройство оплаты, настройка оплаты, docs/specs/_archive/payment-providers/, ПУТ-1, ПУТ-4, ПУТ-7, ПУТ-28

SYS-INT-03. СДЭК​

ПолеКонтракт
Назначение и направлениеПродукт получает договорные тарифы и ПВЗ, создаёт/отменяет прямое и обратное отправление и получает этикетку; СДЭК присылает статусы и готовность печатной формы
Данные и источник истиныСДЭК владеет фактическим отправлением. Продукт хранит его связь с заказом, последний принятый статус, трек-номер, выбранный тариф и локальную копию ПВЗ
Авторизация / доверительная границаРеквизиты и webhook-секрет хранятся зашифрованно. Входящее событие проверяется HMAC в постоянном времени; фактический контракт подписи требует подтверждения провайдера — ЖИВ-02
Триггер и синхронностьТарифы и выбор ПВЗ — синхронная часть checkout; отправление создаётся асинхронно после заказа; статусы приходят webhook; ПВЗ обновляются ежедневно
УспехВозвращён допустимый тариф/ПВЗ; внешний заказ найден или создан и не отклонён; событие применено один раз без регрессии; этикетка связана с отправлением
Таймаут, повтор, идемпотентностьАвторизация и тарифы ограничены примерно 8 секундами. Создание сериализуется ожиданием до 20 секунд и после потери ответа ищет заказ по стабильному номеру; этикетка переиспользует UUID и блокируется до 15 секунд. UUID webhook уникален
Деградация и действия оператораСбой расчёта убирает только тарифы СДЭК; тарифы ApiShip сохраняются. Сбой создания не откатывает заказ и виден для ручного повтора. Администратор проверяет реквизиты, коробку, договор и статус; владелец предоставляет договор/доступы
Настройка экземпляраАдминистратор задаёт договор, отправителя, тарифы и видимость; оператор deployment — ключ шифрования и адрес целевого контура. Сквозной путь целевого договора «Колорики» не принят — ЖИВ-01
Подробности и свидетельстваУстройство доставки, настройка, docs/specs/shipping-providers/, ПУТ-2, ПУТ-6, ПУТ-20, ПУТ-29–ПУТ-30

SYS-INT-04. ApiShip​

ПолеКонтракт
Назначение и направлениеПродукт через установленный плагин получает тарифы и ПВЗ подключённых перевозчиков, создаёт/отменяет отправление, получает этикетку и читает tracking
Данные и источник истиныФактическое отправление принадлежит перевозчику за ApiShip; продукт хранит связь и нормализованное представление статуса. Цена, выбранная в checkout, относится к заказу Medusa
Авторизация / доверительная границаРеквизиты и подключения принадлежат отдельной панели плагина; требование к хранению и возврату секрета сейчас нарушено — ОГР-32. Видимость ApiShip в checkout не доказывает, что хотя бы один перевозчик настроен
Триггер и синхронностьТарифы/ПВЗ читаются синхронно; отправление создаётся после заказа; tracking читается по запросу покупателя и часовым фоновым опросом
УспехТарифы нормализованы и дедуплицированы; отправление имеет внешний ID; status не регрессирует; этикетка доступна сотруднику
Таймаут, повтор, идемпотентностьКаждый отдельный незавершённый запрос браузера к backend при расчёте прекращается через 10 секунд; единого десятисекундного предела для всей последовательности и подтверждённого предела запроса backend к ApiShip нет. Этикетка ограничена 15 секундами. Tracking кэшируется 60 секунд, параллельные чтения объединяются. Повтор создания/этикетки предусмотрен плагином и административным действием; цена при финализации сейчас не перечитывается — ОГР-04
Деградация и действия оператораСбой убирает тарифы ApiShip, не скрывая СДЭК; сбой отправления не откатывает заказ и допускает повтор. Администратор проверяет подключения перевозчиков и видимость, затем передаёт транспортную ошибку сопровождающему
Настройка экземпляраПодключения перевозчиков и их реквизиты настраиваются в панели ApiShip; отдельный переключатель управляет видимостью на витрине. Операции записи на целевом подключении не приняты — ЖИВ-04
Подробности и свидетельстваУстройство доставки, настройка, docs/specs/_archive/apiship-plugin-integration/, ПУТ-2, ПУТ-6, ПУТ-29, ПУТ-32

SYS-INT-05. SMTP и почтовая сеть​

ПолеКонтракт
Назначение и направлениеПродукт отправляет письма восстановления доступа, напоминания и уведомления о заказных событиях; почтовая сеть отвечает за доставку в ящик
Данные и источник истиныПродукт владеет событием и шаблоном; SMTP получает адрес, тему, тело и допустимые вложения. Факт принятия сервером не доказывает доставку адресату
Авторизация / доверительная границаДоступ к SMTP задаётся только в конфигурации deployment; секреты не возвращаются клиенту и не должны попадать в логи
Триггер и синхронностьПисьмо вызывается событием или ежедневным заданием; основная операция не ждёт гарантированной доставки
УспехВызов уведомления завершился без ошибки для инициатора; для напоминания после этого записывается отметка. Провайдер подавляет ошибку SMTP, поэтому такой исход не доказывает ни принятие SMTP-сервером, ни доставку/прочтение
Таймаут, повтор, идемпотентностьПродуктовый таймаут production SMTP не закреплён. Ошибки подавляются; автоматического повтора reset, отмены и решения по возврату нет. Напоминание может как получить ложную отметку после транспортной ошибки, так и прийти дублем при обратном разрыве — ОГР-25, ОГР-26, ОГР-31
Деградация и действия оператораЗаказ, отмена, возврат и reset-запрос продолжаются, но письмо может отсутствовать. Оператор восстанавливает SMTP; администратор связывается с покупателем вручную там, где это требует процесс
Настройка экземпляраОператор задаёт сервер, отправителя и реквизиты компании; изменение набора шаблонов требует изменения продукта
Подробности и свидетельстваОкружение: почта, письма покупателя, docs/feature-inventory.md, §2.10–2.11; ПУТ-8, ПУТ-26, ПУТ-37

SYS-INT-06. Strapi CMS​

ПолеКонтракт
Назначение и направлениеStrapi принимает черновики и публикации; backend проверяет цели, читает согласованную публикацию и формирует снимок; preview выдаётся только авторизованному редакционному потоку
Данные и источник истиныStrapi владеет черновиком и опубликованной ревизией; Medusa владеет последним принятым снимком; витрина напрямую CMS не читает
Авторизация / доверительная границаЧтение использует отдельный read-доступ; публикационный webhook подписан и имеет пятиминутное окно; preview использует два независимых секрета и токен на 10 минут
Триггер и синхронностьПубликация посылает webhook; backend дополнительно перечитывает CMS каждую минуту. Проверка внутренних целей из CMS в Medusa синхронна и закрывается отказом
УспехДве соседние ревизии совпали, все данные прошли строгий разбор, недействительные внутренние цели скрыты, а новый снимок не старше уже принятого
Таймаут, повтор, идемпотентностьWebhook, preview и проверка целей ограничены 5 секундами. Алгоритм согласованности делает до четырёх полных чтений снимка; каждое чтение обращается к homepage, settings и ко всем страницам SEO, поэтому общее число HTTP-запросов зависит от пагинации SEO. Проигранная запись снимка повторяется один раз. Потерянный webhook компенсирует минутный цикл
Деградация и действия оператораВитрина показывает последний снимок. Редактор исправляет невалидную запись/цель; оператор восстанавливает CMS, read-доступ или время серверов. Одна повреждённая запись блокирует весь новый снимок — ОГР-28
Настройка экземпляраОператор связывает CMS, backend, публичную витрину и отдельное хранилище; Editor/Publisher меняют контент без выпуска кода, но набор их прав восстанавливается из кода
Подробности и свидетельстваПуть публикации, контент главной, docs/feature-inventory.md, §2.9 и §3; ПУТ-24, ПУТ-25, ПУТ-27, ПУТ-36

SYS-INT-07. PostgreSQL​

ПолеКонтракт
Назначение и направлениеBackend и CMS читают и изменяют постоянные данные своих доменов; миграции подготавливают структуру до приёма трафика
Данные и источник истиныБаза Medusa — каноническое постоянное состояние commerce; база CMS — постоянное состояние контента. Поиск, кэш и внешние документы не заменяют их
Авторизация / доверительная границаБазы Medusa и CMS разделены именами, но поставляемая конфигурация использует один общий PostgreSQL principal для приложений, миграций и инициализации; публичный браузер к БД не подключается
Триггер и синхронностьДоменная запись синхронна внутри операции; фоновые процессы читают и обновляют состояние по расписанию
УспехТранзакция зафиксирована и последующее чтение владельца возвращает результат; схема соответствует версии приложений
Таймаут, повтор, идемпотентностьОбщего продуктового таймаута или автоматического повтора произвольной транзакции не установлено; идемпотентность реализуется владеющим workflow. Миграции и init запускаются повторяемо до backend
Деградация и действия оператораПри недоступности базы владеющее приложение не должно переключать истину на индекс/кэш; операция или приложение недоступны. Оператор восстанавливает сервис и целостность, затем проверяет миграции и фоновые очереди
Настройка экземпляраКаждая компания получает изолированные базы/схемы и реквизиты; политика резервного копирования и восстановления не утверждена — TBD-08
Подробности и свидетельстваАрхитектура, инфраструктура, развёртывание

SYS-INT-08. Redis​

ПолеКонтракт
Назначение и направлениеBackend использует Redis для кэша, событий, workflow и распределённых блокировок
Данные и источник истиныRedis хранит координационное и временное состояние; PostgreSQL и внешние владельцы остаются источниками доменных фактов
Авторизация / доверительная границаВ поставляемой конфигурации доступ ограничен непубличной Docker-сетью без отдельной Redis-аутентификации; браузеры и внешние провайдеры к Redis не обращаются
Триггер и синхронностьИспользуется при каждом применимом кэше, событии, workflow или lock; production backend считает сервис обязательным
УспехСобытие принято, workflow/lock согласованы, а кэш не изменил доменное решение
Таймаут, повтор, идемпотентностьСобытие с выброшенной ошибкой повторяется до пяти раз с экспоненциальной базой 5 секунд; ошибка хранится до 7 дней. Идемпотентность побочных эффектов остаётся обязанностью подписчика
Деградация и действия оператораProduction не переключается на in-memory как штатный fallback; запуск или координационные операции нарушаются. Оператор восстанавливает Redis и проверяет сохранённые ошибки/повторы
Настройка экземпляраКаждый deployment использует отдельную логическую или физическую область Redis и непубличный доступ
Подробности и свидетельстваАрхитектура, event bus, docs/feature-inventory.md, §2.13

SYS-INT-09. Meilisearch​

ПолеКонтракт
Назначение и направлениеBackend индексирует публичный каталог; витрина получает поиск, фильтры, фасеты и сортировку через backend
Данные и источник истиныИндекс — восстановимая копия товаров, вариантов, цены, категории и вычисленного наличия; PostgreSQL/Medusa остаётся владельцем
Авторизация / доверительная границаBackend обращается с закрытым ключом; браузер не получает административный доступ к индексу
Триггер и синхронностьТочечные или полные обновления следуют за доменными событиями; полная переиндексация доступна сопровождающему
УспехВыдача соответствует фильтрам и каноническим публичным объектам, а карточка/checkout повторно подтверждают продаваемость в Medusa
Таймаут, повтор, идемпотентностьОшибка несовместимых настроек индекса запускает их обновление и один повтор запроса. Отсутствующий индекс трактуется как пустая выдача; недоступный сервис — как отдельная ошибка
Деградация и действия оператораЗаказные данные не повреждаются. Покупатель видит отличимое состояние ошибки либо пустой свежий индекс; оператор восстанавливает сервис и запускает полную переиндексацию
Настройка экземпляраОператор задаёт отдельный сервер/индекс и ключ для экземпляра; данные другой компании не смешиваются
Подробности и свидетельстваAPI и поиск, архитектура, docs/feature-inventory.md, §2.8; ПУТ-9, ПУТ-23

SYS-INT-10. S3-совместимое объектное хранилище​

ПолеКонтракт
Назначение и направлениеMedusa сохраняет изображения и документы товаров; CMS сохраняет публичные медиа контента
Данные и источник истиныОбъектное хранилище владеет байтами файла; доменные приложения владеют ссылкой и разрешением использовать файл
Авторизация / доверительная границаЗапись выполняется отдельными реквизитами; Medusa и CMS используют изолированные бакеты/пользователей. Оба бакета допускают анонимное чтение, а CMS дополнительно записывает объекты как публичные: публикация доменной записи управляет выдачей ссылки приложением, но не правом чтения уже загруженных байтов по известному URL
Триггер и синхронностьЗагрузка и удаление выполняются при административном действии; браузер читает публичный объект по ссылке
УспехВ штатном потоке виджета документ принят только при допустимых размере и сигнатуре и совпадении заявленного MIME; перед связыванием сохранённые байты повторно читаются и проверяются по размеру и сигнатуре, но исходный MIME непомеченной загрузки на этой границе не извлекается и повторно не сравнивается. CMS выполняет content-based MIME detection и применяет настроенные списки типов и размер; если обнаруженный допустимый тип не совпал с допустимым типом расширения либо detection не дал результата, возможен выбор по расширению или заявленному MIME, а повторного чтения объекта перед публикацией нет
Таймаут, повтор, идемпотентностьОбщий продуктовый таймаут/повтор не утверждён. Удаление товара удаляет документ только когда на него больше не ссылается активный товар; CMS-медиа автоматически не очищаются по подтверждённому контракту
Деградация и действия оператораНовая загрузка/чтение файла не проходит, но доменные записи не должны подменяться пустыми. Оператор восстанавливает доступ и проверяет связи; редактор или администратор повторяет загрузку
Настройка экземпляраОператор задаёт публичный адрес, бакеты и отдельные реквизиты; текущий предел загрузки CMS настраивается, значение по умолчанию 8 МиБ не объявляется неизменным продуктовым лимитом
Подробности и свидетельстваОкружение: хранилище, инфраструктура, docs/feature-inventory.md, §2.13 и §3.3

SYS-INT-11. Публичная сетевая граница​

ПолеКонтракт
Назначение и направлениеDNS, reverse proxy и TLS доставляют browser/API-трафик к витрине, backend, admin, CMS и документации
Данные и источник истиныПриложения владеют ответами и сессиями; edge владеет публичным именем, сертификатом и маршрутизацией
Авторизация / доверительная границаHTTPS защищает транспорт; списки origin ограничивают browser-доступ; forwarded-адрес доверяется только перечисленным proxy. Публичная конфигурация не является авторизацией
Триггер и синхронностьКаждый публичный запрос проходит edge синхронно
УспехПубличное имя приводит к правильному приложению, сертификат действителен, cookie и origin соответствуют выбранному HTTPS-контуру
Таймаут, повтор, идемпотентностьЕдиный продуктовый edge-таймаут не утверждён; повтор мутации не считается допустимым без доменной идемпотентности
Деградация и действия оператораНеверный маршрут/origin блокирует API или вход; отсутствие TLS несовместимо с secure-cookie. Инфраструктурный оператор исправляет DNS, сертификат, proxy и согласованные origin
Настройка экземпляраДомен, сертификат, публичные и внутренние адреса и разрешённые origin задаются отдельно для каждой компании без изменения доменной логики
Подробности и свидетельстваОкружение, инфраструктура, развёртывание

SYS-INT-14. YouTube и Vimeo​

ПолеКонтракт
Назначение и направлениеВитрина строит встраиваемый плеер для распознанной ссылки YouTube/Vimeo; браузер покупателя загружает плеер напрямую у видеопровайдера
Данные и источник истиныMedusa хранит заданный для товара URL; провайдер владеет плеером и доступностью видео. Распознаётся ограниченный набор хостов YouTube, youtu.be, youtube-nocookie.com и Vimeo
Авторизация / доверительная границаСерверные реквизиты не используются. Запрос пересекает сетевую и privacy-границу из браузера к третьей стороне; referrer ограничен origin, а cookie и дальнейшая обработка принадлежат границе браузера/провайдера
Триггер и синхронностьiframe присутствует при открытии карточки, а фактическая загрузка отложена браузерным lazy-режимом. Нераспознанный HTTP(S)-URL отображается только как внешняя ссылка
УспехПлеер загружен в карточке, при этом под ним сохраняется ссылка на исходный URL
Таймаут, повтор, идемпотентностьПродуктовый таймаут и автоматический повтор не заданы; загрузкой и повтором управляет браузер
Деградация и действия оператораКомпонент помечает ошибку iframe и заменяет его внешней ссылкой; ссылка также всегда показана под плеером. Недоступность видео не блокирует карточку или покупку
Настройка экземпляраСсылки задаются для конкретного товара; список поддержанных провайдеров меняется только с кодом
Подробности и свидетельстваКарточка товара, docs/feature-inventory.md, §1.5; компонентные тесты распознавания URL и fallback

TBD (решение владельца): [TBD-12] Допустима ли текущая автоматическая lazy- загрузка стороннего плеера при открытии карточки, или до запроса к YouTube/Vimeo нужны явное действие/согласие покупателя?

10. Атрибуты качества​

Каждая строка ниже имеет объективный порог. Значения, которые найдены в текущей реализации, но не утверждены как SLA или постоянный продуктовый лимит, прямо так и помечены.

10.1. Безопасность и приватность​

IDМетрика или условиеОбластьПорогСпособ проверки
SYS-QLT-01Серверная авторизация привилегированных действийПрофиль, заказы, возвраты, admin и CMS100% проверяемых действий требуют соответствующую сессию/роль и ownership; прямой запрос без права отклоняется до побочного эффектаНегативные auth/RBAC/CMS-тесты по матрице раздела 4; ПУТ-15–ПУТ-21, ПУТ-28–ПУТ-36
SYS-QLT-02Отсутствие карточных данных и раскрытия секретовОплата, доставка, МойСклад, S3, почта, логи и публичные ответы0 полных секретов и 0 реквизитов банковской карты в клиентских ответах, Git, тестовых фикстурах и логах; сохранённые integration-секреты наружу возвращаются только признаком наличия/маской. Подтверждённые нарушения — ОГР-32 и ОГР-34Контрактные тесты Admin API, просмотр ответа/логов, secret scan; SYS-BR-21; ОГР-32, ОГР-34
SYS-QLT-03Проверка машинного источника и replayWebhook ЮKassa, СДЭК и CMS100% событий с неверной доверительной границей не применяются; CMS-событие с отклонением времени более 5 минут отклоняется; повтор принятого ID не даёт второго эффектаНегативные webhook-тесты, тест часов и повторной доставки; для целевого СДЭК — ЖИВ-02
SYS-QLT-04Валидация документа до связыванияДокументы товаровПомеченный поток загрузки отклоняет файлы с недопустимыми размером или сигнатурой и с несовпадающими заявленным MIME и сигнатурой. Перед связыванием 100% сохранённых объектов повторно читаются и отклоняются по недопустимым размеру или фактической сигнатуре; заявленный MIME непомеченной загрузки на этой границе не проверяетсяUnit/HTTP-тесты помеченного несовпадения, недопустимого содержимого, размера, непомеченной загрузки и повторного чтения; обход допустимых байтов с несовпавшим MIME подтверждается аудитом двух серверных границ
SYS-QLT-29Валидация CMS-медиа на границе загрузкиМедиа панели контентаФайл проверяется по настроенному пределу размера; Strapi определяет MIME по начальному содержимому и отклоняет обнаруженный тип вне настроенного списка. Строгое совпадение заявленного MIME, расширения и сигнатуры не гарантируется: при допустимом, но несовпавшем типе либо отсутствии результата detection возможен fallback к расширению или заявленному MIME; повторного чтения объекта перед публикацией нетКонфигурационный аудит; проектных CMS upload-тестов несовпадения, неподдерживаемой сигнатуры и сбоя detection нет, поэтому поведение подтверждается исходным кодом закреплённого upload-плагина. Текущий default 8 МиБ не является неизменным лимитом продукта

Сроки хранения, удаление и обезличивание персональных данных нельзя вывести из этих технических мер: решение остаётся в TBD-03.

10.2. Производительность и ёмкость​

IDМетрика или условиеОбластьПорогСпособ проверки
SYS-QLT-05Ограничение ожидания одного запроса расчёта доставкиCheckoutКаждый отдельный незавершённый HTTP-запрос к backend прерывается не позднее 10 секунд и переходит в отличимое состояние ошибки с повтором; единого десятисекундного предела для всей последовательности расчёта нетАудит создания отдельного AbortSignal на запрос и unit-тест преобразования timeout-ошибки; end-to-end deadline цепочки тестами не подтверждён. 10 секунд — текущий защитный предел одного запроса, не SLA всей операции или ответа провайдера
SYS-QLT-06Полнота больших коллекций при ограниченной страницеКаталог, категории, бренды, аккаунт, CMS-снимок и фоновые обходыПереход между страницами не пропускает и не дублирует объекты и даёт согласованное общее количество; операция, обещающая полный набор, обходит все страницы. Размеры отдельных страниц — текущие ненормативные настройкиГраничные тесты 0/1/N/N+1 для текущего размера страницы и сверка общего количества на многостраничном наборе; известные нарушения — ОГР-24 и ОГР-29
SYS-QLT-07Соблюдение внешнего rate limit учётной системыSYS-INT-01Суммарный вес не более 45 за любые 3 секунды; на 429 — не более трёх повторов с задержкой провайдера либо 3 секундыUnit-тест клиента с виртуальными часами и ответами 429; живой контроль без превышения договора — ЖИВ-03

TBD (решение владельца): [TBD-07] Утвердить целевые перцентили времени ответа, конкурентность и объёмы каталога/заказов для поиска, карточки, корзины, checkout и панелей; текущий benchmark и лимиты страниц сами по себе не являются SLA.

10.3. Надёжность, доступность и восстановление​

IDМетрика или условиеОбластьПорогСпособ проверки
SYS-QLT-08Изоляция провайдера при расчётеДоставка в checkoutОтказ одного включённого провайдера не удаляет ни одного успешного тарифа другого; если успешных тарифов 0, создание заказа заблокированоКонтрактный тест «один отказ / оба отказа» и ПУТ-2, ПУТ-5
SYS-QLT-09Сохранение канонического заказа при сбое последействияОтправление, МойСклад, уведомленияПосле полученного ID заказа 100% ошибок этих интеграций оставляют тот же заказ доступным; для отправления и МойСклад фиксируется состояние восстановления, если контракт предусматривает повторИнтеграционные тесты подписчиков и ручной сценарий ПУТ-8/ПУТ-31; почтовые отклонения ОГР-01, ОГР-25, ОГР-31
SYS-QLT-10Изоляция элемента пакетной обработкиОстатки, tracking и истечение оплатОшибка одного элемента не мешает попытке обработать все последующие элементы текущего набора; итог сообщает частичный/общий сбойUnit-тест с ошибкой первого и успехом второго элемента; текущее нарушение цикла истечения — ОГР-27
SYS-QLT-11Работа витрины при отказе CMSПубличный контентПри отказе CMS отдаётся последний принятый снимок; после восстановления валидная публикация появляется не позднее следующего минутного циклаОстановить CMS на выделенном стенде, сравнить ревизию до/после; повреждённая публикация — ОГР-28

TBD (решение владельца): [TBD-08] Утвердить доступность, RTO/RPO, резервное копирование, частоту проверки восстановления и ответственных для PostgreSQL, CMS, объектных файлов, Redis и поискового индекса. Эти значения не выводятся из health-check и restart policy.

10.4. Согласованность и идемпотентность​

IDМетрика или условиеОбластьПорогСпособ проверки
SYS-QLT-12Единственность финансового результата при параллельных сигналахОплата, заказ и возврат денегНе более 1 заказа на корзину; повтор того же возврата не создаёт вторую транзакцию и общая сумма возвратов не превышает захваченнуюКонкурентные тесты двух browser/webhook-входов и повторов refund; SYS-BR-12, SYS-BR-18
SYS-QLT-13Единственность логистического результатаОтправление и заявка на возвратНе более 1 активного отправления на пару заказ–провайдер и 1 ожидающей заявки на заказ; повтор принятого решения — no-op, смена решения отклоняетсяКонкурентные provider/return-тесты и ПУТ-20, ПУТ-30
SYS-QLT-14Монотонность внешнего статусаСДЭК и ApiShipНеизвестный, более старый или регрессирующий статус изменяет 0 принятых состояний; терминальный статус не перезаписывается нетерминальнымТабличные тесты всех переходов и повторная доставка событий
SYS-QLT-15Период планового запуска обновления копииCMS, остатки, tracking ApiShip, ПВЗ СДЭКПопытка обновления CMS запускается каждую минуту; остатков — каждые 15 минут; незавершённого tracking ApiShip — каждый час; справочника ПВЗ СДЭК — раз в сутки. Ошибка либо ещё работающий предыдущий цикл может оставить старую копию; максимальный возраст успешной копии не ограниченПроверка расписаний и ветвей ошибки/пропуска job; сравнение меток до/после подтверждает только успешную попытку, а не верхнюю границу свежести
SYS-QLT-16Разрешение расхождения по владельцуВсе копии раздела 8.3В 100% контрольных конфликтов копия не заменяет источник истины: карточка/checkout отвергают устаревший индекс, платёж перечитывается, старый CMS-снимок не затирает новыйКонтрактные тесты конфликтов и сценарий переиндексации/повторного чтения; SYS-BR-06

10.5. Удобство и доступность интерфейсов​

IDМетрика или условиеОбластьПорогСпособ проверки
SYS-QLT-17Полнота состояний чтенияКаждый публичный экран/блок с удалёнными даннымиДля каждой применимой поверхности существуют и различаются минимум 4 исхода: загрузка, пусто, ошибка, успех; 404 применяется только к реально отсутствующему/скрытому объекту. Текущее нарушение — ОГР-33Компонентные тесты и ревью матрицы состояний; docs/specs/storefront-ux-core.md, §1 и §3; ОГР-33
SYS-QLT-18Наблюдаемость неуспешной записи для пользователяКорзина, wishlist, профиль, checkout, отмена и возврат100% отклонённых мутаций дают локальный сигнал и откатывают оптимистичное состояние; checkout сохраняет введённые контактные данные, помечает поля после невалидной отправки и блокирует кнопку до готовности контактов, доставки, оплаты и согласия. Автоматический перевод фокуса на первое невалидное поле не реализованUI-тесты каждой мутации и ПУТ-5, ПУТ-6, ПУТ-12, ПУТ-19
SYS-QLT-19Клавиатура и программное объявление состоянияВарианты, количество, фильтры, пагинация, вкладки и checkout100% интерактивных элементов доступны клавиатурой и имеют видимый фокус; наличие/ошибка передаются не только цветом; изменение цены варианта, общего количества позиций/штук и количества конкретной строки корзины объявляется assistive technology, но денежный итог корзины программно не объявляется; модальный выбор возвращает фокус инициаторуРучной keyboard/screen-reader аудит и автоматические accessibility-проверки по docs/specs/storefront-ux-core.md, §3
SYS-QLT-20Неразличимость наличия аккаунта по reset-запросуВосстановление пароляДля существующего и отсутствующего email HTTP- и UI-результат одинаков; повторная отправка в UI недоступна 60 секундПарный auth-тест с двумя адресами и проверкой таймера; ПЛТ-02

10.6. Наблюдаемость и сопровождаемость​

IDМетрика или условиеОбластьПорогСпособ проверки
SYS-QLT-21Диагностируемость восстанавливаемой интеграцииМойСклад, отправления, возврат денег и CMSКаждая предусмотренная для повтора операция показывает сотруднику/оператору текущий статус, последнюю ошибку или метку попытки и доступное следующее действие; исчерпание автоматики не выдаётся за успехАдминистративные сценарии ПУТ-28–ПУТ-33 и docs/qa/test-cases/09-admin-operations.md
SYS-QLT-22Ограничение и обезличивание клиентской диагностикиОшибки витриныДо лога удаляются email, телефоны, токены, cookies и query; message ≤500 символов, stack ≤2000 символов и 4 строк, path ≤300; тело ≤16 КиБ, приём ≤30 сообщений/минуту, одинаковый отпечаток подавляется 30 секунд. Текущее нарушение — ОГР-34Unit/HTTP-тесты на каждый предел и проверка принятого синтетического сообщения. Общий process-limit не является доказательством отсутствия ошибок; ОГР-34

10.7. Развёртываемость и переносимость​

IDМетрика или условиеОбластьПорогСпособ проверки
SYS-QLT-24Идемпотентная подготовка нового экземпляраМиграции, первый администратор, sales channel и publishable keyНа пустом постоянном состоянии первый запуск создаёт по одному необходимому объекту и запускает приложения; второй запуск не создаёт дублей и не требует seed демо-каталогаДва последовательных запуска на одноразовом окружении и проверка количества объектов
SYS-QLT-25Изоляция экземпляров компанийDeployment, данные и секретыОдин deployment обслуживает одну компанию; базы, бакеты, домены и customer-сессии экземпляров не используются совместно. Разделение ключей зависит от оператора и не проверяется продуктом — TBD-11Ревью конфигураций двух тестовых экземпляров и негативная попытка cross-instance доступа; ключи сверяются как операторская мера
SYS-QLT-26Восстановимость поисковой копииКаталогПолное удаление индекса не требует ручного изменения доменных записей: после переиндексации набор публичных товаров снова строится из MedusaТест на одноразовом индексе со сравнением ID/фасетов до удаления и после rebuild
SYS-QLT-27Сохранение постоянного состояния при рестарте приложенийPostgreSQL и объектные файлыПосле рестарта backend/web/CMS без очистки persistent storage сохраняются заказы, настройки и опубликованные файлы; Redis/индекс не становятся владельцами потерянных фактовRestart-smoke на выделенном окружении с контрольными объектами

11. Ограничения, предположения и зависимости​

IDТипОграничение, предположение или зависимостьПоследствие нарушенияОснование / проверка
SYS-CON-01Архитектурное ограничениеОдин deployment и его постоянные хранилища обслуживают одну компанию; общего мультитенантного runtime нетСовместное использование смешает домены, customer-сессии, данные и секреты компаний; такая установка не поддерживаетсяРаздел 3.4; SYS-QLT-25; архитектура
SYS-CON-02Платформенная зависимостьProduction требует совместимые PostgreSQL, Redis, Meilisearch и S3, а также поддерживаемые версии Node/npm и приложений; тестовые in-memory-замены не являются production-режимомBackend не стартует или теряет события, workflow, поиск/файлы; зелёные тесты на заменах не доказывают работу реального стекаREADME.md; окружение; инфраструктура
SYS-CON-03Бизнес-ограничениеТекущий продукт продаёт физические товары через серверную корзину: получение обязательно, регистрация и онлайн-оплата — нет; inventory/backorder управляет доступностьюКаталог услуг/digital goods, обязательная регистрация или заказ без получения требуют новой feature spec и пересмотра SYS-BR-02–SYS-BR-09docs/specs/storefront-ux-core.md; ПУТ-1–ПУТ-5
SYS-CON-04Платформенное правилоСтандартные Store/Admin API, модули и workflow Medusa используются прежде кастомной реализации; кастомная граница допустима только для подтверждённого пробелаПараллельная реализация расходится со стандартными заказами, правами, резервами или миграциями и становится неподдерживаемойCLAUDE.md; docs/specs/constitution.md; архитектура
SYS-CON-05Внешний договорОнлайн-оплата, прямой СДЭК, ApiShip и МойСклад предполагают действующий договор/аккаунт, разрешённые операции и выданные реквизиты компанииПровайдер не возвращает тариф/ПВЗ, не принимает запись или не подтверждает деньги; функция считается только настроенной, но не принятой. Пробелы живой приёмки — ЖИВ-01…ЖИВ-04Карточки SYS-INT-01–SYS-INT-04; docs/qa/active-limitations.md
SYS-CON-06Предположение о данныхДля постоянного обмена МойСклад каждый участвующий вариант имеет уникальный непустой SKU, совпадающий ровно с одним кодом номенклатурыНеоднозначная/пустая позиция пропускается, остаток не обновляется, заказ требует исправления или ручной обработкиSYS-BR-05; ПУТ-31, ПУТ-33; МойСклад
SYS-CON-07Криптографическая зависимостьШифруемые реквизиты МойСклад, ЮKassa и СДЭК зависят от непустого ключа вне данных; ключ остаётся тем же, пока реквизиты не заменены. Конфигурация позволяет повторно использовать один ключ в разных окружениях, и продукт не проверяет его уникальностьПосле смены/потери ключа существующие реквизиты не расшифровываются; повтор ключа между окружениями ослабляет изоляцию. Расхождение ApiShip с общим правилом — ОГР-32SYS-BR-21; окружение; ОГР-32; TBD-11
SYS-CON-08Сетевая зависимостьПубличный экземпляр предполагает согласованные домены/origin, HTTPS reverse proxy и корректную доверительную цепочку forwarded-адресовBrowser блокирует API/CORS или не сохраняет secure-cookie; webhook ЮKassa может быть отклонён либо довериться подменённому адресуSYS-INT-11; окружение
SYS-CON-09Предположение о времениЧасы CMS и backend синхронизированы с расхождением не более 5 минутЧестный CMS-webhook отклоняется как replay; снимок обновится только периодическим чтениемSYS-INT-06; путь CMS
SYS-CON-10Предположение о контентеПубликация CMS соответствует схеме, а внутренние цели доступны Medusa в момент проверкиНевалидный черновик не сохраняется; недоступная цель скрывается; повреждённая запись сохраняет прежний снимок целиком — ОГР-28SYS-DAT-08; путь CMS
SYS-CON-11Внешний контрактФорматы, статусы, подписи, rate limits и идемпотентность провайдеров соответствуют их целевому аккаунту, а не только мокамАвтотесты остаются зелёными, но живой запрос может быть отклонён или интерпретирован иначе; до живого прогона уровень доказательства ограниченdocs/known-quirks.md; ЖИВ-01…ЖИВ-04; CLAUDE.md
SYS-CON-12Операционное ограничениеSMTP — best-effort зависимость: недоступность не блокирует commerce/auth-операцию, а подтверждённой очереди доставки для всех типов писем нетПользователь может получить UI-успех без письма; оператор/администратор восстанавливает канал или связывается вручную. Активные отклонения — ОГР-01, ОГР-25, ОГР-31SYS-INT-05; docs/qa/business-overview.md
SYS-CON-13Платформенное ограничениеРасчёт доставки получает город, регион и индекс, но не улицу/дом; СДЭК tracking читается из webhook-копии, ApiShip — прямым запросомНельзя обещать тариф с точностью до дома или одинаковую свежесть tracking двух провайдеров без изменения платформенной границыПЛТ-01, ПЛТ-03; доставка

TBD (решение владельца): [TBD-11] Считать ли уникальный для каждого окружения ключ шифрования обязательным продуктовым инвариантом с запретом пустых/default-значений при запуске, или оставить разделение ключей операторской мерой?

12. Инварианты продукта и настройки компании​

«Без кода» означает изменение данных через штатную панель либо deployment- конфигурацию с перезапуском. Значение из seed или примера не считается подтверждённой production-настройкой.

АспектИнвариант продуктаTenant-настройкаЗначение «Колорики»Владелец настройкиСпособ проверки
Изоляция компанииОдин deployment обслуживает одну компанию; доменные данные и секреты между экземплярами не разделяютсяНовый экземпляр создаётся отдельным deployment и постоянными хранилищами, без изменения кодаОдин экземпляр для магазина «Колорика»; общего мультитенантного режима нетВладелец утверждает границу; инфраструктурный оператор создаёт экземплярСверить домены, базы, бакеты и ключи двух экземпляров; SYS-CON-01, SYS-QLT-25
Бренд и названиеУ публичного экземпляра одно согласованное имя; CMS-название управляет частью главной, но не обязано переименовывать shell/SEOSite settings меняется Publisher без кода; вордмарк, footer и большая часть metadata сейчас меняются только кодом и новой сборкой«Колорика» жёстко присутствует в shell и metadata; резерв CMS до первой публикации — «Магазин автокрасок»Владелец задаёт бренд; Publisher меняет CMS; разработчик — жёсткие строкиСравнить shell, metadata страниц, CMS Site settings и пустой снимок; решение о полной no-code вариативности — TBD-10
Публичный доменПриложения должны использовать согласованные публичные/внутренние адреса, origin и secure-cookieDNS, TLS, reverse proxy и адреса приложений меняются в deployment без кодаВ ролевой инструкции стенда указан qa-a.mirkrasok.termitsdigital.ru; канонический production-домен источниками не подтверждёнВладелец выбирает домен; инфраструктурный оператор настраиваетОткрыть web/admin/CMS/docs по целевым именам, проверить TLS, login, API и preview; TBD-10
Контент и контактыПубличная главная получает целостный CMS-снимок; отдельные страницы контактов/доставки принадлежат legacy-разделу Medusa AdminHomepage/Site settings меняются Editor/Publisher; контакты и доставка — администратором, без кодаРепозиторий и инструкция содержат демонстрационные телефон, email, адрес и условия доставки; реальные значения не подтвержденыВладелец предоставляет данные; Editor/Publisher и администратор публикуют в своих границахСверить главную, страницы контактов/доставки и ревизию CMS; карта контактов; TBD-10
Локаль, страна и валютаВалюта заказа/оплаты должна совпадать на всём пути; формат не должен подменять код валютыCommerce-регион и цены меняются в Medusa, но публичный UI частично жёстко ориентирован на русскую локаль и ₽; полноценная смена требует кода и отдельной specСамонастройка создаёт Russia/RUB; UI использует ru-RU; иная валюта имеет активное отклонение ОГР-03Владелец принимает рынок/валюту; Super Admin меняет commerce-данные; разработчик устраняет жёсткие привязкиОформить тестовый заказ и платёж, сверить код/знак валюты на всех экранах и у провайдера
Каталог и ассортиментТовары, варианты, категории, цены и публикация принадлежат Medusa; наличие вычисляетсяАдминистратор меняет каталог без кода; разовый импорт допустим как отдельная операцияКонкретный ассортимент и цены не являются системным инвариантом; актуальное значение берётся из MedusaАдминистратор магазинаПроверить опубликованный каталог и SYS-BR-01–SYS-BR-05, не сравнивая с demo seed как эталоном
Склад и inventoryДолжна существовать складская локация, связанная с каналом продаж; продаваемый inventory остаётся в MedusaСклад, остатки и backorder меняются в Medusa; физический остаток может приходить из МойСклад; адрес отправителя и коробка задаются в доставкеСамонастройка создаёт Main Warehouse; реальный адрес, размеры, вес и остатки в Git не хранятся и не подтвержденыВладелец/складской оператор; администратор доставкиСверить связь склада/канала, контрольный SKU и остаток, адрес отправителя и тариф после сохранения коробки; TBD-10
Платёжные провайдерыЗаказ без online-провайдера допустим; подключение не хранит карты и не прекращает обслуживание ранее начатых платежей при выключенииРеквизиты/видимость ЮKassa меняет Super Admin без кода; новый тип провайдера требует кода и feature specПоддерживаются manual/system и ЮKassa; активность и реальные реквизиты целевого экземпляра в репозитории не определяютсяВладелец договора и Super Admin; оператор хранит ключ шифрованияПроверить список способов, полный платёж/отказ/возврат и отключение новых оплат; фактический контур не определять по подписи режима — ОГР-06
Службы доставкиCheckout требует реальный способ получения; отказ одной службы изолирован; manual-provider остаётся для непроектных способовApiShip и СДЭК настраиваются/включаются в admin; добавление нового прямого провайдера требует кодаПоддерживаются ApiShip, прямой СДЭК и manual. DPD доступен только через ApiShip; целевые write-сценарии не приняты — ЖИВ-01, ЖИВ-04Владелец договоров и администратор доставкиКонтрольный расчёт курьер/ПВЗ, заказ, отмена, tracking и этикетка на целевом аккаунте
Учётная системаПостоянный обмен ограничен остатками в продукт и заказами/отменами наружу; ключ сопоставления — SKU ↔ кодРеквизиты и активность МойСклад меняются в admin без кода; замена типа учётной системы требует кодаМойСклад поддержан; read-only доступ проверен, живые остатки и запись заказов не приняты — ЖИВ-03Владелец аккаунта и складской оператор; оператор хранит ключ шифрованияЖивой контрольный SKU, заказ и отмена плюс отчёт несопоставленных позиций
Ключи и секретыСекреты разделены по назначению и не входят в клиентскую конфигурацию; ключи шифрования сохраняются на срок жизни реквизитов. Уникальность ключа между окружениями кодом не проверяется. Текущее нарушение общего правила хранения и возврата — ОГР-32Инфраструктурные секреты меняет оператор; реквизиты МойСклад/ЮKassa/ApiShip/СДЭК вводятся уполномоченным сотрудником в adminРеальные значения намеренно отсутствуют в Git; поставляемая конфигурация допускает повторное fallback-значение ключа МойСклад, поэтому фактическая изоляция зависит от оператора — TBD-11; ОГР-32Инфраструктурный оператор и владелец внешнего аккаунтаSecret scan, проверка маскирования и ревью фактических ключей двух окружений; ротация шифруемых интеграционных реквизитов только вместе с их повторным вводом
ПочтаСбой SMTP не откатывает породившую письмо доменную операциюСервер, отправитель и реквизиты меняются в deployment без кода; шаблон и перечень событий требуют кодаВ примере указан no-reply@example.com; фактический отправитель и production SMTP не подтвержденыВладелец выбирает sender; инфраструктурный оператор настраиваетОтправить reset и операционное письмо на контролируемый адрес, проверить From и отсутствие секрета в логах; TBD-10
Sales channel и publishable keyПубличный ключ связан с storefront-каналом и выдаётся витрине в runtime; он не даёт административных правАвтоматически создаются на пустом экземпляре; администратор может отозвать/заменить ключ без пересборки витриныBaseline-имена seed — Auto Paint Storefront и связанный publishable key; сам токен в документацию не входитSuper Admin; начальную связь обеспечивает самонастройкаНа пустом экземпляре выполнить первый и повторный init, проверить один активный связанный ключ и успешный публичный запрос
Режим административных ролейПри включённом RBAC сервер проверяет permissions; CMS-роли Editor/Publisher восстанавливаются из кодаRBAC включается в deployment; назначения Medusa-пользователей меняет Super Admin; состав CMS-ролей требует кодаДокументация требует включённый RBAC; фактическое runtime-значение целевого экземпляра из Git не определяетсяВладелец утверждает матрицу; Super Admin назначает; оператор включает режимНегативные запросы обычного admin/Super Admin и рестарт CMS с проверкой восстановленных ролей; TBD-04, TBD-05

13. Известные отклонения и уровень доказательств​

Легенда доказательств​

УровеньЧто он доказываетЧего не доказывает
D1 — репозиторийКонтракт найден в коде, документации или конфигурацииЧто путь выполнялся в runtime
D2 — автоматическая проверкаВнутреннее поведение прошло unit/HTTP/integration-тест на заглушкахСовместимость с реальным внешним аккаунтом
D3 — реальный read/sandboxОтдельная операция прошла против реального API или песочницыПолный write-путь на договоре компании
D4 — целевой сквозной прогонСценарий прошёл на целевом аккаунте/договоре с проверкой результата во всех системахБудущую доступность провайдера

ОГР-* — подтверждённое нарушение или видимый разрыв; ЖИВ-* — отсутствующий уровень D4, а не подтверждение работы или дефект; ПЛТ-* — подтверждённая граница, которую проверка должна принять. Подробность и статус существуют только в docs/qa/active-limitations.md.

Отклонения​

IDВлияние на системный контрактЕдинственная подробная запись
ОГР-01SYS-CAP-03, SYS-BR-15, SYS-INT-05, SYS-QLT-09docs/qa/active-limitations.md#ogr-01
ОГР-02SYS-CAP-02, SYS-DAT-05docs/qa/active-limitations.md#ogr-02
ОГР-03SYS-BR-01, SYS-DAT-01, SYS-QLT-16docs/qa/active-limitations.md#ogr-03
ОГР-04SYS-BR-08, SYS-INT-04, SYS-QLT-08docs/qa/active-limitations.md#ogr-04
ОГР-05SYS-BR-21, SYS-INT-02, SYS-QLT-02docs/qa/active-limitations.md#ogr-05
ОГР-06SYS-CAP-03, SYS-INT-02, SYS-CON-05docs/qa/active-limitations.md#ogr-06
ОГР-07SYS-CAP-01, SYS-DAT-01docs/qa/active-limitations.md#ogr-07
ОГР-08SYS-CAP-02, SYS-QLT-18docs/qa/active-limitations.md#ogr-08
ОГР-09SYS-CAP-02, SYS-DAT-03, SYS-QLT-18docs/qa/active-limitations.md#ogr-09
ОГР-10SYS-BR-19, SYS-DAT-07docs/qa/active-limitations.md#ogr-10
ОГР-11SYS-CAP-01, SYS-QLT-06docs/qa/active-limitations.md#ogr-11
ОГР-12SYS-CAP-01, SYS-QLT-17docs/qa/active-limitations.md#ogr-12
ОГР-13SYS-CAP-01, SYS-DAT-08docs/qa/active-limitations.md#ogr-13
ОГР-14SYS-BR-21, SYS-QLT-02docs/qa/active-limitations.md#ogr-14
ОГР-15SYS-CAP-07, SYS-DAT-08, SYS-QLT-17docs/qa/active-limitations.md#ogr-15
ОГР-16SYS-CAP-07, SYS-DAT-08docs/qa/active-limitations.md#ogr-16
ОГР-17SYS-CAP-05docs/qa/active-limitations.md#ogr-17
ОГР-18SYS-CAP-04, SYS-INT-03, SYS-INT-04docs/qa/active-limitations.md#ogr-18
ОГР-20SYS-BR-17, SYS-BR-19, SYS-DAT-07, SYS-INT-03docs/qa/active-limitations.md#ogr-20
ОГР-22SYS-CAP-01docs/qa/active-limitations.md#ogr-22
ОГР-23SYS-CAP-07, SYS-DAT-08docs/qa/active-limitations.md#ogr-23
ОГР-24SYS-CAP-01, SYS-QLT-06docs/qa/active-limitations.md#ogr-24
ОГР-25SYS-BR-15, SYS-INT-05, SYS-CON-12docs/qa/active-limitations.md#ogr-25
ОГР-26SYS-CAP-02, SYS-INT-05docs/qa/active-limitations.md#ogr-26
ОГР-27SYS-BR-13, SYS-QLT-10docs/qa/active-limitations.md#ogr-27
ОГР-28SYS-BR-06, SYS-DAT-08, SYS-INT-06, SYS-QLT-11docs/qa/active-limitations.md#ogr-28
ОГР-29SYS-CAP-01, SYS-INT-09, SYS-QLT-06docs/qa/active-limitations.md#ogr-29
ОГР-30SYS-BR-11, SYS-DAT-06, SYS-QLT-18docs/qa/active-limitations.md#ogr-30
ОГР-31SYS-CAP-02, SYS-INT-05, SYS-CON-12docs/qa/active-limitations.md#ogr-31
ОГР-32SYS-BR-21, SYS-INT-04, SYS-QLT-02, SYS-CON-07docs/qa/active-limitations.md#ogr-32
ОГР-33SYS-CAP-01, SYS-QLT-17docs/qa/active-limitations.md#ogr-33
ОГР-34SYS-QLT-02, SYS-QLT-22docs/qa/active-limitations.md#ogr-34

Неполное живое доказательство​

IDВлияние на системный контрактЕдинственная подробная запись
ЖИВ-01SYS-CAP-04, SYS-INT-03, SYS-CON-05docs/qa/active-limitations.md#ziv-01
ЖИВ-02SYS-INT-03, SYS-QLT-03, SYS-CON-11docs/qa/active-limitations.md#ziv-02
ЖИВ-03SYS-CAP-06, SYS-INT-01, SYS-QLT-07, SYS-CON-05docs/qa/active-limitations.md#ziv-03
ЖИВ-04SYS-CAP-04, SYS-INT-04, SYS-CON-05docs/qa/active-limitations.md#ziv-04

Платформенные границы​

IDВлияние на системный контрактЕдинственная подробная запись
ПЛТ-01SYS-BR-08, SYS-DAT-05, SYS-INT-03, SYS-INT-04, SYS-CON-13docs/qa/active-limitations.md#plt-01
ПЛТ-02SYS-CAP-02, SYS-QLT-20docs/qa/active-limitations.md#plt-02
ПЛТ-03SYS-DAT-07, SYS-INT-03, SYS-INT-04, SYS-QLT-15, SYS-CON-13docs/qa/active-limitations.md#plt-03

14. Архитектура требований и порядок сопровождения​

Иерархия и обязательные связи​

Долговечное требование имеет ровно четыре сопровождаемых атрибута: стабильный ID, одно проверяемое утверждение, основание/источник и проверку/свидетельство. Автор, версия и история изменения берутся из Git; приоритет будущей работы — из issue, feature spec и риска ПУТ-*, а не из второго рейтинга этой страницы.

Владение документом​

ОтветственныйОбязанность
Владелец продуктаВладеет baseline и утверждает цели, in/out, бизнес-правила, допустимые качества, не-цели, открытые TBD и вариативность компаний
Автор feature spec / измененияВыполняет impact analysis по SYS-*, меняет затронутые контракты и ссылки в той же задаче, не переносит будущее состояние в baseline раньше приёмки
РазработчикОбеспечивает реализацию producer/consumer-границ и автоматическое доказательство там, где оно поддерживается репозиторием
QA / принимающийСвязывает изменённые ID с ПУТ-*/test case, фиксирует уровень доказательства и обновляет единственный реестр отклонений
Сопровождающий документациюПроверяет якоря, относительные ссылки, уникальность ID и согласованность role/dev-страниц; это может быть тот же автор изменения

Правило изменения​

  1. До реализации автор добавляет в feature spec раздел «Затрагиваемые системные требования» и перечисляет каждый SYS-* ID со статусом сохраняется, изменяется, удаляется или новое. Если контракт не затронут, spec обязана явно сказать почему. Фраза «новая область» допустима только до выдачи следующего свободного ID в этой странице.
  2. Новый долговечный контракт получает следующий свободный ID своего типа. Смысл существующего ID можно уточнять без подмены требования; удалённый ID никогда не переиспользуется.
  3. До реализации и проверки желаемое состояние живёт только в feature spec. После приёмки автор в той же задаче обновляет baseline, относящиеся role/dev docs и QA- свидетельства. Архивная spec остаётся историей решения и не переписывается.
  4. Если реализация нарушает действующую норму, норма остаётся в baseline, а подробная запись создаётся или обновляется только в docs/qa/active-limitations.md; здесь остаётся ссылка и влияние на ID.
  5. Изменение владельца истины, внешней границы, схемы состояний, доступа, хранения, tenant-вариативности или измеримого порога всегда считается изменением системного контракта, даже если публичный UI визуально не изменился.

Definition of Done изменения системного контракта​

Изменение готово только когда одновременно выполнены все применимые пункты:

  • feature spec перечисляет затронутые SYS-* и связывает их с целью, ролью или ПУТ-*;
  • реализация согласована на обеих сторонах изменённого контракта: producer и consumer, read и write path, основной и ошибочный исход;
  • у каждого нового или изменённого SYS-* есть объективная проверка и фактическое свидетельство; внешний mock не выдан за D4;
  • эта страница описывает только уже принятое текущее состояние, а role/dev/QA- документы обновлены там, где изменился их собственный контракт;
  • закрытый ОГР-*/ЖИВ-* удалён из активного реестра, новый разрыв добавлен туда один раз, а ссылки раздела 13 синхронизированы;
  • документационный гейт не находит битых внутренних ссылок, якоря и SYS-* уникальны, секреты и реальные персональные данные в изменения не попали.

Порядок аудита baseline​

Владелец продукта инициирует аудит перед значимым релизом и после крупного обновления docs/feature-inventory.md; автор релиза и QA выполняют сверку. Последовательно проверяются граница раздела 3, владельцы/копии раздела 8, все карточки раздела 9, пороги раздела 10, зависимости и tenant-матрица, затем соответствие раздела 13 активному реестру. Отдельно проверяются уникальность SYS-*, наличие проверки у каждой нормативной строки и ссылки feature specs на изменённые ID. Результат хранится в изменениях Git/задаче релиза; ручной номер версии и журнал правок не ведутся.

15. Термины и ссылки​

Доменные термины​

ТерминЗначение в этом контракте
ТоварОбщая карточка продаваемого предмета с категорией, контентом и одним или несколькими вариантами; публикация не гарантирует продаваемость без цены и категории
ВариантКонкретная продаваемая конфигурация товара со своей ценой, SKU, inventory и backorder; товар без выбора конфигурации имеет один вариант
SKUНеобязательный уникальный код варианта после удаления внешних пробелов; единственный ключ постоянного сопоставления с кодом номенклатуры МойСклад
Остаток / inventoryКоличество варианта, которое Medusa использует для решения о продаже; может обновляться из МойСклад, но не равно вычисленному статусу наличия
Backorder / «под заказ»Разрешение оформить вариант при нулевом остатке; срок поставки этим термином не обещается
НаличиеВычисляемый результат: «в наличии», «под заказ» или «нет в наличии» по SYS-BR-02; учитывает режим управления inventory, остаток и backorder и не является отдельным редактируемым полем
КорзинаСерверный изменяемый набор позиций до заказа; идентификатор в браузере или ссылке восстановления является bearer capability для чтения и изменения незавершённой корзины без customer-аутентификации
РезервВременное выделение продаваемого остатка корзине или заказу; при финализации владелец меняется без промежуточного освобождения
Покупатель-гостьПокупатель без аккаунта, который может оформить заказ, но не получает кабинетные права отмены/возврата/истории
ЗаказКанонический факт продажи в Medusa с зафиксированным составом, суммой, валютой, контактами и получением; не равен платёжному или логистическому статусу
Платёжная сессияЛокальная связь корзины с операцией провайдера, суммой и валютой; не является доказательством списания
Отправление / fulfillmentИсполнение доставки конкретным провайдером, связанное с заказом и имеющее независимый жизненный цикл
Заявка на возвратРешение о допустимости обратной логистики; подтверждение создаёт обратную отправку и не означает денежный возврат
Денежный возврат / refundОперация возврата захваченных денег у платёжного провайдера; выполняется отдельно от заявки и обратной доставки
Публикация CMSРедакционная ревизия Strapi, доступная read-интерфейсу; до принятия backend не является публичным снимком
Снимок контентаПоследняя целостная ревизия CMS, принятая и сохранённая backend для чтения витриной
Источник истиныСистема, решение которой побеждает при расхождении. Кэш, индекс, webhook и внешний документ не становятся владельцем только потому, что содержат копию
Экземпляр компании / tenantИзолированный deployment одной компании со своими доменами, данными, секретами и внешними аккаунтами; не строка tenant внутри общего runtime
ИдемпотентностьПовтор одного логического намерения не создаёт дополнительный заказ, платёжный/денежный эффект, отправление или решение

Карта канонических документов​

ВопросКанонический документСтатус относительно этой страницы
Текущие границы, инварианты, данные, интерфейсы и качестваЭта страницаНормативный системный baseline
Общие инженерные и UX-принципыdocs/specs/constitution.md, docs/specs/storefront-ux-core.mdВышестоящие принципы; не заменяют конкретный SYS-*
Контракт отдельного изменения и его задачиdocs/specs/<feature>/spec.md, stack.md, tasks.md; завершённые — docs/specs/_archive/Дельта и история решения; будущее состояние до приёмки
Фактический реестр по кодуdocs/feature-inventory.mdAs-built свидетельство и индекс, не нормативная копия baseline
Роли, процессы и владельцы данныхdocs/qa/business-overview.mdQA-модель для сверки системного смысла
Риск и проверка поведенияdocs/qa/user-journeys.md, docs/qa/test-cases/ПУТ-*, Given/When/Then и свидетельства SYS-*
Активное нарушение, живой пробел или платформенная границаdocs/qa/active-limitations.mdЕдинственный реестр ОГР-*, ЖИВ-*, ПЛТ-*
Особенности внешнего API и стендаdocs/known-quirks.mdДиагностический источник; не переопределяет норму
Действия покупателя и сотрудниковПокупатель, администратор, владелец, складПошаговые инструкции без дублирования системного контракта
Реализация API, CMS, платежей, доставки, учёта и инфраструктурыРаздел разработчикаТехнические детали интерфейсов и runbook
Состав, setup и правила работы с репозиториемREADME.md, CLAUDE.mdОперационная и инженерная инструкция

Открытые вопросы к владельцу​

  • TBD-01 — бизнес-результаты: являются ли пять результатов раздела 2 целевыми бизнес-результатами продукта, кто владеет каждым и какими метриками или наблюдаемыми исходами измеряется успех?
  • TBD-02 — постоянные не-цели: какие из направлений — международная доставка, встроенная финансовая аналитика, мультитенантность, фискализация онлайн-платежей и полная двусторонняя синхронизация каталога с МойСклад — исключены постоянно, а какие остаются возможным будущим развитием?
  • TBD-03 — юридические и safety-обязательства: какие обязательства действуют для согласия и персональных данных, сроков хранения и удаления, рассылок, лакокрасочных товаров и опасных грузов?
  • TBD-04 — специальные страницы админки: допустим ли постоянный доступ любого вошедшего администратора к МойСклад, доставке, возвратам и legacy-контенту или нужны отдельные серверные разрешения?
  • TBD-05 — профили владельца и склада: нужны ли формальные роли с утверждённой матрицей прав или достаточно индивидуальных назначений Medusa и отдельного доступа к МойСклад?
  • TBD-06 — чтение статуса платежа: достаточно ли знания непредсказуемого идентификатора корзины или требуется дополнительное подтверждение покупателя?
  • TBD-07 — производительность и ёмкость: какие целевые перцентили времени ответа, конкурентность и объёмы каталога/заказов утверждаются для поиска, карточки, корзины, checkout и административных панелей?
  • TBD-08 — доступность и восстановление: какие SLA, RTO/RPO, схема резервного копирования, частота теста восстановления и ответственные утверждаются для постоянных данных, CMS, файлов, Redis и поиска?
  • TBD-09 — операционное хранение: как долго хранить и когда удалять неперсональные корзины, состояния workflow, журналы webhook/синхронизаций, старые снимки и неиспользуемые файлы? Персональные данные остаются частью TBD-03.
  • TBD-10 — профиль экземпляра «Колорики»: подтвердить production-домен, брендовые значения, реальные контакты/контент, склад и коробку, включённые внешние аккаунты, платёжный контур и почтового отправителя; какие из жёстких привязок бренда, локали и валюты должны стать tenant-настройками без кода?
  • TBD-11 — изоляция ключей: считать ли уникальный для каждого окружения ключ шифрования обязательным продуктовым инвариантом с запретом пустых/default-значений при запуске, или оставить разделение ключей операторской мерой?
  • TBD-12 — privacy-граница видео: допустима ли автоматическая lazy-загрузка плеера YouTube/Vimeo при открытии карточки товара, или до прямого запроса браузера к видеопровайдеру нужны явное действие или согласие покупателя?
  • TBD-13 — ссылка восстановления корзины: допустим ли текущий bearer-доступ к незавершённой корзине по одному идентификатору или ссылка должна получить подпись, срок действия либо одноразовость?