# Настройка блока отзывов WB

Date: 2026-09-06. TASK-126 implementation; TASK-131 production release, client 0.25.0.
Release receipt: `operations/platform/task131-reviews-release-20260906/result.json`.

В существующий `customer-auto-responder` добавлен draft-only блок для отзывов.
Он использует общий operation runtime на main-node и существующий account-bound
Data Connector. Новые серверы, marketplace credentials, marketplace API clients
и контейнеры на магазин не создаются. Production deployment and checks are recorded in the TASK-131 receipt;
публичный каталог и процесс health не доказывают readiness конкретного кабинета.

## Результат аудита

Изучены `revies_services.md` и семь листов
`WB_otzyvy_servisy_i_reestr_2026-09-06.xlsx`: Старт, Сервисы, Матрица,
Основания, Шаблоны жалоб, Реестр, Источники. Матрица содержит 15 сценариев,
основания — 8 записей; реестр — 200 пустых заготовок, а не реальные кейсы.
Исходники не изменены и не добавлены в Git. SHA-256 и пределы проверки:
`operations/platform/task126-reviews-20260906/research.json`.

До изменения central responder использовал статические правила, требовал
`auto_send=true` даже для shadow и принимал решение по channel/product/rating/words.
Он не вызывал LLM. Нормализация теряла pros/cons и состояние фото/видео.
Отдельный `marketplace-ai-responder` содержит mock workflow и OpenRouter code,
но его README явно исключает live collectors и реальную публикацию. Это не
готовый backend центрального responder и не основание включать его Compose.

## Сервисы и граница интеграции

Канонический список находится в `xmp_agent_catalog.json#/review_block`.
`automations.reviews.catalog` возвращает его с формой настройки. Повторная
проверка официальных открытых страниц выполнена 06.09.2026; это проверка
заявлений поставщиков, без входа в их кабинеты и без тестов vendor API.

| Сервис | Что проверено / ограничение |
| --- | --- |
| [Спикс](https://spix.ru/) | Страница описывает ИИ, шаблоны, ручные ответы, классификацию и модерацию сложных ответов. |
| [MPSTATS](https://mpstats.io/instruments/wildberries/autoreplies) | Повторное чтение страницы не удалось; описание правил остаётся утверждением входного исследования. |
| [ОТВЕТО](https://otveto.ru/product/otvety-na-otzyvy/) | Страница описывает несколько моделей, фильтры, автоматическую отправку и модерацию. Доступ к моделям сервиса извне не подтверждён. |
| [Отвечумба](https://otvechumba.ru/) | Официальная страница доступна; позитив/негатив и работа команды описаны как функции продукта. |
| [MarketGuru](https://marketguru.io/tools/autoreviews) | Официальная страница автоответов доступна. Это не контракт внешнего API. |
| [ЭРА](https://airesponses.ru/) | Страница автоответов доступна; независимого API-canary нет. |
| [WBARCODE](https://wbarcode.ru/auto-review-replies) | Страница описывает автоматические и ручные ответы. |
| [inSales](https://www.insales.ru/blogs/university/kak-otvetit-na-otzyv-na-wildberries) | Доступна статья о работе с отзывами; она не доказывает account-bound интеграцию X-MP. |
| [Точка](https://tochka.com/rko/marketplace-cabinet/generator-avtootvetov-na-otzyvy/) | Повторное чтение не удалось; доступность и ограничения требуют проверки. |
| [СДЭК](https://ff.cdek.ru/blog/ai-avtootvetchik-na-otzyvy-wildberries) | Официальный анонс AI-ответчика доступен; анонс не подтверждает внешнее управление из X-MP. |
| [CodeMP](https://codemp.ru/) | Смежный анализ активности. Сигнал аномалии не доказывает автора-конкурента. |

Все внешние сервисы имеют `not-integrated`, `api_verified=false` и
`marketplace_write=false`. Выбор такого сервиса возвращает `blocked`,
`service_not_integrated`, `config=null`; чужой сервис не заменяется native.
Для подключения нужен конкретный provider contract: разрешённый способ auth,
registered read/write methods в marketplace-data-skills, grants, redaction,
идемпотентность, ограничения, readback и canary. Оплата или выдача ключа сама по
себе не подтверждает ни API, ни доступ к LLM, ни право публикации.

## Tools и рабочий путь

1. `xmp.services.list`, `automations.status`: эффективные account grants и runtime.
2. `automations.reviews.catalog`: service states и `prepare_schema`.
3. Явно прочитать нужные инструкции и задачу в Seller Memory. Подтвердить продукты,
   оценки, исключения, дополнительные темы эскалации и лимит до 20 случаев.
4. `automations.reviews.prepare`: проверить input и получить несохранённый config.
5. `automations.config.apply` с `domain=responder` и стабильным idempotency key;
   scope/credentials инжектирует gateway. `automations.config.get` — readback.
6. Ручной shadow run либо queued job; читать `automations.jobs.get(job_id)`: полный
   `result.review_cases` доступен в detail. History lists сохраняют count и
   `review_cases_detail_tool`, не повторяют полные черновики во всех строках.
   Расписание отдельно: disabled → ручная проверка → отдельное включение владельцем.

Catalog/prepare являются локальными вычислениями клиента после проверки live
capability с `operations.read`. Они ничего не записывают и не вызывают моделей.
Apply использует прежний маршрут `/cabinet/api/agent/automations/config/apply`
с `operations.plan`; центральный controller повторно валидирует скомпилированный
контракт. Неизвестные поля, auto_send=true, смена канала, чужой provider и execute
mode отвергаются даже при обходе клиентского compiler.

Минимальный пример prepare (только синтетические refs, не готовая настройка магазина):

```json
{
  "config_id": "reviews-pilot-1",
  "service_id": "native",
  "generation": "template",
  "memory_binding": {
    "instructions_ref": "memory-revision://instructions/1",
    "task_ref": "task-revision://reviews/1"
  },
  "product_ids": ["123"],
  "rating_min": 4,
  "rating_max": 5,
  "excluded_terms": [],
  "escalation_terms": ["аллергия"],
  "max_items": 10,
  "response_text": "Спасибо за обратную связь."
}
```

Пустые исключения в примере не являются политикой любого магазина.
Runtime хранит только immutable compiled constraints и refs. Ref проверяется
синтаксически; этот compiler не подтверждает существование или содержание
Memory revision и не читает её. Ответственный агент получает действительные
refs через scoped Memory API; права не выводятся из строки reference.

## Модели и подготовка ответа

`template` использует согласованный статический текст, LLM отсутствует.
`agent-draft` принимает `model_ref` (происхождение результата) и до 20 `drafts`:
`review_id`, `source_text_sha256`, `response_text`, непустые `evidence_refs`.
Черновик готовит внешняя модель, уже доступная агенту. Выбор модели в harness
происходит до этого вызова. Поле `model_ref` не подключает OpenRouter, не меняет
модель Codex и не отправляет данные внешнему SaaS. Новых model endpoints нет.

Хеш — SHA-256 UTF-8 адаптированного текста: непустые text/question, pros и cons
в таком порядке соединяются `\n`. Если текст изменился, старый черновик не
прикладывается. ID и product scope защищают от применения к другому отзыву.
Evidence refs — provenance, не автоматическая проверка фактов. Поведение модели,
галлюцинации и обещания требуют проверки человеком.

## Риски, кейсы и жалобы

Новая конфигурация всегда draft-only, `observe` или `shadow`; rules имеют
`auto_send=false`. Decision выдаёт `action=review_case`, а не исполнимый send_reply.
Все случаи имеют `human_review_required=true`, даже положительные. Legacy rules
без `review_policy` сохраняют прежнее поведение; они не получают новый статус
или разрешения автоматически.

В текст включены pros/cons. `has_media=null` означает неизвестные данные,
а не отсутствие фото. Простые словари маркируют safety, quality, authenticity,
legal, compensation, mismatch и store escalation. Это эвристики, не полноценная
смысловая классификация: ирония, угрозы, скрытая реклама и другие случаи могут
потребовать анализа агентом. Поэтому положительный match не разрешает отправку.
При рисках шаблон подавляется; точный agent draft остаётся материалом для человека.
Изменённый source hash и incomplete source подавляют и agent draft.

Каждый plan case содержит три независимых статуса: reply, problem, complaint,
next_action и evidence refs. Это снимок решения, не новый бизнес-реестр.
Seller Memory владеет долговременной задачей случая, ответственным, сроком,
следующим действием и проверенным outcome. Публикация ответа не завершает
проблему покупателя; ожидание не является закрытием. Повторные циклы могут
повторно предложить незакрытый кейс: агент обновляет прежнюю Memory task,
не создаёт дубликат. Автоматический синхронизатор кейсов в этом release отсутствует.

Жалобы не отправляются. Методология и skill требуют проверяемого фрагмента,
основания действующих правил и evidence. Проверка модерации, удаление и исключение
из рейтинга — разные outcomes. Номера пунктов и обещания удаления не генерируются
программно. Матрица R01–R15 служит инструкцией для reviewer: этот release не
выдаёт эвристическую классификацию за реализацию всех 15 сценариев.

## Сборка, проверка и восстановление

Canonical compiler: `tools/customer_auto_responder/reviews.py`.
`generate_xmp_agent_catalog.py --write` генерирует portable
`connector/xmp_reviews.py` с service catalog, а также прежние JSON/Markdown
проекции. Его нельзя править вручную; `--check` проверяет синхронность.
Production compiler поставляется внутри существующего `xmp_updater.py` asset
(генерируемый блок), который MCP импортирует как REVIEWS. Manifest сохраняет
прежние 10 targets; новые зависимости и файлы на клиенте не требуются.
`generate_xmp_agent_catalog.py --check` проверяет standalone и bundled projections.
Обновление с 0.24.3 проходит через прежний verified updater/ABI self-check;
opt-in/opt-out и rollback сохраняются. После обновления появятся
`automations.reviews.catalog` и `automations.reviews.prepare`.

Для проверки пользователем: обновить подключённый X-MP client обычным
`xmp.client.update` (если auto-update устройства отключён), затем попросить агента
«Покажи доступные сервисы отзывов и подготовь настройку черновиков». Tools требуют
ключа с operations.read; сохранение правил — operations.plan. Подготовка без
сохранения ничего не меняет. Продукты и бизнес-ограничения выбирает владелец.

Для локальных runtime tests требуется существующая runtime dependency
`psycopg[binary]==3.2.9` (см. operation-runtime Dockerfile). Устанавливать её в
отдельный virtualenv, например `python3 -m venv --system-site-packages /tmp/task126-review-tests`;
затем `/tmp/task126-review-tests/bin/pip install "psycopg[binary]==3.2.9"`.
Тесты используют synthetic snapshots и не подключаются к PostgreSQL.

Production promotion требует cumulative Account source inventory, проверки
реального shared operation-runtime image, сохранения rollback refs, одной
account canary и readback. Изолированный production checkout сохраняет исходники release;
чужой dirty canonical checkout не переключается и не перезаписывается.
База данных не меняется; миграций нет. При rollback сначала отключить только
новые review jobs, вернуть прежнюю responder config revision и предыдущие
Account/client/runtime images; новые review_case планы старым executor не передавать.
