{
  "schema_version": 1,
  "catalog_version": "2026-10-07.unified-main.1",
  "client_pack_version": "0.39.4",
  "title": "X-MP agent service and connector catalog",
  "canonical_source": "deploy/x-mp-account/app/xmp_agent_catalog.json",
  "public_origin": "https://x-mp.ru",
  "service": "x-mp",
  "cabinet": "/cabinet/",
  "agent_context": "/cabinet/api/agent/context",
  "agent_tasks": "/cabinet/api/agent/tasks",
  "wildberries_docs": "/services/wildberries/docs",
  "wildberries_health": "/services/wildberries/healthz",
  "seller_memory_hub": "/services/seller-memory-hub",
  "seller_memory_docs": "/services/seller-memory-hub/docs",
  "seller_memory_health": "/services/seller-memory-hub/health",
  "discovery": {
    "agent_guide": "/agents.md",
    "short_guide": "/llms.txt",
    "human_docs": "/docs/",
    "machine_catalog": "/services",
    "account_context": "/cabinet/api/agent/context",
    "account_catalog": "/cabinet/api/agent/connectors"
  },
  "state_vocabulary": [
    "available",
    "connected",
    "not-ready",
    "not-connected",
    "disabled",
    "private",
    "registry-only-disabled",
    "tenant-runtime-control",
    "service-enabled-needs-account-binding",
    "service-enabled-mcp-gateway-pending",
    "mcp-gateway-pending",
    "agent-policy-foundation",
    "gateway-not-configured",
    "shadow-runtime",
    "client-config-dependent",
    "planned",
    "queued-shadow-runtime"
  ],
  "skills": [
    {
      "skill_id": "xmp-wildberries-cabinet",
      "summary": "Cabinet data analysis and readiness-first answers.",
      "connector_ids": [
        "wildberries-cabinet-data",
        "wildberries-public"
      ]
    },
    {
      "skill_id": "xmp-product-card",
      "summary": "Evidence-backed card diagnosis, SEO, attributes and media drafts; capability-gated production and exact operation plans.",
      "connector_ids": [
        "wildberries-cabinet-data",
        "wildberries-public",
        "cabinet-tools",
        "seller-memory",
        "content-media"
      ]
    },
    {
      "skill_id": "xmp-competitor-research",
      "summary": "Bounded competitor and public-market research.",
      "connector_ids": [
        "wildberries-public",
        "research-swarm"
      ]
    },
    {
      "skill_id": "xmp-reports-artifacts",
      "summary": "Private report and artifact navigation.",
      "connector_ids": [
        "reports-artifacts"
      ]
    },
    {
      "skill_id": "xmp-work-memory",
      "summary": "Authoritative business instructions, goals, knowledge, task continuity and evidence-backed outcomes through Seller Memory.",
      "connector_ids": [
        "seller-memory"
      ]
    },
    {
      "skill_id": "xmp-support",
      "summary": "Report confirmed client or platform problems and bounded diagnostic evidence to the account-bound support queue; check status and operator reply.",
      "connector_ids": [
        "support-intake"
      ]
    },
    {
      "skill_id": "xmp-research-swarm",
      "summary": "Delegated multi-source research workflow.",
      "connector_ids": [
        "research-swarm"
      ]
    },
    {
      "skill_id": "xmp-cabinet-operations",
      "summary": "Plan/approval/read-back boundaries for cabinet operations.",
      "connector_ids": [
        "cabinet-tools"
      ]
    },
    {
      "skill_id": "xmp-automations",
      "summary": "Observe/shadow automation policies and scheduler safety.",
      "connector_ids": [
        "scheduler",
        "cabinet-tools"
      ]
    },
    {
      "skill_id": "xmp-advertising-bidder",
      "summary": "Task-bound bidder settings, fixed/target-DRR shadow strategies, lifecycle and explicit funding/conversion execution gaps.",
      "connector_ids": [
        "cabinet-tools",
        "scheduler"
      ]
    },
    {
      "skill_id": "xmp-pricing-config",
      "summary": "Configure registered repricer tasks, Memory bindings and effective price limits.",
      "connector_ids": [
        "cabinet-tools",
        "seller-memory"
      ]
    },
    {
      "skill_id": "xmp-pricing-operations",
      "summary": "Prepare exact price plans, owner approval and verified execution follow-up.",
      "connector_ids": [
        "cabinet-tools",
        "seller-memory"
      ]
    },
    {
      "skill_id": "xmp-analytics",
      "summary": "Сквозная и выборочная аналитика магазина по продажам, рекламе, воронке и остаткам.",
      "connector_ids": [
        "wildberries-cabinet-data"
      ]
    },
    {
      "skill_id": "xmp-finance",
      "summary": "Деньги, выплаты и прибыль с проверкой затрат и зрелости периода.",
      "connector_ids": [
        "wildberries-cabinet-data"
      ]
    },
    {
      "skill_id": "xmp-monitoring",
      "summary": "Проверять мониторинг цен и карточек, историю изменений и наблюдаемое влияние.",
      "connector_ids": [
        "wildberries-cabinet-data",
        "wildberries-public"
      ]
    },
    {
      "skill_id": "xmp-outcome-review",
      "summary": "Проверять результат выполненных действий, сравнивать до/после и сохранять вывод.",
      "connector_ids": [
        "wildberries-cabinet-data",
        "seller-memory"
      ]
    },
    {
      "skill_id": "xmp-reviews",
      "summary": "Настраивать сценарии отзывов и вопросов, готовить ответы и проверять результат.",
      "connector_ids": [
        "cabinet-tools",
        "wildberries-public"
      ]
    },
    {
      "skill_id": "xmp-service-settings",
      "summary": "Диагностировать и настраивать подключения, права и параметры сервисов X-MP.",
      "connector_ids": [
        "xmp-account",
        "cabinet-tools"
      ]
    },
    {
      "skill_id": "xmp-notifications",
      "summary": "Читать уведомления и настраивать доставку, расписания и тихие часы.",
      "connector_ids": [
        "telegram",
        "scheduler"
      ]
    },
    {
      "skill_id": "xmp-daily-assistant",
      "summary": "Ежедневные приоритеты магазина, расписание помощника и контроль follow-up.",
      "connector_ids": [
        "wildberries-cabinet-data",
        "seller-memory"
      ]
    },
    {
      "skill_id": "xmp-inventory",
      "summary": "Анализировать остатки и дефицит, подготовить рекомендации по запасам.",
      "connector_ids": [
        "wildberries-cabinet-data"
      ]
    },
    {
      "skill_id": "xmp-advertising-audit",
      "summary": "Аудит рекламы: потери, воронка, экономика и план проверки эффекта.",
      "connector_ids": [
        "wildberries-cabinet-data",
        "cabinet-tools",
        "seller-memory"
      ]
    },
    {
      "skill_id": "xmp-replenishment-plan",
      "summary": "План пополнения: количество, сроки и бюджет с учётом спроса и наличия.",
      "connector_ids": [
        "wildberries-cabinet-data",
        "seller-memory"
      ]
    },
    {
      "skill_id": "xmp-warehouse-allocation",
      "summary": "Распределение партии по складам: варианты затрат и покрытия спроса.",
      "connector_ids": [
        "wildberries-cabinet-data",
        "seller-memory"
      ]
    },
    {
      "skill_id": "xmp-fbs-control",
      "summary": "Контроль ФБС: сроки, задания, остатки и план действий без исполнения.",
      "connector_ids": [
        "wildberries-cabinet-data",
        "seller-memory"
      ]
    },
    {
      "skill_id": "xmp-wb-rules",
      "summary": "Разбор оферты и правил WB по применимой редакции и официальным источникам.",
      "connector_ids": [
        "seller-memory"
      ]
    },
    {
      "skill_id": "xmp-deduction-review",
      "summary": "Проверка удержаний: сверка начисления, основания и проект обращения.",
      "connector_ids": [
        "wildberries-cabinet-data",
        "seller-memory"
      ]
    }
  ],
  "connectors": [
    {
      "connector_id": "xmp-account",
      "name": "X-MP Account",
      "category": "identity-context",
      "summary": "Account-bound identity, capabilities, readiness, service discovery and verified client updates.",
      "owner": "marketplace-platform/deploy/x-mp-account",
      "default_state": "available",
      "visibility": "public-bootstrap",
      "effect_ceiling": "project-local-update",
      "auth": "xmp-agent-key-file",
      "docs": "/docs/services/account/",
      "health": "/cabinet/health",
      "active_tools": [
        "agent.me",
        "context.get",
        "capabilities.list",
        "readiness.get",
        "xmp.services.list",
        "xmp.connectors.list",
        "xmp.update.check",
        "xmp.update.apply",
        "interactions.history",
        "xmp.client.instructions",
        "xmp.client.doctor"
      ],
      "planned_tools": [],
      "health_contract": {
        "route": "GET /cabinet/health",
        "effect": "read",
        "scope": "service-liveness-and-database-only",
        "account_readiness": false
      }
    },
    {
      "connector_id": "agent-node-core",
      "name": "Agent Node Core",
      "category": "local-node",
      "summary": "Verified local node, module, connector and non-secret settings projection when a protected node config is installed.",
      "owner": "marketplace-platform/deploy/x-mp-account/connector",
      "default_state": "client-config-dependent",
      "visibility": "project-local",
      "effect_ceiling": "read",
      "auth": "protected-node-config-plus-xmp-agent-key",
      "docs": "/docs/agents/",
      "active_tools": [
        "node.me",
        "modules.list",
        "connectors.list",
        "settings.get"
      ],
      "planned_tools": []
    },
    {
      "connector_id": "wildberries-cabinet-data",
      "name": "Wildberries cabinet data",
      "category": "data",
      "summary": "Credential-bound prepared analytics and complete discovery of authorized stored WB sources, record versions, immutable raw files and observed collection/access evidence.",
      "owner": "marketplace-platform/deploy/x-mp-account",
      "default_state": "not-ready",
      "visibility": "account-private",
      "effect_ceiling": "derived-project-artifact",
      "auth": "xmp-agent-key-file",
      "docs": "/docs/services/data/",
      "health": "/cabinet/api/agent/readiness",
      "internal_routes": [
        "GET /v1/analytics/finance-sku-reconciliation (Data connector; provisional settlement and cost/tax version coverage only)",
        "GET /v1/business/costs (Data connector; owner_costs grant; authenticated account only; optional cost input)",
        "POST /internal/v1/business/costs (Data connector; owner_costs_write service grant; account-bound owner_input role; versioned cost input only; no marketplace write)"
      ],
      "active_tools": [
        "datasets.list",
        "cabinet.overview",
        "analysis.query",
        "product.360",
        "finance.summary",
        "metrics.catalog",
        "metrics.status",
        "metrics.completeness",
        "metrics.query",
        "dataset.query",
        "dataset.export",
        "monitor.status",
        "monitor.timeline",
        "monitor.series",
        "assistant.daily",
        "assistant.followup",
        "assistant.action.record",
        "assistant.schedule",
        "monitor.compare",
        "monitor.history",
        "monitor.snapshot",
        "monitor.media",
        "collection.sources",
        "collection.records",
        "collection.history",
        "collection.access",
        "collection.artifacts",
        "collection.artifact.download"
      ],
      "planned_tools": []
    },
    {
      "connector_id": "wildberries-public",
      "name": "Wildberries public market data",
      "category": "public-market-data",
      "summary": "Bounded WB public reads including brands, subject/supplier dictionaries, search filters/tags, category routing, explicit CDN cards/recommendations and anonymized reviews v2.",
      "owner": "marketplace-connector-wb",
      "default_state": "not-ready",
      "visibility": "protected-public-service",
      "effect_ceiling": "read",
      "auth": "service-specific-bearer",
      "docs": "/docs/services/wildberries/",
      "health": "/services/wildberries/healthz",
      "openapi": "/services/wildberries/openapi.json",
      "mcp": "/services/wildberries/mcp/",
      "active_tools": [
        "public.product.get",
        "public.search",
        "public.suggest",
        "public.card_content.get",
        "public.rich_content.get",
        "public.reviews.get",
        "public.questions.get",
        "public.menu.get",
        "public.category.get",
        "public.category.catalog",
        "public.seller.get",
        "public.seller.catalog",
        "public.seller.filters",
        "public.similar.get",
        "public.recommendations.get",
        "public.media.get",
        "public.category.menu",
        "public.brand.get",
        "public.brand.catalog",
        "public.brand.filters",
        "public.seller.dictionary.get",
        "public.subjects.get",
        "public.search.filters",
        "public.search.tags",
        "public.cdn_card.get",
        "public.content_recommendations.get",
        "public.reviews.v2.get",
        "public.reviews.tags",
        "public.site_path.get",
        "public.brand.metadata.get",
        "public.seller.metadata.get",
        "public.category.metadata.get",
        "public.product.snapshot"
      ],
      "planned_tools": [],
      "verification": {
        "state": "deployed-upstream-partial",
        "evidence": "docs/wb-public-storefront.md",
        "limits": [
          "Browser schemas do not establish required query values or server access.",
          "Public counters are not competitor sales over a period.",
          "Personalized recommendations are not reproduced.",
          "Navigation shard does not establish category API routing; searchQuery is required for category catalog.",
          "Commerce denial does not block static identifiers, supplier metadata, questions or feedback v2; reviews/snapshot use independent static-card fallback.",
          "Per-component snapshot status and managed skills distinguish discovery, commerce and independent content sources; integration readiness is not upstream readiness.",
          "Client0.39.1 wraps public array replies as items and accepts bounded8MiB public JSON; other connectors retain existing limits.",
          "Current public source routes, captcha-token use, optional-content404 and original403/429 are explicit; source access must pass live canary before readiness is claimed.",
          "Anonymous search and tags use observed u-search/u-search-tags; Redis anti-bot credential goes in x_wbaas_token cookie. Buyer Authorization/x-userdata never imported. Source/proxy timeouts remain distinguishable from403/429."
        ]
      },
      "client_transport": {
        "version": "0.39.2",
        "maximum_response_bytes": 8388608,
        "array_envelope": "items",
        "scope": "GET /cabinet/api/agent/public/* only",
        "write": false
      },
      "typed_extensions": {
        "public.cdn_card.get": {
          "variant": [
            "card",
            "short-card",
            "rich",
            "promo",
            "documents",
            "highlight",
            "wholesale_threshold"
          ],
          "coordinates": "explicit observed nm_id/cluster/family; no arbitrary URL"
        },
        "registered_media_archive": {
          "geobasket_families": [
            "mow-basket-cdn",
            "mow-videonme-cdn"
          ],
          "effect": "read",
          "bounded_bytes": 33554432,
          "agent_mcp_exposed": false
        },
        "frontend_route_resolution": {
          "fallback_shards": 65,
          "source": "entry.db06148e344c8a56.js reviewed 2026-10-06",
          "priority": "dynamic route-map override before fallback",
          "dynamic_geobasket": "explicit observed coordinates; dynamic map implementation not present in supplied entry bundle"
        },
        "anonymous_browser_contract": {
          "observed_date": "2026-10-06",
          "search_path": "/__internal/u-search/exactmatch/ru/common/v18/search",
          "search_tags_path": "/__internal/u-search-tags/search-tags/api/v3/query",
          "userid": "0",
          "queryid": "generated per request from connector-owned anonymous wbauid and UTC timestamp",
          "spa_version": "14.27.3 observed; configurable, not forever static",
          "requested_with": "XMLHttpRequest",
          "antibot_transport": "x_wbaas_token cookie from existing Redis provider; no buyer Authorization or imported cookies",
          "dest": "explicit existing caller option; user examples positive1259570991 and B2B negative-1724815 are different contexts",
          "state": "deployed source0.10.4; owner canary verified search100 products, filters, tags, menu and product; other routes require individual checks"
        },
        "public.product.get": {
          "dest": "optional signed nonzero bigint delivery region, forwarded unchanged through scoped read facade"
        }
      },
      "health_diagnostics": {
        "source_cooldowns": "authenticated connector health only: origin/status/until_unix; no credentials",
        "canary_handoff": "existing cooldown deadlines seed promoted runtime without resetting source limits"
      }
    },
    {
      "connector_id": "seller-memory",
      "name": "Seller Memory",
      "category": "memory-tasks",
      "summary": "Authoritative business context and tasks, bounded context reads, versioned task checkpoints, action records and evidence-backed closeout through the account gateway.",
      "owner": "seller-agent-memory",
      "default_state": "service-enabled-needs-account-binding",
      "visibility": "account-private",
      "effect_ceiling": "project-state",
      "auth": "xmp-agent-key-file-via-gateway",
      "docs": "/docs/services/memory/",
      "health": "/services/seller-memory-hub/health",
      "active_tools": [
        "tasks.search",
        "tasks.resume",
        "artifacts.list",
        "artifacts.get",
        "artifacts.content",
        "memory.context",
        "tasks.checkpoint",
        "tasks.record",
        "tasks.close"
      ],
      "planned_tools": [
        "tasks.create",
        "memory.retrieve"
      ]
    },
    {
      "connector_id": "research-swarm",
      "name": "Research Swarm",
      "category": "delegated-analysis",
      "summary": "Disabled by owner and excluded from R1. Research workers, model gateways and the remaining dedicated adapters/proxies/database are stopped under TASK-144. No automatic resume.",
      "owner": "marketplace-platform",
      "default_state": "disabled",
      "visibility": "account-private",
      "effect_ceiling": "project-state",
      "auth": "xmp-agent-key-file-via-gateway",
      "docs": "/docs/services/research-swarm/",
      "active_tools": [],
      "planned_tools": [
        "research.submit",
        "research.status",
        "research.result",
        "research.cancel"
      ],
      "availability_policy": {
        "owner_disabled": true,
        "reason": "Owner pause TASK-144; account module preferences cannot reactivate the stopped service"
      }
    },
    {
      "connector_id": "reports-artifacts",
      "name": "Reports and artifacts",
      "category": "reports-storage",
      "summary": "Private report definitions, paused creation, manual runs, schedules, verified result and artifact navigation.",
      "owner": "marketplace-reports",
      "default_state": "disabled",
      "visibility": "account-private",
      "effect_ceiling": "project-state",
      "auth": "xmp-agent-key-file-via-gateway",
      "docs": "/docs/services/reports/",
      "active_tools": [
        "artifacts.list",
        "artifacts.get",
        "artifacts.content",
        "reports.list",
        "reports.create",
        "reports.run",
        "reports.schedule",
        "reports.status",
        "reports.result"
      ],
      "planned_tools": []
    },
    {
      "connector_id": "knowledge",
      "name": "Knowledge Base",
      "category": "rules-methods",
      "summary": "Reviewed methods and evidence-backed knowledge through bounded typed retrieval, without vector search.",
      "owner": "marketplace-knowledge-base",
      "default_state": "mcp-gateway-pending",
      "visibility": "private",
      "effect_ceiling": "read",
      "auth": "service-specific-principal-bound-token",
      "docs": "/docs/services/knowledge/",
      "active_tools": [],
      "planned_tools": [
        "knowledge.search",
        "knowledge.get"
      ]
    },
    {
      "connector_id": "bug-report-center",
      "name": "Bug Report Center",
      "category": "support-quality",
      "summary": "Redacted intake for platform defects, stale data, repeated failures and security or scope concerns.",
      "owner": "marketplace-platform/deploy/bug-report-center",
      "default_state": "mcp-gateway-pending",
      "visibility": "protected-public-service",
      "effect_ceiling": "support-record",
      "auth": "service-specific-node-token",
      "docs": "/docs/bug-report-center/",
      "health": "/services/bug-report-center/healthz",
      "active_tools": [],
      "planned_tools": [
        "bug-report.submit",
        "bug-report.status"
      ]
    },
    {
      "connector_id": "support-intake",
      "name": "Agent Support Intake",
      "category": "support-quality",
      "summary": "Account-bound redacted agent reports for defects, data quality, ideas and feature requests, with private operator triage and Telegram alerts.",
      "owner": "marketplace-platform/deploy/x-mp-account/app/support_intake.py",
      "default_state": "available",
      "visibility": "account-private",
      "effect_ceiling": "support-record",
      "auth": "xmp-agent-key-file-via-gateway",
      "docs": "/docs/bug-report-center/",
      "active_tools": [
        "support.submit",
        "support.status"
      ],
      "planned_tools": []
    },
    {
      "connector_id": "telegram",
      "name": "Telegram owner channel",
      "category": "notifications",
      "summary": "Account-bound redacted notifications and delivery readiness; advertising.task_verified is emitted transactionally after all scheduled advertising actions are verified; operation.failed covers unconfirmed outcomes. Delivery requires explicit user preferences.",
      "owner": "marketplace-platform/deploy/x-mp-notifications",
      "default_state": "not-connected",
      "visibility": "account-private",
      "effect_ceiling": "third-party-message",
      "auth": "xmp-agent-key-file-via-gateway",
      "docs": "/docs/services/reports/#telegram",
      "active_tools": [
        "telegram.status",
        "notifications.history",
        "notifications.settings.get",
        "notifications.settings.update"
      ],
      "planned_tools": [
        "notifications.test"
      ]
    },
    {
      "connector_id": "scheduler",
      "name": "Tenant scheduler",
      "category": "scheduled-tasks",
      "summary": "Account-owned schedule definitions with tenant-local execution, queue, cursor and outbox.",
      "owner": "marketplace-platform/deploy/x-mp-account",
      "default_state": "mcp-gateway-pending",
      "visibility": "account-private",
      "effect_ceiling": "project-state",
      "auth": "xmp-agent-key-file",
      "docs": "/docs/services/scheduler/",
      "active_tools": [
        "scheduled.templates.list",
        "scheduled.tasks.preview",
        "scheduled.tasks.list",
        "scheduled.tasks.get",
        "scheduled.tasks.create",
        "scheduled.tasks.update",
        "scheduled.tasks.history",
        "scheduled.tasks.enable",
        "scheduled.tasks.disable",
        "scheduled.tasks.run"
      ],
      "planned_tools": []
    },
    {
      "connector_id": "cabinet-tools",
      "name": "Cabinet automations and operations",
      "category": "marketplace-management",
      "summary": "Task-bound observe/shadow bidder: fixed or target-DRR, bid bounds, schedule, per-campaign daily spend and stock protections; config create/update/disable/delete and decision history. Funding, conversion/CTR optimization and marketplace execution are not enabled.",
      "owner": "marketplace-platform/deploy/x-mp-account",
      "default_state": "disabled",
      "visibility": "account-private",
      "effect_ceiling": "approval-required-marketplace-write",
      "auth": "xmp-special-key-with-exact-scopes",
      "docs": "/docs/services/automations/",
      "active_tools": [
        "automations.templates.list",
        "automations.catalog",
        "automations.credentials.requirements",
        "automations.policy.validate",
        "automations.status",
        "automations.runs.list",
        "automations.config.get",
        "automations.config.apply",
        "automations.shadow.run",
        "automations.jobs.create",
        "automations.jobs.get",
        "automations.jobs.list",
        "automations.operation.plan.get",
        "automations.policy.plan",
        "automations.operation.plan.register",
        "automations.emergency-stop",
        "automations.reviews.catalog",
        "automations.reviews.prepare",
        "repricer.config.validate",
        "repricer.plan",
        "repricer.plan.get",
        "repricer.reconcile",
        "advertising.tasks.readiness",
        "advertising.tasks.baseline",
        "advertising.tasks.preview",
        "advertising.tasks.create",
        "advertising.tasks.list",
        "advertising.tasks.get",
        "advertising.tasks.pause"
      ],
      "planned_tools": [
        "automations.approve",
        "automations.execute"
      ],
      "access_policy": "effective operations grants and configured runtime; legacy account_settings.modules.tools does not hide already-authorized methods"
    },
    {
      "connector_id": "content-media",
      "name": "Product content and media",
      "category": "product-content",
      "summary": "Native Codex image generation from immutable service-prepared rules, facts and source metadata; private import, review and export. External generation providers deferred by owner.",
      "owner": "marketplace-platform/tools/catalog_manager",
      "default_state": "service-enabled-needs-account-binding",
      "visibility": "account-private",
      "effect_ceiling": "project-state",
      "auth": "xmp-agent-key-file-via-gateway",
      "docs": "/docs/services/content/",
      "active_tools": [
        "content.status",
        "content.settings.get",
        "content.settings.compile",
        "content.product.get",
        "content.audit.create",
        "content.brief.create",
        "content.draft.create",
        "content.review.create",
        "content.media.import",
        "content.artifact.get",
        "content.change.plan",
        "content.export",
        "content.download",
        "content.task.create",
        "content.generation.prepare"
      ],
      "planned_tools": [
        "content.media.generate",
        "content.jobs.get",
        "content.jobs.cancel",
        "content.measurement.get"
      ],
      "design_contract": {
        "version": 1,
        "state": "draft-runtime-candidate",
        "documentation_ref": "docs/content-media-integration.md",
        "business_context_owner": "seller-agent-memory",
        "source_adapter_owner": "marketplace-data-skills",
        "runtime_owner": "marketplace-platform/tools/operation_runtime",
        "placement": "main-node/marketplace-central-services",
        "execution_connector": "cabinet-tools",
        "marketplace_execute": false,
        "client_generation": "optional-session-capability-imported-as-unreviewed-artifact",
        "provider_generation": "not-implemented-client-session-or-manual-import",
        "settings": "immutable-compiled-memory-revisions-plus-execution-ledger",
        "tool_policy": [
          {
            "tool": "content.status",
            "effect": "read",
            "proposed_scope": "tasks.read"
          },
          {
            "tool": "content.settings.get",
            "effect": "read",
            "proposed_scope": "tasks.read"
          },
          {
            "tool": "content.settings.compile",
            "effect": "project-state",
            "proposed_scope": "tasks.write"
          },
          {
            "tool": "content.product.get",
            "effect": "project-state",
            "proposed_scope": "tasks.write"
          },
          {
            "tool": "content.audit.create",
            "effect": "project-state",
            "proposed_scope": "tasks.write"
          },
          {
            "tool": "content.brief.create",
            "effect": "project-state",
            "proposed_scope": "tasks.write"
          },
          {
            "tool": "content.draft.create",
            "effect": "project-state",
            "proposed_scope": "tasks.write"
          },
          {
            "tool": "content.review.create",
            "effect": "project-state",
            "proposed_scope": "tasks.write"
          },
          {
            "tool": "content.media.import",
            "effect": "project-state",
            "proposed_scope": "tasks.write"
          },
          {
            "tool": "content.change.plan",
            "effect": "project-state",
            "proposed_scope": "operations.plan"
          },
          {
            "tool": "content.artifact.get",
            "effect": "read",
            "proposed_scope": "tasks.read"
          },
          {
            "tool": "content.export",
            "effect": "project-local-artifact",
            "proposed_scope": "tasks.read"
          },
          {
            "tool": "content.download",
            "effect": "project-local-artifact",
            "proposed_scope": "tasks.read"
          },
          {
            "tool": "content.task.create",
            "effect": "project-state",
            "proposed_scope": "tasks.write"
          },
          {
            "tool": "content.generation.prepare",
            "effect": "project-state",
            "proposed_scope": "tasks.write"
          }
        ],
        "activation_gates": [
          "typed schemas and source adapter inventory",
          "account artifact authorization and immutable revision checks",
          "budget reservation and provider retry reconciliation",
          "product identity and category-specific validation",
          "gateway MCP discovery and release-manifest parity",
          "one-account canary and rollback evidence",
          "separate exact approval before any marketplace write"
        ],
        "actual_scopes": "Reuse existing tasks.read/tasks.write/analytics.read/operations.plan grants; no new key grants issued.",
        "limits": {
          "image_bytes": 12582912,
          "image_pixels": 20000000,
          "upload_http_bytes": 17825792,
          "image_formats": [
            "PNG",
            "JPEG",
            "WEBP"
          ]
        },
        "transport_routes": [
          "/cabinet/api/agent/content/media/import",
          "/internal/v1/content/storage/put",
          "/internal/v1/content/storage/get"
        ],
        "native_generation": {
          "mode": "codex_builtin",
          "prepare_tool": "content.generation.prepare",
          "requires_service_packet": true,
          "external_provider_api": "deferred_by_owner",
          "output_requires_packet_ref": true
        }
      }
    },
    {
      "connector_id": "ozon-connection",
      "name": "Ozon connection and data",
      "category": "data",
      "summary": "Account-bound Ozon data, exact-operation API and shared configuration/scheduler. Deployed routes do not establish marketplace execution readiness; source, credentials, live validation and exact owner approval remain required.",
      "owner": "marketplace-platform",
      "default_state": "tenant-runtime-control",
      "visibility": "private",
      "effect_ceiling": "approval-required",
      "auth": "account-bound agent key; owner approval for marketplace effects",
      "docs": "/docs/ozon/",
      "active_tools": [
        "ozon.status",
        "ozon.datasets",
        "ozon.schema",
        "ozon.records",
        "ozon.finance",
        "ozon.product",
        "ozon.advertising",
        "ozon.forecast",
        "ozon.plan.get",
        "ozon.plans.list",
        "ozon.connectors.status",
        "ozon.config.get",
        "ozon.config.compile",
        "ozon.schedule.get",
        "ozon.schedule.set",
        "ozon.operation.prepare",
        "ozon.operation.get",
        "ozon.operation.execute",
        "ozon.operation.reconcile",
        "ozon.schedule.run",
        "ozon.emergency_stop"
      ],
      "planned_tools": [],
      "implementation_task": "TASK-191",
      "marketplace": "ozon"
    },
    {
      "connector_id": "ozon-repricer",
      "name": "Ozon repricer",
      "category": "marketplace-management",
      "summary": "Account-bound Ozon repricer. Existing shadow drafts remain non-executable; production execution requires verified method, fresh source, exact approval and readback.",
      "owner": "marketplace-platform",
      "default_state": "shadow-runtime",
      "visibility": "private",
      "effect_ceiling": "approval-required",
      "auth": "account-bound agent key; owner approval for marketplace effects",
      "docs": "/docs/ozon/",
      "active_tools": [
        "ozon.repricer.plan"
      ],
      "planned_tools": [],
      "implementation_task": "TASK-191",
      "marketplace": "ozon"
    },
    {
      "connector_id": "ozon-communications",
      "name": "Ozon reviews and questions",
      "category": "marketplace-management",
      "summary": "Account-bound Ozon communications. Existing shadow drafts remain non-executable; production execution requires verified method, fresh source, exact approval and readback.",
      "owner": "marketplace-platform",
      "default_state": "shadow-runtime",
      "visibility": "private",
      "effect_ceiling": "approval-required",
      "auth": "account-bound agent key; owner approval for marketplace effects",
      "docs": "/docs/ozon/",
      "active_tools": [
        "ozon.communications.plan"
      ],
      "planned_tools": [],
      "implementation_task": "TASK-191",
      "marketplace": "ozon"
    },
    {
      "connector_id": "ozon-bidder",
      "name": "Ozon bidder",
      "category": "marketplace-management",
      "summary": "Account-bound Ozon bidder. Existing shadow drafts remain non-executable; production execution requires verified method, fresh source, exact approval and readback.",
      "owner": "marketplace-platform",
      "default_state": "shadow-runtime",
      "visibility": "private",
      "effect_ceiling": "approval-required",
      "auth": "account-bound agent key; owner approval for marketplace effects",
      "docs": "/docs/ozon/",
      "active_tools": [
        "ozon.bidder.plan"
      ],
      "planned_tools": [],
      "implementation_task": "TASK-191",
      "marketplace": "ozon"
    },
    {
      "connector_id": "ozon-cards",
      "name": "Ozon product cards",
      "category": "marketplace-management",
      "summary": "Account-bound Ozon cards. Existing shadow drafts remain non-executable; production execution requires verified method, fresh source, exact approval and readback.",
      "owner": "marketplace-platform",
      "default_state": "shadow-runtime",
      "visibility": "private",
      "effect_ceiling": "approval-required",
      "auth": "account-bound agent key; owner approval for marketplace effects",
      "docs": "/docs/ozon/",
      "active_tools": [
        "ozon.cards.plan"
      ],
      "planned_tools": [],
      "implementation_task": "TASK-191",
      "marketplace": "ozon"
    }
  ],
  "platform_contract": {
    "version": 1,
    "effective_date": "2026-09-05",
    "decision_state": "owner-directed",
    "deployment_state": "partially-deployed-see-observed-releases",
    "purpose": "Account-bound eyes, ears and hands for external agents: data, analytics, business memory, tasks and governed actions.",
    "authority": {
      "service_contract": "deploy/x-mp-account/app/xmp_agent_catalog.json",
      "placement": "config/deployment-topology.json",
      "repository_owners": "config/repositories.json",
      "account_identity": "config/fleet-identity.json",
      "business_context": "seller-agent-memory",
      "external_knowledge": "marketplace-knowledge-base",
      "execution_state": "marketplace-platform/tools/operation_runtime",
      "analytics_semantics": "marketplace-data-platform",
      "engineering_state": "continuara",
      "observed_state": "operations/platform/unified-working-line-20261007/result.json"
    },
    "business_memory": {
      "owner": "seller-agent-memory",
      "authoritative_fields": [
        "instructions",
        "goals",
        "business_constraints",
        "knowledge",
        "current_tasks",
        "decisions",
        "outcomes",
        "lessons"
      ],
      "duplicate_account_profile": false,
      "context_mode": "explicit-bounded-typed-retrieval",
      "external_knowledge_mode": "versioned-source-references",
      "execution_binding": [
        "memory_revision_ref",
        "task_ref",
        "policy_digest",
        "approval_ref"
      ],
      "policy_boundary": "Business intent comes from memory; grants, system prohibitions and exact operation approval are enforced by the gateway/executor.",
      "gateway_write_state": "planned",
      "pooled_runtime_validation": "pending",
      "learning_contract": {
        "scope": "account-local-by-default",
        "steps": [
          "observation",
          "evidence",
          "decision",
          "outcome",
          "lesson"
        ],
        "reuse": "explicit bounded graph/full-text recall and current task revision before repeated diagnosis",
        "promotion": "redacted evidence-backed result after review; no automatic global transfer",
        "central_collection": "manual-only; at most once per calendar day",
        "model_training": "not implied; durable evidence and lessons improve subsequent work",
        "technical_owner": "Continuara; business impact and support ref only in Seller Memory"
      }
    },
    "scaling": {
      "target_accounts": 1000,
      "capacity_verified": false,
      "capacity_evidence_ref": null,
      "service_model": "shared-services-pooled-workers",
      "account_cell": "logical-scope-not-container",
      "per_account_service_required": false,
      "shared_physical_queue_allowed": true,
      "shared_account_cursor_allowed": false,
      "cross_account_execution_allowed": false,
      "isolation": [
        "server-derived-account",
        "transaction-local-rls",
        "account-object-policy",
        "account-leases",
        "account-idempotency",
        "account-quotas",
        "credential-bound-connector"
      ],
      "admission": [
        "queue-age",
        "request-budgets",
        "cost-budgets",
        "memory-and-db-pool-bounds",
        "fair-account-scheduling",
        "retry-jitter",
        "backpressure"
      ],
      "scale_gates": [
        "1000-synthetic-identities",
        "mixed-read-analysis-task-load",
        "noisy-neighbor",
        "worker-crash-retry",
        "scope-reuse-negative-tests",
        "bounded-db-connections",
        "restore-and-replay"
      ],
      "remaining_per_account_runtime": "research-swarm-adapters-and-workers"
    },
    "data": {
      "canonical_adapter_owner": "marketplace-data-skills",
      "serving_owner": "marketplace-data-platform",
      "registered_api_only": true,
      "direct_agent_api": false,
      "raw_immutable": true,
      "modes": {
        "aggregate": "available-by-account-readiness",
        "normalized_rows": "bounded-query-and-export",
        "raw_source_artifact": "planned-typed-redacted-export"
      },
      "raw_delivery": "Authorized bounded artifact through gateway; no raw storage mounts, credentials, cookies or unrestricted object paths.",
      "analytics_contract": [
        "grain",
        "period",
        "timezone",
        "freshness",
        "completeness",
        "maturity",
        "formula_version",
        "source_refs",
        "row_count",
        "truncation",
        "limitations"
      ],
      "analytics_verification": [
        "source-to-normalized-reconciliation",
        "child-parent-rollup-parity",
        "ratio-numerator-denominator",
        "missing-not-zero",
        "late-data-revisions",
        "join-cardinality",
        "closed-period-reconciliation"
      ],
      "custom_analytics": "Registered bounded query or versioned analysis on authorized exports; custom measures must not impersonate canonical metrics.",
      "adapter_convergence": "completed-active-wb-read-paths; Data-Skills-source-pinned-with-native-canary-and-rollback",
      "request_contract": {
        "state": "deployed",
        "analysis_groups": [
          "account",
          "day",
          "product",
          "day_product"
        ],
        "max_rows": 50,
        "max_metrics": 12,
        "max_period_days": 90,
        "explicit_filters": [
          "nm_ids",
          "date_from",
          "date_to"
        ],
        "raw_rows_in_aggregate": false,
        "missing_values": "null-with-coverage",
        "ratios": "ratio-of-sums",
        "inventory": "last-per-product-then-sum",
        "normalization": "source-presence-is-not-period-completeness",
        "normalized_rows": {
          "max_rows": 50,
          "max_offset": 10000,
          "filters": [
            "nm_ids",
            "date_from",
            "date_to"
          ],
          "projection": "allowlisted fields; no payload",
          "pagination": "lookahead; completion applies only to filtered query"
        },
        "aggregate_grants": {
          "derived_metrics": "registered aggregates and bounded finance",
          "product_daily": "daily-mart aggregates only",
          "source_only": "all selected input grants required"
        },
        "builder_versions": {
          "source_normalizer": "3; migration 027 applied",
          "serving": "serving-facts-v4-source-presence",
          "metrics": "derived-metrics/5-observed-maturity"
        },
        "credential_resolution": {
          "state": "partially-enrolled-broker-not-activated",
          "mode": "trusted account/read-slot binding to private Account broker",
          "fallback_on_error": false,
          "live_mode": "existing protected account token files; no broker fallback on resolution error",
          "enrollment": "verified existing readonly slots; global activation awaits remaining readonly key and canary"
        },
        "mart_rebuild": {
          "default_days": 35,
          "maximum_explicit_days": 90,
          "outside_window_preserved": true,
          "typed_source_scan": "account history; capacity requires separate load acceptance"
        },
        "formula_version": "request-aggregate/2",
        "observed_analytics": {
          "basis": "observed source data only; no modeled demand, cash or causal effect",
          "metrics": [
            "average_ordered_unit_price",
            "cpm",
            "ad_spend_to_ordered_gmv",
            "ad_spend_per_ordered_unit",
            "operational_contribution_margin"
          ],
          "quality": "paired input observations, per-source day coverage, provisional maturity; legacy AOV alias explicitly unit-based",
          "legacy_semantics": "Observed event ratios are not order-cohort probabilities; period closure requires evidence; ROMI is not incremental."
        }
      },
      "monitoring": {
        "state": "deployed-initial-collection",
        "task": "TASK-112",
        "owner": "marketplace-data-platform",
        "architecture_ref": "docs/store-monitoring.md",
        "service_model": "one-shared-central-service-with-scheduler-and-worker",
        "placement": "main-node",
        "account_isolation": "account-bound roles, queues, leases, cursors and quotas",
        "storage_root": "MARKETPLACE_DATA_ROOT",
        "source_policy": "existing normalized versions and registered public connector; observed facts only",
        "history_policy": "compact semantic changes with previous/current version refs; no second full raw copy",
        "competitor_limit_per_account": 20,
        "capacity_verified": false,
        "activation_gate": "passed: schema/isolation tests, restore-tested backup, one-account canary; four accounts active, freshness and resource follow-up ongoing",
        "query_contract": {
          "tools": {
            "monitor.status": "/cabinet/api/agent/monitor/status",
            "monitor.timeline": "/cabinet/api/agent/monitor/timeline",
            "monitor.series": "/cabinet/api/agent/monitor/series"
          },
          "data_routes": [
            "/v1/monitor/status",
            "/v1/monitor/timeline",
            "/v1/monitor/series"
          ],
          "scope": "analytics.read; Data derived_metrics and products (compact analytical evidence only)",
          "effect": "read",
          "period_days_max": 90,
          "page_size_max": 50,
          "product_filter_max": 20,
          "event_types": [
            "baseline",
            "source_gap",
            "card",
            "photos",
            "price",
            "stock",
            "supply",
            "advertising",
            "rating",
            "reviews"
          ],
          "object_types": [
            "store",
            "product",
            "competitor"
          ],
          "cursor": "scope-and-filter-bound-keyset",
          "state": "implementation-in-progress",
          "series_metrics": [
            "events",
            "rating",
            "reviews",
            "public_price_min_rub",
            "public_price_max_rub",
            "amount",
            "discountedPrice_min"
          ]
        },
        "public_connector": {
          "owner": "marketplace-connector-wb",
          "state": "implementation-in-progress",
          "routes": {
            "wb_public_products": "POST /services/wildberries/v1/products:batch",
            "wb_public_image": "GET /services/wildberries/v1/products/{nm_id}/images/{index}"
          },
          "effect": "read",
          "batch_max": 100,
          "auth": "existing connector bearer and existing token provider; no independent parser",
          "rate_policy": "shared connector cooldown on 429/403; no immediate proxy retry for these statuses",
          "media": "bounded image bytes through connector; account-local hash storage and 90-day retention"
        },
        "read_products": [
          "status and coverage",
          "bounded event timeline",
          "product and store daily series"
        ],
        "release_result_ref": "operations/platform/task112-store-monitoring-20260905/result.json",
        "competitors_state": "bounded-helper-available; no automatic enrollment or public configuration tool",
        "product_boundary": {
          "decision_date": "2026-09-08",
          "work_item": "TASK-157",
          "authority": "deploy/x-mp-account/app/xmp_agent_catalog.json#/platform_contract/data/monitoring/product_boundary",
          "blocks": [
            {
              "id": "product-watch",
              "name": "Мониторинг своих товаров и конкурентов",
              "purpose": "Шпион за ценами и карточками своих товаров и конкурентов. Фиксирует, что было, что стало и когда изменение наблюдалось.",
              "owner": "marketplace-data-platform",
              "inputs": [
                "registered public WB connector",
                "own product card and price versions"
              ],
              "outputs": [
                "scoped observations",
                "previous/current version refs",
                "field changes",
                "observed_at/detected_at",
                "source and observation context"
              ],
              "not_responsible_for": [
                "profit calculation",
                "daily account diagnosis",
                "message delivery"
              ],
              "service_ids": [
                "monitor"
              ],
              "data_model": "Объект (account/product/own-or-competitor) + источник + контекст (регион/вариант) + время + состояние; событие = сравнение сопоставимых наблюдений с предыдущей версией.",
              "readiness": "Own card/price versions and bounded public observations exist. Managed competitor enrollment and full competitor text/media history remain incomplete."
            },
            {
              "id": "account-control",
              "name": "Контроль кабинета",
              "purpose": "Проверяет собственные продажи, расходы, остатки и свежесть данных; помогает найти проблемы и подготовить ежедневный разбор.",
              "owner": "marketplace-data-platform + x-mp-account daily_assistant",
              "inputs": [
                "account analytical facts",
                "seller goals and constraints from Memory"
              ],
              "outputs": [
                "analysis",
                "problem/task list",
                "report refs"
              ],
              "not_responsible_for": [
                "competitor polling",
                "public card version capture",
                "message delivery"
              ],
              "service_ids": [
                "analytics",
                "daily",
                "daily-reports"
              ],
              "data_model": "Период + показатель с формулой и источниками + сравнение + проверяемый вывод + задача/ссылка на отчёт.",
              "readiness": "Configured checks available; comprehensive automated daily audit remains incomplete."
            },
            {
              "id": "notification-delivery",
              "name": "Уведомления",
              "purpose": "Доставляет сообщения о готовых результатах в Telegram; отчёты и история доступны в личном кабинете.",
              "owner": "x-mp-account + registered telegram connector",
              "inputs": [
                "result event",
                "report ref",
                "owner recipient settings"
              ],
              "outputs": [
                "delivery state",
                "message/report link"
              ],
              "not_responsible_for": [
                "marketplace polling",
                "analysis",
                "competitor monitoring"
              ],
              "service_ids": [
                "notifications"
              ],
              "data_model": "Событие + получатель + ссылка на результат + статус/попытки доставки.",
              "readiness": "Telegram binding and configured event types required; not all services emit notifications."
            }
          ],
          "implementation_note": "Existing monitor module also stores stock/supply/advertising events and series. These internal capabilities are not a reason to merge the three product tasks; no runtime migration or tool removal is performed by this documentation change."
        }
      },
      "operational_resilience": {
        "state": "implemented-with-explicit-upstream-limits",
        "database_binding": "Connector principals may declare an explicit unambiguous database_host; it overrides only host, preserving same-account credentials and database. Generic postgres names are not safe across shared networks.",
        "read_transport": "Account bounds read timeouts and maps transport failures to controlled503. Public-source429 preserves Retry-After and suppresses same-family requests until cooldown expires.",
        "verification": "Use scoped connection identity, completed metric build and dated freshness; healthy process alone is insufficient.",
        "evidence": "operations/platform/task218-219-stability-20260929/result.json"
      },
      "ozon_shared_collection": {
        "state": "deployed-core-canary-verified-partial-product-coverage",
        "task": "TASK-189",
        "adapter_owner": "marketplace-data-skills",
        "data_owner": "marketplace-data-platform",
        "account_owner": "marketplace-platform",
        "placement": "main-node",
        "storage_root": "MARKETPLACE_DATA_ROOT",
        "required_data_mount": "/srv/marketplace/data-plane",
        "service_model": "shared-workers-logical-account-scopes",
        "scope_fields": [
          "workspace_id",
          "account_id",
          "seller_identity",
          "run_id",
          "stage_cursor",
          "lease",
          "source_artifact"
        ],
        "admission": "verified-Seller-read-slot-and-initial-publication-readback",
        "fairness": "bounded-page-and-stage-dispatch",
        "raw": "immutable-account-scoped-manifests-and-sha256",
        "normalization_schema": "ozon-shared-v1",
        "serving": "explicit-shared-binding-only-legacy-path-retained",
        "coverage": "missing-not-zero-and-partial-visible",
        "migration": "copy-first-parity-canary-rollback-storage-gate",
        "readiness_verified": false,
        "storage_namespace": "ozon_shared_v1",
        "coverage_implemented": "nine-Seller-core-stages-typed-read-publication",
        "verification": "31 Data Skills tests (1 optional skip),20 disposable DB/broker/Account/pool,3 supervisor,8 readiness pass; published Ozon0.4 client HTTPS read verified",
        "deployment": "approved-schemas-workers-and-first-live-core-publication-verified",
        "restart_policy": "owner-requires-no-server-reboot",
        "target_stages": [
          "products",
          "product_details",
          "prices",
          "stocks",
          "postings_fbs",
          "postings_fbo",
          "returns",
          "daily_accruals",
          "balance"
        ],
        "enrollment": "verified-read-slot-outbox-initial-sync-publication-readback",
        "rollout_scope": "additive-shared-stage-canary-no-legacy-copy-before-storage-gate",
        "portable_derivatives": "immutable-scoped-JSONL-and-checksummed-publication",
        "unimplemented": [
          "advertising",
          "extended_analytics",
          "reviews",
          "questions",
          "new-account-Memory-runtime-parity",
          "legacy-copy-parity",
          "two-live-scheduled-cycles"
        ],
        "evidence_ref": "operations/platform/task189-ozon-core-deploy-20260930/result.json"
      }
    },
    "client": {
      "contract_version": 1,
      "supported_transport": "existing-stdio-bridge-to-account-bound-https",
      "business_context_storage": "server-memory-not-installed-skills",
      "update_current": "implemented-compatible-auto-update-after-device-opt-in",
      "update_target": "compatible-delivery-after-explicit-device-opt-in",
      "auto_update_implemented": true,
      "auto_update_requires": [
        "device-local-owner-opt-in",
        "verified-manifest",
        "compatibility-check",
        "no-new-grants",
        "atomic-release-switch",
        "retained-rollback",
        "harness-reload-status"
      ],
      "instructions_rule": "Managed skills are versioned protocol instructions; they cannot overwrite user business memory or grant execution authority.",
      "tool_effect_annotations": {
        "rule": "readOnlyHint=false for every tool that can persist task or schedule state, including optional writes; server grants remain authoritative",
        "project_state_tools": [
          "assistant.daily",
          "assistant.followup",
          "assistant.action.record",
          "assistant.schedule",
          "tasks.checkpoint",
          "tasks.record",
          "tasks.close"
        ]
      },
      "auto_update_lifecycle": {
        "state": "implementation-verified-isolated-runtime; fleet-acceptance-required",
        "runtime_abi": 1,
        "poll_seconds": 300,
        "scope": "managed project launch and trusted project-local MCP after explicit device opt-in",
        "activation": "new connections default disabled; --auto-update explicitly enables; preserve existing device policy",
        "reload": "between requests; replace runtime and updater; require current protocol read before business dispatch",
        "rollback": "pre-activation checks and retained previous release; failed candidate digest quarantined",
        "global_mcp_registration": false,
        "evidence_ref": "operations/platform/task169-client-release-20260908/auto-update-evidence.json",
        "startup": "bounded pre-Codex check; direct MCP bounded startup; offline retains verified current",
        "startup_evidence_ref": "operations/platform/task135-client-update-20260906/result.json",
        "docs": "/cabinet/static/xmp-client-updates.md"
      },
      "diagnostics": "xmp.client.doctor; postinstall read-only account-bound receipt; grants do not imply readiness",
      "protocol_refresh": {
        "tool": "xmp.client.instructions",
        "scope": "bounded explicit managed skill reads; no business context or grants",
        "before_business_dispatch": true,
        "emergency_stop_exempt": true
      },
      "minimum_installer_python": "3.11",
      "runtime_python": "3.10+",
      "protocol_skill_rules": [
        {
          "prefixes": [
            "support."
          ],
          "skills": [
            "xmp-support"
          ]
        },
        {
          "prefixes": [
            "repricer.config."
          ],
          "skills": [
            "xmp-pricing-config"
          ]
        },
        {
          "prefixes": [
            "repricer."
          ],
          "skills": [
            "xmp-pricing-config",
            "xmp-pricing-operations"
          ]
        },
        {
          "prefixes": [
            "automations.reviews."
          ],
          "skills": [
            "xmp-reviews"
          ]
        },
        {
          "prefixes": [
            "automations."
          ],
          "skills": [
            "xmp-automations"
          ]
        },
        {
          "prefixes": [
            "content."
          ],
          "skills": [
            "xmp-product-card"
          ]
        },
        {
          "prefixes": [
            "assistant.followup",
            "assistant.action.record",
            "monitor.compare"
          ],
          "skills": [
            "xmp-outcome-review"
          ]
        },
        {
          "prefixes": [
            "assistant."
          ],
          "skills": [
            "xmp-daily-assistant"
          ]
        },
        {
          "prefixes": [
            "monitor."
          ],
          "skills": [
            "xmp-monitoring"
          ]
        },
        {
          "prefixes": [
            "finance."
          ],
          "skills": [
            "xmp-finance"
          ]
        },
        {
          "prefixes": [
            "analysis.",
            "metrics.",
            "cabinet.overview",
            "product.360",
            "dataset.",
            "datasets.",
            "collection."
          ],
          "skills": [
            "xmp-analytics"
          ]
        },
        {
          "prefixes": [
            "notifications.",
            "telegram.",
            "scheduled."
          ],
          "skills": [
            "xmp-notifications"
          ]
        },
        {
          "prefixes": [
            "tasks.",
            "memory."
          ],
          "skills": [
            "xmp-work-memory"
          ]
        },
        {
          "prefixes": [
            "artifacts.",
            "reports."
          ],
          "skills": [
            "xmp-reports-artifacts"
          ]
        },
        {
          "prefixes": [
            "public."
          ],
          "skills": [
            "xmp-competitor-research"
          ]
        }
      ],
      "automation_domain_skills": {
        "advertising": "xmp-advertising-bidder",
        "pricing": "xmp-pricing-config",
        "responder": "xmp-reviews",
        "catalog": "xmp-product-card"
      },
      "auto_update_evidence_ref": "operations/platform/task169-client-release-20260908/auto-update-evidence.json",
      "applied_workflows": {
        "state": "packaged-read-and-plan-methodologies",
        "skill_ids": [
          "xmp-advertising-audit",
          "xmp-replenishment-plan",
          "xmp-warehouse-allocation",
          "xmp-fbs-control",
          "xmp-wb-rules",
          "xmp-deduction-review"
        ],
        "selection": "one lead workflow by user intent; reuse service protocols and outcome review",
        "data_authority": "registered X-MP data and metrics; explicit inputs with provenance",
        "execution": "no new grants or marketplace methods",
        "web_dependency": "rules research requires client web capability or supplied official document; not an X-MP web connector",
        "warehouse_calculation": "bounded scenario comparison; no optimization service claimed",
        "docs": "/docs/workflows/"
      }
    },
    "operations": {
      "current_mode": "observe-shadow-plan",
      "marketplace_execute_available": false,
      "intent_source": "seller-agent-memory",
      "runtime_definition": "immutable-compiled-projection-with-memory-revision",
      "execute_gates": [
        "fresh-snapshot",
        "resource-version-check",
        "policy-digest",
        "exact-approval",
        "scoped-executor",
        "idempotency",
        "read-back",
        "outcome-window"
      ],
      "explicit_plan_confirmation": [
        "fbs",
        "catalog",
        "migrations"
      ],
      "business_schedule": "disabled-manual-canary-explicit-enable",
      "collection_schedule": "separate-data-freshness-obligation",
      "custom_apps": "research-only-no-arbitrary-code-in-current-task-runtime",
      "daily_assistant": {
        "state": "implementation-candidate",
        "task": "TASK-115",
        "plan_ref": "operations/platform/task115-daily-assistant-20260905/plan.md",
        "memory_owner": "seller-memory",
        "runtime_owner": "existing-shared-operation-runtime",
        "value": "observed problem -> bounded priority -> durable task -> decision -> measured follow-up",
        "max_daily_priorities": 5,
        "marketplace_execute": false,
        "third_party_delivery": false,
        "tools": [
          "assistant.daily",
          "assistant.followup",
          "assistant.action.record",
          "assistant.schedule",
          "memory.context",
          "tasks.checkpoint",
          "tasks.record",
          "tasks.close"
        ],
        "client_pack_version": "0.20.0"
      }
    },
    "readiness": {
      "rule": "Available requires implementation, deployed release evidence, account binding, grants, data readiness and health; process health alone is insufficient.",
      "historical_evidence_is_live_health": false,
      "source_candidate_is_deployed": false,
      "gaps": [
        {
          "id": "scale-1000",
          "state": "unverified",
          "owner": "marketplace-platform",
          "gate": "Measured mixed load and isolation evidence for 1000 synthetic accounts; no production load generation."
        },
        {
          "id": "research-pooling",
          "state": "disabled",
          "owner": "marketplace-platform",
          "gate": "No active Swarm path: owner disabled TASK-144; dedicated services remain stopped. Pooling is required only for a separately approved future reactivation."
        },
        {
          "id": "analytics-completeness",
          "state": "audit-required",
          "owner": "marketplace-data-platform",
          "gate": "TASK-100: method-to-question coverage and formula/source reconciliation; 84 definitions is not full coverage."
        },
        {
          "id": "business-memory-context",
          "state": "implementation-required",
          "owner": "seller-agent-memory",
          "gate": "One versioned context/retrieve/checkpoint contract through gateway, conflicts and multi-harness continuation."
        },
        {
          "id": "raw-artifact-export",
          "state": "implementation-required",
          "owner": "marketplace-data-platform",
          "gate": "Typed raw artifact export with access, redaction, size and provenance checks."
        },
        {
          "id": "marketplace-execution",
          "state": "disabled",
          "owner": "marketplace-platform",
          "gate": "TASK-12/TASK-64: exact approved plan and read-back canary."
        },
        {
          "id": "managed-applications",
          "state": "research-only",
          "owner": "marketplace-platform",
          "gate": "TASK-107: use cases, isolated build/runtime, workload identity, quotas and reviewed deployment."
        }
      ],
      "verified_transitions": [
        {
          "id": "data-adapter-ownership",
          "state": "verified",
          "owner": "marketplace-data-skills",
          "evidence_ref": "operations/platform/unified-working-line-20261007/result.json",
          "scope": "active WB seller ingestion and WB public read adapters; Data quotas/lineage and Connector routes/auth retained"
        },
        {
          "id": "client-auto-update",
          "state": "verified",
          "owner": "marketplace-platform",
          "evidence_ref": "operations/platform/unified-working-line-20261007/result.json",
          "scope": "Eight client projects inventoried; six active account-bound doctors passed on 0.39.4; cosmetics/Yudin identity unavailable and require explicit reconnection. Individual keys and opt-in settings preserved; new installations default opt-out."
        },
        {
          "id": "client-release-drift",
          "state": "verified",
          "owner": "marketplace-platform",
          "evidence_ref": "operations/platform/unified-working-line-20261007/result.json",
          "scope": "Published 29 assets match 0.39.4 manifest checksums; installed account-bound doctor confirms version and owner pause."
        },
        {
          "id": "account-source-runtime-parity",
          "state": "verified",
          "owner": "marketplace-platform",
          "evidence_ref": "operations/platform/unified-working-line-20261007/result.json",
          "scope": "Activated complete native Account build; 283-route parity and database health verified; previous containers retained."
        }
      ]
    },
    "documentation": {
      "current": [
        "README.md",
        "AGENTS.md",
        "docs/product-architecture.md",
        "docs/architecture.md",
        "docs/system-map.md",
        "docs/central-services-topology.md",
        "docs/task-automation-hub.md",
        "docs/agent-business-memory-contract.md",
        "docs/data-analytics-contract.md",
        "docs/shared-runtime-capacity.md",
        "docs/agent-client-lifecycle.md",
        "docs/project/README.md",
        "docs/project/product.md",
        "docs/project/services.md",
        "docs/project/operations.md",
        "docs/project/agent-connection.md",
        "docs/project/maintenance.md"
      ],
      "generated": "docs/platform-contract.md",
      "historical_rule": "Dated journals and explicitly historical designs are evidence, not current policy."
    },
    "store_onboarding": {
      "state": "implementation candidate; isolated component checks; not deployed or end-to-end accepted",
      "owner": "marketplace-platform Account onboarding control plane",
      "definition_owner": "Account onboarding desired-state revision; per-service projections are derived",
      "business_context_owner": "Seller Memory",
      "placement": "shared central services with global account_id; no standard per-store container",
      "approval": "Owner approved TASK177 implementation, existing-store connection and regular read-only collection 2026-09-10; exact migration bundle required before apply",
      "defaults": {
        "marketplace_execute": false,
        "telegram_delivery": false,
        "recurring_collection": false,
        "report_schedules": false
      },
      "activation": "Legacy activate cannot bypass onboarding. Only matching verified receipts, current identity and required complete sources permit activation; partial analytics remain labelled.",
      "notification_enrollment": "generic scoped producer provisioning implemented in candidate; real producer auth/history/revoke fixture passed; production still TASK161 explicit enrollment",
      "evidence": "operations/platform/task89-onboarding-20260908/verification.json",
      "documentation": "docs/new-store-onboarding-spec.md",
      "pilot_plan": "operations/platform/task167-new-store-20260908/plan.md",
      "implementation": {
        "account_module": "deploy/x-mp-account/app/onboarding_api.py",
        "worker": "tools/store_onboarding",
        "migration": "deploy/x-mp-account/app/migrations/0168_onboarding_delivery.sql",
        "routes": {
          "GET /cabinet/accounts/{account_id}/onboarding": "current membership; progress",
          "GET /cabinet/api/marketplace-accounts/{account_id}/onboarding": "current membership; scoped status",
          "POST /cabinet/api/marketplace-accounts/{account_id}/onboarding": "owner/admin and CSRF; idempotent request and bounded adoption of unprovisioned existing Account",
          "POST /cabinet/api/marketplace-accounts/{account_id}/credential-enrollments": "owner/admin and CSRF; one-time broker capability",
          "POST /internal/onboarding/provisioning/jobs/next": "private orchestrator identity; lease one saved scope",
          "POST /internal/onboarding/provisioning/receipts": "private orchestrator identity; fenced read-back receipt",
          "POST /internal/onboarding/credential-enrollments/claim": "private broker identity; consume single-use enrollment",
          "POST /internal/onboarding/credential-enrollments/verified": "private broker identity; bound verification receipt",
          "POST /internal/onboarding/provisioning/failures": "private orchestrator identity; fenced failure without raw output",
          "POST /v1/wildberries/enrollments": "separate credential broker; single-use capability; no key in Account",
          "POST /internal/v1/onboarding/readiness": "runtime private service token; reload and report exact scoped registry projection hash",
          "POST /internal/onboarding/credential-enrollments/rejected": "private broker identity; credential-bound terminal validation failure",
          "POST /internal/onboarding/provisioning/heartbeat": "private orchestrator identity; renew current unexpired lease",
          "POST /cabinet/api/marketplace-accounts/{account_id}/activate": "legacy activation guarded: incomplete onboarding or unprovisioned account returns409; completed existing connections preserved"
        },
        "marketplace_write": false,
        "artifact_order": "artifact namespace read-back follows initial sync/report; no engineering fixture tasks in business history",
        "operations_documentation": "docs/new-store-onboarding-operations.md"
      },
      "existing_account_reconciliation": "Reuse existing Account/workspace/cell only when no established placement, component versions or data binding exists; owner/admin scope and row locks; do not duplicate identity",
      "initial_sync": "Bounded registered source collection with durable page cursor; incomplete sources remain pending; no-success-on-request-budget",
      "credential_types": {
        "basic_readonly": true,
        "personal_readonly": "existing owner-managed deployments only; do not request for cloud enrollment",
        "service": "requires separate paired service owner integration",
        "test": false,
        "basic_read_write": true,
        "execution_access": "registered read methods only; token read_only is factual metadata, not an enrollment requirement; write authority is never inferred from token"
      },
      "verified_identity_reuse": {
        "method": "seller.info",
        "source": "same-request immutable broker raw",
        "checks": [
          "credential fingerprint",
          "seller identity",
          "scope",
          "checksum",
          "expiry",
          "observed within 24h"
        ],
        "second_marketplace_request": false
      },
      "source_rate_limit": {
        "http_status": 429,
        "outcome": "durable pending",
        "honor_upstream_retry_after": true,
        "activation": false
      }
    },
    "release": {
      "manifest": "config/release.json",
      "build_entrypoint": "scripts/release_bundle.py",
      "regression_entrypoint": "scripts/check_release_tests.py",
      "state": "released",
      "source_recovery": "operations/platform/task207-finance-coverage-20260924/source-recovery.json",
      "docs": "docs/unified-release.md",
      "release_id": "xmp-unified-main-2026.10.07",
      "retained_runtime_extensions": [
        {
          "owner": "marketplace-platform/tools/operation_runtime",
          "name": "ozon-shadow-drafts",
          "state": "observe-shadow",
          "marketplace_write": false,
          "routes": [
            "/internal/v1/ozon/plans/create",
            "/internal/v1/ozon/plans/get",
            "/internal/v1/ozon/plans/list"
          ],
          "runtime_image": "sha256:b5d6e6f0667bfe2207644b113d031a708c71cf4c6cfd97b1cc9fdd1f1df21894",
          "note": "Retained deployed Ozon shadow drafts, source observation freshness, idempotent schema replay; no approval/execute capability."
        }
      ],
      "retained_public_clients": [
        {
          "name": "xmp-ozon-client",
          "version": "0.4.0",
          "manifest_url": "https://x-mp.ru/docs/ozon/downloads/release.json",
          "source": "deploy/x-mp-account/connector/ozon",
          "tools": 19,
          "marketplace_write": false,
          "note": "Published client 0.4.0 remains unchanged; source candidate 0.5.0 has not been published."
        }
      ],
      "last_accepted_release": "operations/platform/unified-working-line-20261007/result.json"
    },
    "support_intake": {
      "owner": "marketplace-platform/deploy/x-mp-account/app/support_intake.py",
      "state": "production Account and verified WB/Ozon owner client rollout 2026-09-23",
      "client": "account-bound MCP; no caller-selected account",
      "queue": "shared Account case table with private operator API",
      "notification": "existing Telegram bot, redacted ticket metadata only, retry and overdue reminder",
      "limits": "no marketplace writes; no raw payload or business values in support report; authenticated agent API 5xx records bounded automatic incident"
    },
    "authentication": {
      "owner": "x-mp-account",
      "source": "deploy/x-mp-account/app/email_app.py",
      "documentation": "docs/project/authentication.md",
      "state": "verified_candidate",
      "routes": [
        "GET /cabinet/login",
        "GET /cabinet/register",
        "POST /cabinet/auth/code/request",
        "POST /cabinet/auth/code/verify",
        "POST /cabinet/auth/logout"
      ],
      "policy": "Email OTP, 10 minutes, 5 attempts; serialized IP and email request limits; disabled users denied without reactivation; one-use challenge, secure opaque session and CSRF. No marketplace grants on signup.",
      "verification": "41 tests with production-image dependencies including PostgreSQL concurrency; six responsive browser cases. Live mailbox/user canary pending.",
      "proxy_boundary": "Account private ingress only; nginx appends its observed peer to X-Forwarded-For; marker uses last hop, never caller-controlled first hop."
    }
  },
  "review_block": {
    "schema_version": 1,
    "state": "draft-only",
    "owner": "tools/customer_auto_responder",
    "configuration_tools": [
      "automations.reviews.catalog",
      "automations.reviews.prepare",
      "automations.config.apply",
      "automations.config.get"
    ],
    "routes": {
      "catalog": "client-local-after-capability-check",
      "prepare": "client-local-after-capability-check",
      "apply": "/cabinet/api/agent/automations/config/apply"
    },
    "effect": "draft-only",
    "memory_owner": "Seller Memory",
    "model_execution": "external agent prepares exact per-review drafts; central runtime does not invoke a model",
    "docs": "docs/review-service-configuration.md",
    "services": [
      {
        "service_id": "native",
        "name": "X-MP Responder",
        "integration_state": "draft-only",
        "source_url": null,
        "kind": "reply-service",
        "api_verified": false,
        "marketplace_write": false
      },
      {
        "service_id": "spix",
        "name": "Спикс",
        "integration_state": "not-integrated",
        "source_url": "https://spix.ru/",
        "kind": "reply-service",
        "api_verified": false,
        "marketplace_write": false
      },
      {
        "service_id": "mpstats",
        "name": "MPSTATS",
        "integration_state": "not-integrated",
        "source_url": "https://mpstats.io/instruments/wildberries/autoreplies",
        "kind": "reply-service",
        "api_verified": false,
        "marketplace_write": false
      },
      {
        "service_id": "otveto",
        "name": "ОТВЕТО",
        "integration_state": "not-integrated",
        "source_url": "https://otveto.ru/product/otvety-na-otzyvy/",
        "kind": "reply-service",
        "api_verified": false,
        "marketplace_write": false
      },
      {
        "service_id": "otvechumba",
        "name": "Отвечумба / PiData",
        "integration_state": "not-integrated",
        "source_url": "https://otvechumba.ru/",
        "kind": "reply-service",
        "api_verified": false,
        "marketplace_write": false
      },
      {
        "service_id": "marketguru",
        "name": "MarketGuru",
        "integration_state": "not-integrated",
        "source_url": "https://marketguru.io/tools/autoreviews",
        "kind": "reply-service",
        "api_verified": false,
        "marketplace_write": false
      },
      {
        "service_id": "era",
        "name": "ЭРА",
        "integration_state": "not-integrated",
        "source_url": "https://airesponses.ru/",
        "kind": "reply-service",
        "api_verified": false,
        "marketplace_write": false
      },
      {
        "service_id": "wbarcode",
        "name": "WBARCODE",
        "integration_state": "not-integrated",
        "source_url": "https://wbarcode.ru/auto-review-replies",
        "kind": "reply-service",
        "api_verified": false,
        "marketplace_write": false
      },
      {
        "service_id": "insales",
        "name": "inSales",
        "integration_state": "not-integrated",
        "source_url": "https://www.insales.ru/blogs/university/kak-otvetit-na-otzyv-na-wildberries",
        "kind": "reply-service",
        "api_verified": false,
        "marketplace_write": false
      },
      {
        "service_id": "tochka",
        "name": "Точка",
        "integration_state": "not-integrated",
        "source_url": "https://tochka.com/rko/marketplace-cabinet/generator-avtootvetov-na-otzyvy/",
        "kind": "reply-service",
        "api_verified": false,
        "marketplace_write": false
      },
      {
        "service_id": "cdek",
        "name": "СДЭК",
        "integration_state": "not-integrated",
        "source_url": "https://ff.cdek.ru/blog/ai-avtootvetchik-na-otzyvy-wildberries",
        "kind": "reply-service",
        "api_verified": false,
        "marketplace_write": false
      },
      {
        "service_id": "codemp",
        "name": "CodeMP",
        "integration_state": "not-integrated",
        "source_url": "https://codemp.ru/",
        "kind": "activity-analysis",
        "api_verified": false,
        "marketplace_write": false
      }
    ],
    "result_read_tool": "automations.jobs.get",
    "history_policy": "review cases are returned only in job detail; history lists keep count and detail tool",
    "client_packaging": "compiler bundled in existing verified updater asset; no new manifest target"
  },
  "advertising_bidder": {
    "version": 2,
    "state": "observe-shadow",
    "marketplace_write": false,
    "domain": "advertising",
    "modes": [
      "observe",
      "shadow"
    ],
    "strategies": [
      "fixed",
      "target_drr"
    ],
    "skill_id": "xmp-advertising-bidder",
    "docs": "/cabinet/static/xmp-bidder.md",
    "example": "/cabinet/static/xmp-bidder.example.json",
    "task_binding": {
      "source": "tasks.resume",
      "fields": [
        "card_id",
        "card_version"
      ],
      "verified_at": "config.apply"
    },
    "lifecycle": {
      "read": "automations.config.get",
      "create_update_disable_delete": "automations.config.apply",
      "run": "automations.jobs.create",
      "history": "automations.runs.list",
      "revision": "expected_config_sha256"
    },
    "settings": {
      "target_ids": "campaign ID strings",
      "bidder.enabled": "periodic shadow computation only",
      "bidder.strategy": "fixed or target_drr",
      "bidder.fixed_bid_kopecks": "fixed target with step bounds",
      "bidder.target_drr": "spend / WB-attributed revenue fraction",
      "bidder.deadband": "relative tolerance fraction",
      "guardrails.min_bid_kopecks": "lower bid bound",
      "guardrails.max_bid_kopecks": "upper bid bound",
      "bidder.economic_bid_cap_kopecks": "explicit cap; no inferred profitability",
      "guardrails.max_step_percent": "maximum change per decision",
      "guardrails.cooldown_seconds": "minimum interval after recorded action",
      "guardrails.min_clicks": "minimum sample clicks",
      "guardrails.min_spend_rub": "minimum sample spend in rubles",
      "bidder.attribution_lag_seconds": "maturity after attribution-window end",
      "bidder.schedule": "local weekday/time windows; timezone required; not funding",
      "bidder.daily_budget_kopecks": "per-campaign daily limit, not shared store total",
      "bidder.budget_reserve_kopecks": "pause threshold = daily limit minus reserve",
      "bidder.require_stock": "hold optimization without stock evidence",
      "guardrails.min_stock_cover_days": "low-stock protective pause proposal",
      "guardrails.max_snapshot_age_seconds": "source freshness gate",
      "guardrails.max_actions_per_cycle": "prioritize pauses within count ceiling",
      "interval_seconds": "calculation frequency; distinct from cooldown"
    },
    "pending": [
      "marketplace bid execution/readback",
      "morning-evening budget transfers",
      "automatic campaign resume",
      "spend-window enforcement",
      "CTR/impression strategy",
      "conversion/CPC/CPA strategy",
      "no-orders test-spend stop",
      "profit/returns optimization",
      "shared store budget allocation",
      "standing execution mandate"
    ],
    "limitations": [
      "Missing registered stock/daily-spend/maturity/minimum-bid inputs can hold optimization.",
      "Zero revenue makes DRR undefined; no automatic no-orders stop.",
      "Disabled profile reports hold; enabling also schedules shadow calculations.",
      "Deleting config does not delete or pause a WB campaign."
    ]
  },
  "owner_experience": {
    "configurable_analytics": {
      "status": "limited-runtime",
      "available": false,
      "owner": "x-mp-account",
      "data_owner": "marketplace-data-platform",
      "business_context_owner": "seller-memory",
      "marketplace_effects": "read_only",
      "placement": "existing account results workspace; no new route or per-account service",
      "design_ref": "docs/project/configurable-analytics-workspace.md",
      "first_slice": "closed-period SKU economics with reconciliation and explicit unknown or unallocated amounts",
      "candidate_scope": "Deployed personal view settings, provisional settlement grouping and cost/tax version coverage; no closed-period profit claim",
      "routes": [
        "GET /cabinet/api/marketplace-accounts/{account_id}/workspace/view",
        "PUT /cabinet/api/marketplace-accounts/{account_id}/workspace/view",
        "GET /cabinet/api/marketplace-accounts/{account_id}/workspace/finance-reconciliation"
      ],
      "release_gates": [
        "registered account-scoped data contracts and source coverage",
        "closed-period finance reconciliation for a canary account",
        "owner-visible missing inputs and unallocated amounts",
        "account isolation and desktop/mobile acceptance"
      ]
    },
    "hosted_chat": {
      "status": "closed_read_only_test",
      "available": false,
      "owner": "shared_operation_runtime",
      "design_ref": "docs/store-chat-sessions.md",
      "scope": "session-derived single account; individual expiring MCP credential",
      "execution": "ephemeral isolated codex exec job; no per-store service container",
      "business_memory_owner": "seller_memory",
      "marketplace_effects": "read_only",
      "release_gates": [
        "general availability",
        "write workflows through exact approval",
        "complete account enrollment"
      ],
      "routes": [
        "POST /cabinet/api/marketplace-accounts/{account_id}/chat",
        "GET /cabinet/api/marketplace-accounts/{account_id}/chat",
        "GET /cabinet/api/marketplace-accounts/{account_id}/chat/{job_id}",
        "POST /cabinet/api/marketplace-accounts/{account_id}/chat/{job_id}/cancel",
        "GET /cabinet/accounts/{account_id}/chat",
        "GET /cabinet/api/marketplace-accounts/{account_id}/chat/conversations",
        "GET /cabinet/api/marketplace-accounts/{account_id}/chat/conversations/{job_id}"
      ],
      "test_mode": "owner-authorized existing Codex login; allowlisted store; read-only marketplace access",
      "availability_note": "Enabled only for owner-selected test store; general availability and marketplace execution remain disabled.",
      "conversation_history": "Account-scoped parent-job chains; requests and answers explicitly read from Seller Memory; separate sessions and bounded prior-turn context.",
      "progress": "Persisted allowlisted execution stages and tool event categories; no reasoning, tool arguments/results, credentials or raw logs.",
      "history_policy": "Confirmed engineering canary roots are archived from user session listings; never seed production user history during UI tests."
    },
    "design_system": {
      "guide": "docs/design-system.md",
      "owner": "x-mp-account",
      "theme": "static/owner-theme.css",
      "tokens": "static/design-tokens.css",
      "shell": "templates/cabinet_shell.html",
      "release_policy": "One shared frontend shell and token set; page CSS is layout only; same identity/CSRF/scope checks on every route."
    },
    "navigation": [
      {
        "section": "today",
        "label": "Магазин",
        "group": "Работа магазина",
        "path": "/cabinet/accounts/{account_id}/today"
      },
      {
        "section": "connections",
        "label": "Подключение",
        "group": "Настройки магазина",
        "path": "/cabinet/accounts/{account_id}/setup"
      },
      {
        "section": "team",
        "label": "Участники",
        "group": "Настройки магазина",
        "path": "/cabinet/accounts/{account_id}/team"
      }
    ],
    "product_offer": {
      "decision_date": "2026-09-08",
      "work_item": "TASK-155",
      "headline": "Подключите вашего AI-агента к Wildberries или Ozon.",
      "description": "Мы предоставляем вашему агенту инфраструктуру для работы с магазином — от сбора данных и анализа до настройки инструментов, регулярных задач и контроля результатов.",
      "purpose": "Помогать продавцу принимать обоснованные решения о прибыли и автоматизировать ежедневную работу с минимальными затратами времени и ресурсов. Рост прибыли и полная автономность не гарантируются.",
      "audience": "Продавцы Wildberries, которые хотят работать со своим AI-агентом и не собирать интеграции самостоятельно.",
      "compatibility": "Проверенный путь подключения описан в инструкции. Поддержка конкретного клиента и модели проверяется отдельно; MCP не гарантирует совместимость каждого агента.",
      "docs": "docs/project/README.md",
      "groups": [
        {
          "id": "data",
          "title": "Данные и подключение",
          "description": "Магазин становится доступен вашему агенту: с данными, файлами и понятными правами.",
          "services": [
            {
              "id": "mcp",
              "name": "MCP для AI-агента",
              "benefit": "Подключение своего агента к данным и инструментам магазина через единый доступ.",
              "status": "Доступно",
              "detail": "Выберите доступный способ подключения в инструкции.",
              "href": "/docs/services/mcp-data/",
              "connectors": [
                "xmp-account",
                "agent-node-core"
              ],
              "evidence": [
                "TASK-153",
                "TASK-118"
              ],
              "provides": "Единое подключение агента к данным и инструментам магазина",
              "outcome": "Поручать работу с WB своему AI-помощнику",
              "guide": {
                "example": "Проверь мой магазин и доступные данные для первого разбора.",
                "start": "Подключите совместимого агента из кабинета и проверьте его доступ."
              }
            },
            {
              "id": "wb-data",
              "name": "Сбор данных магазина",
              "benefit": "Заказы, продажи, расходы, реклама, товары и остатки из доступных источников кабинета WB.",
              "status": "Доступно по источникам",
              "detail": "Состав и свежесть зависят от прав доступа и загруженного периода.",
              "href": "/docs/services/data/",
              "connectors": [
                "wildberries-cabinet-data"
              ],
              "evidence": [
                "TASK-146",
                "TASK-148",
                "TASK-153"
              ],
              "provides": "Загрузку и хранение доступных заказов, продаж, расходов, рекламы и остатков",
              "outcome": "Анализировать магазин без ручных выгрузок",
              "guide": {
                "example": "Покажи, за какие дни собраны продажи и расходы.",
                "start": "Подключите чтение нужных разделов WB и проверьте свежесть сбора."
              }
            },
            {
              "id": "public-data",
              "name": "Данные сайта Wildberries",
              "benefit": "Карточки, поиск, отзывы и вопросы покупателей для изучения товаров.",
              "status": "Доступно с ограничениями",
              "detail": "Данные открытой витрины отличаются от официальных данных вашего кабинета.",
              "href": "/docs/services/wildberries/",
              "connectors": [
                "wildberries-public"
              ],
              "evidence": [
                "TASK-112",
                "TASK-152"
              ],
              "provides": "Доступные карточки, поиск, отзывы и вопросы с сайта WB",
              "outcome": "Изучать товары и обращения покупателей",
              "guide": {
                "example": "Сравни видимую покупателю карточку с этими товарами.",
                "start": "Укажите артикулы и вопрос; агент проверит доступность открытых данных."
              }
            }
          ],
          "hero_label": "Данные и подключение",
          "hero_summary": "Данные кабинета и сайта Wildberries, MCP для вашего агента."
        },
        {
          "id": "analysis",
          "title": "Аналитика и отчёты",
          "description": "Задавайте вопросы о магазине и получайте расчёты с объяснением исходных данных.",
          "services": [
            {
              "id": "analytics",
              "name": "Аналитика магазина",
              "benefit": "Сравнение товаров и периодов, разбор продаж, рекламы, расходов и остатков.",
              "status": "Доступно",
              "detail": "Прибыль рассчитывается только при достаточных данных о себестоимости и расходах.",
              "href": "/docs/services/analytics/",
              "connectors": [
                "wildberries-cabinet-data"
              ],
              "evidence": [
                "TASK-100",
                "TASK-101",
                "TASK-124"
              ],
              "provides": "Расчёты по товарам и периодам на собранных данных",
              "outcome": "Разбираться в расходах, продажах и причинах изменений",
              "guide": {
                "example": "Почему выручка растёт, а денег остаётся меньше?",
                "start": "Выберите период; добавьте себестоимость и расходы, если нужна прибыль."
              }
            },
            {
              "id": "reports",
              "name": "Отчёты и файлы",
              "benefit": "Сохраняйте результаты анализа, таблицы и отчёты, чтобы вернуться к ним или поделиться с командой.",
              "status": "Доступно",
              "detail": "Отчёты видны вам и участникам команды, которым вы дали доступ к магазину.",
              "href": "/docs/services/reports/",
              "connectors": [
                "reports-artifacts"
              ],
              "evidence": [
                "TASK-9",
                "TASK-153"
              ],
              "provides": "Сохранённые отчёты, таблицы и файлы с результатами",
              "outcome": "Получать результат работы и возвращаться к нему",
              "guide": {
                "example": "Сохрани недельный разбор с выводами и источниками.",
                "start": "Задайте вопрос и период, затем откройте готовый материал в кабинете."
              }
            },
            {
              "id": "audit",
              "name": "Комплексный разбор магазина",
              "benefit": "Проверка магазина по блокам: прибыль, реклама, цены, запасы, карточки и отзывы.",
              "status": "В разработке",
              "detail": "Единый полный аудит по программе вопросов пока не предоставляется как готовая услуга.",
              "href": "/docs/services/#analysis",
              "connectors": [
                "wildberries-cabinet-data",
                "reports-artifacts"
              ],
              "evidence": [
                "TASK-154",
                "TASK-155"
              ],
              "provides": "Единую программу проверки магазина по основным направлениям",
              "outcome": "Получать список проблем и приоритетных действий",
              "guide": {
                "example": "Хочу полный разбор экономики, рекламы, карточек и запасов.",
                "start": "Пока разделите запрос на доступные анализы; единый полный аудит ещё готовится."
              }
            }
          ],
          "hero_label": "Аналитика и отчёты",
          "hero_summary": "Анализ магазина, расчёты и отчёты. Комплексный аудит — в разработке."
        },
        {
          "id": "tools",
          "title": "Инструменты работы с магазином",
          "description": "Готовьте изменения с учётом правил магазина. Доступный режим указан у каждого инструмента.",
          "services": [
            {
              "id": "repricer",
              "name": "Репрайсер",
              "benefit": "Подготовка цен по заданным правилам и ограничениям, история предложенных изменений.",
              "status": "Планы и согласование",
              "detail": "Исполнитель согласованной цены развёрнут; реальный пилот изменения цены на WB ещё не подтверждён.",
              "href": "/docs/services/repricer/",
              "connectors": [
                "cabinet-tools"
              ],
              "evidence": [
                "TASK-122"
              ],
              "provides": "Расчёт цен, правила, ограничения и планы изменений",
              "outcome": "Готовить цены с учётом экономики товара",
              "guide": {
                "example": "Предложи цены для этих товаров с учётом моей минимальной маржи.",
                "start": "Укажите товары и ограничения; проверьте расчёт и точный план до согласования."
              }
            },
            {
              "id": "bidder",
              "name": "Рекламный биддер",
              "benefit": "Расчёт предложений по ставкам и контроль рекламных расходов.",
              "status": "Без изменения ставок",
              "detail": "Работает анализ и подготовка предложений. Автоматическое исполнение не включено.",
              "href": "/docs/services/bidder/",
              "connectors": [
                "cabinet-tools"
              ],
              "evidence": [
                "TASK-123"
              ],
              "provides": "Анализ рекламных расходов и предложения по ставкам",
              "outcome": "Выбирать, где и как изменить рекламные расходы",
              "guide": {
                "example": "Найди рекламные расходы без достаточной отдачи и предложи ставки.",
                "start": "Задайте цель и бюджет, проверьте данные и предложения. Ставки автоматически не меняются."
              }
            },
            {
              "id": "reviews",
              "name": "Ответы на отзывы и вопросы",
              "benefit": "Подготовка ответов с учётом товара, правил бренда и содержания обращения.",
              "status": "Черновики",
              "detail": "Публикация ответов и полный автоответчик пока не заявляются как готовая функция.",
              "href": "/docs/services/reviews/",
              "connectors": [
                "cabinet-tools",
                "wildberries-public"
              ],
              "evidence": [
                "TASK-126",
                "TASK-131"
              ],
              "provides": "Подготовку ответов по обращению, товару и правилам бренда",
              "outcome": "Сокращать ручную работу с отзывами и вопросами",
              "guide": {
                "example": "Подготовь ответы на отзывы и выдели повторяющиеся жалобы.",
                "start": "Выберите отзывы, задайте тон и проверьте черновики; публикация не включена."
              }
            },
            {
              "id": "content",
              "name": "Карточки и медиаконтент",
              "benefit": "Подготовка описаний, характеристик и медиаматериалов для карточек товаров.",
              "status": "Подготовка материалов",
              "detail": "Возможности генерации зависят от клиента. Публикация на WB требует отдельного готового сценария.",
              "href": "/docs/services/content/",
              "connectors": [
                "cabinet-tools"
              ],
              "evidence": [
                "TASK-133"
              ],
              "provides": "Подготовку описаний, характеристик и медиаматериалов",
              "outcome": "Обновлять содержание карточек товаров",
              "guide": {
                "example": "Сделай описание и размерный слайд по моим фактам и фотографиям.",
                "start": "Передайте подтверждённые свойства, проверьте черновик и скачайте материалы."
              }
            }
          ],
          "hero_label": "Инструменты магазина",
          "hero_summary": "Репрайсер, рекламный биддер, карточки, инфографика и описания, ответы на отзывы и вопросы."
        },
        {
          "id": "control",
          "title": "Память и постоянный контроль",
          "description": "Сохраняйте контекст работы, следите за изменениями и возвращайтесь к результатам.",
          "services": [
            {
              "id": "monitor",
              "name": "Мониторинг своих товаров и конкурентов",
              "benefit": "Шпион за ценами и карточками: что изменилось у вас и конкурентов, когда и как выглядело раньше.",
              "status": "История есть, слежение расширяется",
              "detail": "У своих товаров есть история цен и полей карточки, у публичных товаров — доступные наблюдения. Управляемый список конкурентов и полное слежение за текстом и изображениями их карточек ещё дорабатываются. Проверки периодические, изображения сохраняются в виде миниатюр.",
              "href": "/docs/services/monitoring/",
              "connectors": [
                "wildberries-cabinet-data",
                "wildberries-public"
              ],
              "evidence": [
                "TASK-112",
                "TASK-120",
                "TASK-152"
              ],
              "provides": "Наблюдение за своими ценами, скидками и версиями карточек; публичными ценами и сведениями о товарах конкурентов. История «было → стало» с датой проверки.",
              "outcome": "Замечать изменения цен и карточек у себя и конкурентов. Давать агенту историю для сравнения своих решений с тем, что происходило на рынке.",
              "guide": {
                "example": "Что изменилось в цене и карточке этих товаров за неделю?",
                "start": "Укажите товары и период; агент проверит реально сохранённую историю. Слежение за конкурентами ещё расширяется."
              }
            },
            {
              "id": "memory",
              "name": "Память магазина",
              "benefit": "Сохранять цели, устройство бизнеса, ограничения и решения, чтобы продолжать работу в новом чате без повторного объяснения.",
              "status": "Доступно",
              "detail": "Продолжение сложных задач дорабатывается; память хранит рабочий контекст, а не весь чат.",
              "href": "/docs/services/memory/",
              "connectors": [
                "seller-memory"
              ],
              "evidence": [
                "TASK-101",
                "TASK-118",
                "TASK-128"
              ],
              "provides": "Сохранение правил, задач, решений и результатов магазина",
              "outcome": "Агент читает сохранённый контекст магазина и продолжает работу с учётом ваших правил.",
              "guide": {
                "example": "Сохрани цели и ограничения, чтобы продолжить в новом чате.",
                "start": "Попросите показать сохранённое; в новом чате поручите прочитать память и продолжить задачу."
              }
            },
            {
              "id": "daily",
              "name": "Контроль кабинета и ежедневный помощник",
              "benefit": "Регулярная проверка доступных данных, список важных вопросов и задачи для дальнейшей работы.",
              "status": "Для подключённых магазинов",
              "detail": "Проверки работают после подключения магазина и настройки расписания. Состав разбора зависит от загруженных данных. Этот блок анализирует кабинет; слежение за ценами и карточками — отдельный сервис.",
              "href": "/docs/services/#service-daily",
              "connectors": [
                "scheduler",
                "wildberries-cabinet-data"
              ],
              "evidence": [
                "TASK-115"
              ],
              "provides": "Регулярные проверки собственных продаж, расходов, остатков и свежести данных. Список проблем и задач для разбора.",
              "outcome": "Понимать, что происходит с магазином и где нужно ваше внимание.",
              "guide": {
                "example": "Проверь продажи, расходы и остатки, покажи, что требует внимания.",
                "start": "Проверьте доступность помощника для магазина и настройте расписание проверок."
              }
            },
            {
              "id": "notifications",
              "name": "Уведомления в Telegram",
              "benefit": "Узнавать, когда отчёт готов или задача завершена, без постоянных проверок личного кабинета.",
              "status": "После настройки уведомлений",
              "detail": "Сначала привяжите Telegram в настройках. Пока уведомления отправляют не все сервисы; список событий постепенно расширяется.",
              "href": "/docs/services/reports/#telegram",
              "connectors": [
                "telegram",
                "reports-artifacts"
              ],
              "evidence": [
                "TASK-11",
                "TASK-85"
              ],
              "provides": "Уведомления о готовых результатах в Telegram. Сами отчёты и история работы сохраняются в личном кабинете.",
              "outcome": "Получать важное в привычном мессенджере и открывать подробности, когда удобно.",
              "guide": {
                "example": "Сообщай в Telegram, когда готов нужный мне результат.",
                "start": "Привяжите Telegram и включите уведомления доступного сценария."
              }
            },
            {
              "id": "daily-reports",
              "name": "Ежедневные отчёты и уведомления",
              "benefit": "Получать разбор магазина и другие выбранные отчёты по настроенному расписанию, видеть важные изменения без ручного запроса.",
              "status": "По настроенным сценариям",
              "detail": "Выберите доступный сценарий и настройте расписание. Для уведомлений привяжите Telegram. Полный ежедневный разбор всех сторон магазина ещё готовится; сейчас глубина отчёта зависит от собранных данных и выбранной задачи.",
              "href": "/docs/services/#service-daily-reports",
              "connectors": [
                "scheduler",
                "wildberries-cabinet-data",
                "reports-artifacts",
                "telegram"
              ],
              "evidence": [
                "TASK-115",
                "TASK-9",
                "TASK-11",
                "TASK-85"
              ],
              "provides": "Проверки и отчёты по расписанию: итоги магазина, важные изменения и вопросы для разбора. Отчёты сохраняются в личном кабинете, о готовых результатах можно получать уведомления в Telegram.",
              "outcome": "Начинать день с картины магазина и приоритетов. Выбирать нужные отчёты и расписание, сокращать ручные проверки.",
              "guide": {
                "example": "Хочу регулярно получать сводку по продажам и проблемам.",
                "start": "Выберите доступный сценарий, проверьте его первый результат и настройте расписание."
              }
            }
          ],
          "hero_label": "Автоматизация и память",
          "hero_summary": "Мониторинг своих цен и карточек, наблюдение за конкурентами, память магазина, ежедневный помощник, отчёты по расписанию и уведомления."
        }
      ],
      "future": [
        {
          "name": "Размещение ваших сервисов",
          "description": "Запуск собственных расчётов и автоматизаций на инфраструктуре X-MP. Исследовательское направление; размещение пока не предоставляется."
        },
        {
          "name": "Исследовательский рой",
          "description": "Приостановлен и исключён из первого релиза. Не является доступным способом полного аудита."
        }
      ],
      "roles": {
        "seller": "Ставит задачи, задаёт правила и разрешает изменения.",
        "agent": "Изучает магазин, рассчитывает решения и настраивает доступные инструменты.",
        "platform": "Собирает данные и продолжает выполнять настроенные поддержанные процессы; сохраняет историю и результаты."
      },
      "methodology": {
        "steps": [
          "Найти слабое место по данным",
          "Рассчитать потери и варианты",
          "Настроить поддержанный инструмент",
          "Проверить результат и учесть опыт"
        ],
        "objective": "Улучшать экономику магазина, согласовывая рекламу, цену, запасы, контент и отзывы. Максимизация отдельной метрики не равна росту прибыли.",
        "learning": "Сохранять действия, результаты и проверенные выводы в Memory; сопоставлять наблюдаемые изменения. Не заявлять автоматическое дообучение модели или причинный эффект без проверки.",
        "evidence_policy": "Не публиковать проценты эффективности, кратный рост или обещания прибыли без методики и измеренного кейса.",
        "automation": "Агент изучает данные и настраивает конфигурацию; shared services выполняют поддержанные процессы по согласованным правилам; новые данные позволяют агенту пересмотреть настройку. Не требуется постоянно открытый клиент для уже включённого серверного сценария."
      },
      "core_methodology": {
        "accepted": "2026-09-08",
        "steps": [
          "Оцифровать магазин и сделать экономику прозрачной",
          "Найти слабые места и проверить причины",
          "Убрать подтверждённые потери и лишние действия",
          "Настроить инструменты под цель магазина",
          "Проверять результат, сохранять опыт и улучшать работу"
        ],
        "goals": "Прибыль, выручка или другая явно выбранная цель владельца с финансовыми, складскими и риск-ограничениями; оптимизировать общий результат, не каждую метрику независимо.",
        "quality_loop": "Отзывы/вопросы/возвраты → повторяющаяся проблема → задача на упаковку, качество, комплектацию или контент → действие команды → последующая проверка.",
        "human_role": "Цели и разрешения, поставки, физическое качество товара и исполнение неподдержанных системой действий.",
        "evidence": "Принятая методология продукта, не утверждение, что все этапы уже автоматизированы."
      },
      "journey": {
        "work_item": "TASK-156",
        "title": "Навести порядок в магазине. Повысить отдачу каждого инструмента.",
        "intro": "Сначала понимаем, где деньги и что мешает зарабатывать. Затем устраняем потери, улучшаем работу магазина и закрепляем результат. Ваш агент ведёт эту работу с данными и инструментами X-MP.",
        "boundary": "Это метод работы с магазином. Анализ выполняет ваш агент; доступность данных и действий зависит от подключённых сервисов. Текущие режимы перечислены ниже.",
        "steps": [
          {
            "id": "digitize",
            "number": 1,
            "title": "Оцифровать",
            "action": "Собрать продажи, расходы, рекламу, остатки и возвраты. Проверить полноту и расхождения.",
            "help": "X-MP собирает доступные данные WB и передаёт их агенту. Вы добавляете себестоимость и расходы вне площадки.",
            "services": [
              "wb-data",
              "mcp"
            ],
            "result": "Понятно, каким цифрам можно доверять и чего не хватает для расчёта."
          },
          {
            "id": "baseline",
            "number": 2,
            "title": "Увидеть реальное состояние",
            "action": "Разобраться, что продаётся, куда уходят деньги и какие товары требуют внимания.",
            "help": "Агент анализирует данные по магазину и товарам, готовит отчёт с расчётами и пробелами в данных.",
            "services": [
              "analytics",
              "reports"
            ],
            "result": "Текущая картина магазина: продажи, расходы, выплаты и доступный расчёт прибыли."
          },
          {
            "id": "target",
            "number": 3,
            "title": "Выбрать цель",
            "action": "Определить, что важнее сейчас: прибыль, оборот, распродажа запасов или меньше ручной работы.",
            "help": "Вы задаёте цель, срок и ограничения. Агент сохраняет их в памяти магазина для следующих решений.",
            "services": [
              "memory"
            ],
            "result": "Измеримая цель и понятные правила: к чему идём и чем нельзя жертвовать."
          },
          {
            "id": "prioritize",
            "number": 4,
            "title": "Найти и устранить потери",
            "action": "Выбрать главные проблемы, проверить причины и подготовить исправления. Начать с того, что даёт больше пользы при меньших затратах.",
            "help": "Агент разбирает расходы, предлагает действия и сохраняет задачи. История цен и карточек помогает выяснить, что менялось перед возникновением проблемы.",
            "services": [
              "analytics",
              "monitor",
              "memory"
            ],
            "result": "Очередь действий: что исправить, зачем, какой ценой и когда проверить."
          },
          {
            "id": "optimize",
            "number": 5,
            "title": "Повысить отдачу каждого инструмента",
            "action": "Последовательно дорабатывать рекламу, цену, карточку, инфографику, описание, отзывы и работу с запасами.",
            "help": "Агент готовит варианты и настройки через биддер, репрайсер и инструменты контента. Для рекламы сейчас доступны предложения, для отзывов и контента — черновики.",
            "services": [
              "bidder",
              "repricer",
              "content",
              "reviews"
            ],
            "result": "Обоснованные улучшения каждого блока под общую цель магазина. Конкретные направления — сразу под таблицей."
          },
          {
            "id": "measure",
            "number": 6,
            "title": "Проверить, стало ли лучше",
            "action": "Сравнить ожидания с фактом: продажи, расходы, доступную прибыль, конверсию и обращения. Учесть другие изменения.",
            "help": "Мониторинг сохраняет историю цен и карточек. Агент сопоставляет её с продажами и расходами через аналитику, затем сохраняет выводы. Если данных мало, вывод остаётся гипотезой.",
            "services": [
              "analytics",
              "monitor",
              "reports"
            ],
            "result": "Понятно, что помогло, что стоит доработать и что ещё нужно проверить."
          },
          {
            "id": "sustain",
            "number": 7,
            "title": "Закрепить и автоматизировать",
            "action": "Сохранить рабочие решения, настроить регулярные проверки и возвращаться к проблеме, если она повторяется.",
            "help": "Память сохраняет опыт магазина. Настроенные задачи продолжают работать в фоне. Отчёты можно открыть в личном кабинете, а уведомления о готовых результатах — получить в Telegram.",
            "services": [
              "memory",
              "daily",
              "monitor",
              "notifications",
              "daily-reports"
            ],
            "result": "Меньше повторной ручной работы. Правила и накопленный опыт помогают поддерживать результат."
          }
        ]
      },
      "optimization": {
        "title": "На шаге 5 — докручиваем каждый инструмент до максимальной отдачи.",
        "intro": "Находим слабое место, готовим улучшение, проверяем результат и дорабатываем снова. Реклама, цена, контент и запасы работают на общую цель магазина.",
        "boundary": "Максимальная отдача — цель постоянной работы в условиях Wildberries. Оцениваем результат по данным магазина: универсальных 99% эффективности и гарантированного роста нет.",
        "items": [
          {
            "title": "Реклама",
            "goal": "Найти, где бюджет теряется, и подготовить настройки для более результативных кампаний.",
            "action": "Ставки, ограничения расходов, связь кампаний с экономикой товара и запасом.",
            "measure": "Расходы и доступные результаты; вклад в прибыль — когда данных достаточно.",
            "service": "bidder"
          },
          {
            "title": "Цена",
            "goal": "Искать цену, которая лучше работает на выбранную цель: прибыль, оборот или распродажу.",
            "action": "Варианты цены, минимально допустимая экономика, условия акций и остатки.",
            "measure": "Продажи, доступная маржа и скорость расходования запаса.",
            "service": "repricer"
          },
          {
            "title": "Карточка, инфографика и описание",
            "goal": "Сделать товар понятным и убедительным для покупателя: раскрыть преимущества и снять сомнения.",
            "action": "Первое изображение, инфографика, характеристики, описание, размеры и комплектация. Агент готовит материалы для просмотра.",
            "measure": "Доступные показатели воронки, конверсия, повторяющиеся вопросы и причины возвратов.",
            "service": "content"
          },
          {
            "title": "Отзывы и вопросы",
            "goal": "Давать полезные ответы и находить причины недовольства, которые можно устранить.",
            "action": "Черновики ответов; предложения исправить инструкцию, упаковку, описание или проверить качество товара.",
            "measure": "Повторяемость вопросов и жалоб после изменений. Качество и упаковку исправляет ваша команда.",
            "service": "reviews"
          },
          {
            "title": "Остатки и поставки",
            "goal": "Снижать риск дефицита прибыльных товаров и лишних денег в запасах.",
            "action": "Агент анализирует доступные остатки и продажи, готовит рекомендации с учётом ваших сроков и бюджета поставки.",
            "measure": "Покрытие запасом, отсутствие важных размеров и динамика остатков. Поставку организует ваша команда.",
            "service": "analytics"
          },
          {
            "title": "Экономика магазина",
            "goal": "Проверять, что улучшения отдельных блоков помогают зарабатывать всему магазину.",
            "action": "Разбор расходов, себестоимости и ассортимента; согласование рекомендаций по рекламе, цене и запасам.",
            "measure": "Прибыль при достаточных данных, расходы, выплаты и деньги в запасах.",
            "service": "analytics"
          }
        ]
      },
      "ranking_reference": {
        "source_url": "https://seller.wildberries.ru/instructions/ru/ru/material/item-search-results-and-ranking",
        "source_title": "WB: выдача и ранжирование товаров",
        "source_updated": "2026-07-27",
        "verified_at": "2026-09-08",
        "meaning": "Диапазоны влияния на место товара в поисковой выдаче. Это не доли прибыли и не баллы эффективности магазина; их нельзя складывать в 100%.",
        "rows": [
          {
            "name": "Доставка и сборка",
            "weight": "30–40%",
            "low": 30,
            "high": 40,
            "action": "Анализировать сроки, доступность размеров и распределение запаса. Готовить рекомендации по поставкам.",
            "service": "analytics"
          },
          {
            "name": "Акции",
            "weight": "7–35%",
            "low": 7,
            "high": 35,
            "action": "Считать варианты участия с учётом расходов и допустимой прибыли.",
            "service": "repricer"
          },
          {
            "name": "Продажи в рублях",
            "weight": "10–25%",
            "low": 10,
            "high": 25,
            "action": "Разбирать динамику продаж вместе с ценой, рекламой и наличием товара.",
            "service": "analytics"
          },
          {
            "name": "Конверсия",
            "weight": "5–20%",
            "low": 5,
            "high": 20,
            "action": "Улучшать фото, инфографику, описание и предложение; проверять этапы воронки.",
            "service": "content"
          },
          {
            "name": "Рейтинг продавца",
            "weight": "3–10%",
            "low": 3,
            "high": 10,
            "action": "Находить повторяющиеся причины возвратов и жалоб, готовить задачи на исправление.",
            "service": "reviews"
          },
          {
            "name": "Рейтинг товара",
            "weight": "1–10%",
            "low": 1,
            "high": 10,
            "action": "Разбирать отзывы и качество товара, уточнять обещания в карточке.",
            "service": "reviews"
          },
          {
            "name": "Платная опция позиций",
            "weight": "до 3%",
            "low": 0,
            "high": 3,
            "action": "Оценивать затраты и наблюдаемый результат перед решением о подключении.",
            "service": "analytics"
          },
          {
            "name": "Уровень продавца",
            "weight": "1–2%",
            "low": 1,
            "high": 2,
            "action": "Учитывать действующие условия программы в анализе.",
            "service": "analytics"
          },
          {
            "name": "Скидка WB Клуба",
            "weight": "до 2%",
            "low": 0,
            "high": 2,
            "action": "Проверять экономику скидки по товарам.",
            "service": "repricer"
          },
          {
            "name": "Заполнение карточки",
            "weight": "до 1%",
            "low": 0,
            "high": 1,
            "action": "Проверять полноту сведений и изображения. Влияние контента на конверсию оценивается отдельно.",
            "service": "content"
          },
          {
            "name": "Рекламное продвижение",
            "weight": "Без фиксированной доли",
            "low": null,
            "high": null,
            "action": "Готовить настройки ставок и бюджета вместе с анализом органических факторов.",
            "service": "bidder"
          }
        ]
      },
      "improvement_demo": {
        "label": "Интерактивный пример · не данные вашего магазина",
        "title": "Видно, что уже улучшили и что осталось проверить.",
        "description": "Отметьте выполненные пункты: индикатор покажет долю завершённого плана. В работе с магазином критерии, сроки и подтверждающие данные нужно определить заранее.",
        "formula": "Выполненные пункты ÷ все пункты × 100%. В примере 12 пунктов с одинаковым весом. Индикатор показывает выполнение плана, а не прибыль или оценку магазина от Wildberries.",
        "checks": [
          [
            "Реклама",
            "Проверить расходы и подготовить ограничения бюджета",
            "Проверить результат выбранной настройки"
          ],
          [
            "Цена",
            "Рассчитать варианты цены с учётом расходов",
            "Проверить продажи и маржу после изменения"
          ],
          [
            "Карточка и инфографика",
            "Подготовить понятные изображения и описание",
            "Проверить доступную конверсию после публикации"
          ],
          [
            "Отзывы и качество",
            "Найти повторяющиеся причины жалоб",
            "Проверить обращения после исправления причины"
          ],
          [
            "Запасы",
            "Подготовить план пополнения важных размеров",
            "Проверить доступность после поставки"
          ],
          [
            "Экономика",
            "Сверить себестоимость и доступные расходы",
            "Проверить общий результат и стоимость улучшений"
          ]
        ]
      },
      "marketplaces": [
        {
          "name": "Wildberries",
          "status": "Работаем сейчас",
          "state": "available"
        },
        {
          "name": "Ozon",
          "status": "Работаем сейчас · доступен проверенный набор данных и инструментов",
          "state": "available"
        },
        {
          "name": "Яндекс Маркет",
          "status": "Подключение в работе",
          "state": "planned"
        }
      ],
      "commercial_offer": {
        "id": "xmp-tiered",
        "name": "X-MP",
        "period": "месяц",
        "payment_method": "manual_invoice_after_call",
        "payment_label": "Оплата по счёту после созвона",
        "description": "Данные и инструменты для самостоятельной работы — или настроенные регулярные сервисы с сопровождением.",
        "boundary": "Перед подключением согласуем состав услуг и доступные сценарии для вашего магазина. Возможности сервисов указаны в каталоге ниже.",
        "registration_note": "Создание аккаунта не оформляет платную подписку. Подключение и оплату согласуем на созвоне, затем выставим счёт.",
        "decision_ref": "TASK-222: owner decision 2026-09-29",
        "pending_terms": [
          "service_limits",
          "legal_entity_and_documents"
        ],
        "documentation": [
          "docs/project/commercial-launch.md"
        ],
        "billing_unit": "one_marketplace_account",
        "billing_label": "за один магазин",
        "ai_usage": "customer_paid_separately",
        "ai_label": "Подписку на своего AI-агента вы оплачиваете отдельно.",
        "sales_contact": {
          "provider": "telegram",
          "url": "https://t.me/foripost",
          "label": "Написать в Telegram",
          "handle": "@foripost"
        },
        "callback": {
          "state": "planned",
          "owner_notifications": "telegram",
          "recipient": "owner",
          "delivery_verified": false,
          "bot": "@xmp_agent_bot"
        },
        "trial": {
          "days": 7,
          "state": "requirement_accepted_not_implemented",
          "start_recommendation": "first_verified_data_ready_and_client_connected",
          "payment_card_required": false,
          "automatic_charge": false,
          "automatic_enforcement": false,
          "scope": "one_verified_marketplace_account",
          "decision_ref": "TASK-222 owner request 2026-09-29",
          "documentation": "docs/project/trial-and-value.md",
          "public_note": "7 дней бесплатного доступа по согласованию при подключении. Без карты и автоматических списаний."
        },
        "assistance": {
          "state": "owner_accepted_scope_to_finalize",
          "includes": [
            "помощь с подключением",
            "первый разбор магазина",
            "ограниченный регулярный контроль"
          ],
          "unlimited_support": false,
          "decision_ref": "TASK-222 owner confirmation 2026-09-29"
        },
        "pricing_review": {
          "state": "owner_approved",
          "supersedes_amount_rub": 12990,
          "documentation": "docs/project/commercial-tiers.md"
        },
        "tiers": [
          {
            "id": "data",
            "name": "Данные и инструменты",
            "amount_rub": 3000,
            "includes": [
              "Доступ к данным подключённого магазина в одном месте",
              "Хранение собираемых данных до 90 дней по согласованному составу",
              "Доступные коннекторы Wildberries или Ozon и MCP-инструменты",
              "Навыки и настройки для работы со своим AI-агентом"
            ],
            "boundary": "Самостоятельная работа. Доступность методов зависит от маркетплейса и прав магазина. История до подключения доступна только в пределах API маркетплейса."
          },
          {
            "id": "services",
            "name": "Регулярные сервисы",
            "amount_rub": 12900,
            "includes": [
              "Всё из тарифа «Данные и инструменты»",
              "Помощь с подключением и первый разбор магазина",
              "Настройка согласованных регулярных задач и конфигураций",
              "Контроль выполнения и ограниченное сопровождение",
              "Индивидуальные сценарии на базе существующих инструментов"
            ],
            "boundary": "Состав задач, частоту запусков и объём сопровождения фиксируем до начала работы. Новые интеграции и отдельную разработку оцениваем отдельно."
          }
        ],
        "retention": {
          "days": 90,
          "scope": "collected_marketplace_data",
          "state": "requirement_accepted_not_enforced",
          "automatic_deletion": false,
          "documentation": "docs/project/commercial-tiers.md"
        },
        "activation_note": "Подключаем после созвона: проверим доступность нужных данных и сценариев для вашего магазина. Условия хранения и обслуживания закрепим перед стартом."
      }
    },
    "positioning": "X-MP — подключение вашего AI-агента к Wildberries. Данные магазина, аналитика и инструменты управления без самостоятельной настройки сервисов.",
    "public_documentation": {
      "editorial_rule": "Полноценная документация: назначение, структура, источники и поля, алгоритм, подключение, конфигурация, методы и параметры, примеры, результат, ошибки и границы. Обзор — вход, не замена руководству. Методы сверяются с опубликованным клиентом; наличие кода не повышает readiness.",
      "pages": {
        "": {
          "title": "Как работать с магазином через X-MP",
          "lead": "Подключите своего AI-агента к магазину, чтобы разбираться в цифрах, находить проблемы и готовить решения с учётом ваших целей.",
          "purpose": "Вам не нужно вручную собирать каждую таблицу и заново объяснять устройство бизнеса. X-MP предоставляет агенту доступные данные и инструменты, сохраняет рабочий контекст и результаты. Вы задаёте направление и контролируете изменения.",
          "example": "«Хочу понять, почему продажи растут, а денег остаётся меньше. Проверь расходы и предложи, с чего начать».",
          "steps": [
            "Подключите магазин и совместимого агента по инструкции «Начало работы».",
            "Расскажите агенту о товарах, цели, себестоимости и ограничениях. Попросите сохранить важное в памяти магазина.",
            "Дайте первую конкретную задачу с периодом и ожидаемым результатом: например, разобрать расходы за месяц."
          ],
          "result": "Разбор с источниками, перечень обнаруженных проблем и следующие шаги. К сохранённому результату можно вернуться и проверить, помогли ли принятые решения.",
          "limits": "Набор доступных действий зависит от подключения. Предложение агента не означает, что изменение уже выполнено на Wildberries. Текущие режимы перечислены в каталоге сервисов.",
          "services": [],
          "sections": [
            {
              "id": "manuals",
              "title": "Руководства и справочник",
              "blocks": [
                {
                  "type": "links",
                  "items": [
                    [
                      "Репрайсер",
                      "/docs/services/repricer/"
                    ],
                    [
                      "Биддер",
                      "/docs/services/bidder/"
                    ],
                    [
                      "Отзывы",
                      "/docs/services/reviews/"
                    ],
                    [
                      "Мониторинг",
                      "/docs/services/monitoring/"
                    ],
                    [
                      "Аналитика",
                      "/docs/services/analytics/"
                    ],
                    [
                      "MCP данных",
                      "/docs/services/mcp-data/"
                    ],
                    [
                      "Справочник методов",
                      "/docs/mcp-reference/"
                    ]
                  ]
                }
              ]
            }
          ]
        },
        "getting-started": {
          "title": "Начните с одной задачи магазина",
          "lead": "Подключение нужно, чтобы агент работал с вашими данными. Первым результатом может стать разбор продаж, расходов или остатков.",
          "purpose": "Начните с вопроса, на который сейчас не хватает времени или данных. Так вы сможете проверить пользу X-MP на понятной задаче и затем добавить регулярную работу.",
          "example": "«Покажи продажи и расходы за прошлый месяц. Отметь, каких данных не хватает для расчёта прибыли. Составь три приоритетные задачи».",
          "steps": [
            "Войдите в личный кабинет X-MP и выберите свой магазин.",
            "В разделе подключения сохраните ключ Wildberries с правами чтения нужных данных. Секретный ключ вводится в защищённой форме, а не в чате.",
            "Откройте подключение агента. Для настройки сервисов выберите «Настройка и планы»; для анализа достаточно чтения. Установите Python 3.11+ и Codex, выполните команду из кабинета и введите одноразовый код скрыто.",
            "Попросите агента проверить, какой магазин подключён, какие данные уже собраны и за какой период.",
            "Сообщите цель и ограничения, сохраните их в памяти магазина и дайте первую задачу."
          ],
          "result": "Агент называет правильный магазин, показывает доступный период и отвечает на ваш вопрос по фактическим данным. Если сбор ещё не завершён, он объясняет, чего нужно дождаться.",
          "limits": "Не все данные появляются сразу после сохранения ключа. Если нужного раздела нет, сначала проверьте права и состояние сбора. Расписание и изменения на маркетплейсе настраиваются отдельно.",
          "services": [],
          "sections": [
            {
              "id": "manuals",
              "title": "Руководства и справочник",
              "blocks": [
                {
                  "type": "links",
                  "items": [
                    [
                      "Репрайсер",
                      "/docs/services/repricer/"
                    ],
                    [
                      "Биддер",
                      "/docs/services/bidder/"
                    ],
                    [
                      "Отзывы",
                      "/docs/services/reviews/"
                    ],
                    [
                      "Мониторинг",
                      "/docs/services/monitoring/"
                    ],
                    [
                      "Аналитика",
                      "/docs/services/analytics/"
                    ],
                    [
                      "MCP данных",
                      "/docs/services/mcp-data/"
                    ],
                    [
                      "Справочник методов",
                      "/docs/mcp-reference/"
                    ]
                  ]
                }
              ]
            }
          ]
        },
        "project": {
          "title": "Как сервисы помогают друг другу",
          "lead": "Данные показывают состояние магазина, агент помогает выбрать решение, память сохраняет договорённости, а отчёты позволяют проверить результат.",
          "purpose": "Сервисы решают разные части одной задачи. Например, падение продаж требует цифр и сравнения периодов, проверка карточки — её истории, а продолжение работы через неделю — сохранённых решений.",
          "example": "«Разбери падение продаж товара, посмотри изменения цены и карточки, сохрани гипотезы и план проверки».",
          "steps": [
            "Начните с данных и аналитики: определите масштаб проблемы и период.",
            "При необходимости подключите историю товаров, подготовку карточки, рекламные или ценовые предложения.",
            "Сохраните решение и задачу в памяти, затем сравните результат с исходным состоянием."
          ],
          "result": "Вы понимаете, какие инструменты нужны для вашей задачи и что получите на каждом шаге.",
          "limits": "Мониторинг цен и карточек, контроль собственного кабинета и доставка уведомлений — разные функции. Подключение одной не включает остальные.",
          "services": [],
          "sections": [
            {
              "id": "manuals",
              "title": "Руководства и справочник",
              "blocks": [
                {
                  "type": "links",
                  "items": [
                    [
                      "Репрайсер",
                      "/docs/services/repricer/"
                    ],
                    [
                      "Биддер",
                      "/docs/services/bidder/"
                    ],
                    [
                      "Отзывы",
                      "/docs/services/reviews/"
                    ],
                    [
                      "Мониторинг",
                      "/docs/services/monitoring/"
                    ],
                    [
                      "Аналитика",
                      "/docs/services/analytics/"
                    ],
                    [
                      "MCP данных",
                      "/docs/services/mcp-data/"
                    ],
                    [
                      "Справочник методов",
                      "/docs/mcp-reference/"
                    ]
                  ]
                }
              ]
            }
          ]
        },
        "architecture": {
          "title": "Что происходит после вашего поручения",
          "lead": "Вы задаёте задачу агенту. X-MP предоставляет ему данные и доступные инструменты выбранного магазина, а результаты сохраняются для дальнейшей работы.",
          "purpose": "Это помогает понимать, откуда взялся вывод, где искать результат и кто отвечает за следующий шаг. Владелец определяет цель и разрешения, агент анализирует, платформа выполняет настроенные поддержанные процессы.",
          "example": "«Проверь, у каких товаров выросли расходы на рекламу, и подготовь варианты действий в пределах моего бюджета».",
          "steps": [
            "Агент проверяет подключённый магазин и читает относящиеся к задаче цели и ограничения из памяти.",
            "Получает нужные данные, проверяет период и полноту, отделяет факты от гипотез.",
            "Готовит объяснение и предложение. Для доступного изменения показывает конкретный план и запрашивает необходимое подтверждение.",
            "Сохраняет результат; после выполненного действия проверяет, что изменилось."
          ],
          "result": "Понятная цепочка от вопроса до решения с источниками и сохранённым итогом.",
          "limits": "Открытый чат сам по себе не запускает круглосуточную работу. После закрытия чата продолжаются только отдельно настроенные и доступные серверные процессы.",
          "services": []
        },
        "services": {
          "title": "Выберите инструмент под свою задачу",
          "lead": "У каждого сервиса есть конкретная польза: разобраться в деньгах, подготовить улучшение товара, сохранить договорённости или вовремя увидеть результат.",
          "purpose": "Начинайте с того, что хотите улучшить в магазине. В каталоге можно сравнить назначения сервисов и увидеть, где доступен анализ, где — подготовка, а где нужна дополнительная настройка.",
          "example": "«Нужно уменьшить рекламные расходы, не потеряв прибыль. Сначала проверь экономику, затем подготовь предложения по рекламе».",
          "steps": [
            "Найдите сервис по своей задаче в таблице ниже.",
            "Проверьте его текущий режим и ограничения.",
            "Поручите агенту проверить доступность именно для вашего магазина и показать первый результат."
          ],
          "result": "Подходящий инструмент и реалистичное ожидание от его работы.",
          "limits": "Режим в каталоге описывает возможности продукта. Готовность вашего магазина зависит от прав, данных и настроек.",
          "services": [],
          "sections": [
            {
              "id": "manuals",
              "title": "Руководства и справочник",
              "blocks": [
                {
                  "type": "links",
                  "items": [
                    [
                      "Репрайсер",
                      "/docs/services/repricer/"
                    ],
                    [
                      "Биддер",
                      "/docs/services/bidder/"
                    ],
                    [
                      "Отзывы",
                      "/docs/services/reviews/"
                    ],
                    [
                      "Мониторинг",
                      "/docs/services/monitoring/"
                    ],
                    [
                      "Аналитика",
                      "/docs/services/analytics/"
                    ],
                    [
                      "MCP данных",
                      "/docs/services/mcp-data/"
                    ],
                    [
                      "Справочник методов",
                      "/docs/mcp-reference/"
                    ]
                  ]
                }
              ]
            }
          ]
        },
        "services/memory": {
          "title": "Память магазина: продолжайте с того, на чём остановились",
          "lead": "Сохраняйте цели, устройство бизнеса, ограничения и прошлые решения, чтобы не объяснять всё заново в каждом новом чате.",
          "purpose": "Обычная переписка оставляет важные договорённости в отдельных разговорах. Память магазина даёт подключённому агенту рабочую опору: чем вы торгуете, чего хотите добиться, что нельзя менять, какие задачи уже решали и что получилось. Перед продолжением агент обращается к нужным сохранённым записям.",
          "example": "Сегодня: «Мы продаём одежду. Наша цель — прибыль, а не оборот любой ценой. Рекламный бюджет — до 30 000 ₽ в неделю. Сохрани эти ограничения». В новом чате: «Прочитай цели и ограничения магазина и продолжи работу над рекламой». Это пример поручения, не настройка вашего магазина.",
          "steps": [
            "Расскажите о структуре бизнеса: товары, команда, сезонность и особенности работы.",
            "Сформулируйте цель и ограничения: бюджет, минимальная допустимая экономика, правила цен и контента. Попросите агента сохранить их и показать, что записано.",
            "После разбора сохраняйте решение, основания, задачу и следующий шаг.",
            "В новом чате попросите прочитать актуальную память магазина и продолжить нужную задачу. Если правила изменились, попросите обновить прежнюю запись."
          ],
          "result": "Агент начинает с сохранённых вводных, учитывает действующие ограничения и видит прежние решения. Вы можете вернуться к задаче и проверить результат вместо повторного обсуждения с нуля.",
          "limits": "Память помогает только в подключённом магазине и при обращении агента к ней: все записи не загружаются автоматически в каждый чат. Продолжение сложных задач дорабатывается. Сохраняется важный рабочий контекст, а не полный чат; секреты туда не попадают. Сохранённый бюджет или правило не даёт разрешения на изменение цен или ставок.",
          "services": [
            "memory"
          ]
        },
        "services/data": {
          "title": "Понимайте, что происходит с деньгами и товарами",
          "lead": "X-MP собирает доступные данные магазина, чтобы агент мог объяснить продажи, расходы, остатки и изменения показателей.",
          "purpose": "Вместо ручного сопоставления выгрузок вы задаёте вопрос о бизнесе. Агент использует сохранённые данные, показывает период и пробелы, помогает найти товары и расходы, которые требуют внимания.",
          "example": "«Сравни последние две недели: где выручка выросла, но расходы росли быстрее? Отдельно покажи товары, которым грозит нехватка остатков».",
          "steps": [
            "Подключите чтение нужных разделов Wildberries в кабинете X-MP.",
            "Попросите проверить, какие данные собраны и насколько они свежие.",
            "Задайте период, товары и вопрос. Для прибыли добавьте достоверную себестоимость и необходимые расходы.",
            "Попросите сохранить выводы и список следующих действий."
          ],
          "result": "Сравнение показателей с объяснением расчётов и источниками. Пробелы видны отдельно: отсутствие данных не превращается в нулевые продажи или нулевые расходы.",
          "limits": "Прибыль нельзя достоверно посчитать без достаточных данных о себестоимости и расходах. История начинается с реально сохранённых наблюдений; наличие записей не доказывает полноту всех дат и разделов.",
          "services": [
            "wb-data",
            "analytics",
            "monitor",
            "daily"
          ],
          "sections": [
            {
              "id": "manuals",
              "title": "Руководства и справочник",
              "blocks": [
                {
                  "type": "links",
                  "items": [
                    [
                      "Репрайсер",
                      "/docs/services/repricer/"
                    ],
                    [
                      "Биддер",
                      "/docs/services/bidder/"
                    ],
                    [
                      "Отзывы",
                      "/docs/services/reviews/"
                    ],
                    [
                      "Мониторинг",
                      "/docs/services/monitoring/"
                    ],
                    [
                      "Аналитика",
                      "/docs/services/analytics/"
                    ],
                    [
                      "MCP данных",
                      "/docs/services/mcp-data/"
                    ],
                    [
                      "Справочник методов",
                      "/docs/mcp-reference/"
                    ]
                  ]
                }
              ]
            }
          ]
        },
        "services/wildberries": {
          "title": "Смотрите на товар глазами покупателя",
          "lead": "Открытые данные Wildberries помогают изучать видимую покупателю карточку и сравнивать доступные сведения о товарах.",
          "purpose": "Это полезно, когда нужно понять, как представлен ваш товар, чем отличается предложение конкурента и какие вопросы возникают у покупателей. Агент может сопоставить доступные наблюдения и подготовить направления для проверки.",
          "example": "«Сравни мою карточку с этими тремя товарами: цена, представление товара и доступные отзывы. Отдели наблюдаемые факты от предположений».",
          "steps": [
            "Укажите артикулы или ссылки на товары и цель сравнения.",
            "Попросите агента проверить доступность нужных открытых данных.",
            "Получите сравнение с датой наблюдения и оговорками о полноте."
          ],
          "result": "Список заметных различий и идеи, что проверить или улучшить в своём предложении.",
          "limits": "Цена и доступность на витрине могут зависеть от региона и условий просмотра. Открытая карточка не раскрывает достоверную прибыль, расходы или полные продажи конкурента. Данные вашего кабинета подключаются отдельно.",
          "services": [
            "public-data"
          ]
        },
        "services/account": {
          "title": "Личный кабинет: управляйте подключением магазина",
          "lead": "Здесь вы выбираете магазин, подключаете данные и агента, управляете доступом команды и открываете результаты работы.",
          "purpose": "Кабинет помогает держать под контролем, кто работает с магазином и к чему имеет доступ. Подключение данных, права агента и разрешение на конкретное изменение решают разные задачи.",
          "example": "«Хочу подключить агента для анализа продаж и дать менеджеру доступ к результатам работы этого магазина».",
          "steps": [
            "Войдите в X-MP и выберите нужный магазин.",
            "В защищённом разделе подключений добавьте необходимые ключи, затем проверьте состояние данных.",
            "Подключите агента по доступной инструкции и настройте права участников команды.",
            "Открывайте задачи и результаты из рабочих разделов магазина."
          ],
          "result": "Один выбранный магазин, понятные участники и подключения, доступ к сохранённой работе.",
          "limits": "Сохранённый ключ Wildberries не означает, что сбор завершён или исполнение изменений включено. Необходимые разрешения проверяются отдельно.",
          "services": [],
          "methods": [
            "xmp.client.doctor",
            "agent.me",
            "capabilities.list",
            "readiness.get",
            "xmp.services.list",
            "xmp.update.check",
            "xmp.update.apply"
          ],
          "sections": [
            {
              "id": "client-pack",
              "title": "Что устанавливает клиент 0.34.0",
              "blocks": [
                {
                  "type": "paragraph",
                  "text": "Комплект содержит один MCP X-MP с 112 методами и 26 skills: отдельные инструкции по аналитике, финансам, мониторингу, отзывам, запасам, ежедневным приоритетам и проверке результата; настройки репрайсера, биддера, контента, уведомлений и отчётов. Skills объясняют методику работы; MCP предоставляет типизированные операции. Право пользоваться методом проверяется сервером отдельно."
                },
                {
                  "type": "paragraph",
                  "text": "Для новой установки нужны Python 3.11+, curl, Bash и установленный авторизованный Codex. Рабочий путь — терминал Linux; macOS/WSL требуют отдельной проверки окружения. Уже установленные совместимые клиенты Python 3.10+ получают managed pack через обновлятор."
                }
              ]
            },
            {
              "id": "access-and-diagnostics",
              "title": "Доступы и проверка подключения",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Режим",
                    "Назначение"
                  ],
                  "rows": [
                    [
                      "Только чтение",
                      "Данные, аналитика, чтение задач и состояния сервисов."
                    ],
                    [
                      "Настройка и планы",
                      "Дополнительно задачи памяти, конфигурации сервисов, черновики, отчёты и расписания в рамках роли участника."
                    ],
                    [
                      "Изменение Wildberries",
                      "Отдельная поддержанная операция с точным планом, подтверждением и проверкой исполнения."
                    ]
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "Установщик проверяет конфигурацию до замены ключа и выполняет диагностику. xmp.client.doctor разделяет доступность соединения, права и состояние каждого сервиса. Он не включает сервисы и не меняет полномочия. Результат сохраняется в .xmp/diagnostics.json; повторная проверка — ./.xmp/doctor."
                }
              ]
            },
            {
              "id": "files-and-updates",
              "title": "Файлы и обновления",
              "blocks": [
                {
                  "type": "paragraph",
                  "text": "AGENTS.md содержит управляемые инструкции, .codex/config.toml — локальный MCP, .agents/skills — ссылки на проверенные инструкции, .xmp/current — текущий пакет, .xmp/previous — предыдущая версия. Ключ находится только в .xmp/secrets/agent.key. Бизнес-контекст хранится в Seller Memory и читается явно, а не копируется в skills."
                },
                {
                  "type": "paragraph",
                  "text": "Запуск — ./.xmp/start. Новые подключения включают совместимые автоматические обновления; --no-auto-update отключает их. Во время активной сессии пакет проверяется примерно раз в пять минут. При новом протоколе агент читает нужные предметные skills перед повтором вызова. Пользовательские правила и .gitignore сохраняются; ошибочный TOML блокирует установку до изменения ключа."
                }
              ]
            },
            {
              "id": "applied-methodologies",
              "title": "Готовые методики работы",
              "blocks": [
                {
                  "type": "paragraph",
                  "text": "Дополнительно к сервисным инструкциям пакет включает аудит рекламы, планирование пополнения, распределение партии по складам, контроль ФБС, разбор оферты и проверку удержаний. Каждый сценарий готовит отдельный результат и использует общие данные, Memory и проверку эффекта."
                },
                {
                  "type": "links",
                  "items": [
                    [
                      "Все методики, входные данные и примеры запросов",
                      "/docs/workflows/"
                    ]
                  ]
                }
              ]
            }
          ]
        },
        "services/reports": {
          "title": "Возвращайтесь к выводам и получайте уведомления",
          "lead": "Отчёт сохраняет ответ на ваш вопрос вместе с цифрами и выводами. Уведомление помогает узнать, что результат готов.",
          "purpose": "Отчёт удобно открыть позже, обсудить с командой и сравнить с новым периодом. Настроенные регулярные сценарии уменьшают повторную ручную работу, а Telegram служит каналом доставки коротких сообщений.",
          "example": "«Подготовь отчёт по продажам и расходам за неделю: что изменилось, что требует внимания и какие действия проверить».",
          "steps": [
            "Задайте агенту цель отчёта, период и нужные товары.",
            "Откройте сохранённый результат в кабинете и проверьте источники и недостающие данные.",
            "Для повторения выберите доступный сценарий и настройте его расписание.",
            "Для сообщений в Telegram привяжите его в настройках и проверьте, что нужный сценарий поддерживает уведомления."
          ],
          "result": "Сохранённый отчёт, к которому можно вернуться, и уведомления о результатах поддержанных сценариев после настройки.",
          "limits": "Не все сервисы отправляют уведомления. Привязка Telegram сама по себе не включает ежедневный анализ. Полные материалы открываются в приватном кабинете; полный ежедневный аудит всех сторон магазина ещё готовится.",
          "services": [
            "reports",
            "notifications",
            "daily-reports"
          ],
          "sections": [
            {
              "id": "report-center-mcp",
              "title": "Центр отчётов через MCP",
              "blocks": [
                {
                  "type": "paragraph",
                  "text": "reports.create создаёт выключенное определение отчёта daily-review/1 в Memory. Выберите sales, advertising, stock, change, время и дни недели. reports.run запускает один выпуск; reports.status показывает job; reports.result читает проверенный результат по artifact_id. reports.schedule отдельно включает или выключает повторение. Это ограниченный обзор ежедневного помощника, а не полный финансовый аудит. Статус partial и пробелы данных остаются видимыми."
                }
              ]
            }
          ],
          "methods": [
            "reports.list",
            "reports.create",
            "reports.run",
            "reports.schedule",
            "reports.status",
            "reports.result"
          ]
        },
        "services/content": {
          "title": "Подготовьте карточку, которая понятнее покупателю",
          "lead": "Агент помогает доработать описание, характеристики и изображения, опираясь на реальные свойства товара и ваши материалы.",
          "purpose": "Покупатель должен понимать размер, комплект, назначение и особенности товара. Разбор карточки помогает найти неясности, а подготовленные тексты и изображения — проверить вариант улучшения до размещения.",
          "example": "«Для этого артикула подготовь описание и размерный слайд. Используй мои фотографии и подтверждённые размеры. Сохрани цвет и комплектацию, покажи результат перед публикацией».",
          "steps": [
            "Укажите товар, проблему и желаемый результат; предоставьте факты и исходные материалы.",
            "Попросите агента показать, что именно стоит изменить и на каких данных основано предложение.",
            "Проверьте черновик: свойства, размеры, цвет, комплектацию и читаемость на телефоне.",
            "Скачайте подготовленные материалы для проверки и ручного размещения. После размещения сравните доступные показатели."
          ],
          "result": "Черновик текста, изображения или макет, сохранённый в задаче магазина. Вы можете попросить доработку и сравнить версии.",
          "limits": "Возможности генерации зависят от клиента. Rich content и видео могут возвращаться как макет и сценарий. Автоматическая публикация на Wildberries не заявляется готовой; улучшение карточки не гарантирует рост продаж.",
          "services": [
            "content"
          ]
        },
        "agents": {
          "title": "Дайте своему агенту доступ к работе с магазином",
          "lead": "Подключение позволяет агенту отвечать по данным магазина и пользоваться инструментами X-MP в пределах выданных прав.",
          "purpose": "Агенту нужны сведения о бизнесе и способ получить актуальные цифры. X-MP связывает его с конкретным магазином: данные, память, задачи и результаты становятся доступны через одно управляемое подключение.",
          "example": "После подключения: «Проверь, к какому магазину ты подключён, прочитай его цели из памяти и скажи, какие данные доступны для первого разбора».",
          "steps": [
            "Откройте подключение агента в личном кабинете выбранного магазина.",
            "Выберите доступный совместимый клиент и выполните его инструкцию подключения.",
            "Проверьте с агентом название магазина, права, доступные инструменты и свежесть данных.",
            "Если доступ больше не нужен, отзовите соответствующий ключ в кабинете."
          ],
          "result": "Агент может выполнить первую задачу на данных вашего магазина, а вы контролируете его доступ.",
          "limits": "Совместимость проверяется для конкретного клиента. Ключ хранится защищённо, не в чате. Чтение, подготовка плана и исполнение — разные права; подключение не разрешает агенту менять магазин произвольно.",
          "services": [
            "mcp"
          ],
          "sections": [
            {
              "id": "manuals",
              "title": "Руководства и справочник",
              "blocks": [
                {
                  "type": "links",
                  "items": [
                    [
                      "Репрайсер",
                      "/docs/services/repricer/"
                    ],
                    [
                      "Биддер",
                      "/docs/services/bidder/"
                    ],
                    [
                      "Отзывы",
                      "/docs/services/reviews/"
                    ],
                    [
                      "Мониторинг",
                      "/docs/services/monitoring/"
                    ],
                    [
                      "Аналитика",
                      "/docs/services/analytics/"
                    ],
                    [
                      "MCP данных",
                      "/docs/services/mcp-data/"
                    ],
                    [
                      "Справочник методов",
                      "/docs/mcp-reference/"
                    ]
                  ]
                }
              ]
            }
          ]
        },
        "owner-workspace": {
          "title": "Организуйте работу владельца и команды",
          "lead": "Используйте задачи, данные и результаты одного магазина, чтобы поручения не терялись между разговорами и участниками.",
          "purpose": "Владелец задаёт приоритеты, менеджер работает в пределах своего доступа, агент помогает с анализом и подготовкой решений. Сохранённая задача связывает поручение с результатом и следующим шагом.",
          "example": "«Разбери товары с растущими расходами. Сохрани отдельные задачи для проверки рекламы и карточек, а общий вывод — в отчёте».",
          "steps": [
            "Выберите магазин и проверьте участников и их права.",
            "Сформулируйте задачу агенту: цель, период, ограничения и ожидаемый результат.",
            "Открывайте сохранённые задачи и материалы в кабинете.",
            "При продолжении поручите агенту прочитать состояние задачи и действующие правила магазина."
          ],
          "result": "Команда видит сохранённую работу в пределах выданного доступа; владелец может проверить вывод и следующий шаг.",
          "limits": "Работа привязана к выбранному магазину. Чат не равен расписанию фоновых задач; постоянное выполнение требует отдельно настроенного доступного процесса.",
          "services": []
        },
        "security": {
          "title": "Контролируйте доступ и изменения",
          "lead": "Вы определяете, кто работает с магазином и какие действия ему доступны. Анализ данных и изменение магазина разделены.",
          "purpose": "Это позволяет поручить агенту разбор бизнеса и подготовку решений, сохраняя контроль над ценами, рекламой и другими действиями. Участники получают доступ к своим магазинам и разрешённым функциям.",
          "example": "«Проанализируй цены и подготовь предложение. Перед изменением покажи конкретные товары, новые цены и ограничения».",
          "steps": [
            "Выдавайте каждому подключению отдельный доступ с нужными правами.",
            "Вводите ключи в защищённых настройках; не отправляйте их в чат или отчёт.",
            "Перед доступным изменением проверяйте точный план и подтверждайте нужное действие.",
            "Отзывайте доступ, когда он больше не нужен. При подозрении на утечку сначала отзовите ключ и сообщите о проблеме."
          ],
          "result": "Понятные границы доступа и возможность проверить действие до выполнения и его результат после.",
          "limits": "Правило в памяти или выбранная цель не заменяет разрешение на действие. Готовность исполнения проверяется для конкретного инструмента, а не по наличию ключа.",
          "services": []
        },
        "bug-report-center": {
          "title": "Помогите разобраться, если что-то не работает",
          "lead": "Сообщение о проблеме связывает ошибку с конкретной задачей, чтобы поддержку не пришлось начинать с догадок.",
          "purpose": "Если агент не может получить данные или открыть результат, важно отличить технический сбой от отсутствующих данных, прав или незавершённого сбора. Короткое описание с временем и ожидаемым результатом помогает это проверить.",
          "example": "«Сегодня при открытии недельного отчёта появилась ошибка. Ожидал увидеть сравнение продаж. Повторное открытие не помогло».",
          "steps": [
            "Запишите, что делали, когда появилась проблема и какой результат ожидали.",
            "Попросите агента проверить доступ и состояние нужного сервиса, если он может это сделать.",
            "Откройте «Сообщить о проблеме» в кабинете или поручите агенту отправить очищенное техническое описание доступным инструментом.",
            "Сохраните номер обращения, если он выдан, и используйте его при продолжении."
          ],
          "result": "Обращение с контекстом ошибки, по которому можно продолжать разбор без повторного пересказа.",
          "limits": "Не включайте ключи, cookies, полный чат или сырые данные магазина. Отправка обращения не означает, что ошибка уже исправлена; срок решения зависит от диагностики.",
          "services": []
        },
        "services/repricer": {
          "title": "Репрайсер: цены, экономика и согласование изменений",
          "lead": "Подробное руководство по настройке ценовых задач: какие цены читает сервис, как рассчитывает допустимое предложение, почему может отказаться и как проверяется согласованная отправка.",
          "purpose": "Репрайсер нужен, когда цену нельзя выбирать изолированно от затрат, ограничений и предыдущих изменений. Вы задаёте целевую цену или правило по запасу, а сервис проверяет, укладывается ли предложение в экономику товара и установленные пределы. Агент помогает сформулировать условия; численный расчёт выполняет ценовой модуль.",
          "example": "«Для этих товаров подготовь движение к целевой цене. Не выходи за согласованный коридор, сохрани минимальную маржинальность моей модели и покажи причины по каждому товару».",
          "steps": [
            "Подключите магазин и проверьте agent.me, capabilities.list и automations.credentials.requirements с domain=pricing.",
            "Согласуйте в памяти магазина товары, цели, затраты, сроки действия и ограничения. Для настройки нужны operations.read, operations.plan и доступ к задаче.",
            "Прочитайте текущую конфигурацию, подготовьте новую версию, проверьте repricer.config.validate и привяжите условия к актуальной задаче.",
            "Сохраните конфигурацию, выполните один предварительный расчёт и прочитайте решения. Для возможной отправки используйте отдельный точный план и подтверждение владельца."
          ],
          "result": "По каждому товару — текущее состояние, желаемая и допустимая цена, ограничения и причина предложения, удержания или блокировки. При отдельном исполнении — план, состояние отправки и проверенный результат.",
          "limits": "Конфигурация и предварительные расчёты работают в observe/shadow. Отдельный исполнитель согласованных цен существует, но успешный реальный пилот изменения на WB не объявляется подтверждённым. Наличие ключа и метода не доказывает готовность конкретного магазина. Автономная переоценка без точного согласования не включена.",
          "sections": [
            {
              "id": "structure",
              "title": "Из чего состоит репрайсер",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Часть",
                    "Что хранит или делает",
                    "Результат"
                  ],
                  "rows": [
                    [
                      "Задача в памяти",
                      "Цель, ограничения, обоснование затрат и актуальная версия договорённостей.",
                      "Основание для настройки; не разрешение на запись."
                    ],
                    [
                      "Конфигурация pricing",
                      "Полный набор задач и товаров, стратегии, срок действия и ограничения.",
                      "Неизменяемая зарегистрированная версия с контрольной суммой."
                    ],
                    [
                      "Источник цен",
                      "Наблюдаемая цена и скидка, варианты размеров, время и версия источника.",
                      "Проверяемый снимок для расчёта."
                    ],
                    [
                      "Расчётный модуль",
                      "Пересекает финансовый порог, коридор, шаг и лимит движения.",
                      "Предложения и причины по каждому товару."
                    ],
                    [
                      "Точный план",
                      "Повторно проверяет цены, условия задачи и историю исполнений.",
                      "Конкретные цены и ссылка владельцу для согласования."
                    ],
                    [
                      "Проверка исполнения",
                      "Сопоставляет статус загрузки и фактические цены после отправки.",
                      "Подтверждённый результат либо состояние, требующее разбора."
                    ]
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "Один магазин имеет одну активную конфигурацию домена pricing, внутри которой может быть несколько задач. Обновление заменяет полный набор, а не добавляет к нему отдельное поле. Старые версии и история сохраняются."
                }
              ]
            },
            {
              "id": "price-inputs",
              "title": "Какие параметры читает расчёт",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Параметр",
                    "Смысл",
                    "Как влияет"
                  ],
                  "rows": [
                    [
                      "target_id",
                      "Артикул WB, передаваемый строкой.",
                      "Товар должен совпасть с выбранным источником цены."
                    ],
                    [
                      "discountedPrice",
                      "Цена продавца после его скидки, в рублях.",
                      "Основная управляемая величина; не цена после СПП или кошелька."
                    ],
                    [
                      "Цена и скидка размеров",
                      "Наблюдаемые варианты одного товара.",
                      "Неодинаковые или неполные цены размеров блокируют общий расчёт."
                    ],
                    [
                      "Время и версия цены",
                      "Когда получено наблюдение и к какой версии относится.",
                      "Устаревшую или неоднозначную цену нельзя использовать для нового плана."
                    ],
                    [
                      "stock_cover_days, stock_observed_at",
                      "Запас в днях и время наблюдения.",
                      "Нужны только стратегии stock-cover; не угадываются из одного остатка."
                    ],
                    [
                      "История подтверждённых действий",
                      "Последняя проверенная цена, предыдущие движения, незавершённые операции и ручная остановка.",
                      "Определяет паузу, остаток суточного лимита и блокировки."
                    ]
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "Текущий адаптер цен не рассчитывает дни запаса автоматически из сырых заказов и остатков. Если такого входа нет, stock-cover вернёт missing_stock_cover. Для target-seller-price дни запаса не являются обязательной частью стратегии."
                }
              ]
            },
            {
              "id": "configuration",
              "title": "Структура конфигурации и задачи",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Поле",
                    "Назначение"
                  ],
                  "rows": [
                    [
                      "repricer_version=2",
                      "Версия ценового формата внутри конфигурации контроллера."
                    ],
                    [
                      "config_id, mode",
                      "Имя версии и режим observe/shadow."
                    ],
                    [
                      "expected_config_sha256",
                      "Контрольная сумма последней прочитанной конфигурации; пустая строка — создание при её отсутствии."
                    ],
                    [
                      "tasks[].task_id, enabled",
                      "Идентификатор задачи и явное включение её расчёта."
                    ],
                    [
                      "tasks[].binding",
                      "Ссылки на согласованную запись памяти и версию задачи."
                    ],
                    [
                      "tasks[].valid_until",
                      "Срок действия условий с часовым поясом. Истёкшая модель затрат не продолжает действовать молча."
                    ],
                    [
                      "tasks[].strategy.kind",
                      "target-seller-price, stock-cover или hold."
                    ],
                    [
                      "products[].safe_min_price / safe_max_price",
                      "Разрешённый ценовой коридор в рублях."
                    ],
                    [
                      "products[].target_price",
                      "Желаемая цена для target-seller-price. Для hold не передаётся."
                    ],
                    [
                      "economics.revision_ref",
                      "Версия согласованной модели затрат."
                    ],
                    [
                      "economics.fixed_cost_rub",
                      "Согласованные фиксированные расходы на единицу, в рублях."
                    ],
                    [
                      "economics.variable_cost_percent",
                      "Согласованная доля переменных расходов в процентах."
                    ]
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "Неизвестные поля и стратегии отклоняются. На один товар допускается одна включённая задача. Лимит определения — до 100 задач и суммарно 1000 товарных строк; это ограничение файла, а не обещание производительности для 1000 магазинов."
                }
              ]
            },
            {
              "id": "guardrails",
              "title": "Настройки ограничений",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Поле guardrails",
                    "По умолчанию",
                    "Допустимый диапазон и смысл"
                  ],
                  "rows": [
                    [
                      "max_snapshot_age_seconds",
                      "900 секунд",
                      "1–3600; максимальный возраст цены."
                    ],
                    [
                      "max_actions_per_cycle",
                      "5",
                      "1–100 предложений за расчёт."
                    ],
                    [
                      "max_step_percent",
                      "5%",
                      "0,01–20%; максимальное изменение за один шаг."
                    ],
                    [
                      "max_24h_movement_percent",
                      "10%",
                      "0,01–20%; сумма абсолютных движений за скользящие 24 часа."
                    ],
                    [
                      "cooldown_seconds",
                      "21600 секунд / 6 часов",
                      "900–604800; пауза после подтверждённого изменения."
                    ],
                    [
                      "minimum_margin_percent",
                      "15%",
                      "0–99%; минимум маржинальности именно заданной модели."
                    ],
                    [
                      "deadband_rub",
                      "1 ₽",
                      "0,01–100000 ₽; малое отклонение, при котором цену оставляют прежней."
                    ]
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "interval_seconds задаётся отдельно: 60–86400 секунд, по умолчанию 900. Само сохранение интервала не включает расписание. Значения по умолчанию описывают контракт и не являются рекомендацией для вашей экономики."
                }
              ]
            },
            {
              "id": "configuration-example",
              "title": "Полный учебный профиль репрайсера",
              "blocks": [
                {
                  "type": "paragraph",
                  "text": "Шаблон отключён и содержит вымышленные идентификаторы, ссылки и суммы. Он показывает структуру, а не настройки вашего магазина. Замените их на согласованные условия и действительные версии памяти; выберите реальный срок действия. Не включайте пример как готовую конфигурацию."
                },
                {
                  "type": "code",
                  "label": "Полный учебный профиль репрайсера",
                  "value": "{\n  \"repricer_version\": 2,\n  \"config_id\": \"repricer-example-v2\",\n  \"mode\": \"shadow\",\n  \"tasks\": [\n    {\n      \"task_id\": \"example-target-price\",\n      \"enabled\": false,\n      \"binding\": {\n        \"memory_revision_ref\": \"example-memory-revision-1\",\n        \"task_revision_ref\": \"example-task-revision-1\"\n      },\n      \"valid_until\": \"2099-01-01T00:00:00Z\",\n      \"strategy\": {\n        \"kind\": \"target-seller-price\"\n      },\n      \"products\": [\n        {\n          \"target_id\": \"123456\",\n          \"safe_min_price\": 900,\n          \"safe_max_price\": 1300,\n          \"target_price\": 1100,\n          \"economics\": {\n            \"revision_ref\": \"example-economics-revision-1\",\n            \"fixed_cost_rub\": 550,\n            \"variable_cost_percent\": 20\n          }\n        }\n      ]\n    }\n  ],\n  \"expected_config_sha256\": \"\"\n}"
                },
                {
                  "type": "links",
                  "items": [
                    [
                      "Опубликованный шаблон для скачивания",
                      "/cabinet/static/xmp-repricer.example.json"
                    ]
                  ]
                }
              ]
            },
            {
              "id": "calculation",
              "title": "Как получается предложение цены",
              "blocks": [
                {
                  "type": "steps",
                  "items": [
                    "Проверяется задача: включена ли, не истёк ли срок, однозначно ли выбран товар.",
                    "Проверяется цена и история: свежесть, незавершённые действия, ручная остановка и внешние изменения.",
                    "Рассчитывается нижний порог модели затрат.",
                    "Стратегия определяет желаемое направление.",
                    "Финансовый порог пересекается с коридором владельца, допустимым шагом и оставшимся лимитом движения.",
                    "Если пересечение пустое, товар блокируется; если отклонение мало — цена удерживается. Предложение сохраняется с причиной."
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "Порог = fixed_cost_rub / (1 − variable_cost_percent / 100 − minimum_margin_percent / 100). Знаменатель должен быть положительным. Порог округляется вверх до копейки. Расходы на налоги, возвраты, комиссию, рекламу и логистику должны быть согласованно включены в модель; сервис не угадывает их и не добавляет повторно."
                },
                {
                  "type": "paragraph",
                  "text": "Учебный расчёт: фиксированные расходы 550 ₽, переменная доля 20%, минимальная маржинальность 15%. Порог = 550 / 0,65 = 846,16 ₽ после округления вверх. При коридоре 900–1300 ₽, текущей цене 1000 ₽, цели 1100 ₽ и шаге 5% ближайшее предложение не выше 1050 ₽, если остальные проверки пройдены. Это пример механики, не прогноз прибыли."
                },
                {
                  "type": "table",
                  "headers": [
                    "Стратегия",
                    "Правило"
                  ],
                  "rows": [
                    [
                      "target-seller-price",
                      "Движение к target_price в пределах всех ограничений."
                    ],
                    [
                      "stock-cover",
                      "Ниже low_days — повышение на step_percent; выше high_days — снижение; внутри диапазона — удержание. Нужны подтверждённые дни запаса."
                    ],
                    [
                      "hold",
                      "Удержание без новой цены."
                    ]
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "Суточный лимит учитывает оба направления: снижение и обратное повышение расходуют его. Предварительное предложение ещё не является действием и не расходует лимит подтверждённых изменений."
                }
              ]
            },
            {
              "id": "workflow",
              "title": "Порядок работы через методы",
              "blocks": [
                {
                  "type": "code",
                  "label": "automations.config.get",
                  "value": "{\n  \"domain\": \"pricing\"\n}",
                  "method": "automations.config.get"
                },
                {
                  "type": "steps",
                  "items": [
                    "Возьмите текущую конфигурацию и её server SHA-256. Не передавайте обратно служебные поля ответа.",
                    "Вызовите repricer.config.validate с полным объектом config. Получите effective config и bindings[].success_criterion.",
                    "Добавьте критерий в соответствующую задачу памяти, сохранив остальные критерии. Через tasks.resume прочитайте UUID и текущую version; укажите их в binding.",
                    "Вызовите automations.config.apply с domain=pricing, config и idempotency_key. После записи перечитайте config.get.",
                    "Выполните один automations.shadow.run либо создайте automations.jobs.create. Прочитайте результат и причины через runs.list или jobs.get."
                  ]
                },
                {
                  "type": "code",
                  "label": "automations.shadow.run",
                  "value": "{\n  \"domain\": \"pricing\",\n  \"idempotency_key\": \"guide-pricing-preview-001\"\n}",
                  "method": "automations.shadow.run"
                },
                {
                  "type": "code",
                  "label": "automations.runs.list",
                  "value": "{\n  \"domain\": \"pricing\",\n  \"limit\": 5\n}",
                  "method": "automations.runs.list"
                },
                {
                  "type": "paragraph",
                  "text": "Примеры показывают форму запроса. Артикулы, Memory refs и ключи идемпотентности заменяются для реальной задачи. Вызов расчёта сохраняет результат X-MP, но не меняет цену WB."
                }
              ]
            },
            {
              "id": "execution",
              "title": "Точный план, согласование и чтение результата",
              "blocks": [
                {
                  "type": "code",
                  "label": "repricer.plan",
                  "value": "{\n  \"target_ids\": [\n    \"123456\"\n  ],\n  \"idempotency_key\": \"guide-pricing-plan-001\"\n}",
                  "method": "repricer.plan"
                },
                {
                  "type": "paragraph",
                  "text": "repricer.plan принимает 1–5 артикулов и повторно читает собственные цены зарегистрированным методом. Возвращает plan_id, точные значения, контрольную сумму конфигурации, срок и approval_url. План действует 10 минут. Повтор с тем же ключом возвращает тот же план, а не новый произвольный расчёт."
                },
                {
                  "type": "steps",
                  "items": [
                    "Владелец открывает approval_url в своей сессии и проверяет товары, цены до/после, базовую цену и скидку.",
                    "Отправка возможна только после точного подтверждения владельца и повторной серверной проверки. Кнопка отправки — отдельное действие, не часть чтения руководства.",
                    "repricer.plan.get показывает состояние. repricer.reconcile проверяет загрузку и фактические цены, ничего не отправляя повторно.",
                    "succeeded означает совпадение подтверждённого статуса загрузки и фактической базовой цены, скидки и цены продавца. pending/unknown требуют проверки, а не слепого повторения."
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "Исполнитель сохраняет текущую скидку и работает с общей ценой RUB при одинаковых ценах размеров. Акции, отдельные размеры, управление персональной ценой покупателя и автоматическое следование конкуренту этим путём не поддерживаются. Возврат к старой цене — новый проверяемый план."
                }
              ]
            },
            {
              "id": "failures",
              "title": "Причины удержания и блокировки",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Причина",
                    "Что означает",
                    "Что проверить"
                  ],
                  "rows": [
                    [
                      "missing_price / stale_price",
                      "Цены нет или она слишком старая.",
                      "Источник и время последнего сбора."
                    ],
                    [
                      "ambiguous_price / incomplete_price",
                      "Варианты дают неоднозначную или неполную цену.",
                      "Состав размеров и согласованность снимка."
                    ],
                    [
                      "definition_expired",
                      "Истёк срок задачи и её условий.",
                      "Актуализировать затраты и срок через новую версию задачи."
                    ],
                    [
                      "infeasible_economics / corridor_step_conflict",
                      "Безопасного допустимого решения нет.",
                      "Модель расходов, коридор, целевую цену и шаг; не обходить проверку."
                    ],
                    [
                      "movement_limit / cooldown",
                      "Исчерпан лимит движения или не закончена пауза.",
                      "Историю подтверждённых действий и время."
                    ],
                    [
                      "pending_readback / external_price_change",
                      "Есть незавершённое действие или цена изменилась вне ожиданий.",
                      "Предыдущую операцию и фактическую цену."
                    ],
                    [
                      "missing_stock_cover / stale_stock",
                      "Нет свежего запаса в днях.",
                      "Доступность входа stock-cover."
                    ],
                    [
                      "deadband / stock_in_band",
                      "Изменение по стратегии не требуется.",
                      "Это нормальное удержание, а не техническая ошибка."
                    ]
                  ]
                }
              ]
            }
          ],
          "methods": [
            "automations.credentials.requirements",
            "automations.status",
            "automations.config.get",
            "automations.config.apply",
            "automations.shadow.run",
            "automations.jobs.create",
            "automations.jobs.get",
            "automations.jobs.list",
            "automations.runs.list",
            "automations.emergency-stop",
            "repricer.config.validate",
            "repricer.plan",
            "repricer.plan.get",
            "repricer.reconcile"
          ],
          "services": [
            "repricer"
          ]
        },
        "services/bidder": {
          "title": "Рекламный биддер: стратегии, бюджет и расчёт ставок",
          "lead": "Руководство по рекламному профилю v2: данные кампаний, единицы денег, целевой ДРР, ограничения, расписание расчётов и причины, по которым ставка остаётся прежней.",
          "purpose": "Биддер превращает согласованные правила рекламы в повторяемый расчёт по выбранным кампаниям. Его задача — показать допустимое предложение, а не увеличивать ставку при любом падении продаж. Он учитывает полноту данных, статистику, бюджетные условия, запас и ограничения самой кампании.",
          "example": "«По этим кампаниям рассчитывай предложения с целевым ДРР и согласованным потолком ставки. Объясняй случаи, где данных недостаточно. Пока не меняй рекламу на WB».",
          "steps": [
            "Подключите данные рекламы и агентский доступ operations.read, operations.plan, tasks.read.",
            "Создайте или продолжите задачу рекламы в памяти. Согласуйте кампании, бюджет, цель и ограничения.",
            "Проверьте automations.catalog и automations.credentials.requirements для advertising, затем прочитайте текущую конфигурацию.",
            "Подготовьте профиль v2 сначала отключённым. После проверки отдельно включайте расчёт предложений и контролируйте историю."
          ],
          "result": "Решение по каждой кампании: удержать, предложить повышение/снижение ставки или защитную остановку, с причинами и ссылками на источники.",
          "limits": "Текущий режим — observe/shadow. Изменения ставок WB, переводы денег, автоматическое возобновление кампаний и общий распределитель бюджета магазина не включены. Некоторые обязательные входы расчёта могут отсутствовать у реального магазина; это приводит к hold, а не к выдуманной ставке.",
          "sections": [
            {
              "id": "structure",
              "title": "Структура рекламного профиля",
              "blocks": [
                {
                  "type": "paragraph",
                  "text": "Один активный профиль advertising описывает набор campaign ID, стратегию и ограничения. Задача в памяти хранит цель бизнеса, профиль — её проверенную версию для расчёта, очередь — отдельные запуски, история — результаты. Создание профиля не создаёт кампанию Wildberries."
                },
                {
                  "type": "table",
                  "headers": [
                    "Часть",
                    "Поля и назначение"
                  ],
                  "rows": [
                    [
                      "Идентичность версии",
                      "config_id, schema_version=1, expected_config_sha256; последняя прочитанная версия защищает от перезаписи чужой правки."
                    ],
                    [
                      "Основание",
                      "source_binding.card_id и card_version из tasks.resume; при сохранении проверяется текущая задача."
                    ],
                    [
                      "Кампании",
                      "target_ids — строковые ID рекламных кампаний, не nmID товаров."
                    ],
                    [
                      "Единицы",
                      "bid_unit=kopecks; decision_basis=wb_attributed_revenue."
                    ],
                    [
                      "Стратегия",
                      "bidder.version=2, bidder.strategy=fixed или target_drr."
                    ],
                    [
                      "Запуск",
                      "bidder.enabled и interval_seconds; включение запускает периодический shadow-расчёт."
                    ],
                    [
                      "Правила",
                      "Для v2 rules=[]; произвольные legacy-правила с новым профилем не смешиваются."
                    ]
                  ]
                }
              ]
            },
            {
              "id": "inputs",
              "title": "Какие данные читает биддер",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Вход",
                    "Единица / смысл",
                    "Для чего нужен"
                  ],
                  "rows": [
                    [
                      "current_bid_kopecks, min_bid_kopecks",
                      "Целые копейки; текущая ставка и подтверждённый минимум платформы.",
                      "Допустимый коридор и шаг."
                    ],
                    [
                      "spend_rub, attributed_revenue_rub",
                      "Рубли за окно статистики; выручка, отнесённая WB к рекламе.",
                      "Расчёт ДРР. Это не вся выручка магазина."
                    ],
                    [
                      "clicks",
                      "Число кликов.",
                      "Проверка минимальной выборки."
                    ],
                    [
                      "daily_spend_kopecks, spend_date, spend_timezone",
                      "Дневной расход именно за локальный день профиля.",
                      "Сравнение с дневным лимитом и резервом. Расход окна статистики не подставляется вместо дневного."
                    ],
                    [
                      "stock_cover_days, stock_complete",
                      "Дни запаса и признак достаточности данных.",
                      "Защита при малом запасе; неизвестное значение не считается нулём."
                    ],
                    [
                      "captured_at, metrics_captured_at",
                      "Время состояния кампании и её статистики.",
                      "Независимая проверка свежести."
                    ],
                    [
                      "attribution_window_end",
                      "Конец окна атрибуции.",
                      "Ожидание запаздывающих заказов."
                    ],
                    [
                      "status, payment_type, bid_type",
                      "Активность, cpm/cpc, manual/unified.",
                      "Проверка подходящего типа кампании."
                    ],
                    [
                      "bid_change_supported, pause_supported",
                      "Подтверждённые адаптером возможности.",
                      "Числовая ставка сама по себе не доказывает возможность её изменения."
                    ],
                    [
                      "manual_stop, pending_command, external_change",
                      "Остановка, незавершённая команда, внешняя правка.",
                      "Предотвращение противоречащих друг другу действий."
                    ],
                    [
                      "data_complete, metrics_complete, source_run_ids",
                      "Достаточность снимка и происхождение.",
                      "Объяснимость решения и отказ при недостатке данных."
                    ]
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "Наличие поля в модели не гарантирует, что источник умеет заполнить его для каждой кампании. Если нет дневного расхода, запаса, конца атрибуции или минимума ставки, оптимизация может остаться заблокированной."
                }
              ]
            },
            {
              "id": "settings",
              "title": "Настройки стратегии и бюджета",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Поле",
                    "Как задаётся",
                    "Поведение"
                  ],
                  "rows": [
                    [
                      "bidder.strategy",
                      "fixed / target_drr",
                      "Фиксированная цель либо движение по ДРР."
                    ],
                    [
                      "bidder.fixed_bid_kopecks",
                      "Целые копейки",
                      "Целевая ставка стратегии fixed; не гарантирует движение за один шаг."
                    ],
                    [
                      "bidder.target_drr",
                      "Доля: 0.18 = 18%",
                      "Цель расход / рекламная выручка."
                    ],
                    [
                      "bidder.deadband",
                      "Относительная доля: 0.1 = 10%",
                      "При цели 18% удержание в диапазоне 16,2–19,8%."
                    ],
                    [
                      "bidder.economic_bid_cap_kopecks",
                      "Копейки",
                      "Явно согласованный дополнительный потолок; сервис не выводит его автоматически из прибыли."
                    ],
                    [
                      "bidder.daily_budget_kopecks",
                      "Копейки на каждую кампанию",
                      "Не общий лимит всех кампаний магазина."
                    ],
                    [
                      "bidder.budget_reserve_kopecks",
                      "Копейки",
                      "Защитный порог расхода = дневной лимит − резерв."
                    ],
                    [
                      "bidder.require_stock",
                      "true / false",
                      "Требовать данные запаса для оптимизации."
                    ],
                    [
                      "bidder.attribution_lag_seconds",
                      "Секунды",
                      "Пауза после конца окна атрибуции."
                    ],
                    [
                      "policy_confirmed",
                      "true / false",
                      "Фиксирует согласованность условий; не включает исполнение WB."
                    ],
                    [
                      "bidder.enabled",
                      "true / false",
                      "Включает или прекращает повторяемые расчёты предложений."
                    ],
                    [
                      "interval_seconds",
                      "10–86400 секунд",
                      "Частота расчёта, а не частота изменения ставки."
                    ]
                  ]
                },
                {
                  "type": "table",
                  "headers": [
                    "Поле guardrails",
                    "Смысл"
                  ],
                  "rows": [
                    [
                      "min_bid_kopecks / max_bid_kopecks",
                      "Нижняя и верхняя ставки; дополнительно учитывается минимум платформы и экономический потолок."
                    ],
                    [
                      "max_step_percent",
                      "Максимальный процент изменения за одно решение."
                    ],
                    [
                      "cooldown_seconds",
                      "Пауза после записанного действия."
                    ],
                    [
                      "min_clicks / min_spend_rub",
                      "Минимум кликов и расходов в рублях перед оптимизацией."
                    ],
                    [
                      "min_stock_cover_days",
                      "Защитный порог запаса в днях."
                    ],
                    [
                      "max_snapshot_age_seconds",
                      "Максимальный возраст состояния и статистики."
                    ],
                    [
                      "max_actions_per_cycle",
                      "Лимит предложений в одном запуске; защитные остановки приоритетнее."
                    ]
                  ]
                }
              ]
            },
            {
              "id": "algorithm",
              "title": "Как рассчитывается ставка",
              "blocks": [
                {
                  "type": "steps",
                  "items": [
                    "Проверяются профиль, ручная остановка, незавершённая команда и внешние изменения.",
                    "Проверяются рабочее окно, запас и дневной бюджет; при подтверждённых условиях может появиться защитное предложение pause.",
                    "Для оптимизации требуются активная подходящая кампания, свежие и полные данные, законченная пауза, достаточная выборка и созревшая атрибуция.",
                    "Стратегия fixed выбирает заданную целевую ставку. target_drr делит spend_rub на attributed_revenue_rub.",
                    "Если ДРР выше диапазона допуска — направление вниз, ниже — вверх; внутри — удержание. При нулевой выручке ДРР неопределён и ставка удерживается.",
                    "Желаемая ставка пересекается с шагом, минимумом платформы, коридором и экономическим потолком. Если допустимого решения нет, сохраняется причина отказа."
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "Учебный пример: ставка 1000 копеек, шаг 10%, целевой ДРР 0.18, допуск 0.1. При ДРР 0.25 желаемая ставка — 900 копеек. Если минимум платформы 950, допустимое предложение может стать 950. Если безопасное пересечение отсутствует, ставка не выбирается «примерно». Пример действует только при пройденных остальных проверках и не является настройкой магазина."
                },
                {
                  "type": "paragraph",
                  "text": "CTR, CPC, CPO и конверсия доступны в аналитике, но не становятся автоматически стратегиями биддера v2. Стратегии по позиции, поисковым кластерам, портфелю, прибыли и расходу без заказов требуют отдельной реализации."
                }
              ]
            },
            {
              "id": "configuration-example",
              "title": "Полный учебный профиль биддера",
              "blocks": [
                {
                  "type": "paragraph",
                  "text": "Шаблон отключён и содержит вымышленные идентификаторы, ссылки и суммы. Он показывает структуру, а не настройки вашего магазина. Замените их на согласованные условия и действительные версии памяти; выберите реальный срок действия. Не включайте пример как готовую конфигурацию."
                },
                {
                  "type": "code",
                  "label": "Полный учебный профиль биддера",
                  "value": "{\n  \"schema_version\": 1,\n  \"config_id\": \"advertising-task-bound-v2\",\n  \"mode\": \"shadow\",\n  \"interval_seconds\": 60,\n  \"bid_unit\": \"kopecks\",\n  \"decision_basis\": \"wb_attributed_revenue\",\n  \"policy_confirmed\": false,\n  \"target_ids\": [],\n  \"guardrails\": {\n    \"max_snapshot_age_seconds\": 300,\n    \"max_actions_per_cycle\": 5,\n    \"min_bid_kopecks\": 100,\n    \"max_bid_kopecks\": 250000,\n    \"max_step_percent\": 10,\n    \"cooldown_seconds\": 1800,\n    \"min_stock_cover_days\": 7,\n    \"min_clicks\": 30,\n    \"min_spend_rub\": 100\n  },\n  \"rules\": [],\n  \"expected_config_sha256\": \"\",\n  \"source_binding\": {\n    \"card_id\": \"00000000-0000-0000-0000-000000000001\",\n    \"card_version\": 1\n  },\n  \"bidder\": {\n    \"version\": 2,\n    \"enabled\": false,\n    \"strategy\": \"target_drr\",\n    \"target_drr\": \"0.18\",\n    \"deadband\": \"0.1\",\n    \"schedule\": {\n      \"timezone\": \"Europe/Moscow\",\n      \"windows\": [\n        {\n          \"days\": [\n            0,\n            1,\n            2,\n            3,\n            4,\n            5,\n            6\n          ],\n          \"start_minute\": 0,\n          \"end_minute\": 1440\n        }\n      ]\n    },\n    \"daily_budget_kopecks\": 100000,\n    \"budget_reserve_kopecks\": 10000,\n    \"require_stock\": true,\n    \"attribution_lag_seconds\": 172800,\n    \"economic_bid_cap_kopecks\": 1000\n  }\n}"
                },
                {
                  "type": "links",
                  "items": [
                    [
                      "Опубликованный шаблон для скачивания",
                      "/cabinet/static/xmp-bidder.example.json"
                    ]
                  ]
                }
              ]
            },
            {
              "id": "schedule",
              "title": "Три разных понятия времени и бюджета",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Понятие",
                    "Как работает сейчас"
                  ],
                  "rows": [
                    [
                      "Расписание расчёта",
                      "interval_seconds и enabled управляют повторяемыми shadow-запусками X-MP."
                    ],
                    [
                      "Рабочее окно рекламы",
                      "bidder.schedule содержит timezone и windows: days, start_minute, end_minute. Вне окна возможна рекомендация остановки; автоматического старта нет."
                    ],
                    [
                      "Пополнение бюджета",
                      "Утренние/вечерние переводы не подключены к исполнению v2. Дневной предел не является переводом средств."
                    ]
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "Дни: понедельник 0, воскресенье 6. Минуты: 0–1440. Ночное окно разделите у полуночи, например 22:00–24:00 и 00:00–06:00. IANA timezone, например Europe/Moscow, задаётся явно. Даже наличие окна не означает, что WB физически остановит рекламу: текущий результат — предложение."
                }
              ]
            },
            {
              "id": "lifecycle",
              "title": "Создание, проверка, обновление и отключение",
              "blocks": [
                {
                  "type": "code",
                  "label": "automations.config.get",
                  "value": "{\n  \"domain\": \"advertising\"\n}",
                  "method": "automations.config.get"
                },
                {
                  "type": "steps",
                  "items": [
                    "Прочитайте задачу через tasks.resume и возьмите реальную card_version.",
                    "Заполните профиль v2 по шаблону: кампании, цели, лимиты и source_binding. При создании expected_config_sha256 — пустая строка, при обновлении — текущая сумма.",
                    "Передайте весь профиль в automations.config.apply с domain=advertising. Не возвращайте служебные received_at/config_sha256 как часть пользовательского config.",
                    "Проверьте сохранённую версию. Отключённый профиль даёт profile_disabled. Для проверки предложений требуется осознанно включить enabled=true; это также запускает периодические расчёты.",
                    "Читайте jobs.get для результата конкретного запуска, runs.list для истории и сравнивайте config hash.",
                    "Для отключения сохраните новую версию enabled=false. Для удаления используйте lifecycle_action=delete с текущим hash и source_binding. История остаётся."
                  ]
                },
                {
                  "type": "code",
                  "label": "automations.jobs.create",
                  "value": "{\n  \"domain\": \"advertising\",\n  \"idempotency_key\": \"guide-bidder-run-001\"\n}",
                  "method": "automations.jobs.create"
                },
                {
                  "type": "paragraph",
                  "text": "Удаление или отключение профиля X-MP не останавливает кампанию Wildberries. Независимая аварийная остановка не снимается изменением профиля. При конфликте версии перечитайте состояние и согласуйте новую конфигурацию."
                }
              ]
            },
            {
              "id": "failures",
              "title": "Как читать причины решения",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Причина",
                    "Объяснение"
                  ],
                  "rows": [
                    [
                      "profile_disabled / policy_unconfirmed",
                      "Расчёт отключён или условия не подтверждены."
                    ],
                    [
                      "stock_unknown / daily_spend_unknown",
                      "Нет доказанного запаса или расхода за нужный день."
                    ],
                    [
                      "attribution_immature / insufficient_sample",
                      "Не прошло время атрибуции либо недостаточно кликов/расхода."
                    ],
                    [
                      "undefined_drr",
                      "Нулевая рекламная выручка: ДРР нельзя посчитать."
                    ],
                    [
                      "platform_min_unknown / capability_unverified",
                      "Не подтверждён минимум ставки или возможность действия для кампании."
                    ],
                    [
                      "no_feasible_bid / no_feasible_step",
                      "Коридор и шаг не дают допустимой ставки."
                    ],
                    [
                      "within_deadband / unchanged_bid",
                      "Нормальное удержание: изменение не нужно."
                    ],
                    [
                      "manual_stop / command_unresolved / external_change",
                      "Сначала разобраться с ручным вмешательством или предыдущим действием."
                    ],
                    [
                      "schedule_closed / stock_protection / budget_limit",
                      "Основание для защитного предложения при достаточных подтверждениях."
                    ]
                  ]
                }
              ]
            }
          ],
          "methods": [
            "automations.credentials.requirements",
            "automations.status",
            "automations.config.get",
            "automations.config.apply",
            "automations.shadow.run",
            "automations.jobs.create",
            "automations.jobs.get",
            "automations.jobs.list",
            "automations.runs.list",
            "automations.emergency-stop",
            "automations.catalog",
            "tasks.resume"
          ],
          "services": [
            "bidder"
          ]
        },
        "services/reviews": {
          "title": "Отзывы: от входящего сообщения до проверенного решения",
          "lead": "Подключение и настройка блока отзывов: фильтры, шаблоны, черновики агента, риски, статусы ответа и проблемы покупателя, методы подготовки и чтения результата.",
          "purpose": "Блок помогает не смешивать написание ответа с решением проблемы. Он отбирает отзывы по согласованным условиям, готовит материал для проверки и выделяет случаи, где нужен человек. Повторяющиеся жалобы могут стать задачами на качество, упаковку или описание товара.",
          "example": "«Подготовь черновики для новых отзывов по этим товарам. Жалобы на качество и безопасность вынеси отдельно. Не обещай компенсацию без согласования».",
          "steps": [
            "Проверьте наличие данных отзывов и права operations.read; для сохранения нужны operations.plan.",
            "Вызовите automations.reviews.catalog и выберите native; проверьте текущую схему подготовки.",
            "Прочитайте правила общения и задачу магазина из памяти, согласуйте товары, оценки, исключения и эскалации.",
            "Подготовьте config через automations.reviews.prepare, сохраните его и выполните ограниченный предварительный запуск."
          ],
          "result": "Набор review_cases: текст для проверки, замеченные риски, отдельные состояния ответа, проблемы и жалобы, ссылки на основания и рекомендуемый следующий шаг.",
          "limits": "Нативный блок работает только с черновиками, публикация и отправка жалоб не включены. Любой ответ требует human review, в том числе положительный. Внешние сервисы, перечисленные в каталоге отзывов, не считаются подключёнными к X-MP.",
          "sections": [
            {
              "id": "structure",
              "title": "Устройство блока и жизненный цикл случая",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Слой",
                    "Назначение"
                  ],
                  "rows": [
                    [
                      "Данные отзыва",
                      "ID, товар, оценка, текст, достоинства/недостатки и доступные признаки источника."
                    ],
                    [
                      "Правила магазина",
                      "Тон, ограничения, исключения, основания эскалации и ссылки на задачу памяти."
                    ],
                    [
                      "Подготовка",
                      "Проверка параметров и сборка конфигурации; без сохранения и без вызова модели."
                    ],
                    [
                      "Расчёт",
                      "Отбор и создание review_case в observe/shadow."
                    ],
                    [
                      "Проверка человеком",
                      "Проверка текста, фактов, рисков и следующего действия."
                    ],
                    [
                      "Память задачи",
                      "Ответственный, срок, решение и подтверждённый результат сохраняются отдельно от снимка расчёта."
                    ]
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "Один случай имеет три независимых направления: reply — работа над ответом, problem — проблема покупателя, complaint — подготовка или разбор жалобы. Готовый текст не означает, что проблема решена. Повторный запуск может снова показать незакрытый случай: агент продолжает прежнюю задачу, а не создаёт дубликат. Автоматический синхронизатор всех случаев с памятью в этом выпуске отсутствует."
                }
              ]
            },
            {
              "id": "inputs",
              "title": "Какие поля отзыва используются",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Данные",
                    "Как используются"
                  ],
                  "rows": [
                    [
                      "ID отзыва и product ID",
                      "Связывают результат с конкретным сообщением и выбранным товаром."
                    ],
                    [
                      "Оценка",
                      "Фильтр rating_min–rating_max от 1 до 5."
                    ],
                    [
                      "Текст, pros, cons",
                      "Собираются в адаптированный текст; непустые части соединяются переводами строки."
                    ],
                    [
                      "Признаки фото/видео",
                      "Неизвестное has_media=null не трактуется как отсутствие вложений."
                    ],
                    [
                      "Хеш текста",
                      "Проверяет, что черновик относится к той версии сообщения, по которой был подготовлен."
                    ],
                    [
                      "Источник и ссылки на доказательства",
                      "Позволяют проверить происхождение. Ссылка сама по себе не доказывает истинность ответа."
                    ]
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "Риски отмечаются простыми словарями: безопасность, качество, подлинность, правовые вопросы, компенсация, несоответствие и дополнительные темы магазина. Это эвристики. Иронию, скрытую рекламу и сложный конфликт может понадобиться разобрать агенту и человеку."
                }
              ]
            },
            {
              "id": "settings",
              "title": "Параметры подготовки правил",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Поле",
                    "Смысл и ограничения"
                  ],
                  "rows": [
                    [
                      "config_id",
                      "Имя подготовленной конфигурации."
                    ],
                    [
                      "service_id",
                      "native — реализованный блок; внешний сервис может вернуть service_not_integrated."
                    ],
                    [
                      "generation",
                      "template или agent-draft."
                    ],
                    [
                      "memory_binding",
                      "instructions_ref и task_ref, явно прочитанные агентом в памяти. Компилятор проверяет форму ссылки, а не содержимое памяти."
                    ],
                    [
                      "product_ids",
                      "1–20 артикулов, строки цифр."
                    ],
                    [
                      "rating_min / rating_max",
                      "Оценки 1–5; нижняя граница не выше верхней."
                    ],
                    [
                      "excluded_terms",
                      "До 30 исключаемых выражений; пустой список нужно согласовать, а не принять за правило любого магазина."
                    ],
                    [
                      "escalation_terms",
                      "До 30 дополнительных выражений для передачи человеку."
                    ],
                    [
                      "max_items",
                      "1–20 случаев за расчёт."
                    ],
                    [
                      "response_text",
                      "2–1000 символов; согласованный текст шаблона."
                    ],
                    [
                      "model_ref",
                      "Имя источника агентского черновика. Не переключает модель и не подключает платный API."
                    ],
                    [
                      "drafts",
                      "1–20 точных черновиков с ID отзыва, source_text_sha256, response_text и непустыми evidence_refs."
                    ]
                  ]
                }
              ]
            },
            {
              "id": "generation",
              "title": "Два способа подготовки ответа",
              "blocks": [
                {
                  "type": "paragraph",
                  "text": "template использует один заранее согласованный текст. Вызова языковой модели нет. При рискованном случае шаблон подавляется, чтобы нейтральная благодарность не подменила разбор жалобы."
                },
                {
                  "type": "paragraph",
                  "text": "agent-draft принимает уже подготовленные агентом тексты. Агент сначала читает точный отзыв и факты, использует доступную ему модель, затем передаёт черновик вместе с model_ref и основаниями. Метод prepare не вызывает эту модель за него."
                },
                {
                  "type": "paragraph",
                  "text": "source_text_sha256 считается по UTF-8 адаптированного текста: непустые text/question, pros, cons в этом порядке через символ новой строки. Если источник изменился или неполон, прежний agent draft не прикладывается. Повтор одного ID отзыва в scoped snapshot помечается duplicate_source и не даёт черновик при любом порядке записей. Наличие риска не превращает черновик в готовый ответ: человек всё равно проверяет его."
                },
                {
                  "type": "paragraph",
                  "text": "Проверьте факты о товаре, обещания возврата или компенсации, тон, персональные данные и соответствие правилам площадки. Ни одна оценка и ни одно совпадение словаря не разрешают автоматическую отправку."
                }
              ]
            },
            {
              "id": "workflow",
              "title": "Пошаговый пример: подготовка и чтение",
              "blocks": [
                {
                  "type": "code",
                  "label": "automations.reviews.catalog",
                  "value": "{}",
                  "method": "automations.reviews.catalog"
                },
                {
                  "type": "code",
                  "label": "automations.reviews.prepare",
                  "value": "{\n  \"config_id\": \"guide-reviews-01\",\n  \"service_id\": \"native\",\n  \"generation\": \"template\",\n  \"memory_binding\": {\n    \"instructions_ref\": \"memory-revision://example/1\",\n    \"task_ref\": \"task-revision://example/1\"\n  },\n  \"product_ids\": [\n    \"123456\"\n  ],\n  \"rating_min\": 4,\n  \"rating_max\": 5,\n  \"excluded_terms\": [],\n  \"escalation_terms\": [\n    \"аллергия\"\n  ],\n  \"max_items\": 10,\n  \"response_text\": \"Спасибо за обратную связь.\"\n}",
                  "method": "automations.reviews.prepare"
                },
                {
                  "type": "paragraph",
                  "text": "Это учебный запрос: ссылки и артикул вымышлены, текст и исключения не являются правилами вашего магазина. В реальной задаче замените их на согласованные значения. prepare возвращает несохранённый config."
                },
                {
                  "type": "steps",
                  "items": [
                    "Проверьте config и замечания. Если внешний service_id не интегрирован, ожидайте blocked и config=null; не подменяйте провайдера без решения владельца.",
                    "Передайте возвращённый config в automations.config.apply с domain=responder и новым стабильным idempotency_key.",
                    "Перечитайте config.get, затем создайте один automations.jobs.create.",
                    "Возьмите job_id из ответа и прочитайте automations.jobs.get. Полные result.review_cases находятся в деталях задачи; списки истории могут содержать только количество и указатель на detail tool.",
                    "Проверьте каждый случай, сохраните решение и дальнейшую работу в существующей задаче памяти."
                  ]
                },
                {
                  "type": "code",
                  "label": "automations.jobs.create",
                  "value": "{\n  \"domain\": \"responder\",\n  \"idempotency_key\": \"guide-reviews-run-001\"\n}",
                  "method": "automations.jobs.create"
                }
              ]
            },
            {
              "id": "results",
              "title": "Что читать в результате",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Поле / признак",
                    "Интерпретация"
                  ],
                  "rows": [
                    [
                      "action=review_case",
                      "Подготовлен случай для рассмотрения, не команда send_reply."
                    ],
                    [
                      "human_review_required=true",
                      "Проверка человеком обязательна."
                    ],
                    [
                      "reply / problem / complaint",
                      "Независимые состояния работы с ответом, проблемой и жалобой."
                    ],
                    [
                      "next_action",
                      "Предложенный следующий шаг; его выполнение не подразумевается."
                    ],
                    [
                      "evidence_refs",
                      "Основания и происхождение материала."
                    ],
                    [
                      "marketplace_write=false",
                      "Расчёт не публиковал ответ на WB."
                    ]
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "Жалоба требует конкретного фрагмента, основания действующих правил и доказательств. Модерация, удаление и исключение из рейтинга — разные результаты. Сервис не обещает удалить отзыв и не выдумывает номера правил."
                }
              ]
            },
            {
              "id": "failures",
              "title": "Ошибки настройки и границы интеграций",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Ситуация",
                    "Что делать"
                  ],
                  "rows": [
                    [
                      "service_not_integrated",
                      "Использовать native либо отдельно проектировать подтверждённую интеграцию; оплата внешнего сервиса её не создаёт."
                    ],
                    [
                      "Изменился текст / неверный hash",
                      "Перечитать отзыв и подготовить новую версию черновика."
                    ],
                    [
                      "Неполный источник",
                      "Проверить доступность текста и его частей; не дописывать от имени покупателя."
                    ],
                    [
                      "Неизвестное поле, auto_send=true или execute mode",
                      "Исправить настройку по prepare_schema; публикация не включается обходом компилятора."
                    ],
                    [
                      "В истории нет полного текста",
                      "Открыть jobs.get по полученному job_id."
                    ],
                    [
                      "Случай появился снова",
                      "Найти и продолжить существующую задачу в памяти."
                    ]
                  ]
                }
              ]
            }
          ],
          "methods": [
            "automations.reviews.catalog",
            "automations.reviews.prepare",
            "automations.credentials.requirements",
            "automations.status",
            "automations.config.get",
            "automations.config.apply",
            "automations.shadow.run",
            "automations.jobs.create",
            "automations.jobs.get",
            "automations.jobs.list",
            "automations.runs.list",
            "automations.emergency-stop"
          ],
          "services": [
            "reviews"
          ]
        },
        "services/monitoring": {
          "title": "Мониторинг: история цен, карточек и наблюдений",
          "lead": "Как устроен журнал изменений, какие параметры сохраняются, как получить состояние на дату, прочитать изображения и сопоставить изменение с показателями магазина.",
          "purpose": "Мониторинг помогает восстановить, что было изменено в товаре и когда это стало видно в данных. Это полезно для разбора падения продаж, проверки новой карточки и сравнения наблюдаемых цен. Он сохраняет факты изменений, а вывод о влиянии делает отдельный анализ.",
          "example": "«Покажи изменения цены и описания этого товара за две недели. Восстанови состояние до правки и сравни показатели вокруг события, указав пропуски данных».",
          "steps": [
            "Подключите данные магазина и проверьте monitor.status, права и фактическое покрытие истории.",
            "Укажите товары и период. Сначала получите summary через monitor.timeline или monitor.history.",
            "Для выбранного события откройте полный before/after с limit=1, при необходимости прочитайте snapshot и сохранённое медиа.",
            "Для сравнения результата используйте monitor.compare, проверяя покрытие и одновременные изменения."
          ],
          "result": "Лента наблюдаемых изменений, предыдущие/новые значения, время проверки, сохранённые версии компонентов и ограниченное сравнение показателей до/после.",
          "limits": "История содержит только действительно сохранённые наблюдения. Управляемый список конкурентов и полное слежение за текстом и изображениями их карточек ещё расширяются. Нет изменений в ответе — не доказательство, что источник недавно проверен. Сравнение до/после не устанавливает причинность.",
          "sections": [
            {
              "id": "structure",
              "title": "Структура: версии → события → сравнение",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Объект",
                    "Назначение"
                  ],
                  "rows": [
                    [
                      "Наблюдение источника",
                      "Что удалось получить при конкретной проверке и когда."
                    ],
                    [
                      "Версия компонента",
                      "Сохранённое состояние цены, текста, характеристик или другого компонента."
                    ],
                    [
                      "Событие изменения",
                      "Связь предыдущего и нового значений с источником и временем обнаружения."
                    ],
                    [
                      "Медиа",
                      "Сохранённые изображения с идентификатором и контрольной суммой; выдаются частями."
                    ],
                    [
                      "Временной ряд",
                      "Компактная последовательность разрешённых показателей или количества событий."
                    ],
                    [
                      "Сравнение вокруг события",
                      "Наблюдаемые показатели до/после, покрытие, одновременные изменения и ограничения вывода."
                    ]
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "Журнал не заменяет память магазина. Цели эксперимента, гипотезы и решения сохраняются в памяти; история товара предоставляет доказательства. Контроль собственных продаж и расходов — отдельный аналитический блок, Telegram — отдельная доставка."
                }
              ]
            },
            {
              "id": "fields",
              "title": "Что наблюдается и чего из этого нельзя выводить",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Раздел",
                    "Доступные типы данных",
                    "Граница смысла"
                  ],
                  "rows": [
                    [
                      "Карточка",
                      "Название, описание, характеристики, ссылки на медиа и версии.",
                      "Автор правки известен только при дополнительном подтверждении операции."
                    ],
                    [
                      "Цена",
                      "Цена продавца, скидка, варианты/размеры и время версии.",
                      "Не персональная цена каждой покупки."
                    ],
                    [
                      "Изображения",
                      "Доступные сохранённые миниатюры и изменения медиа.",
                      "Нет гарантии сохранения полного оригинала или всех прошлых изображений."
                    ],
                    [
                      "Открытая витрина",
                      "Наблюдаемые публичные цены, рейтинг и количество отзывов.",
                      "Регион и условия просмотра влияют на цену; это не чужие продажи и прибыль."
                    ],
                    [
                      "Смежные события журнала",
                      "stock, supply, advertising, если их источники сохранены.",
                      "Наличие этих типов в общем журнале не превращает мониторинг карточек в полный контроль кабинета."
                    ],
                    [
                      "Пробелы",
                      "source_gap, отсутствующий источник или недоступное медиа.",
                      "Не заменяются нулём и не скрываются из вывода."
                    ]
                  ]
                }
              ]
            },
            {
              "id": "time",
              "title": "Три времени, baseline и отсутствие событий",
              "blocks": [
                {
                  "type": "paragraph",
                  "text": "Время исходного события, время проверки источника и время обнаружения изменения могут различаться. Если товар проверяли утром и вечером, изменение между проверками известно только в пределах этого окна. Нельзя выдавать время обнаружения за точный момент редактирования."
                },
                {
                  "type": "paragraph",
                  "text": "baseline — первое сохранённое состояние, а не обнаруженная правка. По умолчанию базовые снимки скрыты; include_baseline=true позволяет их запросить. Пустая лента означает отсутствие подходящих сохранённых событий, но сама по себе не подтверждает свежесть проверки или неизменность товара."
                },
                {
                  "type": "paragraph",
                  "text": "Периодические проверки не гарантируют фиксацию всех промежуточных изменений между обращениями к источнику. Сначала смотрите monitor.status и признаки пробелов, затем интерпретируйте ленту. Частоты и покрытие конкретного магазина берутся из его состояния, а не из общего обещания «в реальном времени»."
                }
              ]
            },
            {
              "id": "query-patterns",
              "title": "Как выбрать метод",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Задача",
                    "Метод",
                    "Выбор параметров"
                  ],
                  "rows": [
                    [
                      "Узнать состояние истории",
                      "monitor.status",
                      "Без параметров."
                    ],
                    [
                      "Лента типов событий",
                      "monitor.timeline",
                      "Период, nm_ids, event_type, object_type, limit и cursor."
                    ],
                    [
                      "Поиск изменения конкретного поля",
                      "monitor.history",
                      "Период, nm_ids, tag, field, source, detail и cursor. Значения фильтров берите из наблюдаемой истории."
                    ],
                    [
                      "Состояние товара на момент",
                      "monitor.snapshot",
                      "nm_id плюс at либо snapshot_id, component/source/field и offset."
                    ],
                    [
                      "Изображение из истории",
                      "monitor.media",
                      "media_id из результата и offset для следующей части."
                    ],
                    [
                      "Ряд рейтинга/цены/событий",
                      "monitor.series",
                      "Период, товары, group_by и один разрешённый metric."
                    ],
                    [
                      "Показатели вокруг правки",
                      "monitor.compare",
                      "event_id, nm_id, окно days и выбранные metrics."
                    ]
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "У timeline/history максимум 50 событий и 20 товаров в запросе. Полный detail=full требует limit=1. Ответ полного снимка ограничен 20 MiB. Сначала выберите событие из краткого списка, затем запрашивайте его подробности. Cursor нельзя переносить на другой набор фильтров."
                }
              ]
            },
            {
              "id": "examples",
              "title": "Примеры запросов истории и состояния",
              "blocks": [
                {
                  "type": "code",
                  "label": "monitor.timeline",
                  "value": "{\n  \"date_from\": \"2026-09-01\",\n  \"date_to\": \"2026-09-07\",\n  \"nm_ids\": [\n    \"123456\"\n  ],\n  \"event_type\": \"price\",\n  \"limit\": 10\n}",
                  "method": "monitor.timeline"
                },
                {
                  "type": "code",
                  "label": "monitor.history",
                  "value": "{\n  \"date_from\": \"2026-09-01\",\n  \"date_to\": \"2026-09-07\",\n  \"nm_ids\": [\n    \"123456\"\n  ],\n  \"detail\": \"full\",\n  \"limit\": 1\n}",
                  "method": "monitor.history"
                },
                {
                  "type": "code",
                  "label": "monitor.snapshot",
                  "value": "{\n  \"nm_id\": 123456,\n  \"at\": \"2026-09-07T12:00:00Z\",\n  \"detail\": \"full\",\n  \"limit\": 1\n}",
                  "method": "monitor.snapshot"
                },
                {
                  "type": "paragraph",
                  "text": "Артикул и даты учебные. Для следующих страниц snapshot используйте возвращённые at и next_offset, чтобы оставаться на выбранном моменте. Для history/timeline продолжайте выданный cursor. Не конструируйте snapshot_id, event_id или media_id самостоятельно."
                }
              ]
            },
            {
              "id": "media",
              "title": "Как читать сохранённые изображения",
              "blocks": [
                {
                  "type": "paragraph",
                  "text": "monitor.media возвращает часть до 256 KiB в base64, а не публичную ссылку на хранилище. Агент продолжает next_offset, собирает байты в приватном файле и проверяет полный SHA-256. Нельзя считать одну часть полным изображением. Отсутствующий файл или недоступный источник нужно показать как ограничение."
                },
                {
                  "type": "paragraph",
                  "text": "Для сравнения изображений важно использовать те версии, которые относятся к выбранному событию, а не сегодняшнюю карточку. Сохранённая миниатюра подтверждает доступное изображение этой версии; она не доказывает, что на витрине не было других кадров между проверками."
                }
              ]
            },
            {
              "id": "comparison",
              "title": "Сравнение показателей вокруг изменения",
              "blocks": [
                {
                  "type": "code",
                  "label": "monitor.compare",
                  "value": "{\n  \"event_id\": \"00000000-0000-0000-0000-000000000001\",\n  \"nm_id\": 123456,\n  \"days\": 7,\n  \"metrics\": [\n    \"ordered_gmv\",\n    \"ad_spend\",\n    \"order_cr\"\n  ]\n}",
                  "method": "monitor.compare"
                },
                {
                  "type": "paragraph",
                  "text": "event_id в примере — заглушка: замените его реальным ID события из истории этого магазина. Окно days — 1–28 дней, metrics — до 12 показателей. Метод исключает неопределённые дни изменения, возвращает покрытие и сопутствующие изменения. Подготовленный evidence candidate для памяти требует проверки; сам метод память не записывает."
                },
                {
                  "type": "paragraph",
                  "text": "Например, после новой обложки заказы выросли, но одновременно снизилась цена и увеличился рекламный расход. Такой результат нельзя назвать доказанным эффектом обложки. В отчёте нужны обе стороны сравнения, одинаковые товары и денежная база, пропуски, сезонность и другие изменения."
                }
              ]
            },
            {
              "id": "failures",
              "title": "Как разбирать неполную историю",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Симптом",
                    "Проверка"
                  ],
                  "rows": [
                    [
                      "Пустая лента",
                      "Период, артикулы, фильтры, include_baseline и свежесть источника."
                    ],
                    [
                      "source_gap",
                      "Какая проверка не состоялась; это ограничение доказательств."
                    ],
                    [
                      "Нет старого состояния",
                      "Было ли оно вообще сохранено; будущий сбор не восстанавливает прошлое автоматически."
                    ],
                    [
                      "Нет медиа",
                      "Идентификатор и доступность сохранённого объекта; не заменять современной картинкой."
                    ],
                    [
                      "Полный ответ не помещается",
                      "detail=full и limit=1, затем выбор компонента/поля."
                    ],
                    [
                      "Сравнение даёт null",
                      "Покрытие выбранных метрик и окна; не подставлять нулевые продажи."
                    ]
                  ]
                }
              ]
            }
          ],
          "methods": [
            "monitor.history",
            "monitor.snapshot",
            "monitor.media",
            "monitor.status",
            "monitor.timeline",
            "monitor.series",
            "monitor.compare"
          ],
          "services": [
            "monitor"
          ]
        },
        "services/analytics": {
          "title": "Аналитика: данные, показатели, формулы и качество расчётов",
          "lead": "Справочник аналитических запросов X-MP: от выбора периода и товаров до формул показателей, проверки покрытия и воспроизводимого вывода.",
          "purpose": "Аналитика отвечает на конкретный вопрос о магазине по фактически собранным данным. Она отделяет заказы от реализованной выручки, расходы от прибыли, остаток от продаж. Агент выбирает подходящий срез, а сервис возвращает ограниченный результат с признаками качества.",
          "example": "«Найди товары, где рекламные расходы росли быстрее заказанного оборота. Покажи цифры, формулу и пробелы; не называй результат чистой прибылью без затрат».",
          "steps": [
            "Проверьте agent.me, readiness.get и datasets.list: нужны analytics.read и соответствующие источники магазина.",
            "Определите вопрос, период, товары и денежную базу.",
            "Выберите analysis.query для агрегатов, metrics.query для KPI либо dataset.query для строк.",
            "Прочитайте значения вместе с качеством и источниками; сохраните формулу и вывод."
          ],
          "result": "Проверяемый срез магазина или товаров, выбранные показатели и явные ограничения достаточности. Пропуски не заменяются нулём.",
          "limits": "Полнота зависит от дат, товаров и источников. Старый период не становится закрытым только по возрасту. Прибыль требует подтверждённых затрат; причинный эффект не выводится из одного сравнения.",
          "sections": [
            {
              "id": "structure",
              "title": "Структура аналитического сервиса",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Уровень",
                    "Содержание",
                    "Использование"
                  ],
                  "rows": [
                    [
                      "Сохранённые ответы",
                      "Неизменяемые исходные результаты сбора.",
                      "Происхождение и приватная выгрузка."
                    ],
                    [
                      "Нормализованные записи",
                      "Товары, заказы, продажи и версии сущностей.",
                      "Детализация и связь с источником."
                    ],
                    [
                      "Дневная витрина",
                      "Наблюдения товара по дням с признаками наличия источника.",
                      "Агрегат analysis.query."
                    ],
                    [
                      "Реестр KPI",
                      "Формулы, входы, единицы, детализация и зрелость.",
                      "metrics.catalog и metrics.query."
                    ],
                    [
                      "Контроль качества",
                      "Покрытие, свежесть и недостающие входы.",
                      "Допустимость вывода."
                    ]
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "Показатель, страница строк и исходный файл — разные продукты данных. Начинайте с минимального достаточного уровня. Тысячи строк не нужно переносить в чат ради одного итога."
                }
              ]
            },
            {
              "id": "query-choice",
              "title": "Как выбрать метод",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Метод",
                    "Назначение",
                    "Проверка"
                  ],
                  "rows": [
                    [
                      "cabinet.overview",
                      "Общая картина и ведущие товары.",
                      "Период и входы; не полный финансовый аудит."
                    ],
                    [
                      "product.360",
                      "Один артикул за период.",
                      "Товар и денежная база."
                    ],
                    [
                      "finance.summary",
                      "Финансовая сводка.",
                      "Реализация, к перечислению, выплата и прибыль различаются."
                    ],
                    [
                      "analysis.query",
                      "Выбранные показатели по магазину, товарам и дням.",
                      "Поля, группировка, качество и сортировка."
                    ],
                    [
                      "metrics.catalog / metrics.query",
                      "KPI с зарегистрированной формулой.",
                      "Сначала определение, затем значения."
                    ],
                    [
                      "metrics.status / metrics.completeness",
                      "Состояние расчётов и пробелы.",
                      "Свежесть и недостающие входы."
                    ],
                    [
                      "dataset.query",
                      "Строки для проверки вывода.",
                      "Поля, дата события и пагинация."
                    ]
                  ]
                }
              ]
            },
            {
              "id": "parameters",
              "title": "Параметры analysis.query",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Параметр",
                    "Формат",
                    "Правило"
                  ],
                  "rows": [
                    [
                      "date_from, date_to",
                      "YYYY-MM-DD",
                      "Обязательные включённые границы,1–90 дней."
                    ],
                    [
                      "group_by",
                      "account / product / day / day_product",
                      "Магазин, товар, день или товар в день. По умолчанию product."
                    ],
                    [
                      "metrics",
                      "Массив имён",
                      "1–12 разных показателей."
                    ],
                    [
                      "nm_ids",
                      "Массив строк",
                      "До 20 артикулов; без фильтра — доступные товары."
                    ],
                    [
                      "sort_by",
                      "Выбранный показатель",
                      "Обязан входить в metrics. Задавайте явно при своём наборе."
                    ],
                    [
                      "sort_direction",
                      "asc / desc",
                      "Возрастание/убывание; по умолчанию desc."
                    ],
                    [
                      "limit",
                      "1–50",
                      "Размер страницы, по умолчанию 20."
                    ],
                    [
                      "offset",
                      "0–10000",
                      "Смещение для продолжения."
                    ]
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "SQL, произвольные таблицы и чужой account_id запрещены. Магазин определяется ключом. Общую картину удобно читать несколькими тематическими срезами, затем детализировать отклонения."
                }
              ]
            },
            {
              "id": "metric-dictionary",
              "title": "Словарь всех полей analysis.query",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Поле",
                    "Единица",
                    "Определение / формула",
                    "Как понимать"
                  ],
                  "rows": [
                    [
                      "ordered_units",
                      "шт.",
                      "Количество заказанных единиц.",
                      "Заказ не равен выкупу или выплате."
                    ],
                    [
                      "ordered_gmv",
                      "₽",
                      "Наблюдаемый заказанный оборот.",
                      "Не реализованная выручка."
                    ],
                    [
                      "cancelled_units",
                      "шт.",
                      "Наблюдаемые отменённые единицы.",
                      "Не финансовые возвраты и не доказанная итоговая когорта."
                    ],
                    [
                      "sales_gmv",
                      "₽",
                      "Операционные продажи.",
                      "Предварительная база, отдельно от закрытой реализации."
                    ],
                    [
                      "ad_spend",
                      "₽",
                      "Рекламные расходы источника.",
                      "Учитывать окно и полноту данных."
                    ],
                    [
                      "ad_clicks",
                      "события",
                      "Рекламные клики.",
                      "Не уникальные покупатели."
                    ],
                    [
                      "ad_impressions",
                      "события",
                      "Рекламные показы.",
                      "Не уникальный охват."
                    ],
                    [
                      "ad_orders",
                      "шт.",
                      "Заказы, отнесённые WB к рекламе.",
                      "Не доказанный дополнительный эффект рекламы."
                    ],
                    [
                      "wb_for_pay",
                      "₽",
                      "Сумма к перечислению по доступной финансовой базе.",
                      "Не подтверждение прихода в банк."
                    ],
                    [
                      "contribution_profit",
                      "₽",
                      "Подтверждённая входами часть экономического результата.",
                      "При недостатке затрат — null; не полная чистая прибыль."
                    ],
                    [
                      "stock_units",
                      "шт.",
                      "Последнее известное наличие товара в срезе.",
                      "Не сумма остатков по дням; проверять дату источника."
                    ],
                    [
                      "opens",
                      "события",
                      "Открытия карточки из воронки.",
                      "Наблюдаемый поток источника."
                    ],
                    [
                      "carts",
                      "события",
                      "Добавления в корзину.",
                      "Не оплаченные покупки."
                    ],
                    [
                      "funnel_orders",
                      "шт.",
                      "Заказы из источника воронки.",
                      "Не смешивать автоматически с оперативными orders."
                    ],
                    [
                      "average_ordered_unit_price",
                      "₽/шт.",
                      "ordered_gmv / ordered_units",
                      "Цена единицы, не средний чек корзины."
                    ],
                    [
                      "average_order_value",
                      "₽/шт.",
                      "Старый псевдоним average_ordered_unit_price.",
                      "Для новых запросов используйте точное имя цены единицы."
                    ],
                    [
                      "cancelled_order_share",
                      "доля",
                      "cancelled_units / ordered_units",
                      "Наблюдаемое покрытие, не финальная доля возвратов."
                    ],
                    [
                      "ad_ctr",
                      "доля",
                      "ad_clicks / ad_impressions",
                      "0.025 = 2,5%."
                    ],
                    [
                      "cpm",
                      "₽/1000 показов",
                      "1000 × ad_spend / ad_impressions",
                      "Множитель 1000 применяется только здесь."
                    ],
                    [
                      "cpc",
                      "₽/клик",
                      "ad_spend / ad_clicks",
                      "Наблюдаемая стоимость клика."
                    ],
                    [
                      "cpo",
                      "₽/заказ",
                      "ad_spend / ad_orders",
                      "Стоимость атрибутированного заказа, не CAC покупателя."
                    ],
                    [
                      "cart_cr",
                      "доля",
                      "carts / opens",
                      "Открытие → корзина."
                    ],
                    [
                      "order_cr",
                      "доля",
                      "funnel_orders / opens",
                      "Открытие → заказ в одном источнике."
                    ],
                    [
                      "cart_to_order_cr",
                      "доля",
                      "funnel_orders / carts",
                      "Корзина → заказ."
                    ],
                    [
                      "ad_spend_to_ordered_gmv",
                      "доля",
                      "ad_spend / ordered_gmv",
                      "Не TACoS по реализации."
                    ],
                    [
                      "ad_spend_per_ordered_unit",
                      "₽/шт.",
                      "ad_spend / ordered_units",
                      "Все заказанные единицы, не только рекламные."
                    ],
                    [
                      "operational_contribution_margin",
                      "доля",
                      "contribution_profit / sales_gmv",
                      "Операционная маржинальность, не закрытая чистая маржа."
                    ]
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "Доля переводится в проценты умножением на 100. Нулевой знаменатель даёт null. «Не определено» и «нулевая эффективность» — разные утверждения."
                }
              ]
            },
            {
              "id": "quality",
              "title": "Итоги, покрытие и качество",
              "blocks": [
                {
                  "type": "paragraph",
                  "text": "Коэффициенты считаются из сумм числителя и знаменателя на совпадающих product-day наблюдениях, а не как среднее дневных процентов. Итоговый коэффициент может отличаться от деления отдельно показанных итогов при различном покрытии."
                },
                {
                  "type": "table",
                  "headers": [
                    "Признак",
                    "Что проверять"
                  ],
                  "rows": [
                    [
                      "numerator / denominator / multiplier",
                      "Суммы и множитель формулы."
                    ],
                    [
                      "paired_observed_days",
                      "Дни одновременного наблюдения обеих сторон отношения."
                    ],
                    [
                      "observed_days",
                      "Дни отдельного входа; не доказательство полноты всех товаров/страниц."
                    ],
                    [
                      "null / not_ready",
                      "Недостаточный вход либо неопределённое значение."
                    ],
                    [
                      "Свежесть источника",
                      "Время исходных данных, а не только построения витрины."
                    ],
                    [
                      "Полнота периода",
                      "Пропущенные дни, страницы, товары и поздние исправления."
                    ]
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "Для account/product остаток берётся по последнему наблюдению товара в срезе, а не суммируется за каждый день. day/day_product позволяет смотреть дневные значения. Уменьшение остатка не равно продаже: возможны перемещения и другие операции."
                },
                {
                  "type": "paragraph",
                  "text": "Пример:1 клик из 10 показов в первый день и 9 из 990 во второй. Итоговый CTR=10/1000=1%, а не среднее 10% и примерно 0,91%. Для рекламы к заказам дополнительно требуется совпадающее покрытие двух источников."
                }
              ]
            },
            {
              "id": "examples",
              "title": "Рабочие примеры запросов",
              "blocks": [
                {
                  "type": "code",
                  "label": "analysis.query",
                  "value": "{\n  \"date_from\": \"2026-09-01\",\n  \"date_to\": \"2026-09-07\",\n  \"group_by\": \"product\",\n  \"metrics\": [\n    \"ordered_gmv\",\n    \"ad_spend\",\n    \"ad_spend_to_ordered_gmv\",\n    \"cpo\"\n  ],\n  \"sort_by\": \"ad_spend\",\n  \"limit\": 10\n}",
                  "method": "analysis.query"
                },
                {
                  "type": "paragraph",
                  "text": "Срез лидеров по расходу. Большой расход сам по себе не означает убыточность: проверьте качество и экономику."
                },
                {
                  "type": "code",
                  "label": "analysis.query",
                  "value": "{\n  \"date_from\": \"2026-09-01\",\n  \"date_to\": \"2026-09-07\",\n  \"group_by\": \"day_product\",\n  \"nm_ids\": [\n    \"123456\"\n  ],\n  \"metrics\": [\n    \"opens\",\n    \"carts\",\n    \"funnel_orders\",\n    \"cart_cr\",\n    \"order_cr\"\n  ],\n  \"sort_by\": \"opens\",\n  \"limit\": 20\n}",
                  "method": "analysis.query"
                },
                {
                  "type": "paragraph",
                  "text": "Учебный артикул замените своим. Сопоставьте воронку с ценой, наличием и рекламой: падение конверсии не доказывает ухудшение карточки."
                },
                {
                  "type": "code",
                  "label": "finance.summary",
                  "value": "{\n  \"date_from\": \"2026-09-01\",\n  \"date_to\": \"2026-09-07\"\n}",
                  "method": "finance.summary"
                },
                {
                  "type": "paragraph",
                  "text": "При неизвестной или смешанной валюте суммы могут быть подавлены. Сумма к перечислению не подтверждает банковскую выплату."
                }
              ]
            },
            {
              "id": "metric-library",
              "title": "Библиотека KPI и дополнительные расчёты",
              "blocks": [
                {
                  "type": "steps",
                  "items": [
                    "Прочитайте metrics.catalog: смысл, формулу, входы, единицы и поддержанную детализацию.",
                    "Проверьте metrics.status и metrics.completeness.",
                    "Передайте metric_ids, период и нужные фильтры в metrics.query.",
                    "Сопоставьте значения с определением и происхождением; не смешивайте дневные и периодные записи."
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "metrics.query принимает до 50 ID, но это не обещает их готовность. Без grain применяется канонический уровень метрики. product_id — внутренний UUID, nm_id — артикул; campaign_id и warehouse_id нужны только поддерживающим их KPI. ID выбираются из каталога."
                },
                {
                  "type": "paragraph",
                  "text": "Для дополнительного анализа используйте разрешённую выгрузку в среде агента. Сохраняйте период, детализацию, формулу, checksum входа и ограничения. Новому расчёту нужно отдельное имя: нельзя изменять формулу существующего KPI под прежним названием."
                }
              ]
            },
            {
              "id": "interpretation",
              "title": "От показателя к решению",
              "blocks": [
                {
                  "type": "steps",
                  "items": [
                    "Сравнивайте одинаковые товары, денежную базу, длительность и покрытие.",
                    "Отделяйте наблюдение от гипотезы: «расход вырос» — факт, «из-за ставки» — версия.",
                    "Проверьте цену, наличие, ассортимент, рекламу, сезонность и запаздывание данных.",
                    "Сохраните основания и предложите отдельный план действия.",
                    "После действия проверьте результат, не объявляя любое совпадение причинным эффектом."
                  ]
                }
              ]
            }
          ],
          "methods": [
            "cabinet.overview",
            "product.360",
            "finance.summary",
            "analysis.query",
            "metrics.catalog",
            "metrics.status",
            "metrics.completeness",
            "metrics.query",
            "dataset.query"
          ],
          "services": [
            "analytics"
          ]
        },
        "services/mcp-data": {
          "title": "MCP данных: подключение, наборы, методы и выгрузки",
          "lead": "Справочник доступа агента к данным X-MP: установка подключения, выбор полей, пагинация, исходные файлы, контроль качества и ошибки.",
          "purpose": "MCP предоставляет совместимому агенту именованные инструменты и схемы запросов. Вы задаёте вопрос, агент выбирает метод и параметры. Разработчик использует тот же контракт без прямого доступа к базе или ключу Wildberries.",
          "example": "«Проверь доступные наборы и период сбора, прочитай десять заказов с нужными полями. Если требуется исходный файл, скачай его приватно и покажи только вывод».",
          "steps": [
            "Подключите магазин и WB-ключ чтения нужных категорий в кабинете.",
            "Выполните инструкцию подключения агента в папке проекта магазина.",
            "Передайте X-MP-ключ через защищённый файл или скрытый ввод установщика.",
            "В новой сессии проверьте agent.me, capabilities.list, readiness.get и datasets.list."
          ],
          "result": "Ограниченные ответы по выбранным данным, происхождение и проверенные приватные файлы для больших объёмов.",
          "limits": "Методы зависят от клиента и прав. Справочник сверён с клиентом 0.32.0 на 08.09.2026; tools/list вашей сессии определяет доступный контракт. Сохранённый источник может содержать неполный или ошибочный ответ.",
          "sections": [
            {
              "id": "architecture",
              "title": "Устройство подключения",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Компонент",
                    "Ответственность"
                  ],
                  "rows": [
                    [
                      "Клиент MCP",
                      "Список методов, форма запросов и возврат результата агенту."
                    ],
                    [
                      "Шлюз X-MP",
                      "Определяет магазин и эффективные права по ключу."
                    ],
                    [
                      "Сервис данных",
                      "Читает разрешённые записи, агрегаты, версии и артефакты."
                    ],
                    [
                      "Центральный сбор",
                      "Отдельно получает источники WB зарегистрированными методами."
                    ],
                    [
                      "Приватная папка проекта",
                      "Хранит разрешённые выгрузки с лимитами и checksum."
                    ]
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "WB-ключ разрешает серверу читать категории маркетплейса. X-MP-ключ разрешает агенту пользоваться конкретным магазином. Шлюз не выдаёт агенту WB-ключ, доступ к базе или объектному хранилищу."
                }
              ]
            },
            {
              "id": "installation",
              "title": "Подключение по шагам",
              "blocks": [
                {
                  "type": "steps",
                  "items": [
                    "Выберите магазин в кабинете. В защищённых подключениях сохраните WB-ключ чтения категорий, нужных для задачи.",
                    "Откройте подключение агента и выдайте нужные права: analytics.read для аналитики; operations.read/operations.plan отдельно для рабочих блоков.",
                    "Поддержанный установщик Codex требует curl, python3 и codex в PATH. Запустите команду кабинета в папке, из которой будете работать.",
                    "Установщик скачивает пакет, проверяет совместимость и хеши, создаёт .xmp и привязку MCP. ID магазина в команде проверяет ожидаемое подключение, не даёт права выбирать чужой scope.",
                    "Ключ вводится скрыто или через --credential-file. Файл должен принадлежать текущему пользователю, быть обычным приватным файлом с правами 0600.",
                    "Начните новую сессию в подключённой папке; проверьте магазин, права и наборы."
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "В проекте: .xmp/current/bin/xmp_agent_mcp.py — клиент; .xmp/secrets/agent.key — секрет; .codex/config.toml — настройки MCP. Не копируйте ключи между магазинами. Для другого клиента требуется совместимый способ подключения из инструкции, а не произвольное использование настроек Codex."
                },
                {
                  "type": "paragraph",
                  "text": "xmp.update.check проверяет выпуск; xmp.update.apply с confirm=true применяет проверенное обновление. Автообновление зависит от настроенной политики устройства. Обновление не добавляет прав. Если метода нет в tools/list, проверьте версию, совместимость и доступ."
                }
              ]
            },
            {
              "id": "install-command",
              "title": "Команда установки и локальная структура",
              "blocks": [
                {
                  "type": "paragraph",
                  "text": "Предпочтительно копировать индивидуальную команду из своего кабинета. Ниже — техническая форма того же установщика для подготовленного окружения. UUID и путь учебные: замените их на ID вашего кабинета и существующий приватный файл ключа. Значение ключа в командной строке отсутствует."
                },
                {
                  "type": "code",
                  "label": "Шаблон установки; команды выполняются в папке проекта магазина",
                  "value": "curl --fail --silent --show-error https://x-mp.ru/cabinet/static/install-xmp-codex.sh --output ./install-xmp-codex.sh\nbash ./install-xmp-codex.sh \"00000000-0000-0000-0000-000000000001\" --credential-file \"/private/xmp-agent.key\" --no-launch"
                },
                {
                  "type": "table",
                  "headers": [
                    "Аргумент",
                    "Назначение"
                  ],
                  "rows": [
                    [
                      "Первый UUID",
                      "Ожидаемый кабинет; серверная личность должна ему соответствовать."
                    ],
                    [
                      "--credential-file",
                      "Прочитать уже подготовленный приватный файл вместо скрытого ввода."
                    ],
                    [
                      "--no-launch",
                      "Установить подключение без автоматического запуска Codex."
                    ],
                    [
                      "--replace-key",
                      "Явно заменить прежний ключ проекта после проверки нужного магазина."
                    ],
                    [
                      "--auto-update / --no-auto-update",
                      "Явно выбрать политику обновления устройства; без выбора сохраняется текущая."
                    ]
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "Если работа ведётся через другого совместимого клиента, используйте его проверенную инструкцию подключения. Этот shell-установщик предназначен для Codex и не является универсальным установщиком всех MCP-клиентов."
                }
              ]
            },
            {
              "id": "first-query",
              "title": "Первый запрос и права",
              "blocks": [
                {
                  "type": "code",
                  "label": "agent.me",
                  "value": "{}",
                  "method": "agent.me"
                },
                {
                  "type": "code",
                  "label": "capabilities.list",
                  "value": "{}",
                  "method": "capabilities.list"
                },
                {
                  "type": "code",
                  "label": "readiness.get",
                  "value": "{}",
                  "method": "readiness.get"
                },
                {
                  "type": "code",
                  "label": "datasets.list",
                  "value": "{}",
                  "method": "datasets.list"
                },
                {
                  "type": "paragraph",
                  "text": "Сверьте магазин, эффективные права, свежесть и доступные dataset_key. degraded по свежести не всегда запрещает чтение: разрешённые старые данные можно использовать с явной датой. Для нового плана изменения действуют более строгие требования."
                },
                {
                  "type": "paragraph",
                  "text": "Для исходных сохранённых данных нужен analytics.read на шлюзе и серверный grant stored_data. Недостающие права не исправляются передачей account_id, SQL или пути хранилища."
                }
              ]
            },
            {
              "id": "data-levels",
              "title": "Агрегат, строки или файл",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Потребность",
                    "Методы",
                    "Результат"
                  ],
                  "rows": [
                    [
                      "Итоговые показатели",
                      "analysis.query, metrics.query, finance.summary",
                      "Компактный расчёт с качеством."
                    ],
                    [
                      "Проверка записей",
                      "dataset.query, collection.records",
                      "Страница строк/полей и продолжение."
                    ],
                    [
                      "Объёмная обработка",
                      "dataset.export, collection.artifact.download",
                      "Приватный файл и метаданные."
                    ]
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "dataset.export — нормализованный набор; collection.artifact.download — один сохранённый артефакт. Это разные продукты, а не два названия произвольного доступа к базе."
                }
              ]
            },
            {
              "id": "datasets",
              "title": "Наборы и разрешённые поля dataset.query",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Набор",
                    "Поля",
                    "Смысл"
                  ],
                  "rows": [
                    [
                      "Общие",
                      "product_id, nm_id, vendor_code, raw_run_id, observed_at",
                      "Внутренний ID, артикулы, ссылка на исходный запуск, время наблюдения."
                    ],
                    [
                      "products",
                      "listing_id, title, brand, subject_id, valid_from",
                      "Листинг, название, бренд, предмет и начало версии."
                    ],
                    [
                      "orders",
                      "source_key, srid, listing_id, total_price, discounted_price, is_cancel, event_at, last_change_at",
                      "Идентификаторы заказа, ценовые поля, отмена и времена события/изменения."
                    ],
                    [
                      "sales",
                      "source_key, srid, sale_id, listing_id, price_with_discount, for_pay, finished_price, event_at, last_change_at",
                      "Идентификаторы продажи, разные денежные базы, сумма к перечислению и времена."
                    ]
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "Доступные dataset_key сначала читаются через datasets.list. Страничная проекция реализована для products, orders, sales. Другие источники ищите через collection.sources, не подставляйте произвольную entity как dataset_key."
                },
                {
                  "type": "paragraph",
                  "text": "fields — до 16 уникальных разрешённых полей, nm_ids — до 20 строковых артикулов, limit — до 50 строк, offset — до 10000. Для периода нужны обе границы, максимум 90 дней. У products даты относятся к observed_at, у orders/sales — к event_at."
                },
                {
                  "type": "code",
                  "label": "dataset.query",
                  "value": "{\n  \"dataset_key\": \"orders\",\n  \"fields\": [\n    \"nm_id\",\n    \"vendor_code\",\n    \"discounted_price\",\n    \"is_cancel\",\n    \"event_at\",\n    \"raw_run_id\"\n  ],\n  \"date_from\": \"2026-09-01\",\n  \"date_to\": \"2026-09-07\",\n  \"limit\": 10,\n  \"offset\": 0\n}",
                  "method": "dataset.query"
                },
                {
                  "type": "paragraph",
                  "text": "raw_run_id показывает происхождение, а не включает весь payload в строку. Не складывайте разные ценовые поля как независимые доходы. Идентификаторы источника не доказывают уникального покупателя."
                }
              ]
            },
            {
              "id": "collection",
              "title": "Источники и сохранённые версии",
              "blocks": [
                {
                  "type": "code",
                  "label": "collection.sources",
                  "value": "{\n  \"limit\": 20,\n  \"offset\": 0\n}",
                  "method": "collection.sources"
                },
                {
                  "type": "steps",
                  "items": [
                    "Пройдите next_offset каталога. В нём бывают пустые и ошибочные источники.",
                    "Из record_sets возьмите entity и kind: entity, fact либо product. Не угадывайте значения.",
                    "Вызовите collection.records с полями и лимитом. Для истории задайте current_only=false.",
                    "Продолжайте next_after. Даты фильтруют observed_at, не дату продажи.",
                    "Если payload_omitted сообщает о большом содержимом, переходите к raw_run_id и артефакту."
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "До 50 записей и 20 полей за страницу. Фильтр записей/файлов — до 366 дней за запрос; без дат доступны сохранённые даты с пагинацией. Сортировка UUID стабильна для неизменного набора, но не создаёт транзакционный снимок при параллельном сборе."
                }
              ]
            },
            {
              "id": "collection-quality",
              "title": "История сбора и ошибки доступа",
              "blocks": [
                {
                  "type": "code",
                  "label": "collection.history",
                  "value": "{\n  \"date_from\": \"2026-09-01\",\n  \"date_to\": \"2026-09-07\"\n}",
                  "method": "collection.history"
                },
                {
                  "type": "code",
                  "label": "collection.access",
                  "value": "{\n  \"limit\": 20,\n  \"offset\": 0\n}",
                  "method": "collection.access"
                },
                {
                  "type": "paragraph",
                  "text": "История показывает дни/разделы, частичные и неудачные загрузки; диапазон до 31 дня. Диагностика читает последнее сохранённое свидетельство и documented_requirements, не вызывает новый запрос WB."
                },
                {
                  "type": "paragraph",
                  "text": "403 сам по себе не доказывает отсутствие подписки или конкретной категории ключа. Причину и документированные требования проверяют отдельно. Успешный ответ также не доказывает, что собраны все страницы и даты."
                }
              ]
            },
            {
              "id": "files",
              "title": "Файлы, лимиты и проверка выгрузки",
              "blocks": [
                {
                  "type": "code",
                  "label": "collection.artifacts",
                  "value": "{\n  \"kind\": \"raw\",\n  \"date_from\": \"2026-09-01\",\n  \"date_to\": \"2026-09-07\",\n  \"limit\": 10\n}",
                  "method": "collection.artifacts"
                },
                {
                  "type": "code",
                  "label": "collection.artifact.download",
                  "value": "{\n  \"artifact_id\": \"00000000-0000-0000-0000-000000000001\",\n  \"kind\": \"raw\",\n  \"max_bytes\": 10485760\n}",
                  "method": "collection.artifact.download"
                },
                {
                  "type": "paragraph",
                  "text": "UUID учебный: замените реальным ID из каталога. Скачивание по умолчанию до 10MiB, явно — до 128MiB. Части до 256KiB проверяются по размеру, непрерывности, scope и SHA-256; весь файл сохраняется атомарно в .xmp/data с приватными правами. Ответ содержит путь и метаданные."
                },
                {
                  "type": "paragraph",
                  "text": "ZIP не распаковывается; base64-документ внутри JSON не декодируется автоматически. Сначала проверьте формат, затем обрабатывайте локально с сохранением происхождения. Ошибочный ответ WB тоже может быть артефактом."
                },
                {
                  "type": "table",
                  "headers": [
                    "storage_status",
                    "Значение"
                  ],
                  "rows": [
                    [
                      "not_checked",
                      "Привязка выглядит корректной, но существование файла не проверено."
                    ],
                    [
                      "archive_binding_required",
                      "Нужна привязка старого архива; файл не объявляется удалённым или доступным."
                    ]
                  ]
                },
                {
                  "type": "code",
                  "label": "dataset.export",
                  "value": "{\n  \"dataset_key\": \"orders\",\n  \"max_rows\": 10000,\n  \"max_bytes\": 10485760\n}",
                  "method": "dataset.export"
                },
                {
                  "type": "paragraph",
                  "text": "Экспорт сохраняет JSONL и manifest. До 100000 строк и 50MiB; по умолчанию 10000 строк и 10MiB. У export нет фильтров fields, nm_ids и периода: не переносите параметры query. complete описывает завершённость выдачи, а не полноту сбора."
                }
              ]
            },
            {
              "id": "protocol",
              "title": "Вызов MCP и чтение ответа",
              "blocks": [
                {
                  "type": "code",
                  "label": "Учебный JSON-RPC tools/call",
                  "value": "{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"analysis.query\",\n    \"arguments\": {\n      \"date_from\": \"2026-09-01\",\n      \"date_to\": \"2026-09-07\",\n      \"metrics\": [\n        \"ordered_gmv\",\n        \"ad_spend\"\n      ],\n      \"sort_by\": \"ordered_gmv\",\n      \"limit\": 10\n    }\n  }\n}"
                },
                {
                  "type": "paragraph",
                  "text": "Обычно конверт формирует клиент агента. tools/list сообщает имена и inputSchema; arguments обязан соответствовать схеме. Методы без параметров получают {}. Секрет и выбор магазина в arguments не передаются. Формат результата различается по методам."
                },
                {
                  "type": "paragraph",
                  "text": "readOnlyHint — подсказка протокола, не вся модель эффектов. Скачивание пишет локальный файл, расчёт сохраняет историю, reconcile записывает проверку без повторной отправки цены. Сервер дополнительно проверяет права и сочетания параметров."
                }
              ]
            },
            {
              "id": "errors",
              "title": "Неполные ответы и восстановление",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Симптом",
                    "Действие"
                  ],
                  "rows": [
                    [
                      "401",
                      "Обновить индивидуальный доступ через кабинет, не пересылать ключ."
                    ],
                    [
                      "403",
                      "Проверить эффективные права и сохранённую диагностику, не угадывать подписку."
                    ],
                    [
                      "Неизвестное имя",
                      "Прочитать каталог и tools/list; не подбирать WB URL."
                    ],
                    [
                      "degraded / partial / null",
                      "Показать пробелы и ограничить вывод."
                    ],
                    [
                      "next_offset / next_after / cursor",
                      "Продолжить именно выданным механизмом с прежними фильтрами."
                    ],
                    [
                      "payload_omitted",
                      "Получить исходный артефакт ограниченной выгрузкой."
                    ],
                    [
                      "archive_binding_required",
                      "Обратиться за проверкой старой привязки."
                    ],
                    [
                      "Hash или размер не совпал",
                      "Не использовать файл; проверить загрузку."
                    ],
                    [
                      "Метода нет в сессии",
                      "Проверить установленный выпуск, совместимость и grants."
                    ]
                  ]
                }
              ]
            }
          ],
          "methods": [
            "agent.me",
            "capabilities.list",
            "readiness.get",
            "datasets.list",
            "xmp.client.instructions",
            "xmp.update.check",
            "xmp.update.apply",
            "dataset.query",
            "dataset.export",
            "collection.sources",
            "collection.history",
            "collection.access",
            "collection.records",
            "collection.artifacts",
            "collection.artifact.download"
          ],
          "services": [
            "mcp",
            "wb-data"
          ]
        },
        "mcp-reference": {
          "title": "Справочник методов MCP X-MP",
          "lead": "Именованные методы, параметры, типы, обязательность, ограничения и схемы опубликованного клиента. Читайте вместе с руководством нужного сервиса.",
          "purpose": "Справочник помогает точно составить запрос и понять назначение результата. Поля и имена сверены с клиентом. Сервисные руководства объясняют смысл данных, алгоритм и ограничения, а этот раздел фиксирует формальный интерфейс.",
          "example": "Задача → руководство → метод → параметры → вызов → проверка результата и качества.",
          "steps": [
            "Проверьте tools/list своей сессии и capabilities.list.",
            "Выберите метод и изучите руководство его сервиса.",
            "Передавайте только допустимые поля; типы идентификаторов не взаимозаменяемы.",
            "Следуйте пагинации и проверяйте качество, а не только успешность вызова."
          ],
          "result": "Однозначный запрос по проверенной схеме и понимание того, что делает инструмент.",
          "limits": "Контракт проверен по клиенту 0.34.0 на 08.09.2026. Сервер дополнительно проверяет права, период, сочетания параметров и готовность. Наличие схемы не разрешает действие.",
          "sections": [
            {
              "id": "conventions",
              "title": "Идентификаторы, единицы и версии",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Понятие",
                    "Правило"
                  ],
                  "rows": [
                    [
                      "nm_id / nm_ids",
                      "Артикул WB. Тип различается по методу: строка либо integer."
                    ],
                    [
                      "product_id",
                      "Внутренний UUID товара."
                    ],
                    [
                      "target_ids",
                      "В pricing — nmID, в advertising — campaign ID."
                    ],
                    [
                      "card_id / job_id / plan_id / artifact_id",
                      "Задача памяти, запуск, план и файл — разные ID из соответствующих ответов."
                    ],
                    [
                      "date_from / date_to",
                      "Включённые даты; смысл события или наблюдения зависит от метода."
                    ],
                    [
                      "idempotency_key",
                      "Стабильный ключ одной логической операции. Новое намерение — новый ключ."
                    ],
                    [
                      "expected_config_sha256",
                      "Последняя прочитанная контрольная сумма для безопасного обновления."
                    ],
                    [
                      "null",
                      "Неопределённое значение, не ноль."
                    ],
                    [
                      "Доли / проценты",
                      "target_drr=0.18 означает 18%; max_step_percent=10 означает 10%."
                    ],
                    [
                      "Рубли / копейки",
                      "Суффиксы _rub и _kopecks задают разные единицы."
                    ]
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "Таблицы показывают вложенные поля; их обязательность действует при передаче родительского объекта. JSON Schema раскрывается отдельно и сохраняет точные типы. Методы без параметров получают arguments={}."
                }
              ]
            }
          ],
          "methods": [
            "agent.me",
            "capabilities.list",
            "readiness.get",
            "xmp.services.list",
            "tasks.resume",
            "monitor.history",
            "monitor.snapshot",
            "monitor.media",
            "collection.sources",
            "collection.history",
            "collection.access",
            "collection.records",
            "collection.artifacts",
            "collection.artifact.download",
            "monitor.status",
            "monitor.timeline",
            "monitor.series",
            "analysis.query",
            "metrics.catalog",
            "metrics.status",
            "metrics.completeness",
            "metrics.query",
            "dataset.query",
            "dataset.export",
            "repricer.config.validate",
            "repricer.plan",
            "repricer.plan.get",
            "repricer.reconcile",
            "automations.templates.list",
            "automations.catalog",
            "automations.policy.validate",
            "automations.policy.plan",
            "automations.operation.plan.register",
            "automations.operation.plan.get",
            "automations.credentials.requirements",
            "automations.status",
            "automations.config.get",
            "automations.config.apply",
            "automations.shadow.run",
            "automations.runs.list",
            "automations.jobs.create",
            "automations.jobs.get",
            "automations.jobs.list",
            "automations.emergency-stop",
            "automations.reviews.catalog",
            "automations.reviews.prepare",
            "monitor.compare",
            "datasets.list",
            "cabinet.overview",
            "product.360",
            "finance.summary",
            "memory.context",
            "xmp.client.instructions",
            "xmp.update.check",
            "xmp.update.apply",
            "xmp.client.doctor",
            "notifications.history",
            "notifications.settings.get",
            "notifications.settings.update",
            "reports.list",
            "reports.create",
            "reports.run",
            "reports.schedule",
            "reports.status",
            "reports.result"
          ],
          "services": []
        },
        "workflows": {
          "title": "Прикладные методики: от вопроса к проверяемому решению",
          "lead": "Шесть сценариев помогают агенту провести анализ рекламы, подготовить закупку и распределение, проверить ФБС, разобраться в правилах и удержаниях.",
          "purpose": "Получать повторяемый полезный результат по данным магазина: не только цифры, но и обоснованное решение с источниками, ограничениями и последующей проверкой.",
          "example": "«Реклама растёт, некоторые товары заканчиваются. Проведи аудит, затем подготовь пополнение в пределах бюджета. Покажи, что подтверждено данными и какие действия требуют моего решения».",
          "steps": [
            "Установите или обновите клиент и проверьте ./.xmp/doctor.",
            "Назовите задачу, период и существенные ограничения; сохранённые условия агент явно прочитает из Memory.",
            "Получите анализ и подготовленный план с проверкой полноты данных.",
            "Согласуйте конкретные изменения и отдельно оцените результат после исполнения."
          ],
          "result": "Таблица решений, план пополнения/распределения, очередь ФБС либо доказательный разбор документа; у каждого результата — источники и критерий проверки.",
          "limits": "Навык не заменяет недостающие данные и не включает исполнение операций. Правовые выводы зависят от применимой редакции. Доступность методики не доказывает полноту данных конкретного магазина.",
          "services": [
            "analytics"
          ],
          "methods": [
            "xmp.client.instructions",
            "xmp.client.doctor",
            "analysis.query",
            "metrics.catalog",
            "finance.summary"
          ],
          "sections": [
            {
              "id": "choose-workflow",
              "title": "Какой сценарий выбрать",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Методика",
                    "Необходимые входы",
                    "Что получите",
                    "Пример запроса"
                  ],
                  "rows": [
                    [
                      "Аудит рекламы",
                      "Расходы, показы, клики, заказы, воронка, маржа и наличие; детализация и атрибуция проверяются.",
                      "Проблемы и гипотезы по доступному уровню, приоритет действий и план измерения.",
                      "Разбери рекламу за последние две полные недели: где потери, что проверить и что предложить изменить."
                    ],
                    [
                      "Пополнение",
                      "Спрос, свободный запас, резерв, поступления/ETA, сроки, кратность и бюджет.",
                      "Потребность до округления, партия, дата заказа, стоимость и риск дефицита.",
                      "Подготовь план пополнения выбранных товаров на четыре недели в пределах моего бюджета."
                    ],
                    [
                      "Распределение по складам",
                      "Партия по SKU/размеру, региональный спрос, складские остатки, тарифы и приёмка.",
                      "Таблица SKU × склад × количество, сравнение затрат/покрытия, нераспределённый остаток.",
                      "Распредели имеющуюся партию по допустимым складам и объясни компромисс стоимости и покрытия."
                    ],
                    [
                      "Контроль ФБС",
                      "Задания, варианты товара, статусы, сроки/часовой пояс, свободный запас и полнота очереди.",
                      "Приоритет сборки, просрочки, нехватка и конфликтующие статусы; план ручных действий.",
                      "Проверь текущую очередь ФБС и подготовь список действий на сегодня без изменения заданий."
                    ],
                    [
                      "Оферта и правила",
                      "Конкретный вопрос, страна, сторона договора, модель продаж, дата события и официальный текст.",
                      "Пункты и редакции, применимость, выводы, источники и вопросы для правовой проверки.",
                      "Проверь, какие правила применимы к этому событию, и укажи основание и нужные документы."
                    ],
                    [
                      "Удержания",
                      "Начисления и корректировки, идентификаторы документов, денежная база, основание и редакция правил.",
                      "Сверка суммы, доказательства, неясности и подготовленный проект обращения.",
                      "Разбери это удержание: сверь сумму и основание, подготовь обращение, не отправляй."
                    ]
                  ]
                }
              ]
            },
            {
              "id": "workflow-structure",
              "title": "Как работает прикладной навык",
              "blocks": [
                {
                  "type": "steps",
                  "items": [
                    "Агент выбирает ведущую методику по вашему вопросу и явно читает нужный контекст магазина из Memory.",
                    "Проверяет доступ, свежесть, период, детализацию и полноту источников через X-MP.",
                    "Выполняет анализ или расчёт вариантов с исходными данными, единицами и допущениями.",
                    "Готовит решение, таблицу или проект документа; показывает, что пока нельзя подтвердить.",
                    "Для изменений переходит к соответствующему сервису и его порядку подтверждения. После реального действия проверяет результат."
                  ]
                },
                {
                  "type": "paragraph",
                  "text": "Прикладной навык задаёт методику. Сервисный навык объясняет инструменты. MCP и сервер проверяют права. Формулы фактических KPI принадлежат реестру метрик, цели и ограничения — памяти магазина. Установка инструкций не выдаёт новые права."
                }
              ]
            },
            {
              "id": "data-limits",
              "title": "Когда данных недостаточно",
              "blocks": [
                {
                  "type": "table",
                  "headers": [
                    "Ситуация",
                    "Что сделает агент"
                  ],
                  "rows": [
                    [
                      "Есть только итог по товару",
                      "Сделает анализ товара, но не выдумает конкретную кампанию или размер."
                    ],
                    [
                      "Нет сроков пополнения или стоимости",
                      "Подготовит условный план и укажет параметры, без которых нельзя выбрать окончательную закупку."
                    ],
                    [
                      "Нет регионального спроса или складских тарифов",
                      "Покажет доступные варианты без заявления об оптимальном распределении."
                    ],
                    [
                      "Очередь ФБС неполная или старая",
                      "Укажет границы снимка; отсутствие задания не назовёт подтверждением отгрузки."
                    ],
                    [
                      "Оферта недоступна или редакция не установлена",
                      "Попросит нужный документ либо выполнит условный разбор предоставленного текста."
                    ],
                    [
                      "В финансовых данных нет причины удержания",
                      "Сверит доступные суммы и подготовит запрос детализации; не угадает основание."
                    ]
                  ]
                }
              ]
            },
            {
              "id": "connect-workflows",
              "title": "Подключение и вызов",
              "blocks": [
                {
                  "type": "paragraph",
                  "text": "Навыки входят в клиентский пакет 0.34.0: всего 26 навыков и 112 MCP-инструментов. При новой установке используйте команду из кабинета. В существующей папке запустите ./.xmp/start при включённом обновлении либо попросите агента явно обновить клиент. ./.xmp/doctor проверяет пакет и подключения. Затем сформулируйте задачу обычным языком."
                },
                {
                  "type": "code",
                  "label": "Явное чтение инструкции через MCP",
                  "value": "{\"name\":\"xmp.client.instructions\",\"arguments\":{\"skills\":[\"xmp-advertising-audit\"]}}"
                },
                {
                  "type": "paragraph",
                  "text": "Для оферты нужен web-инструмент выбранного AI-клиента или предоставленный официальный документ. Отдельный web-коннектор X-MP в этом выпуске не добавляется. Не передавайте пароли, cookies и ключ WB в чат."
                },
                {
                  "type": "links",
                  "items": [
                    [
                      "Установка и диагностика",
                      "/docs/services/account/"
                    ],
                    [
                      "Аналитика и определения метрик",
                      "/docs/services/analytics/"
                    ],
                    [
                      "Память и задачи",
                      "/docs/services/memory/"
                    ],
                    [
                      "Официальная инструкция WB по оферте",
                      "https://seller.wildberries.ru/instructions/ru/ru/material/how-to-use-offer"
                    ]
                  ]
                }
              ]
            },
            {
              "id": "workflow-results",
              "title": "Проверка результата",
              "blocks": [
                {
                  "type": "paragraph",
                  "text": "Каждый результат содержит дату, область анализа, факты и источники, ограничения, предложенное действие и способ его проверки. Отправленное обращение не равно возврату денег, созданный план не равен поставке, изменение настроек не доказывает рост прибыли. Для замера после действия используется общий навык xmp-outcome-review."
                },
                {
                  "type": "paragraph",
                  "text": "ФБС и поставки в этих методиках работают в режиме чтения и планирования. Промышленный оптимизатор распределения, бронирование слотов и новые marketplace write-методы этим выпуском не поставляются."
                }
              ]
            }
          ]
        }
      },
      "method_reference": {
        "agent.me": {
          "description": "Проверить личность, привязанный магазин и права подключения.",
          "inputSchema": {
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "capabilities.list": {
          "description": "Получить эффективные возможности; наличие метода в клиенте не заменяет проверку прав.",
          "inputSchema": {
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "readiness.get": {
          "description": "Проверить состояние магазина и свежесть данных.",
          "inputSchema": {
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "xmp.services.list": {
          "description": "Получить сервисы и их режимы для текущего подключения.",
          "inputSchema": {
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "tasks.resume": {
          "description": "Прочитать актуальную версию существующей задачи и рабочий контекст.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "card_id"
            ],
            "properties": {
              "card_id": {
                "type": "string",
                "format": "uuid"
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "monitor.history": {
          "description": "Найти изменения по тегу, полю и источнику; полный before/after требует limit=1.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "date_from": {
                "type": "string"
              },
              "date_to": {
                "type": "string"
              },
              "tag": {
                "type": "string"
              },
              "field": {
                "type": "string"
              },
              "source": {
                "type": "string"
              },
              "cursor": {
                "type": "string"
              },
              "limit": {
                "type": "integer",
                "minimum": 1,
                "maximum": 50
              },
              "detail": {
                "type": "string",
                "enum": [
                  "summary",
                  "full"
                ]
              },
              "nm_ids": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "maxItems": 20
              },
              "include_baseline": {
                "type": "boolean"
              }
            },
            "required": [
              "date_from",
              "date_to"
            ],
            "additionalProperties": false
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "monitor.snapshot": {
          "description": "Прочитать компоненты товара на момент или по snapshot_id; полный detail требует limit=1.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "snapshot_id": {
                "type": "string"
              },
              "at": {
                "type": "string"
              },
              "component": {
                "type": "string"
              },
              "source": {
                "type": "string"
              },
              "field": {
                "type": "string"
              },
              "limit": {
                "type": "integer",
                "minimum": 1,
                "maximum": 50
              },
              "detail": {
                "type": "string",
                "enum": [
                  "summary",
                  "full"
                ]
              },
              "nm_id": {
                "type": "integer",
                "minimum": 1
              },
              "offset": {
                "type": "integer",
                "minimum": 0
              }
            },
            "required": [
              "nm_id"
            ],
            "additionalProperties": false
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "monitor.media": {
          "description": "Прочитать часть изображения до256KiB; продолжать next_offset, проверить полный hash.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "media_id": {
                "type": "string"
              },
              "offset": {
                "type": "integer",
                "minimum": 0
              }
            },
            "required": [
              "media_id"
            ],
            "additionalProperties": false
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "collection.sources": {
          "description": "Перечислить сохранённые источники и record_sets; включает пустые/ошибочные источники.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "limit": {
                "type": "integer",
                "minimum": 1,
                "maximum": 50,
                "default": 20
              },
              "offset": {
                "type": "integer",
                "minimum": 0,
                "maximum": 10000
              }
            },
            "required": []
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "collection.history": {
          "description": "Прочитать историю сбора по дням и методам за период до31 дня.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "date_from": {
                "type": "string",
                "format": "date"
              },
              "date_to": {
                "type": "string",
                "format": "date"
              }
            },
            "required": [
              "date_from",
              "date_to"
            ]
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "collection.access": {
          "description": "Прочитать сохранённую диагностику доступа без нового запроса WB.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "limit": {
                "type": "integer",
                "minimum": 1,
                "maximum": 50,
                "default": 20
              },
              "offset": {
                "type": "integer",
                "minimum": 0,
                "maximum": 10000
              }
            },
            "required": []
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "collection.records": {
          "description": "Прочитать текущие записи или версии; entity и kind берутся из collection.sources.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "entity": {
                "type": "string",
                "pattern": "^[a-zA-Z0-9_.-]{1,128}$"
              },
              "kind": {
                "type": "string",
                "enum": [
                  "entity",
                  "fact",
                  "product"
                ]
              },
              "current_only": {
                "type": "boolean",
                "default": true
              },
              "after": {
                "type": "string",
                "format": "uuid"
              },
              "limit": {
                "type": "integer",
                "minimum": 1,
                "maximum": 50,
                "default": 20
              },
              "fields": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "minItems": 1,
                "maxItems": 20
              },
              "date_from": {
                "type": "string",
                "format": "date"
              },
              "date_to": {
                "type": "string",
                "format": "date"
              }
            },
            "required": [
              "entity"
            ]
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "collection.artifacts": {
          "description": "Найти метаданные исходных ответов или зарегистрированных бизнес-файлов.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "kind": {
                "type": "string",
                "enum": [
                  "raw",
                  "business"
                ]
              },
              "entity": {
                "type": "string"
              },
              "method_id": {
                "type": "string"
              },
              "date_from": {
                "type": "string",
                "format": "date"
              },
              "date_to": {
                "type": "string",
                "format": "date"
              },
              "after": {
                "type": "string",
                "format": "uuid"
              },
              "limit": {
                "type": "integer",
                "minimum": 1,
                "maximum": 50,
                "default": 20
              }
            },
            "required": []
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "collection.artifact.download": {
          "description": "Скачать один артефакт в приватную .xmp/data, проверить размер и SHA-256; вернуть путь.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "artifact_id": {
                "type": "string",
                "format": "uuid"
              },
              "kind": {
                "type": "string",
                "enum": [
                  "raw",
                  "business"
                ],
                "default": "raw"
              },
              "max_bytes": {
                "type": "integer",
                "minimum": 1,
                "maximum": 134217728,
                "default": 10485760
              }
            },
            "required": [
              "artifact_id"
            ]
          },
          "read_only": false,
          "source": "published-client-0.32.0/2026-09-08"
        },
        "monitor.status": {
          "description": "Проверить состояние и покрытие мониторинга.",
          "inputSchema": {
            "type": "object",
            "properties": {},
            "required": [],
            "additionalProperties": false
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "monitor.timeline": {
          "description": "Прочитать события по типу и товарам; baseline скрыт по умолчанию.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "date_from": {
                "type": "string"
              },
              "date_to": {
                "type": "string"
              },
              "nm_ids": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "maxItems": 20
              },
              "event_type": {
                "type": "string",
                "enum": [
                  "baseline",
                  "source_gap",
                  "card",
                  "photos",
                  "price",
                  "stock",
                  "supply",
                  "advertising",
                  "rating",
                  "reviews"
                ]
              },
              "object_type": {
                "type": "string",
                "enum": [
                  "store",
                  "product",
                  "competitor"
                ]
              },
              "limit": {
                "type": "integer",
                "minimum": 1,
                "maximum": 50
              },
              "cursor": {
                "type": "string"
              },
              "include_baseline": {
                "type": "boolean",
                "default": false
              },
              "detail": {
                "type": "string",
                "enum": [
                  "summary",
                  "full"
                ],
                "default": "summary"
              }
            },
            "required": [
              "date_from",
              "date_to"
            ],
            "additionalProperties": false
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "monitor.series": {
          "description": "Получить временной ряд одного разрешённого показателя или количества событий.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "date_from": {
                "type": "string"
              },
              "date_to": {
                "type": "string"
              },
              "nm_ids": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "maxItems": 20
              },
              "event_type": {
                "type": "string",
                "enum": [
                  "baseline",
                  "source_gap",
                  "card",
                  "photos",
                  "price",
                  "stock",
                  "supply",
                  "advertising",
                  "rating",
                  "reviews"
                ]
              },
              "object_type": {
                "type": "string",
                "enum": [
                  "store",
                  "product",
                  "competitor"
                ]
              },
              "group_by": {
                "type": "string",
                "enum": [
                  "account",
                  "product"
                ]
              },
              "metric": {
                "type": "string",
                "enum": [
                  "events",
                  "rating",
                  "reviews",
                  "public_price_min_rub",
                  "public_price_max_rub",
                  "amount",
                  "discountedPrice_min"
                ]
              }
            },
            "required": [
              "date_from",
              "date_to"
            ],
            "additionalProperties": false
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "analysis.query": {
          "description": "Рассчитать агрегаты и коэффициенты по магазину, товарам и дням с признаками качества.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "date_from",
              "date_to"
            ],
            "properties": {
              "date_from": {
                "type": "string",
                "format": "date"
              },
              "date_to": {
                "type": "string",
                "format": "date"
              },
              "group_by": {
                "type": "string",
                "enum": [
                  "account",
                  "day",
                  "product",
                  "day_product"
                ],
                "default": "product"
              },
              "metrics": {
                "type": "array",
                "minItems": 1,
                "maxItems": 12,
                "uniqueItems": true,
                "items": {
                  "type": "string",
                  "enum": [
                    "ordered_units",
                    "ordered_gmv",
                    "cancelled_units",
                    "sales_gmv",
                    "ad_spend",
                    "ad_clicks",
                    "ad_orders",
                    "wb_for_pay",
                    "contribution_profit",
                    "stock_units",
                    "opens",
                    "carts",
                    "ad_impressions",
                    "funnel_orders",
                    "average_ordered_unit_price",
                    "cpm",
                    "ad_spend_to_ordered_gmv",
                    "ad_spend_per_ordered_unit",
                    "operational_contribution_margin",
                    "average_order_value",
                    "cancelled_order_share",
                    "ad_ctr",
                    "cpc",
                    "cpo",
                    "cart_cr",
                    "order_cr",
                    "cart_to_order_cr"
                  ]
                },
                "default": [
                  "ordered_gmv",
                  "sales_gmv",
                  "ad_spend",
                  "cancelled_units"
                ]
              },
              "nm_ids": {
                "type": "array",
                "maxItems": 20,
                "uniqueItems": true,
                "items": {
                  "type": "string",
                  "pattern": "^[0-9]{1,20}$"
                }
              },
              "sort_by": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9_]{1,63}$",
                "default": "ordered_gmv"
              },
              "sort_direction": {
                "type": "string",
                "enum": [
                  "asc",
                  "desc"
                ],
                "default": "desc"
              },
              "offset": {
                "type": "integer",
                "minimum": 0,
                "maximum": 10000,
                "default": 0
              },
              "limit": {
                "type": "integer",
                "minimum": 1,
                "maximum": 50,
                "default": 20
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "metrics.catalog": {
          "description": "Прочитать определения KPI: формулы, входы, единицы, детализацию и зрелость.",
          "inputSchema": {
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "metrics.status": {
          "description": "Проверить последнюю сборку метрик и пробелы покрытия.",
          "inputSchema": {
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "metrics.completeness": {
          "description": "Получить матрицу достаточности определений, свежесть и недостающие входы.",
          "inputSchema": {
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "metrics.query": {
          "description": "Прочитать значения зарегистрированных KPI по периоду и измерениям.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "metric_ids",
              "date_from",
              "date_to"
            ],
            "properties": {
              "metric_ids": {
                "type": "array",
                "minItems": 1,
                "maxItems": 50,
                "uniqueItems": true,
                "items": {
                  "type": "string",
                  "pattern": "^[a-z][a-z0-9_]{1,63}$"
                }
              },
              "date_from": {
                "type": "string",
                "format": "date"
              },
              "date_to": {
                "type": "string",
                "format": "date"
              },
              "grain": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9_]{1,63}$"
              },
              "product_id": {
                "type": "string",
                "format": "uuid"
              },
              "nm_id": {
                "type": "integer",
                "minimum": 1
              },
              "campaign_id": {
                "type": "integer",
                "minimum": 1
              },
              "warehouse_id": {
                "type": "string",
                "minLength": 1,
                "maxLength": 128
              },
              "limit": {
                "type": "integer",
                "minimum": 1,
                "maximum": 50,
                "default": 20
              },
              "offset": {
                "type": "integer",
                "minimum": 0,
                "maximum": 1000000,
                "default": 0
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "dataset.query": {
          "description": "Прочитать страницу нормализованных строк с выбранными полями, без raw payload.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "dataset_key"
            ],
            "properties": {
              "dataset_key": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9_-]{1,127}$"
              },
              "fields": {
                "type": "array",
                "minItems": 1,
                "maxItems": 16,
                "uniqueItems": true,
                "items": {
                  "type": "string",
                  "pattern": "^[a-z][a-z0-9_]*$"
                }
              },
              "nm_ids": {
                "type": "array",
                "maxItems": 20,
                "uniqueItems": true,
                "items": {
                  "type": "string",
                  "pattern": "^[0-9]{1,19}$"
                }
              },
              "date_from": {
                "type": "string",
                "format": "date"
              },
              "date_to": {
                "type": "string",
                "format": "date"
              },
              "limit": {
                "type": "integer",
                "minimum": 1,
                "maximum": 50,
                "default": 20
              },
              "offset": {
                "type": "integer",
                "minimum": 0,
                "maximum": 10000,
                "default": 0
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "dataset.export": {
          "description": "Сохранить ограниченный нормализованный набор в приватный JSONL и manifest.",
          "read_only": false,
          "idempotent": false,
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "dataset_key"
            ],
            "properties": {
              "dataset_key": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9_-]{1,127}$"
              },
              "max_rows": {
                "type": "integer",
                "minimum": 1,
                "maximum": 100000,
                "default": 10000
              },
              "max_bytes": {
                "type": "integer",
                "minimum": 1024,
                "maximum": 52428800,
                "default": 10485760
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "repricer.config.validate": {
          "description": "Проверить конфигурацию v2 и получить effective config и критерии привязки к памяти.",
          "read_only": true,
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "config"
            ],
            "properties": {
              "config": {
                "type": "object"
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "repricer.plan": {
          "description": "Подготовить точный ценовой план и approval_url без отправки цен.",
          "read_only": false,
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "target_ids",
              "idempotency_key"
            ],
            "properties": {
              "target_ids": {
                "type": "array",
                "minItems": 1,
                "maxItems": 5,
                "items": {
                  "type": "string",
                  "pattern": "^[0-9]+$"
                }
              },
              "idempotency_key": {
                "type": "string",
                "minLength": 8,
                "maxLength": 128
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "repricer.plan.get": {
          "description": "Прочитать план и состояние его исполнения.",
          "read_only": true,
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "plan_id"
            ],
            "properties": {
              "plan_id": {
                "type": "string"
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "repricer.reconcile": {
          "description": "Проверить загрузку WB и фактические цены, сохранить проверку; повторной отправки нет.",
          "read_only": false,
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "plan_id"
            ],
            "properties": {
              "plan_id": {
                "type": "string"
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "automations.templates.list": {
          "description": "Получить шаблоны предварительных расчётов и планов.",
          "inputSchema": {
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "automations.catalog": {
          "description": "Прочитать каталог пакетов и контракт биддера.",
          "inputSchema": {
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "automations.policy.validate": {
          "description": "Проверить структурированные условия; не запускает и не планирует работу.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "policy"
            ],
            "properties": {
              "policy": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "schema_version": {
                    "const": 1
                  },
                  "domain": {
                    "enum": [
                      "advertising",
                      "advertising-budget",
                      "card-experiment",
                      "catalog",
                      "custom",
                      "inventory-fbs",
                      "pricing",
                      "reputation",
                      "supplies"
                    ]
                  },
                  "objective": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 1000
                  },
                  "mode": {
                    "enum": [
                      "observe",
                      "shadow"
                    ]
                  },
                  "algorithm_id": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_.-]{1,127}$"
                  },
                  "trigger": {
                    "type": "object"
                  },
                  "targets": {
                    "type": "object"
                  },
                  "guardrails": {
                    "type": "object"
                  },
                  "domain_settings": {
                    "type": "object"
                  },
                  "evidence_refs": {
                    "type": "array",
                    "maxItems": 50,
                    "items": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "automations.policy.plan": {
          "description": "Сохранить локальный неизменяемый план условий; WB не меняется.",
          "read_only": false,
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "idempotency_key",
              "policy"
            ],
            "properties": {
              "idempotency_key": {
                "type": "string",
                "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$"
              },
              "policy": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "schema_version": {
                    "const": 1
                  },
                  "domain": {
                    "enum": [
                      "advertising",
                      "advertising-budget",
                      "card-experiment",
                      "catalog",
                      "custom",
                      "inventory-fbs",
                      "pricing",
                      "reputation",
                      "supplies"
                    ]
                  },
                  "objective": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 1000
                  },
                  "mode": {
                    "enum": [
                      "observe",
                      "shadow"
                    ]
                  },
                  "algorithm_id": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_.-]{1,127}$"
                  },
                  "trigger": {
                    "type": "object"
                  },
                  "targets": {
                    "type": "object"
                  },
                  "guardrails": {
                    "type": "object"
                  },
                  "domain_settings": {
                    "type": "object"
                  },
                  "evidence_refs": {
                    "type": "array",
                    "maxItems": 50,
                    "items": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "automations.operation.plan.register": {
          "description": "Зарегистрировать digest и приватную ссылку общего плана; не исполняет операцию.",
          "read_only": false,
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "plan_id",
              "plan_sha256",
              "capability",
              "artifact_ref",
              "effect_ceiling",
              "expires_at"
            ],
            "properties": {
              "plan_id": {
                "type": "string",
                "pattern": "^operation-plan-[a-f0-9]{24}$"
              },
              "plan_sha256": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              "capability": {
                "enum": [
                  "advertising.apply_actions",
                  "pricing.apply_actions",
                  "catalog.apply_content_actions",
                  "communication.send_replies"
                ]
              },
              "artifact_ref": {
                "type": "string",
                "pattern": "^operations-artifact://[^\\s]{1,240}$"
              },
              "effect_ceiling": {
                "enum": [
                  "shadow",
                  "approval-required"
                ]
              },
              "expires_at": {
                "type": "string",
                "format": "date-time"
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "automations.operation.plan.get": {
          "description": "Прочитать общий план и статус согласования; для исполнения цен есть отдельный путь репрайсера.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "plan_id"
            ],
            "properties": {
              "plan_id": {
                "type": "string",
                "pattern": "^operation-plan-[a-f0-9]{24}$"
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "automations.credentials.requirements": {
          "description": "Узнать права X-MP и категории WB-ключей для домена без значений секретов.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "domain"
            ],
            "properties": {
              "domain": {
                "enum": [
                  "advertising",
                  "advertising-budget",
                  "card-experiment",
                  "catalog",
                  "custom",
                  "inventory-fbs",
                  "pricing",
                  "reputation",
                  "supplies"
                ]
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "automations.status": {
          "description": "Прочитать состояние связанных рабочих доменов магазина.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "automations.config.get": {
          "description": "Прочитать конфигурацию и её контрольную сумму перед обновлением.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "domain"
            ],
            "properties": {
              "domain": {
                "enum": [
                  "advertising",
                  "pricing",
                  "catalog",
                  "responder"
                ]
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "automations.config.apply": {
          "description": "Проверить и сохранить полный observe/shadow config; включение биддера запускает расчёты, а не WB execution.",
          "read_only": false,
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "domain",
              "config",
              "idempotency_key"
            ],
            "properties": {
              "domain": {
                "enum": [
                  "advertising",
                  "pricing",
                  "catalog",
                  "responder"
                ]
              },
              "config": {
                "type": "object",
                "minProperties": 1
              },
              "idempotency_key": {
                "type": "string",
                "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{7,127}$"
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "automations.shadow.run": {
          "description": "Выполнить один предварительный расчёт и сохранить отчёт без изменений WB.",
          "read_only": false,
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "domain",
              "idempotency_key"
            ],
            "properties": {
              "domain": {
                "enum": [
                  "advertising",
                  "pricing",
                  "catalog",
                  "responder"
                ]
              },
              "idempotency_key": {
                "type": "string",
                "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{7,127}$"
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "automations.runs.list": {
          "description": "Прочитать ограниченную историю запусков домена.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "domain"
            ],
            "properties": {
              "domain": {
                "enum": [
                  "advertising",
                  "pricing",
                  "catalog",
                  "responder"
                ]
              },
              "limit": {
                "type": "integer",
                "minimum": 1,
                "maximum": 100
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "automations.jobs.create": {
          "description": "Поставить один расчёт в очередь и получить job_id.",
          "read_only": false,
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "domain",
              "idempotency_key"
            ],
            "properties": {
              "domain": {
                "enum": [
                  "advertising",
                  "pricing",
                  "catalog",
                  "responder"
                ]
              },
              "idempotency_key": {
                "type": "string",
                "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{7,127}$"
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "automations.jobs.get": {
          "description": "Прочитать состояние и полный результат задачи очереди, включая review_cases.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "job_id"
            ],
            "properties": {
              "job_id": {
                "type": "string",
                "format": "uuid"
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "automations.jobs.list": {
          "description": "Прочитать ограниченный список задач очереди магазина.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "limit": {
                "type": "integer",
                "minimum": 1,
                "maximum": 100,
                "default": 20
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "automations.emergency-stop": {
          "description": "Установить аварийную остановку контроллеров X-MP; не обещает остановить кампании непосредственно в WB.",
          "read_only": false,
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "reason"
            ],
            "properties": {
              "reason": {
                "type": "string",
                "minLength": 1,
                "maxLength": 500
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "automations.reviews.catalog": {
          "description": "Получить сервисы отзывов, ограничения и prepare_schema.",
          "inputSchema": {
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "automations.reviews.prepare": {
          "description": "Проверить параметры и собрать несохранённый draft-only config; модель не вызывается.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "config_id": {
                "type": "string",
                "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{1,127}$"
              },
              "service_id": {
                "type": "string",
                "minLength": 1,
                "maxLength": 64
              },
              "generation": {
                "type": "string",
                "enum": [
                  "template",
                  "agent-draft"
                ]
              },
              "model_ref": {
                "type": "string",
                "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{1,127}$"
              },
              "memory_binding": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "instructions_ref": {
                    "type": "string",
                    "pattern": "^(?:memory|task|artifact|task-revision|memory-revision)://[A-Za-z0-9][A-Za-z0-9_./:@-]{1,255}$"
                  },
                  "task_ref": {
                    "type": "string",
                    "pattern": "^(?:memory|task|artifact|task-revision|memory-revision)://[A-Za-z0-9][A-Za-z0-9_./:@-]{1,255}$"
                  }
                },
                "required": [
                  "instructions_ref",
                  "task_ref"
                ]
              },
              "product_ids": {
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 256,
                  "pattern": "^[0-9]{1,20}$"
                },
                "minItems": 1,
                "maxItems": 20,
                "uniqueItems": true
              },
              "rating_min": {
                "type": "integer",
                "minimum": 1,
                "maximum": 5
              },
              "rating_max": {
                "type": "integer",
                "minimum": 1,
                "maximum": 5
              },
              "excluded_terms": {
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 256
                },
                "minItems": 0,
                "maxItems": 30,
                "uniqueItems": true
              },
              "escalation_terms": {
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 256
                },
                "minItems": 0,
                "maxItems": 30,
                "uniqueItems": true
              },
              "response_text": {
                "type": "string",
                "minLength": 2,
                "maxLength": 1000
              },
              "drafts": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "properties": {
                    "review_id": {
                      "type": "string",
                      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{1,127}$"
                    },
                    "source_text_sha256": {
                      "type": "string",
                      "pattern": "^[a-f0-9]{64}$"
                    },
                    "response_text": {
                      "type": "string",
                      "minLength": 2,
                      "maxLength": 1000
                    },
                    "evidence_refs": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 256,
                        "pattern": "^(?:memory|task|artifact|task-revision|memory-revision)://[A-Za-z0-9][A-Za-z0-9_./:@-]{1,255}$"
                      },
                      "minItems": 1,
                      "maxItems": 10,
                      "uniqueItems": true
                    }
                  },
                  "required": [
                    "review_id",
                    "source_text_sha256",
                    "response_text",
                    "evidence_refs"
                  ]
                },
                "maxItems": 20,
                "minItems": 1
              },
              "max_items": {
                "type": "integer",
                "minimum": 1,
                "maximum": 20
              }
            },
            "required": [
              "config_id",
              "service_id",
              "generation",
              "memory_binding",
              "product_ids",
              "rating_min",
              "rating_max",
              "excluded_terms",
              "escalation_terms",
              "max_items"
            ]
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "monitor.compare": {
          "description": "Сравнить показатели вокруг события с покрытием и одновременными изменениями; причинность не доказывает, память не записывает.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "event_id",
              "nm_id"
            ],
            "properties": {
              "event_id": {
                "type": "string",
                "format": "uuid"
              },
              "nm_id": {
                "type": "integer",
                "minimum": 1
              },
              "days": {
                "type": "integer",
                "minimum": 1,
                "maximum": 28,
                "default": 7
              },
              "metrics": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "minItems": 1,
                "maxItems": 12
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "datasets.list": {
          "description": "Узнать доступные dataset_key перед запросом или экспортом.",
          "inputSchema": {
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "cabinet.overview": {
          "description": "Получить компактный обзор и ограниченное число ведущих товаров.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "top_limit": {
                "type": "integer",
                "minimum": 1,
                "maximum": 20,
                "default": 10
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "product.360": {
          "description": "Прочитать срез одного артикула за выбранный период.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "nm_id",
              "date_from",
              "date_to"
            ],
            "properties": {
              "nm_id": {
                "type": "string",
                "pattern": "^[0-9]{1,19}$"
              },
              "date_from": {
                "type": "string",
                "format": "date"
              },
              "date_to": {
                "type": "string",
                "format": "date"
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "finance.summary": {
          "description": "Получить финансовую сводку с явными денежными базами и ограничениями.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "date_from",
              "date_to"
            ],
            "properties": {
              "date_from": {
                "type": "string",
                "format": "date"
              },
              "date_to": {
                "type": "string",
                "format": "date"
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "memory.context": {
          "description": "Явно прочитать ограниченный контекст магазина.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "query": {
                "type": "string",
                "maxLength": 500
              },
              "limit": {
                "type": "integer",
                "minimum": 1,
                "maximum": 5
              },
              "max_chars": {
                "type": "integer",
                "minimum": 1000,
                "maximum": 6000
              }
            },
            "required": [
              "query"
            ]
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "xmp.client.instructions": {
          "description": "Прочитать индекс инструкций или1–3 skill; бизнес-правила не меняются.",
          "read_only": true,
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "skills": {
                "type": "array",
                "minItems": 1,
                "maxItems": 3,
                "uniqueItems": true,
                "items": {
                  "type": "string"
                }
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "xmp.update.check": {
          "description": "Проверить доступность совместимого клиентского выпуска.",
          "inputSchema": {
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "xmp.update.apply": {
          "description": "Применить проверенное обновление после confirm=true; права не расширяются.",
          "read_only": false,
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "confirm"
            ],
            "properties": {
              "confirm": {
                "const": true
              },
              "auto_update": {
                "type": "boolean"
              }
            }
          },
          "source": "published-client-0.32.0/2026-09-08"
        },
        "xmp.client.doctor": {
          "description": "Check client integrity, account identity, granted access and configured service states. Read-only; never enables grants, schedules or marketplace operations. Returns bounded diagnostics, not business data.",
          "inputSchema": {
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "source": "client-0.33.0/TASK-169"
        },
        "notifications.history": {
          "description": "Read bounded notification history for the key owner and bound account, including supported delivery evidence. Does not mark read or send messages.",
          "inputSchema": {
            "type": "object",
            "required": [],
            "additionalProperties": false,
            "properties": {
              "cursor": {
                "type": "integer",
                "minimum": 0
              },
              "limit": {
                "type": "integer",
                "minimum": 1,
                "maximum": 100
              },
              "category": {
                "type": "string",
                "enum": [
                  "reports",
                  "operations",
                  "prices",
                  "data"
                ]
              },
              "correlation_id": {
                "type": "string",
                "maxLength": 128
              }
            }
          },
          "source": "client-0.33.0/TASK-169"
        },
        "notifications.settings.get": {
          "description": "Read personal delivery preferences for this account and key owner. Version is required for a later update.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "properties": {}
          },
          "source": "client-0.33.0/TASK-169"
        },
        "notifications.settings.update": {
          "description": "Save requested delivery preferences with exact current version and confirm=true. Requires tasks.write; no test message or marketplace execution. On conflict/timeout read preferences before retry.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "settings",
              "confirm"
            ],
            "properties": {
              "settings": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "version",
                  "reports",
                  "operations",
                  "prices",
                  "data",
                  "notify_no_changes",
                  "timezone",
                  "quiet_start",
                  "quiet_end",
                  "digest_time"
                ],
                "properties": {
                  "version": {
                    "type": "integer",
                    "minimum": 0
                  },
                  "reports": {
                    "type": "string",
                    "enum": [
                      "immediate",
                      "digest",
                      "in_app_only",
                      "off"
                    ]
                  },
                  "operations": {
                    "type": "string",
                    "enum": [
                      "immediate",
                      "digest",
                      "in_app_only",
                      "off"
                    ]
                  },
                  "prices": {
                    "type": "string",
                    "enum": [
                      "immediate",
                      "digest",
                      "in_app_only",
                      "off"
                    ]
                  },
                  "data": {
                    "type": "string",
                    "enum": [
                      "immediate",
                      "digest",
                      "in_app_only",
                      "off"
                    ]
                  },
                  "notify_no_changes": {
                    "type": "boolean"
                  },
                  "timezone": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100
                  },
                  "quiet_start": {
                    "type": "string",
                    "pattern": "^(?:[01][0-9]|2[0-3]):[0-5][0-9]$"
                  },
                  "quiet_end": {
                    "type": "string",
                    "pattern": "^(?:[01][0-9]|2[0-3]):[0-5][0-9]$"
                  },
                  "digest_time": {
                    "type": "string",
                    "pattern": "^(?:[01][0-9]|2[0-3]):[0-5][0-9]$"
                  }
                }
              },
              "confirm": {
                "type": "boolean",
                "const": true
              }
            }
          },
          "source": "client-0.33.0/TASK-169"
        },
        "reports.list": {
          "description": "List up to ten Memory-backed report definitions and their schedule state for this account.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "properties": {}
          },
          "source": "client-0.33.0/TASK-169"
        },
        "reports.create": {
          "description": "Create an idempotent Memory-backed daily-review/1 report definition, initially paused. Sections sales/advertising/stock/change; not a complete financial audit.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "title",
              "request_id"
            ],
            "properties": {
              "title": {
                "type": "string",
                "minLength": 3,
                "maxLength": 120
              },
              "request_id": {
                "type": "string",
                "format": "uuid"
              },
              "template": {
                "type": "string",
                "enum": [
                  "daily-review/1"
                ]
              },
              "sections": {
                "type": "array",
                "minItems": 1,
                "maxItems": 4,
                "uniqueItems": true,
                "items": {
                  "type": "string",
                  "enum": [
                    "sales",
                    "advertising",
                    "stock",
                    "change"
                  ]
                }
              },
              "timezone": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              },
              "local_time": {
                "type": "string",
                "pattern": "^(?:[01][0-9]|2[0-3]):[0-5][0-9]$"
              },
              "weekdays": {
                "type": "array",
                "minItems": 1,
                "maxItems": 7,
                "uniqueItems": true,
                "items": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 6
                }
              }
            }
          },
          "source": "client-0.33.0/TASK-169"
        },
        "reports.run": {
          "description": "Queue one requested report generation using a stable request_id. Does not enable recurrence or execute marketplace changes.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "card_id",
              "request_id"
            ],
            "properties": {
              "card_id": {
                "type": "string",
                "format": "uuid"
              },
              "request_id": {
                "type": "string",
                "format": "uuid"
              }
            }
          },
          "source": "client-0.33.0/TASK-169"
        },
        "reports.schedule": {
          "description": "Explicitly enable or disable the saved report schedule. Requires confirm=true and account tasks.write; changes recurrence, not marketplace data.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "card_id",
              "enabled",
              "confirm"
            ],
            "properties": {
              "card_id": {
                "type": "string",
                "format": "uuid"
              },
              "enabled": {
                "type": "boolean"
              },
              "confirm": {
                "type": "boolean",
                "const": true
              }
            }
          },
          "source": "client-0.33.0/TASK-169"
        },
        "reports.status": {
          "description": "Read the bound report job state; completion and delivery are separate.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "job_id"
            ],
            "properties": {
              "job_id": {
                "type": "string",
                "format": "uuid"
              }
            }
          },
          "source": "client-0.33.0/TASK-169"
        },
        "reports.result": {
          "description": "Read verified bounded report JSON from a scoped artifact; server verifies archive checksums, account, workspace and tenant.",
          "inputSchema": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "artifact_id"
            ],
            "properties": {
              "artifact_id": {
                "type": "string",
                "format": "uuid"
              }
            }
          },
          "source": "client-0.33.0/TASK-169"
        }
      },
      "parameter_help": {
        "date_from": "Дата начала; смысл события или наблюдения зависит от метода.",
        "date_to": "Включённая дата окончания; проверяйте допустимую длину периода.",
        "limit": "Число строк/событий за страницу, а не полнота всего источника.",
        "offset": "Смещение следующей страницы либо байтов медиа; используйте значение ответа.",
        "cursor": "Непрозрачный курсор продолжения с теми же фильтрами.",
        "after": "UUID последней записи для продолжения next_after.",
        "nm_id": "Артикул WB; соблюдайте тип именно этого метода.",
        "nm_ids": "Список артикулов WB в пределах выбранного магазина.",
        "product_ids": "Список артикулов WB в пределах выбранного магазина.",
        "product_id": "Внутренний UUID товара; отличается от артикула WB.",
        "campaign_id": "Идентификатор рекламной кампании.",
        "warehouse_id": "Идентификатор склада из доступного источника.",
        "dataset_key": "Зарегистрированное имя набора из datasets.list.",
        "fields": "Имена выбранных полей; допустимые имена зависят от набора.",
        "entity": "Наблюдаемое имя сущности из collection.sources/record_sets.",
        "kind": "Вид записи или файла; допустимые варианты зависят от метода.",
        "current_only": "Только актуальные записи либо сохранённая история версий.",
        "method_id": "Фильтр по зарегистрированному методу источника.",
        "artifact_id": "Идентификатор файла из каталога артефактов.",
        "max_bytes": "Верхняя граница размера скачивания или экспорта в байтах.",
        "max_rows": "Верхняя граница числа экспортируемых строк.",
        "group_by": "Группировка данных; проверяйте разрешённые варианты.",
        "grain": "Зарегистрированный уровень детализации метрики.",
        "metrics": "Список выбранных показателей; разные сервисы имеют собственный каталог.",
        "metric_ids": "Список выбранных показателей; разные сервисы имеют собственный каталог.",
        "metric": "Один показатель временного ряда.",
        "sort_by": "Выбранный показатель для сортировки; должен присутствовать в запросе.",
        "sort_direction": "Направление сортировки.",
        "top_limit": "Количество ведущих товаров в обзоре.",
        "event_type": "Тип сохранённого события.",
        "object_type": "Тип наблюдаемого объекта.",
        "include_baseline": "Включить первоначальные базовые снимки, не только изменения.",
        "detail": "Краткие данные либо полный снимок; full у истории требует limit=1.",
        "tag": "Тег изменения из доступной истории.",
        "field": "Путь конкретного параметра; выбирается по данным истории.",
        "source": "Фильтр источника наблюдения.",
        "component": "Сохранённый компонент товара.",
        "at": "Момент времени с часовым поясом для восстановления снимка.",
        "snapshot_id": "Точный ID сохранённого снимка из ответа.",
        "media_id": "Идентификатор сохранённого изображения.",
        "event_id": "Идентификатор наблюдаемого события для сравнения.",
        "days": "Число дней окна до/после события.",
        "card_id": "Задача Seller Memory; возьмите реальный UUID.",
        "query": "Запрос для ограниченного поиска рабочего контекста.",
        "max_chars": "Ограничение возвращаемого текста в символах.",
        "skills": "Имена выбранных инструкций из текущего индекса.",
        "confirm": "Явное подтверждение обновления клиента; не разрешение на WB write.",
        "auto_update": "Выбранная политика обновления устройства.",
        "domain": "Рабочий домен: цены, реклама, контент или ответы.",
        "config": "Полная конфигурация по руководству соответствующего домена, без секретов и caller scope.",
        "config_id": "Идентификатор версии конфигурации.",
        "idempotency_key": "Стабильный ключ одной логической операции; при повторе сохраняйте его.",
        "job_id": "Идентификатор задачи очереди из jobs.create/list.",
        "plan_id": "Идентификатор плана из ответа соответствующего метода.",
        "reason": "Причина остановки или изменения состояния.",
        "target_ids": "Для ценового плана — артикулы; для рекламного профиля — кампании.",
        "targets": "Для ценового плана — артикулы; для рекламного профиля — кампании.",
        "service_id": "Провайдер блока отзывов; native реализован, внешние требуют интеграции.",
        "generation": "Шаблон либо подготовленный агентом черновик.",
        "model_ref": "Происхождение агентского черновика, не выбор/вызов модели.",
        "memory_binding": "Ссылки на явно прочитанные правила и задачу магазина.",
        "instructions_ref": "Ссылка на версию правил памяти.",
        "task_ref": "Ссылка на версию бизнес-задачи.",
        "rating_min": "Нижняя граница оценки отзыва.",
        "rating_max": "Верхняя граница оценки отзыва.",
        "excluded_terms": "Согласованные исключаемые выражения.",
        "escalation_terms": "Дополнительные темы передачи человеку.",
        "response_text": "Текст шаблона или конкретного черновика.",
        "drafts": "Массив точных черновиков по ID и хешу источника.",
        "review_id": "ID конкретного отзыва из прочитанных данных.",
        "source_text_sha256": "SHA-256 UTF-8 адаптированного текста отзыва.",
        "evidence_refs": "Непустые ссылки на основания и происхождение.",
        "max_items": "Максимальное число случаев за расчёт.",
        "policy": "Структурированные условия поручения; не исполнимая произвольная программа.",
        "schema_version": "Версия формата условий.",
        "algorithm_id": "Выбранный поддержанный алгоритм.",
        "mode": "Режим работы в пределах разрешённых возможностей.",
        "objective": "Описание ожидаемого бизнес-результата.",
        "trigger": "Условие запуска по контракту шаблона.",
        "guardrails": "Ограничения действий, не отменяющие системные пределы.",
        "domain_settings": "Настройки выбранного домена по его контракту.",
        "plan_sha256": "Контрольная сумма точного зарегистрированного плана.",
        "capability": "Зарегистрированная возможность, для которой подготовлен план.",
        "artifact_ref": "Приватная ссылка на артефакт плана, не произвольный URL хранилища.",
        "effect_ceiling": "Предельный эффект плана; не включает исполнение.",
        "expires_at": "Срок действия с часовым поясом."
      }
    },
    "data_readiness_guidance": {
      "status": "read-only-guidance",
      "owner": "x-mp-account",
      "placement": "existing WB today/results pages",
      "effect": "read_only",
      "contract": "Show source freshness separately from period completeness; offer a next action; GET refresh checks stored data and does not trigger collection.",
      "evidence_ref": "operations/platform/client-data-readiness-20260928/"
    },
    "weekly_summary": {
      "owner": "x-mp-account",
      "status": "read-only-observations",
      "platform": "wildberries",
      "placement": "existing today/results pages",
      "owner_route": "GET /cabinet/api/marketplace-accounts/{account_id}/workspace/weekly-summary",
      "parameters": {
        "end_date": "optional completed Moscow date in the last year; exactly 14 days ending on this date"
      },
      "effects": "read_only",
      "access": "authenticated effective store membership; existing account-bound connector; no caller-selected tenant or data scope",
      "methodology": "weekly-observations/1",
      "source": "registered product_performance day aggregates; top five observed ordered GMV products; registered readiness",
      "comparison_gate": "7 numeric, evidenced days per metric in each week and fresh source; otherwise no difference or percent. Even passed comparisons remain provisional observations; period completeness unverified.",
      "artifact": "Same snapshot downloadable as private ZIP: self-contained index.html, report.json, metrics.csv, daily.csv, products.csv and checksum manifest.json",
      "docs": "docs/project/weekly-summary.md"
    },
    "simple_onboarding": {
      "status": "active",
      "owner": "deploy/x-mp-account/app/simple_setup.py",
      "contract": "docs/simple-store-onboarding.md",
      "steps": [
        "submit_read_key",
        "verify_store",
        "prepare_data",
        "connect_agent"
      ],
      "routes": [
        "/cabinet/api/wildberries/connect",
        "/cabinet/accounts/{account_id}/setup",
        "/cabinet/api/marketplace-accounts/{account_id}/setup/retry",
        "/cabinet/api/marketplace-accounts/{account_id}/setup/agent"
      ],
      "acceptance": "Published UI/automatic dispatch, existing-store12 activation gates and first report verified. Data-owned X-Client-Secret required. Model session and complete history are separate checks.",
      "source_auth": {
        "owner": "tools/store_onboarding/service_auth.py",
        "seller_token_types": [
          "base",
          "service_for_xmp"
        ],
        "service_secret_ref": "main-node-service-secret://wildberries/xmp",
        "required_header": "X-Client-Secret",
        "unsigned_fallback": false,
        "personal_or_foreign_service_tokens": "rejected",
        "secret_values_in_account_or_client": false
      }
    }
  },
  "ozon_operations": {
    "schema_version": 1,
    "implementation_state": "in-progress",
    "owner": "marketplace-platform",
    "transport_owner": "marketplace-data-platform",
    "domains": [
      "repricer",
      "communications",
      "bidder",
      "cards"
    ],
    "execution_contract": [
      "server-observed precondition",
      "immutable account-bound plan digest",
      "single-use exact owner approval",
      "persist dispatch before external request",
      "unknown response never automatically resent",
      "account-scoped readback and pending-target lock"
    ],
    "scheduler_contract": "Shared operation runtime; immutable compiled definition with verified Seller Memory revision; disabled by default; scheduled planning does not approve marketplace writes.",
    "monitoring": {
      "state": "planned",
      "implementation_authorized": false,
      "design": "docs/project/ozon-production.md"
    },
    "routes": {
      "status": "/cabinet/api/agent/ozon/connectors/status",
      "operations": "/cabinet/api/agent/ozon/operations/{action}",
      "configuration": "/cabinet/api/agent/ozon/config/{action}",
      "schedule": "/cabinet/api/agent/ozon/schedule/{action}",
      "owner_review": "/cabinet/ozon/operations/{account_id}/{plan_id}",
      "owner_execute": "/cabinet/api/ozon/accounts/{account_id}/operations/{action}",
      "stop": "/cabinet/api/agent/ozon/control/stop"
    },
    "payment_types": [
      "cpc",
      "cpo"
    ],
    "performance_execution": "offline-implemented-live-validation-deferred",
    "client_candidate": {
      "version": "0.6.2",
      "tools": 41,
      "state": "published and owner canary verified 2026-09-23",
      "public_manifest": "/docs/ozon/downloads/release.json",
      "skills": 8,
      "connection_check": "installer doctor; read-only account/data/memory/config verification"
    },
    "runtime_marketplace_guard": "Ozon cells execute only compiled Ozon jobs; legacy WB controllers are rejected.",
    "api_sources": "marketplace-data-platform/config/ozon/api_sources.json",
    "performance_limits": [
      "CPC TARGET_BIDS only; explicit keyword-reset acknowledgement; API-native bid units",
      "CPO per-SKU deprecated method requires acknowledgement; active existing products only",
      "CPO all-products mutation unavailable: no independent readback in supplied snapshot",
      "Retail reference inventoried; no supply operations activated"
    ],
    "completion_rollout": {
      "state": "in-progress",
      "memory_scope": "tenant-<workspace_uuid>/ozon-<account_uuid>",
      "runtime": "shared-account-cell",
      "marketplace_effects": "exact-approval-only",
      "monitoring": "design-only"
    },
    "shared_memory_tools": [
      "tasks.search",
      "tasks.resume",
      "artifacts.list",
      "artifacts.get",
      "artifacts.content",
      "memory.context",
      "tasks.checkpoint",
      "tasks.record",
      "tasks.close"
    ],
    "tool_grants": {
      "ozon.status": "analytics.read",
      "ozon.datasets": "analytics.read",
      "ozon.schema": "analytics.read",
      "ozon.records": "analytics.read",
      "ozon.finance": "analytics.read",
      "ozon.product": "analytics.read",
      "ozon.advertising": "analytics.read",
      "ozon.forecast": "analytics.read",
      "ozon.plan.get": "operations.read",
      "ozon.plans.list": "operations.read",
      "ozon.connectors.status": "analytics.read",
      "ozon.config.get": "operations.read",
      "ozon.config.compile": "operations.plan",
      "ozon.schedule.get": "operations.read",
      "ozon.schedule.set": "operations.plan",
      "ozon.operation.prepare": "operations.plan",
      "ozon.operation.get": "operations.read",
      "ozon.operation.execute": "operations.execute",
      "ozon.operation.reconcile": "operations.read",
      "ozon.schedule.run": "operations.plan",
      "ozon.emergency_stop": "operations.plan",
      "ozon.repricer.plan": "operations.plan",
      "ozon.communications.plan": "operations.plan",
      "ozon.bidder.plan": "operations.plan",
      "ozon.cards.plan": "operations.plan"
    },
    "readiness_contract": "Report executor activation separately from live validation. No domain is execution-ready without verified domain live evidence; catalog availability only advertises authorized API methods."
  },
  "advertising_task_setup": {
    "version": 1,
    "state": "production-finite-tasks-owner-opt-in",
    "marketplace_write": true,
    "owner_routes": {
      "readiness": "GET /cabinet/api/marketplace-accounts/{marketplace_account_id}/advertising/tasks/readiness",
      "baseline": "GET /cabinet/api/marketplace-accounts/{marketplace_account_id}/workspace/advertising-baseline",
      "preview": "POST /cabinet/api/marketplace-accounts/{marketplace_account_id}/advertising/tasks/preview",
      "review": "GET /cabinet/advertising/tasks/{marketplace_account_id}/{task_id}",
      "approve": "POST /cabinet/api/marketplace-accounts/{marketplace_account_id}/advertising/tasks/{task_id}/approve",
      "pause": "POST /cabinet/api/marketplace-accounts/{marketplace_account_id}/advertising/tasks/{task_id}/pause",
      "list": "GET /cabinet/api/marketplace-accounts/{marketplace_account_id}/advertising/tasks"
    },
    "credential_role": "promotion",
    "required_access": "read_write",
    "available_actions": [
      "deposit",
      "start",
      "pause",
      "set_bid"
    ],
    "execution_state": "owner-approved-finite-tasks",
    "owner_confirmation_required": true,
    "scheduler_state": "shared-runtime",
    "future_task_examples": [
      "advertising_bid_change",
      "advertising_bid_limit",
      "fbs_stock_threshold"
    ],
    "docs": "/cabinet/static/xmp-advertising-tasks.md",
    "agent_routes": {
      "readiness": "POST /cabinet/api/agent/advertising/tasks/readiness",
      "baseline": "POST /cabinet/api/agent/advertising/tasks/baseline",
      "preview": "POST /cabinet/api/agent/advertising/tasks/preview",
      "create": "POST /cabinet/api/agent/advertising/tasks/create",
      "list": "POST /cabinet/api/agent/advertising/tasks/list",
      "get": "POST /cabinet/api/agent/advertising/tasks/get",
      "pause": "POST /cabinet/api/agent/advertising/tasks/pause"
    },
    "activation": "exact-owner-confirmation",
    "internal_routes": [
      "POST /internal/v1/advertising/tasks/due",
      "POST /internal/v1/advertising/tasks/execute"
    ],
    "client_secret_binding": "Server-owned account UUID map to existing protected Data service-secret ref; no agent-supplied scope or secret"
  },
  "wb_feedback_exact": {
    "state": "deployed-disabled",
    "owner": "marketplace-platform",
    "transport_owner": "marketplace-data-platform",
    "capability": "communication.send_replies",
    "credential_role": "feedbacks_questions",
    "activation": "WB_FEEDBACK_EXACT_ENABLED=1 and server-side WB_FEEDBACK_CANARY_ACCOUNT_ID allowlist only after reviewed migration, client/account canary and owner-approved exact plan",
    "agent_route": "POST /cabinet/api/agent/wb/feedback/operations/{action}",
    "owner_review_route": "GET /cabinet/api/marketplace-accounts/{account_id}/wb/feedback/operations/{plan_id}",
    "owner_approval_route": "POST /cabinet/api/marketplace-accounts/{marketplace_account_id}/operations/plans/{plan_id}/approve",
    "actions": {
      "prepare": "operations.plan",
      "get": "operations.read",
      "execute": "operations.execute",
      "reconcile": "operations.read"
    },
    "effect": "One exact reply after single-use owner approval; POST is never automatically retried; publication requires registered GET readback.",
    "publication_state": "unverified-until-readback"
  }
}
