{
    "version": "cmx-medgen-public-contract-v1",
    "updated_at": "2026-05-23",
    "canonical_contract_url": "https://cmx-medgen-contract.pages.dev/contract.md",
    "canonical_registry_url": "https://cmx-medgen-contract.pages.dev/page-format-registry.json",
    "response_mode": "cmx_page_skeleton_response",
    "primary_response_path": "result.cmx_page",
    "fallback_response_path": "article.body",
    "contract_markdown": "# MedGen Page Skeleton Contract For CMX\n\n## Permanent Public Source\n\nMedGen should read the current CMX contract before each generation task:\n\n- Human/markdown contract: `https://cmx-medgen-contract.pages.dev/contract.md`\n- Machine-readable page format registry: `https://cmx-medgen-contract.pages.dev/page-format-registry.json`\n- Public landing page: `https://cmx-medgen-contract.pages.dev/`\n\nIf CMX adds a new page, edits an existing page module structure, changes accepted HTML, or changes a page-specific response format, the public contract and registry above must be updated before MedGen is asked to generate that page.\n\n## Purpose\n\nThis is the default instruction CMX sends to MedGen for generated sites.\n\nCMX generates the site skeleton: routes, page types, module order, global header/footer, CSS spacing, schema, canonical URLs, preview, approval and deploy gates.\n\nMedGen fills that skeleton. It must not return only plain text. It should return a ready CMX page response where headings, paragraphs, lists, FAQ, CTA labels, image suggestions, alt text, sources and relations are already placed into the approved page/module structure.\n\nCMX then validates the response, mounts allowed fragments into CMS JSON, builds preview, asks for approval and deploys.\n\n## Important Boundary\n\nMedGen returns internal page/module markup, not a full website document.\n\nAllowed:\n\n- localized `h1`, `h2`, `h3`, paragraphs, lists, FAQ and table fragments;\n- module props with generated text;\n- `html` strings for approved body slots;\n- image suggestions and image alt text;\n- anchors only when CMX provided or requested a route/relation.\n\nNot part of the MedGen response:\n\n- `<!doctype>`, `<html>`, `<head>`, `<body>`;\n- global site header/footer;\n- CSS, JS, inline styles or event attributes;\n- forms, inputs, scripts, iframes or deployment code;\n- Cloudflare/GitHub/VPS settings.\n\nSpacing, visual rhythm and responsive layout are owned by CMX CSS. MedGen may return the approved structural tags; CMX applies the final visual spacing.\n\n## Canonical Response Shape\n\nPreferred response path:\n\n```text\nresult.cmx_page\n```\n\nBackward-compatible fallback:\n\n```text\narticle.body\n```\n\nExpected JSON:\n\n```json\n{\n  \"article\": {\n    \"title\": \"Localized page title\",\n    \"h1\": \"Localized H1\",\n    \"seo_title\": \"Localized SEO title\",\n    \"seo_description\": \"Localized SEO description\",\n    \"body\": \"<section><h2>Fallback section</h2><p>Fallback HTML fragment.</p></section>\",\n    \"blocks\": [],\n    \"metadata\": {}\n  },\n  \"result\": {\n    \"cmx_page\": {\n      \"version\": \"cmx-page-skeleton-v1\",\n      \"content_type\": \"technical_page\",\n      \"route\": \"/editorial-policy/\",\n      \"locale\": \"bg_BG\",\n      \"seo\": {\n        \"title\": \"Localized SEO title\",\n        \"description\": \"Localized SEO description\"\n      },\n      \"modules\": [\n        {\n          \"type\": \"page_header\",\n          \"props\": {\n            \"h1\": \"Generated H1\",\n            \"lead\": \"Generated lead paragraph.\"\n          }\n        },\n        {\n          \"type\": \"rich_text\",\n          \"props\": {\n            \"html\": \"<section><h2>Generated H2</h2><p>Generated paragraph.</p><ul><li>Generated list item.</li></ul></section>\"\n          }\n        }\n      ],\n      \"faq\": [],\n      \"media\": [],\n      \"relations\": {}\n    },\n    \"fields\": {},\n    \"sections\": [],\n    \"faq\": [],\n    \"media\": [],\n    \"relations\": {}\n  }\n}\n```\n\n## Shared Site Rules\n\n- Each public site has one root locale. For `bg_BG`, Bulgarian content lives at `/`, not `/bg/`.\n- CMX provides the route, content path, content type and available relations.\n- MedGen fills only the requested page target.\n- Index pages summarize collections; individual products, reviews, guides and experts are generated by separate tasks.\n- If a product review references a new expert/reviewer, MedGen should return enough expert data to create or update that expert page.\n- Page-specific rules live in `page-format-registry.json`. The registry is more precise than this prose document when there is a conflict.\n\n## Home Page Skeleton\n\nCMX route: `/`\nCMX path: `content/pages/home.json`\nCMX content type: `home_page`\n\nRequired modules:\n\n```json\n{\n  \"type\": \"home_page\",\n  \"modules\": [\n    {\n      \"type\": \"home_hero\",\n      \"props\": {\n        \"brand_slogan\": \"{{unique localized slogan}}\",\n        \"h1\": \"{{homepage H1}}\",\n        \"lead\": \"{{homepage lead}}\",\n        \"image\": \"{{hero image suggestion}}\",\n        \"image_alt\": \"{{hero image alt}}\"\n      }\n    },\n    {\n      \"type\": \"trust_cards\",\n      \"props\": {\n        \"items\": [\n          {\n            \"title\": \"{{trust card heading}}\",\n            \"body\": \"{{trust card text}}\"\n          }\n        ]\n      }\n    },\n    {\n      \"type\": \"homepage_sections\",\n      \"props\": {\n        \"catalog_heading\": \"{{catalog widget heading}}\",\n        \"reviews_heading\": \"{{reviews widget heading}}\",\n        \"experts_heading\": \"{{experts widget heading}}\",\n        \"methodology_heading\": \"{{methodology widget heading}}\"\n      }\n    }\n  ]\n}\n```\n\nMedGen generates the slogan, H1, lead, widget headings, image suggestion, FAQ and SEO fields. CMX renders the final cards, carousels and links.\n\n## Technical Page Skeleton\n\nRoutes:\n\n```text\n/about/\n/methodology/\n/editorial-policy/\n/sources/\n/affiliate-disclosure/\n/contact/\n/faq/\n/how-to-use/\n/suggest-supplement/\n/disclaimer/\n/privacy-policy/\n/terms/\n/cookie-policy/\n```\n\nCMX content type: `technical_page`\n\nExample response for a technical page:\n\n```json\n{\n  \"result\": {\n    \"cmx_page\": {\n      \"version\": \"cmx-page-skeleton-v1\",\n      \"content_type\": \"technical_page\",\n      \"route\": \"/affiliate-disclosure/\",\n      \"locale\": \"bg_BG\",\n      \"seo\": {\n        \"title\": \"{{localized SEO title}}\",\n        \"description\": \"{{localized SEO description}}\"\n      },\n      \"modules\": [\n        {\n          \"type\": \"page_header\",\n          \"props\": {\n            \"h1\": \"{{page H1}}\",\n            \"lead\": \"{{short page intro}}\"\n          }\n        },\n        {\n          \"type\": \"rich_text\",\n          \"props\": {\n            \"html\": \"<section><h2>{{section heading}}</h2><p>{{paragraph}}</p><p>{{paragraph}}</p></section><section><h2>{{section heading}}</h2><ul><li>{{list item}}</li><li>{{list item}}</li></ul></section>\"\n          }\n        },\n        {\n          \"type\": \"related_pages\",\n          \"props\": {\n            \"items\": [\n              {\n                \"route\": \"/editorial-policy/\",\n                \"label\": \"{{localized anchor label}}\"\n              }\n            ]\n          }\n        }\n      ],\n      \"faq\": [\n        {\n          \"question\": \"{{FAQ question}}\",\n          \"answer_html\": \"<p>{{FAQ answer}}</p>\"\n        }\n      ]\n    }\n  }\n}\n```\n\nFor `/contact/`, MedGen fills the upper text modules only. CMX keeps the contact form module below the MedGen content.\n\n## Product Card Skeleton\n\nAdmin first provides product basics: product name, brand, product image, price, offer URL, currency, route and locale.\n\nCMX route: `/bady/{product_slug}/`\nCMX path: `content/pages/supplements/{product_slug}.json`\nCMX content type: `product_card`\n\nExample response:\n\n```json\n{\n  \"result\": {\n    \"cmx_page\": {\n      \"version\": \"cmx-page-skeleton-v1\",\n      \"content_type\": \"product_card\",\n      \"route\": \"/bady/{product_slug}/\",\n      \"locale\": \"bg_BG\",\n      \"seo\": {\n        \"title\": \"{{product SEO title}}\",\n        \"description\": \"{{product SEO description}}\"\n      },\n      \"modules\": [\n        {\n          \"type\": \"product_hero\",\n          \"props\": {\n            \"name\": \"{{product name}}\",\n            \"brand\": \"{{product brand}}\",\n            \"summary_html\": \"<p>{{short product summary}}</p>\",\n            \"image\": \"{{product image URL or suggestion}}\",\n            \"image_alt\": \"{{product image alt}}\",\n            \"price_label\": \"{{localized price label}}\",\n            \"seller_label\": \"{{localized buy button label}}\"\n          }\n        },\n        {\n          \"type\": \"product_details\",\n          \"props\": {\n            \"html\": \"<section><h2>{{details heading}}</h2><p>{{long product description}}</p><dl><dt>{{fact label}}</dt><dd>{{fact value}}</dd></dl></section>\"\n          }\n        },\n        {\n          \"type\": \"product_notes\",\n          \"props\": {\n            \"safety_note_html\": \"<p>{{safety note}}</p>\",\n            \"affiliate_note_html\": \"<p>{{affiliate note}}</p>\",\n            \"review_cta_label\": \"{{localized review CTA}}\",\n            \"review_route\": \"/obzory/{product_slug}-review/\"\n          }\n        }\n      ]\n    }\n  }\n}\n```\n\n## Product Review Skeleton\n\nProduct review should be generated after the product card exists, because it needs the product route, product context and image.\n\nCMX route: `/obzory/{product_slug}-review/`\nCMX path: `content/pages/technical/{product_slug}-review.json`\nCMX content type: `product_review`\n\nExample response:\n\n```json\n{\n  \"result\": {\n    \"cmx_page\": {\n      \"version\": \"cmx-page-skeleton-v1\",\n      \"content_type\": \"product_review\",\n      \"route\": \"/obzory/{product_slug}-review/\",\n      \"locale\": \"bg_BG\",\n      \"seo\": {\n        \"title\": \"{{review SEO title}}\",\n        \"description\": \"{{review SEO description}}\"\n      },\n      \"modules\": [\n        {\n          \"type\": \"review_header\",\n          \"props\": {\n            \"h1\": \"{{review H1}}\",\n            \"lead\": \"{{review lead}}\",\n            \"summary_html\": \"<p>{{review summary}}</p>\",\n            \"hero_image\": \"{{review hero image suggestion}}\",\n            \"hero_image_alt\": \"{{review hero image alt}}\"\n          }\n        },\n        {\n          \"type\": \"review_verdict\",\n          \"props\": {\n            \"rating\": \"{{rating}}\",\n            \"verdict_html\": \"<p>{{verdict}}</p>\",\n            \"pros\": [\"{{pro}}\"],\n            \"cons\": [\"{{con}}\"]\n          }\n        },\n        {\n          \"type\": \"review_body\",\n          \"props\": {\n            \"html\": \"<section><h2>{{section heading}}</h2><p>{{section body}}</p></section><section><h2>{{section heading}}</h2><ul><li>{{list item}}</li></ul></section>\"\n          }\n        },\n        {\n          \"type\": \"review_relations\",\n          \"props\": {\n            \"product_route\": \"/bady/{product_slug}/\",\n            \"product_anchor_label\": \"{{localized product anchor}}\",\n            \"expert_route\": \"/experts/{expert_slug}/\",\n            \"expert_anchor_label\": \"{{localized expert anchor}}\"\n          }\n        }\n      ],\n      \"faq\": [\n        {\n          \"question\": \"{{FAQ question}}\",\n          \"answer_html\": \"<p>{{FAQ answer}}</p>\"\n        }\n      ],\n      \"sources\": []\n    }\n  }\n}\n```\n\n## Expert / Reviewer Skeleton\n\nExpert profile can be generated after a review task if the review references a new reviewer.\n\nCMX route: `/experts/{expert_slug}/`\nCMX path: `content/pages/authors/{expert_slug}.json`\nCMX content type: `expert_profile`\n\nExample response:\n\n```json\n{\n  \"result\": {\n    \"cmx_page\": {\n      \"version\": \"cmx-page-skeleton-v1\",\n      \"content_type\": \"expert_profile\",\n      \"route\": \"/experts/{expert_slug}/\",\n      \"locale\": \"bg_BG\",\n      \"seo\": {\n        \"title\": \"{{expert SEO title}}\",\n        \"description\": \"{{expert SEO description}}\"\n      },\n      \"modules\": [\n        {\n          \"type\": \"author_header\",\n          \"props\": {\n            \"name\": \"{{expert name}}\",\n            \"role\": \"{{expert role}}\",\n            \"bio_html\": \"<p>{{short bio}}</p>\",\n            \"portrait_image\": \"{{portrait image suggestion}}\",\n            \"portrait_image_alt\": \"{{portrait alt}}\"\n          }\n        },\n        {\n          \"type\": \"author_body\",\n          \"props\": {\n            \"html\": \"<section><h2>{{qualification heading}}</h2><p>{{full bio}}</p></section><section><h2>{{reviewed materials heading}}</h2><ul><li>{{review reference}}</li></ul></section>\"\n          }\n        },\n        {\n          \"type\": \"author_disclosure\",\n          \"props\": {\n            \"html\": \"<p>{{disclosure text}}</p>\"\n          }\n        }\n      ],\n      \"relations\": {\n        \"reviews_route\": \"/obzory/\",\n        \"same_as_links\": []\n      }\n    }\n  }\n}\n```\n\n## Guide Article Skeleton\n\nCMX route: `/guides/{guide_slug}/`\nCMX path: `content/pages/technical/{guide_slug}.json`\nCMX content type: `guide_article`\n\nExample response:\n\n```json\n{\n  \"result\": {\n    \"cmx_page\": {\n      \"version\": \"cmx-page-skeleton-v1\",\n      \"content_type\": \"guide_article\",\n      \"route\": \"/guides/{guide_slug}/\",\n      \"locale\": \"bg_BG\",\n      \"seo\": {\n        \"title\": \"{{guide SEO title}}\",\n        \"description\": \"{{guide SEO description}}\"\n      },\n      \"modules\": [\n        {\n          \"type\": \"article_header\",\n          \"props\": {\n            \"h1\": \"{{guide H1}}\",\n            \"lead\": \"{{guide lead}}\"\n          }\n        },\n        {\n          \"type\": \"article_body\",\n          \"props\": {\n            \"html\": \"<section><h2>{{section heading}}</h2><p>{{section body}}</p></section>\"\n          }\n        }\n      ],\n      \"faq\": []\n    }\n  }\n}\n```\n\n## Index Page Skeleton\n\nIndex pages receive intro SEO content and widget copy, not full product/review/expert content.\n\nSupported index targets:\n\n- `/bady/`\n- `/obzory/`\n- `/experts/`\n- `/guides/`\n- `/popular-products/`\n- `/sravneniya/`\n- `/brands/`\n- `/vitamins-minerals/`\n\nRequired slots:\n\n- `h1`;\n- `lead`;\n- `intro_html`;\n- `widget_headings`;\n- `empty_state_text`;\n- `faq`;\n- `seo`.\n\n## Pipeline Order\n\n1. Admin creates or selects a site.\n2. CMX generates route skeleton, theme and unique visual system.\n3. For products, admin enters product basics first.\n4. MedGen fills product card skeleton.\n5. MedGen fills review skeleton using product route and context.\n6. MedGen fills reviewer/expert skeleton if needed.\n7. MedGen can fill technical/index/guide skeletons independently.\n8. CMX validates returned modules and allowed HTML.\n9. CMX builds preview.\n10. Operator approves.\n11. CMX deploys.\n",
    "scope_markdown": "# MedGen Content Scope And Response Contract For CMX Admin\n\n## 1. Назначение документа\n\nЭтот документ описывает, с какими страницами сайта должен работать MedGen, какой контент он должен генерировать и в каком JSON-формате CMX Admin ожидает ответ.\n\nАктуальное публичное ТЗ для MedGen: `https://cmx-medgen-contract.pages.dev/contract.md`. Машинно-читаемые правила по каждой странице: `https://cmx-medgen-contract.pages.dev/page-format-registry.json`. Их смысл: CMX владеет маршрутом, типом страницы, набором модулей, глобальным шаблоном и CSS; MedGen возвращает уже заполненный `result.cmx_page` с готовыми module props и разрешенной внутренней HTML-разметкой для заранее известных слотов. То есть MedGen не присылает \"просто текст\"; он присылает контент, уже разложенный по CMX skeleton.\n\nПроектное правило синхронизации: если в CMX появляется новая страница, меняется существующая страница, меняется порядок модулей или допустимая разметка, сначала обновляется публичный contract project на том же `cmx-medgen-contract.pages.dev`. Только после этого можно создавать MedGen task для новой/измененной страницы.\n\nMedGen не управляет дизайном, сервером, SSL, деплоем, favicon, логотипом, CSS/JS, обфускацией и GitHub Actions. MedGen отвечает только за контент:\n\n- SEO-тексты;\n- технические страницы;\n- карточки товаров;\n- обзоры товаров;\n- страницы экспертов/докторов;\n- guide-статьи;\n- заголовки, описания, FAQ, источники, предупреждения, микроразметочные данные.\n\nMedGen является внешним независимым микросервисом и не связан с OpenAI аккаунтом владельца CMX. CMX ожидает от него только структурированные ответы по контракту ниже; секрет доступа к MedGen хранится отдельно как `MEDGEN_API_TOKEN` в GitHub Secrets и не передается в публичную админку.\n\nCMX Admin отвечает за:\n\n- выбор активного сайта;\n- маршруты;\n- slug;\n- публикацию JSON;\n- SEO-аудит;\n- сборку статического сайта;\n- деплой на VPS.\n\n## 1.1 Актуальная транспортная оговорка\n\nЭтот документ описывает CMX-side content scope и локальные content types. Текущий публичный MedGen API принимает только `type: \"content_page\" | \"tech_page\" | \"author\" | \"placeholder\"`. Локальные CMX типы вроде `product_review`, `product_card`, `expert_profile`, `technical_page` и `guide_article` не отправляются как top-level `type`; workflow нормализует их в официальный MedGen `type`, а локальный режим кладет в `extra.cmx_content_type`.\n\nПубличный успешный ответ MedGen содержит финальный `article`; `cms_payload` не является обязательным полем текущего API. Новый предпочтительный CMX-формат находится в `result.cmx_page`: это заполненный page skeleton с `version`, `content_type`, `route`, `seo`, `modules`, `faq`, `media` и `relations`. CMX использует `article.body`, `article.html`, `article.text`, `article.metadata`, `article.seo_title` и `article.seo_description` как fallback/SEO-поля, если MedGen еще не вернул полный `result.cmx_page`. После preview и подтверждения CMX запускает validation/build/SEO/assets audit.\n\n## 2. Общая логика сайта\n\nКаждый сайт генерируется под один GEO и один язык в корне домена.\n\nПример для Болгарии:\n\n```json\n{\n  \"root_locale\": \"bg_BG\",\n  \"geo\": \"BG\",\n  \"locale_strategy\": \"single_root\"\n}\n```\n\nПравильные URL:\n\n```text\nhttps://example.com/\nhttps://example.com/bady/omega-balance-softgels/\nhttps://example.com/obzory/omega-balance-softgels-review/\nhttps://example.com/experts/dr-demo-reviewer/\n```\n\nНеправильные URL:\n\n```text\nhttps://example.com/bg/\nhttps://example.com/en/\nhttps://example.com/ru/\n```\n\nMedGen должен возвращать контент на языке `root_locale`. Если `root_locale=bg_BG`, все публичные тексты должны быть на болгарском.\n\n## 3. С какими страницами работает MedGen\n\n### 3.1 Главная страница\n\nMedGen генерирует контент для:\n\n```text\nroute: /\ncontent_path: content/pages/home.json\ncontent_type: home_page\n```\n\nНужные поля:\n\n- `h1`;\n- `hero_lead`;\n- `search_placeholder`;\n- `trust_cards`;\n- `popular_categories_intro`;\n- `product_carousel_heading`;\n- `reviews_heading`;\n- `experts_heading`;\n- `faq`;\n- `footer_disclaimer`;\n- `seo`.\n\n### 3.2 Технические страницы\n\nMedGen должен уметь генерировать следующие технические страницы:\n\n| page_key | route | content_path | Назначение |\n|---|---|---|---|\n| `about` | `/about/` | `content/pages/technical/about.json` | О проекте |\n| `methodology` | `/methodology/` | `content/pages/technical/methodology.json` | Методология оценки |\n| `editorial_policy` | `/editorial-policy/` | `content/pages/technical/editorial-policy.json` | Редакционная политика |\n| `information_sources` | `/sources/` | `content/pages/technical/sources.json` | Источники информации |\n| `affiliate_disclosure` | `/affiliate-disclosure/` | `content/pages/technical/affiliate-disclosure.json` | Партнерское раскрытие |\n| `contact` | `/contact/` | `content/pages/technical/contact.json` | Контакты |\n| `faq` | `/faq/` | `content/pages/technical/faq.json` | FAQ |\n| `how_to_use` | `/how-to-use/` | `content/pages/technical/how-to-use.json` | Как пользоваться сайтом |\n| `suggest_supplement` | `/suggest-supplement/` | `content/pages/technical/suggest-supplement.json` | Предложить добавку |\n| `disclaimer` | `/disclaimer/` | `content/pages/technical/disclaimer.json` | Дисклеймер |\n| `privacy_policy` | `/privacy-policy/` | `content/pages/technical/privacy-policy.json` | Политика конфиденциальности |\n| `terms_of_use` | `/terms/` | `content/pages/technical/terms.json` | Условия использования |\n| `cookie_policy` | `/cookie-policy/` | `content/pages/technical/cookie-policy.json` | Cookie Policy |\n| `product_picker` | `/podbor/` | `content/pages/technical/podbor.json` | Подбор продукта |\n\nMedGen не должен генерировать визуальную страницу `/sitemap/`. Sitemap должен быть системным SEO-артефактом, который CMX строит автоматически.\n\n### 3.3 Индексные страницы\n\nMedGen должен уметь генерировать вводный SEO-контент для индексных страниц:\n\n| page_key | route | content_path | Назначение |\n|---|---|---|---|\n| `catalog` | `/bady/` | `content/pages/categories/bady.json` | Каталог товаров/БАДов |\n| `reviews_index` | `/obzory/` | `content/pages/categories/obzory.json` | Список обзоров |\n| `experts_index` | `/experts/` | `content/pages/authors/experts.json` | Список экспертов |\n| `guides_index` | `/guides/` | `content/pages/categories/guides.json` | Гайды и статьи |\n| `popular_products` | `/popular-products/` | `content/pages/categories/popular-products.json` | Популярные товары |\n| `comparisons` | `/sravneniya/` | `content/pages/categories/sravneniya.json` | Сравнения |\n| `brands` | `/brands/` | `content/pages/categories/brands.json` | Бренды |\n| `vitamins_minerals` | `/vitamins-minerals/` | `content/pages/categories/vitamins-minerals.json` | Витамины и минералы |\n\nИндексные страницы не должны содержать полный товарный или авторский контент. Они получают:\n\n- SEO title/description;\n- H1;\n- lead;\n- intro sections;\n- FAQ;\n- короткие подписи к блокам;\n- тексты для виджетов.\n\nСами товары, обзоры, эксперты и гайды генерируются отдельными задачами.\n\n### 3.4 Карточки товаров\n\nMedGen генерирует карточки товаров по шаблону:\n\n```text\nroute: /bady/{product_slug}/\ncontent_path: content/pages/supplements/{product_slug}.json\ncontent_type: product_card\n```\n\nПример:\n\n```text\n/bady/omega-balance-softgels/\ncontent/pages/supplements/omega-balance-softgels.json\n```\n\nНужные поля:\n\n- название товара;\n- бренд;\n- короткое описание;\n- длинное описание;\n- рейтинг;\n- цена в валюте текущего GEO;\n- availability: всегда `Available`, если оператор не передал другое;\n- offer URL;\n- Buy button label;\n- gallery images или image suggestions;\n- alt для всех изображений;\n- reviewer/expert reference, если есть обзор;\n- safety note;\n- affiliate note;\n- SEO;\n- Product JSON-LD hints.\n\n### 3.5 Обзоры товаров\n\nMedGen генерирует обзор товара по шаблону:\n\n```text\nroute: /obzory/{product_slug}-review/\ncontent_path: content/pages/technical/{product_slug}-review.json\ncontent_type: product_review\n```\n\nПример:\n\n```text\n/obzory/omega-balance-softgels-review/\ncontent/pages/technical/omega-balance-softgels-review.json\n```\n\nОбзор должен быть связан с:\n\n- товаром: `/bady/{product_slug}/`;\n- экспертом/доктором: `/experts/{expert_slug}/`;\n- индексом обзоров: `/obzory/`.\n\nНужные поля:\n\n- H1;\n- lead;\n- full review text;\n- review summary;\n- reviewer;\n- updated date;\n- verdict;\n- rating;\n- pros;\n- cons;\n- safety notes;\n- sources;\n- FAQ;\n- related product route;\n- author/expert route;\n- SEO;\n- Article/Review JSON-LD hints.\n\n### 3.6 Эксперты/доктора\n\nMedGen генерирует страницы экспертов по шаблону:\n\n```text\nroute: /experts/{expert_slug}/\ncontent_path: content/pages/authors/{expert_slug}.json\ncontent_type: expert_profile\n```\n\nПример:\n\n```text\n/experts/dr-demo-reviewer/\ncontent/pages/authors/dr-demo-reviewer.json\n```\n\nНужные поля:\n\n- имя;\n- роль;\n- короткая специализация;\n- bio;\n- portrait image suggestion;\n- image alt;\n- social links;\n- research profile link;\n- doctor profile link;\n- reviews route;\n- список review references;\n- SEO;\n- Person JSON-LD hints.\n\nВажно: если MedGen создает review с новым доктором, он должен вернуть данные для создания/обновления экспертной страницы. Review не должен ссылаться на несуществующего эксперта.\n\n### 3.7 Guide-статьи\n\nMedGen генерирует guide-статьи по шаблону:\n\n```text\nroute: /guides/{guide_slug}/\ncontent_path: content/pages/technical/{guide_slug}.json\ncontent_type: guide_article\n```\n\nПример:\n\n```text\n/guides/how-to-compare-supplement-labels/\ncontent/pages/technical/how-to-compare-supplement-labels.json\n```\n\nНужные поля:\n\n- H1;\n- H2/lead;\n- hero image suggestion;\n- sections;\n- FAQ;\n- sources;\n- related products;\n- SEO;\n- Article JSON-LD hints.\n\n### 3.8 Legacy/optional sections\n\nСледующие разделы могут существовать в старом шаблоне, но не должны генерироваться MedGen по умолчанию:\n\n```text\n/problems/\n/problems/{slug}/\n```\n\nИх использовать только если CMX Admin явно передаст `enabled: true`.\n\n## 4. Универсальный request от CMX к MedGen\n\nCMX отправляет в MedGen один объект задачи:\n\n```json\n{\n  \"request_id\": \"cmx-workerwp-store-20260518-001\",\n  \"type\": \"product_review\",\n  \"site\": {\n    \"site_id\": \"workerwp-store\",\n    \"domain\": \"workerwp.store\",\n    \"base_url\": \"https://workerwp.store\",\n    \"brand_name\": \"NutriScope\",\n    \"root_locale\": \"bg_BG\",\n    \"geo\": \"BG\",\n    \"contact_email\": \"support@workerwp.store\",\n    \"locale_strategy\": \"single_root\"\n  },\n  \"target\": {\n    \"page_key\": \"omega_balance_softgels_review\",\n    \"route\": \"/obzory/omega-balance-softgels-review/\",\n    \"slug\": \"omega-balance-softgels-review\",\n    \"content_path\": \"content/pages/technical/omega-balance-softgels-review.json\"\n  },\n  \"product\": {\n    \"name\": \"Omega Balance Softgels\",\n    \"brand\": \"Demo Brand\",\n    \"slug\": \"omega-balance-softgels\",\n    \"route\": \"/bady/omega-balance-softgels/\",\n    \"price\": \"19.90 USD\",\n    \"offer_url\": \"https://example.com/demo-offer\"\n  },\n  \"expert\": {\n    \"name\": \"Dr Demo Reviewer\",\n    \"slug\": \"dr-demo-reviewer\",\n    \"route\": \"/experts/dr-demo-reviewer/\",\n    \"role\": \"medical reviewer\"\n  },\n  \"content_policy\": {\n    \"ymyl\": true,\n    \"no_medical_promises\": true,\n    \"no_fake_sources\": true,\n    \"fictional_demo_allowed\": true,\n    \"language\": \"Bulgarian\"\n  },\n  \"seo\": {\n    \"canonical\": \"https://workerwp.store/obzory/omega-balance-softgels-review/\",\n    \"robots\": \"index,follow\",\n    \"schema_required\": true\n  },\n  \"notes\": \"Generate cautious supplement review content. Do not claim treatment or diagnosis.\"\n}\n```\n\nЕсли `contact_email` не передан из админки, CMX автоматически подставляет `support@<site.domain>` до создания задачи. CMX также дублирует это значение в `site.contact_email`, `editorial_metadata.contact_email` и `extra.allowed_contact_text`.\n\nMedGen должен использовать email только как plain text контакт. Запрещено превращать его в `mailto:`, HTML anchor или элемент массива `sources`. CMX отправляет защитные флаги `extra.cmx_content_policy.no_mailto_links=true`, `no_email_as_source=true`, `contact_email_plain_text_only=true` и вычищает email-like значения из `sources` перед созданием задачи.\n\n## 5. Универсальный response от MedGen\n\nMedGen должен возвращать стабильный JSON:\n\n```json\n{\n  \"ok\": true,\n  \"task_id\": \"mg_task_123\",\n  \"request_id\": \"cmx-workerwp-store-20260518-001\",\n  \"status\": \"succeeded\",\n  \"content_type\": \"product_review\",\n  \"result\": {\n    \"locale\": \"bg_BG\",\n    \"route\": \"/obzory/omega-balance-softgels-review/\",\n    \"slug\": \"omega-balance-softgels-review\",\n    \"title\": \"Omega Balance Softgels Review\",\n    \"seo\": {\n      \"title\": \"Omega Balance Softgels Review | NutriScope\",\n      \"description\": \"Evidence-aware review of Omega Balance Softgels with pricing, safety notes and reviewer context.\",\n      \"robots\": \"index,follow\",\n      \"open_graph_title\": \"Omega Balance Softgels Review\",\n      \"open_graph_description\": \"Review summary for supplement buyers.\",\n      \"open_graph_image_alt\": \"Omega Balance Softgels product review\"\n    },\n    \"fields\": {},\n    \"sections\": [],\n    \"faq\": [],\n    \"sources\": [],\n    \"media\": [],\n    \"relations\": {},\n    \"schema_hints\": {},\n    \"warnings\": []\n  },\n  \"validation_report\": {\n    \"ok\": true,\n    \"issues\": [],\n    \"warnings\": []\n  }\n}\n```\n\n`fields`, `sections`, `relations` и `schema_hints` зависят от типа страницы.\n\n## 6. Response format by content type\n\n### 6.1 `home_page`\n\n```json\n{\n  \"content_type\": \"home_page\",\n  \"result\": {\n    \"route\": \"/\",\n    \"title\": \"NutriScope\",\n    \"seo\": {\n      \"title\": \"NutriScope | Evidence-first supplement reviews\",\n      \"description\": \"Independent supplement catalog with reviews, expert context and transparent safety notes.\",\n      \"robots\": \"index,follow\"\n    },\n    \"fields\": {\n      \"h1\": \"Supplement reviews that check evidence first\",\n      \"hero_lead\": \"Short value proposition for the site.\",\n      \"search_placeholder\": \"Search supplements, ingredients, brands...\",\n      \"product_carousel_heading\": \"Popular products\",\n      \"reviews_heading\": \"Latest reviews\",\n      \"experts_heading\": \"Expert reviewers\",\n      \"footer_disclaimer\": \"The materials of the site are informative and are not medical recommendations.\"\n    },\n    \"trust_cards\": [\n      {\n        \"title\": \"Authorship\",\n        \"body\": \"Every review shows reviewer attribution.\"\n      }\n    ],\n    \"faq\": [\n      {\n        \"question\": \"Is this medical advice?\",\n        \"answer\": \"No. Content is informational.\"\n      }\n    ]\n  }\n}\n```\n\n### 6.2 `technical_page`\n\n```json\n{\n  \"content_type\": \"technical_page\",\n  \"result\": {\n    \"route\": \"/privacy-policy/\",\n    \"title\": \"Privacy Policy\",\n    \"seo\": {\n      \"title\": \"Privacy Policy | NutriScope\",\n      \"description\": \"How the site handles privacy, cookies and user requests.\",\n      \"robots\": \"index,follow\"\n    },\n    \"fields\": {\n      \"h1\": \"Privacy Policy\",\n      \"lead\": \"Short page lead.\",\n      \"updated_label\": \"Last updated\"\n    },\n    \"sections\": [\n      {\n        \"h2\": \"What information we handle\",\n        \"body\": \"Section text.\"\n      },\n      {\n        \"h2\": \"How users can contact us\",\n        \"body\": \"Section text.\"\n      }\n    ],\n    \"faq\": [\n      {\n        \"question\": \"Can users request corrections?\",\n        \"answer\": \"Yes, they can contact the editorial team.\"\n      }\n    ]\n  }\n}\n```\n\n### 6.3 `category_index`\n\n```json\n{\n  \"content_type\": \"category_index\",\n  \"result\": {\n    \"route\": \"/bady/\",\n    \"title\": \"Popular products\",\n    \"seo\": {\n      \"title\": \"Popular supplement products | NutriScope\",\n      \"description\": \"Browse supplement product cards with prices, reviews and safety context.\",\n      \"robots\": \"index,follow\"\n    },\n    \"fields\": {\n      \"h1\": \"Popular products\",\n      \"lead\": \"Short index page intro.\",\n      \"empty_state\": \"No products found yet.\",\n      \"filter_hint\": \"Use filters to compare product cards.\"\n    },\n    \"sections\": [\n      {\n        \"h2\": \"How to read product cards\",\n        \"body\": \"Explain ratings, price, offer links and review buttons.\"\n      }\n    ],\n    \"faq\": []\n  }\n}\n```\n\n### 6.4 `product_card`\n\n```json\n{\n  \"content_type\": \"product_card\",\n  \"result\": {\n    \"route\": \"/bady/omega-balance-softgels/\",\n    \"slug\": \"omega-balance-softgels\",\n    \"title\": \"Omega Balance Softgels\",\n    \"seo\": {\n      \"title\": \"Omega Balance Softgels: price and review context | NutriScope\",\n      \"description\": \"Product card for Omega Balance Softgels with price, availability, offer link and review context.\",\n      \"robots\": \"index,follow\"\n    },\n    \"fields\": {\n      \"name\": \"Omega Balance Softgels\",\n      \"brand\": \"Demo Brand\",\n      \"rating\": 4.3,\n      \"price\": \"19.90 USD\",\n      \"availability\": \"Available\",\n      \"seller_label\": \"Buy\",\n      \"seller_url\": \"https://example.com/demo-offer\",\n      \"short_description\": \"Short product card description.\",\n      \"long_description\": \"Long product page description.\",\n      \"important_notice\": \"Informational content only. Consult a qualified clinician before using supplements.\",\n      \"affiliate_note\": \"Offer links may be affiliate links.\"\n    },\n    \"media\": [\n      {\n        \"kind\": \"product_image\",\n        \"url\": \"https://example.com/image.webp\",\n        \"alt\": \"Omega Balance Softgels bottle\",\n        \"license_note\": \"Public/demo image or supplied asset.\"\n      }\n    ],\n    \"relations\": {\n      \"review_route\": \"/obzory/omega-balance-softgels-review/\",\n      \"expert_route\": \"/experts/dr-demo-reviewer/\"\n    },\n    \"schema_hints\": {\n      \"types\": [\"Product\", \"Review\", \"BreadcrumbList\"],\n      \"brand\": \"Demo Brand\",\n      \"offers\": {\n        \"price\": \"19.90\",\n        \"priceCurrency\": \"USD\",\n        \"availability\": \"https://schema.org/InStock\"\n      }\n    }\n  }\n}\n```\n\n### 6.5 `product_review`\n\n```json\n{\n  \"content_type\": \"product_review\",\n  \"result\": {\n    \"route\": \"/obzory/omega-balance-softgels-review/\",\n    \"slug\": \"omega-balance-softgels-review\",\n    \"title\": \"Omega Balance Softgels Review\",\n    \"seo\": {\n      \"title\": \"Omega Balance Softgels Review | NutriScope\",\n      \"description\": \"Review of Omega Balance Softgels with safety notes, pricing and reviewer context.\",\n      \"robots\": \"index,follow\"\n    },\n    \"fields\": {\n      \"h1\": \"Omega Balance Softgels Review\",\n      \"lead\": \"Short review lead.\",\n      \"review_summary\": \"Two sentence review summary.\",\n      \"verdict\": \"Context-dependent supplement review.\",\n      \"rating\": 4.3,\n      \"updated_at\": \"2026-05-18\",\n      \"important_notice\": \"This review is informational and is not medical advice.\"\n    },\n    \"sections\": [\n      {\n        \"h2\": \"What this product is\",\n        \"body\": \"Section text.\"\n      },\n      {\n        \"h2\": \"What to check before buying\",\n        \"body\": \"Section text.\"\n      }\n    ],\n    \"pros\": [\n      \"Clear public product positioning\"\n    ],\n    \"cons\": [\n      \"Evidence and label data should be verified before production\"\n    ],\n    \"sources\": [\n      {\n        \"title\": \"Source title\",\n        \"url\": \"https://example.com/source\",\n        \"note\": \"Why this source is relevant\"\n      }\n    ],\n    \"relations\": {\n      \"product_route\": \"/bady/omega-balance-softgels/\",\n      \"expert_route\": \"/experts/dr-demo-reviewer/\",\n      \"reviews_index_route\": \"/obzory/\"\n    },\n    \"schema_hints\": {\n      \"types\": [\"Article\", \"Review\", \"BreadcrumbList\"],\n      \"author_name\": \"Dr Demo Reviewer\",\n      \"reviewed_item_name\": \"Omega Balance Softgels\"\n    }\n  }\n}\n```\n\n### 6.6 `expert_profile`\n\n```json\n{\n  \"content_type\": \"expert_profile\",\n  \"result\": {\n    \"route\": \"/experts/dr-demo-reviewer/\",\n    \"slug\": \"dr-demo-reviewer\",\n    \"title\": \"Dr Demo Reviewer\",\n    \"seo\": {\n      \"title\": \"Dr Demo Reviewer | NutriScope\",\n      \"description\": \"Expert profile and review archive.\",\n      \"robots\": \"index,follow\"\n    },\n    \"fields\": {\n      \"name\": \"Dr Demo Reviewer\",\n      \"role\": \"Medical reviewer\",\n      \"specialty\": \"Supplement review and safety context\",\n      \"bio\": \"Short expert biography.\",\n      \"reviews_label\": \"View reviews\"\n    },\n    \"media\": [\n      {\n        \"kind\": \"portrait\",\n        \"url\": \"https://example.com/portrait.webp\",\n        \"alt\": \"Dr Demo Reviewer portrait\"\n      }\n    ],\n    \"social_links\": [\n      {\n        \"label\": \"LinkedIn\",\n        \"url\": \"https://example.com/in/dr-demo-reviewer\"\n      },\n      {\n        \"label\": \"Research profile\",\n        \"url\": \"https://example.com/research/dr-demo-reviewer\"\n      }\n    ],\n    \"relations\": {\n      \"reviews_index_route\": \"/obzory/\",\n      \"review_routes\": [\n        \"/obzory/omega-balance-softgels-review/\"\n      ]\n    },\n    \"schema_hints\": {\n      \"types\": [\"Person\", \"ProfilePage\", \"BreadcrumbList\"]\n    }\n  }\n}\n```\n\n### 6.7 `guide_article`\n\n```json\n{\n  \"content_type\": \"guide_article\",\n  \"result\": {\n    \"route\": \"/guides/how-to-compare-supplement-labels/\",\n    \"slug\": \"how-to-compare-supplement-labels\",\n    \"title\": \"How to Compare Supplement Labels\",\n    \"seo\": {\n      \"title\": \"How to Compare Supplement Labels | NutriScope\",\n      \"description\": \"Guide to reading supplement labels, claims and safety notes.\",\n      \"robots\": \"index,follow\"\n    },\n    \"fields\": {\n      \"h1\": \"How to Compare Supplement Labels\",\n      \"lead\": \"Short educational lead.\"\n    },\n    \"sections\": [\n      {\n        \"h2\": \"Start with the serving size\",\n        \"body\": \"Section text.\"\n      }\n    ],\n    \"faq\": [],\n    \"sources\": [],\n    \"media\": [\n      {\n        \"kind\": \"hero_image\",\n        \"url\": \"https://example.com/guide.webp\",\n        \"alt\": \"Supplement label comparison\"\n      }\n    ],\n    \"schema_hints\": {\n      \"types\": [\"Article\", \"BreadcrumbList\"]\n    }\n  }\n}\n```\n\n## 7. Task lifecycle response\n\nСоздание задачи:\n\n```json\n{\n  \"ok\": true,\n  \"task_id\": \"mg_task_123\",\n  \"status\": \"queued\",\n  \"poll_after_seconds\": 30\n}\n```\n\nПромежуточный статус:\n\n```json\n{\n  \"ok\": true,\n  \"task_id\": \"mg_task_123\",\n  \"status\": \"running\",\n  \"stage\": \"draft\",\n  \"progress\": 55,\n  \"poll_after_seconds\": 60\n}\n```\n\nОшибка:\n\n```json\n{\n  \"ok\": false,\n  \"task_id\": \"mg_task_123\",\n  \"status\": \"failed\",\n  \"stage\": \"safety_review\",\n  \"failed_stage\": \"safety_review\",\n  \"error\": {\n    \"code\": \"ymyl_claim_rejected\",\n    \"message\": \"Unsupported medical claim detected.\",\n    \"human\": \"Материал содержит неподтвержденное медицинское обещание.\",\n    \"retryable\": false\n  }\n}\n```\n\n## 8. Что нельзя возвращать\n\nMedGen не должен возвращать:\n\n- HTML целой страницы;\n- CSS/JS;\n- секреты;\n- SSH/деплой данные;\n- языковые папки `/bg/`, `/en/`, `/ru/`;\n- fake medical sources без явной пометки demo;\n- claims про лечение, диагностику или предотвращение заболеваний;\n- каноникалы на другой домен;\n- `noindex`, если CMX явно не запросил это;\n- неструктурированный текст без JSON-обертки.\n\n## 9. Минимально достаточный формат для старта\n\nЕсли партнеру нужно начать с самого простого варианта, достаточно поддержать:\n\n```json\n{\n  \"ok\": true,\n  \"task_id\": \"mg_task_123\",\n  \"status\": \"succeeded\",\n  \"content_type\": \"technical_page\",\n  \"result\": {\n    \"route\": \"/about/\",\n    \"title\": \"About\",\n    \"seo\": {\n      \"title\": \"About | Site Name\",\n      \"description\": \"SEO description.\",\n      \"robots\": \"index,follow\"\n    },\n    \"fields\": {\n      \"h1\": \"About\",\n      \"lead\": \"Short lead.\"\n    },\n    \"sections\": [\n      {\n        \"h2\": \"Section title\",\n        \"body\": \"Section body.\"\n      }\n    ],\n    \"faq\": [],\n    \"sources\": [],\n    \"warnings\": []\n  }\n}\n```\n\nCMX сможет конвертировать этот формат в свои JSON-страницы.\n\n## 10. Главный принцип интеграции\n\nMedGen должен возвращать не \"готовую страницу сайта\", а структурированный контент для конкретного route и content_type.\n\nCMX Admin сам:\n\n- знает, куда записать JSON;\n- знает, какие модули отрисовать;\n- знает, как построить sitemap;\n- знает, как собрать JSON-LD;\n- знает, как задеплоить статический сайт.\n\nMedGen должен стабильно отдавать контентные поля, связи и SEO-данные в JSON.\n",
    "registry": {
        "version": "cmx-medgen-page-format-registry-v1",
        "updated_at": "2026-05-23",
        "canonical_contract_url": "https://cmx-medgen-contract.pages.dev/contract.md",
        "canonical_registry_url": "https://cmx-medgen-contract.pages.dev/page-format-registry.json",
        "update_rule": "Whenever CMX adds a new public page type, changes a page module structure, changes accepted HTML, or edits a page-specific content format, update this registry and redeploy the same Pages project before asking MedGen to generate that page.",
        "response_mode": "cmx_page_skeleton_response",
        "primary_response_path": "result.cmx_page",
        "fallback_response_path": "article.body",
        "global_rules": {
            "locale_strategy": "single_root",
            "cmx_owns": [
                "routes",
                "content paths",
                "global header",
                "global footer",
                "CSS",
                "responsive spacing",
                "canonical URLs",
                "schema assembly",
                "preview",
                "approval",
                "deploy"
            ],
            "medgen_owns": [
                "localized headings",
                "localized body fragments",
                "module props",
                "FAQ",
                "CTA labels",
                "media suggestions",
                "alt text",
                "sources",
                "relations"
            ],
            "allowed_html_tags": [
                "section",
                "article",
                "header",
                "div",
                "h1",
                "h2",
                "h3",
                "p",
                "ul",
                "ol",
                "li",
                "dl",
                "dt",
                "dd",
                "strong",
                "em",
                "small",
                "blockquote",
                "table",
                "thead",
                "tbody",
                "tr",
                "th",
                "td",
                "a"
            ],
            "forbidden_html": [
                "doctype",
                "html",
                "head",
                "body",
                "script",
                "style",
                "iframe",
                "form",
                "input",
                "textarea",
                "button",
                "svg",
                "canvas",
                "link",
                "meta",
                "inline style attributes",
                "on* event attributes"
            ]
        },
        "response_schema": {
            "required": [
                "result.cmx_page.version",
                "result.cmx_page.content_type",
                "result.cmx_page.route",
                "result.cmx_page.locale",
                "result.cmx_page.seo",
                "result.cmx_page.modules"
            ],
            "example": {
                "result": {
                    "cmx_page": {
                        "version": "cmx-page-skeleton-v1",
                        "content_type": "technical_page",
                        "route": "/editorial-policy/",
                        "locale": "bg_BG",
                        "seo": {
                            "title": "{{localized SEO title}}",
                            "description": "{{localized SEO description}}"
                        },
                        "modules": [
                            {
                                "type": "page_header",
                                "props": {
                                    "h1": "{{page H1}}",
                                    "lead": "{{page lead}}"
                                }
                            },
                            {
                                "type": "rich_text",
                                "props": {
                                    "html": "<section><h2>{{section heading}}</h2><p>{{paragraph}}</p></section>"
                                }
                            }
                        ],
                        "faq": [],
                        "media": [],
                        "relations": []
                    }
                }
            }
        },
        "page_formats": {
            "home": {
                "content_type": "home_page",
                "route": "/",
                "content_path": "content/pages/home.json",
                "medgen_api_type": "content_page",
                "required_modules": [
                    "home_hero",
                    "trust_cards",
                    "homepage_sections"
                ],
                "required_slots": [
                    "brand_slogan",
                    "hero_h1",
                    "hero_lead",
                    "hero_image",
                    "hero_image_alt",
                    "trust_cards",
                    "catalog_heading",
                    "reviews_heading",
                    "experts_heading",
                    "methodology_heading",
                    "seo_title",
                    "seo_description"
                ],
                "accepted_markup": {
                    "home_hero.lead": "<p>{{homepage lead}}</p>",
                    "trust_cards.items.body": "<p>{{trust card body}}</p>"
                }
            },
            "technical.about": {
                "content_type": "technical_page",
                "page_key": "about",
                "route": "/about/",
                "content_path": "content/pages/technical/about.json",
                "medgen_api_type": "tech_page",
                "required_modules": [
                    "page_header",
                    "rich_text",
                    "related_pages"
                ],
                "required_slots": [
                    "page_h1",
                    "page_lead",
                    "sections",
                    "related_pages",
                    "seo_title",
                    "seo_description"
                ],
                "accepted_markup": {
                    "rich_text.html": "<section><h2>{{section heading}}</h2><p>{{paragraph}}</p></section>"
                }
            },
            "technical.methodology": {
                "content_type": "technical_page",
                "page_key": "methodology",
                "route": "/methodology/",
                "content_path": "content/pages/technical/methodology.json",
                "medgen_api_type": "tech_page",
                "required_modules": [
                    "page_header",
                    "rich_text",
                    "faq"
                ],
                "required_slots": [
                    "page_h1",
                    "page_lead",
                    "method_sections",
                    "evaluation_steps",
                    "faq",
                    "seo_title",
                    "seo_description"
                ],
                "accepted_markup": {
                    "rich_text.html": "<section><h2>{{method heading}}</h2><p>{{method body}}</p><ol><li>{{step}}</li></ol></section>"
                }
            },
            "technical.editorial_policy": {
                "content_type": "technical_page",
                "page_key": "editorial_policy",
                "route": "/editorial-policy/",
                "content_path": "content/pages/technical/editorial-policy.json",
                "medgen_api_type": "tech_page",
                "required_modules": [
                    "page_header",
                    "rich_text",
                    "related_pages"
                ],
                "required_slots": [
                    "page_h1",
                    "page_lead",
                    "editorial_principles",
                    "review_process",
                    "corrections_policy",
                    "related_pages",
                    "seo_title",
                    "seo_description"
                ],
                "accepted_markup": {
                    "rich_text.html": "<section><h2>{{policy heading}}</h2><p>{{policy paragraph}}</p><ul><li>{{policy item}}</li></ul></section>"
                }
            },
            "technical.information_sources": {
                "content_type": "technical_page",
                "page_key": "information_sources",
                "route": "/sources/",
                "content_path": "content/pages/technical/sources.json",
                "medgen_api_type": "tech_page",
                "required_modules": [
                    "page_header",
                    "rich_text",
                    "source_list"
                ],
                "required_slots": [
                    "page_h1",
                    "page_lead",
                    "source_policy_sections",
                    "source_groups",
                    "seo_title",
                    "seo_description"
                ],
                "accepted_markup": {
                    "rich_text.html": "<section><h2>{{source heading}}</h2><p>{{source explanation}}</p></section>"
                }
            },
            "technical.affiliate_disclosure": {
                "content_type": "technical_page",
                "page_key": "affiliate_disclosure",
                "route": "/affiliate-disclosure/",
                "content_path": "content/pages/technical/affiliate-disclosure.json",
                "medgen_api_type": "tech_page",
                "required_modules": [
                    "page_header",
                    "rich_text",
                    "related_pages"
                ],
                "required_slots": [
                    "page_h1",
                    "page_lead",
                    "commercial_disclosure_sections",
                    "related_pages",
                    "seo_title",
                    "seo_description"
                ],
                "accepted_markup": {
                    "rich_text.html": "<section><h2>{{disclosure heading}}</h2><p>{{disclosure body}}</p></section>"
                }
            },
            "technical.contact": {
                "content_type": "technical_page",
                "page_key": "contact",
                "route": "/contact/",
                "content_path": "content/pages/technical/contact.json",
                "medgen_api_type": "tech_page",
                "required_modules": [
                    "page_header",
                    "rich_text"
                ],
                "cmx_fixed_modules_after_medgen": [
                    "contact_form"
                ],
                "required_slots": [
                    "page_h1",
                    "page_lead",
                    "contact_intro_sections",
                    "seo_title",
                    "seo_description"
                ],
                "accepted_markup": {
                    "rich_text.html": "<section><h2>{{contact heading}}</h2><p>{{contact paragraph}}</p></section>"
                }
            },
            "technical.faq": {
                "content_type": "technical_page",
                "page_key": "faq",
                "route": "/faq/",
                "content_path": "content/pages/technical/faq.json",
                "medgen_api_type": "tech_page",
                "required_modules": [
                    "page_header",
                    "faq"
                ],
                "required_slots": [
                    "page_h1",
                    "page_lead",
                    "faq",
                    "seo_title",
                    "seo_description"
                ],
                "accepted_markup": {
                    "faq.answer_html": "<p>{{answer}}</p>"
                }
            },
            "technical.how_to_use": {
                "content_type": "technical_page",
                "page_key": "how_to_use",
                "route": "/how-to-use/",
                "content_path": "content/pages/technical/how-to-use.json",
                "medgen_api_type": "tech_page",
                "required_modules": [
                    "page_header",
                    "rich_text",
                    "faq"
                ],
                "required_slots": [
                    "page_h1",
                    "page_lead",
                    "usage_steps",
                    "faq",
                    "seo_title",
                    "seo_description"
                ],
                "accepted_markup": {
                    "rich_text.html": "<section><h2>{{step group heading}}</h2><ol><li>{{step}}</li></ol></section>"
                }
            },
            "technical.suggest_supplement": {
                "content_type": "technical_page",
                "page_key": "suggest_supplement",
                "route": "/suggest-supplement/",
                "content_path": "content/pages/technical/suggest-supplement.json",
                "medgen_api_type": "tech_page",
                "required_modules": [
                    "page_header",
                    "rich_text"
                ],
                "required_slots": [
                    "page_h1",
                    "page_lead",
                    "submission_guidance",
                    "seo_title",
                    "seo_description"
                ],
                "accepted_markup": {
                    "rich_text.html": "<section><h2>{{guidance heading}}</h2><p>{{guidance paragraph}}</p><ul><li>{{required info}}</li></ul></section>"
                }
            },
            "technical.disclaimer": {
                "content_type": "technical_page",
                "page_key": "disclaimer",
                "route": "/disclaimer/",
                "content_path": "content/pages/technical/disclaimer.json",
                "medgen_api_type": "tech_page",
                "required_modules": [
                    "page_header",
                    "rich_text"
                ],
                "required_slots": [
                    "page_h1",
                    "page_lead",
                    "disclaimer_sections",
                    "seo_title",
                    "seo_description"
                ],
                "accepted_markup": {
                    "rich_text.html": "<section><h2>{{disclaimer heading}}</h2><p>{{disclaimer text}}</p></section>"
                }
            },
            "technical.privacy_policy": {
                "content_type": "technical_page",
                "page_key": "privacy_policy",
                "route": "/privacy-policy/",
                "content_path": "content/pages/technical/privacy-policy.json",
                "medgen_api_type": "tech_page",
                "required_modules": [
                    "page_header",
                    "rich_text"
                ],
                "required_slots": [
                    "page_h1",
                    "page_lead",
                    "privacy_sections",
                    "seo_title",
                    "seo_description"
                ],
                "accepted_markup": {
                    "rich_text.html": "<section><h2>{{privacy heading}}</h2><p>{{privacy text}}</p></section>"
                }
            },
            "technical.terms_of_use": {
                "content_type": "technical_page",
                "page_key": "terms_of_use",
                "route": "/terms/",
                "content_path": "content/pages/technical/terms.json",
                "medgen_api_type": "tech_page",
                "required_modules": [
                    "page_header",
                    "rich_text"
                ],
                "required_slots": [
                    "page_h1",
                    "page_lead",
                    "terms_sections",
                    "seo_title",
                    "seo_description"
                ],
                "accepted_markup": {
                    "rich_text.html": "<section><h2>{{terms heading}}</h2><p>{{terms text}}</p></section>"
                }
            },
            "technical.cookie_policy": {
                "content_type": "technical_page",
                "page_key": "cookie_policy",
                "route": "/cookie-policy/",
                "content_path": "content/pages/technical/cookie-policy.json",
                "medgen_api_type": "tech_page",
                "required_modules": [
                    "page_header",
                    "rich_text"
                ],
                "required_slots": [
                    "page_h1",
                    "page_lead",
                    "cookie_sections",
                    "seo_title",
                    "seo_description"
                ],
                "accepted_markup": {
                    "rich_text.html": "<section><h2>{{cookie heading}}</h2><p>{{cookie text}}</p></section>"
                }
            },
            "index.catalog": {
                "content_type": "index_page",
                "page_key": "catalog",
                "route": "/bady/",
                "content_path": "content/pages/categories/bady.json",
                "medgen_api_type": "content_page",
                "required_modules": [
                    "category_header",
                    "index_intro"
                ],
                "required_slots": [
                    "h1",
                    "lead",
                    "intro_html",
                    "widget_headings",
                    "empty_state_text",
                    "faq",
                    "seo_title",
                    "seo_description"
                ],
                "accepted_markup": {
                    "index_intro.html": "<section><h2>{{catalog heading}}</h2><p>{{catalog intro}}</p></section>"
                }
            },
            "index.reviews": {
                "content_type": "index_page",
                "page_key": "reviews_index",
                "route": "/obzory/",
                "content_path": "content/pages/categories/obzory.json",
                "medgen_api_type": "content_page",
                "required_modules": [
                    "category_header",
                    "index_intro",
                    "review_grid"
                ],
                "required_slots": [
                    "h1",
                    "lead",
                    "intro_html",
                    "empty_state_text",
                    "faq",
                    "seo_title",
                    "seo_description"
                ],
                "accepted_markup": {
                    "index_intro.html": "<section><h2>{{reviews heading}}</h2><p>{{reviews intro}}</p></section>"
                }
            },
            "index.experts": {
                "content_type": "index_page",
                "page_key": "experts_index",
                "route": "/experts/",
                "content_path": "content/pages/authors/experts.json",
                "medgen_api_type": "author",
                "required_modules": [
                    "page_header",
                    "authors_grid_intro"
                ],
                "required_slots": [
                    "h1",
                    "lead",
                    "intro_html",
                    "empty_state_text",
                    "seo_title",
                    "seo_description"
                ],
                "accepted_markup": {
                    "authors_grid_intro.html": "<section><h2>{{experts heading}}</h2><p>{{experts intro}}</p></section>"
                }
            },
            "index.guides": {
                "content_type": "index_page",
                "page_key": "guides_index",
                "route": "/guides/",
                "content_path": "content/pages/categories/guides.json",
                "medgen_api_type": "content_page",
                "required_modules": [
                    "category_header",
                    "index_intro"
                ],
                "required_slots": [
                    "h1",
                    "lead",
                    "intro_html",
                    "empty_state_text",
                    "seo_title",
                    "seo_description"
                ],
                "accepted_markup": {
                    "index_intro.html": "<section><h2>{{guides heading}}</h2><p>{{guides intro}}</p></section>"
                }
            },
            "dynamic.product_card": {
                "content_type": "product_card",
                "route_pattern": "/bady/{product_slug}/",
                "content_path_pattern": "content/pages/supplements/{product_slug}.json",
                "medgen_api_type": "content_page",
                "required_modules": [
                    "product_hero",
                    "product_details",
                    "product_notes"
                ],
                "required_slots": [
                    "product_name",
                    "product_brand",
                    "product_summary",
                    "product_long_description",
                    "product_image",
                    "product_image_alt",
                    "price_label",
                    "seller_label",
                    "safety_note",
                    "affiliate_note",
                    "review_cta_label",
                    "review_route",
                    "seo_title",
                    "seo_description"
                ],
                "accepted_markup": {
                    "product_hero.summary_html": "<p>{{short product summary}}</p>",
                    "product_details.html": "<section><h2>{{details heading}}</h2><p>{{long product description}}</p><dl><dt>{{fact label}}</dt><dd>{{fact value}}</dd></dl></section>",
                    "product_notes.safety_note_html": "<p>{{safety note}}</p>"
                }
            },
            "dynamic.product_review": {
                "content_type": "product_review",
                "route_pattern": "/obzory/{product_slug}-review/",
                "content_path_pattern": "content/pages/technical/{product_slug}-review.json",
                "medgen_api_type": "content_page",
                "required_modules": [
                    "review_header",
                    "review_verdict",
                    "review_body",
                    "review_relations"
                ],
                "required_slots": [
                    "review_h1",
                    "review_lead",
                    "review_summary",
                    "rating",
                    "verdict",
                    "pros",
                    "cons",
                    "review_sections",
                    "product_route",
                    "product_anchor_label",
                    "expert_route",
                    "expert_anchor_label",
                    "faq",
                    "sources",
                    "seo_title",
                    "seo_description"
                ],
                "accepted_markup": {
                    "review_header.summary_html": "<p>{{review summary}}</p>",
                    "review_verdict.verdict_html": "<p>{{verdict}}</p>",
                    "review_body.html": "<section><h2>{{section heading}}</h2><p>{{section body}}</p></section>"
                }
            },
            "dynamic.expert_profile": {
                "content_type": "expert_profile",
                "route_pattern": "/experts/{expert_slug}/",
                "content_path_pattern": "content/pages/authors/{expert_slug}.json",
                "medgen_api_type": "author",
                "required_modules": [
                    "author_header",
                    "author_body",
                    "author_disclosure"
                ],
                "required_slots": [
                    "expert_name",
                    "expert_role",
                    "short_bio",
                    "full_bio",
                    "qualification_heading",
                    "reviewed_materials_heading",
                    "review_refs",
                    "disclosure_text",
                    "portrait_image",
                    "portrait_image_alt",
                    "same_as_links",
                    "seo_title",
                    "seo_description"
                ],
                "accepted_markup": {
                    "author_header.bio_html": "<p>{{short bio}}</p>",
                    "author_body.html": "<section><h2>{{qualification heading}}</h2><p>{{full bio}}</p></section>",
                    "author_disclosure.html": "<p>{{disclosure text}}</p>"
                }
            },
            "dynamic.guide_article": {
                "content_type": "guide_article",
                "route_pattern": "/guides/{guide_slug}/",
                "content_path_pattern": "content/pages/technical/{guide_slug}.json",
                "medgen_api_type": "content_page",
                "required_modules": [
                    "article_header",
                    "article_body"
                ],
                "required_slots": [
                    "guide_h1",
                    "guide_lead",
                    "sections",
                    "related_products",
                    "related_reviews",
                    "faq",
                    "seo_title",
                    "seo_description"
                ],
                "accepted_markup": {
                    "article_body.html": "<section><h2>{{section heading}}</h2><p>{{section body}}</p></section>"
                }
            }
        }
    }
}
