{
  "exported_at": "2026-08-17T12:19:12.051680+00:00",
  "site": "quickex_io",
  "run": {
    "id": 638,
    "started_at": "2026-08-17T11:05:00.607818+00:00",
    "finished_at": "2026-08-17T11:05:01.355603+00:00",
    "url": "https://quickex.io/exchange-zec-xmr",
    "label": "ZEC→XMR",
    "pair": "zec-xmr",
    "lang": "en",
    "status": "fail",
    "summary": {
      "score": 42.0,
      "grade": "F",
      "applicable": 137,
      "counts": {
        "pass": 38,
        "warn": 39,
        "fail": 29,
        "manual": 31,
        "na": 8
      },
      "critical_fail": 13,
      "status": "fail",
      "is_nuxt": true,
      "stack": "nuxt",
      "url": "https://quickex.io/exchange-zec-xmr",
      "label": "ZEC→XMR",
      "pair": "zec-xmr",
      "lang": "en",
      "roadmap": [
        {
          "id": "001",
          "priority": "P0",
          "severity": "critical",
          "status": "fail",
          "title": "Целевой URL отдаёт HTTP 200 (не 404/410/5xx)",
          "block": "A",
          "evidence": "HTTP 403"
        },
        {
          "id": "005",
          "priority": "P0",
          "severity": "critical",
          "status": "fail",
          "title": "Canonical указывает на ту же пару и язык (не другую пару)",
          "block": "A",
          "evidence": "Нет canonical"
        },
        {
          "id": "013",
          "priority": "P0",
          "severity": "critical",
          "status": "fail",
          "title": "Контент SSR/пререндер — в HTML есть H1 и основной текст (не пустой shell)",
          "block": "A",
          "evidence": "H1 отсутствует — возможен пустой shell"
        },
        {
          "id": "021",
          "priority": "P0",
          "severity": "critical",
          "status": "fail",
          "title": "meta title [`meta_title`] не пустой на indexable URL",
          "block": "B",
          "evidence": "Title пустой"
        },
        {
          "id": "028",
          "priority": "P0",
          "severity": "critical",
          "status": "fail",
          "title": "Description не содержит body-copy (>300 символов = fail)",
          "block": "B",
          "evidence": "Нет description"
        },
        {
          "id": "036",
          "priority": "P0",
          "severity": "critical",
          "status": "fail",
          "title": "H1 [`title`] присутствует (ровно один видимый H1)",
          "block": "C",
          "evidence": "Найдено H1: 0"
        },
        {
          "id": "037",
          "priority": "P0",
          "severity": "critical",
          "status": "fail",
          "title": "H1 содержит полные имена монет: `Bitcoin (BTC) to Monero (XMR)`",
          "block": "C",
          "evidence": "Нет H1"
        },
        {
          "id": "101",
          "priority": "P0",
          "severity": "critical",
          "status": "fail",
          "title": "SSR/SSG: в view-source есть осмысленный текст (>150 символов), не пустой shell",
          "block": "N",
          "evidence": "Мало текста: 0 chars — возможен CSR shell"
        },
        {
          "id": "103",
          "priority": "P0",
          "severity": "critical",
          "status": "fail",
          "title": "H1 в исходном HTML — не только после гидрации JS",
          "block": "N",
          "evidence": "H1 отсутствует в исходном HTML"
        },
        {
          "id": "104",
          "priority": "P0",
          "severity": "critical",
          "status": "fail",
          "title": "`<title>` в исходном HTML — useHead/useSeoMeta отработал на сервере",
          "block": "N",
          "evidence": "Title отсутствует в SSR HTML"
        },
        {
          "id": "109",
          "priority": "P0",
          "severity": "critical",
          "status": "fail",
          "title": "Нет паттерна пустого `#__nuxt`/`#app` (<200 символов видимого текста)",
          "block": "N",
          "evidence": "Пустой #__nuxt shell: 0 chars"
        },
        {
          "id": "119",
          "priority": "P0",
          "severity": "critical",
          "status": "fail",
          "title": "Нет `data-server-rendered=\"true\"` missing + empty body (CSR-only mode)",
          "block": "N",
          "evidence": "Признаки CSR-only: пустой body без SSR marker"
        },
        {
          "id": "129",
          "priority": "P0",
          "severity": "critical",
          "status": "fail",
          "title": "Strict-Transport-Security (HSTS) в ответе сервера",
          "block": "J",
          "evidence": "Нет Strict-Transport-Security"
        },
        {
          "id": "002",
          "priority": "P2",
          "severity": "critical",
          "status": "warn",
          "title": "Final URL после редиректов совпадает с canonical (нет лишних hop)",
          "block": "A",
          "evidence": "Canonical отсутствует — нельзя сверить final URL"
        },
        {
          "id": "064",
          "priority": "P2",
          "severity": "critical",
          "status": "warn",
          "title": "Комиссии в тексте: Fixed 1% / Floating 0.5% — без выдуманных цифр",
          "block": "D",
          "evidence": "Fee не найдены в тексте"
        },
        {
          "id": "102",
          "priority": "P2",
          "severity": "critical",
          "status": "warn",
          "title": "Payload __NUXT__ / __NUXT_DATA__ / `window.__NUXT__` в HTML (Nuxt 3)",
          "block": "N",
          "evidence": "Payload __NUXT__ не найден — возможен static generate или CSR"
        },
        {
          "id": "004",
          "priority": "P1",
          "severity": "high",
          "status": "fail",
          "title": "Canonical присутствует и self-referencing",
          "block": "A",
          "evidence": "Canonical не найден"
        },
        {
          "id": "009",
          "priority": "P1",
          "severity": "high",
          "status": "fail",
          "title": "robots.txt доступен (200) и не содержит `Disallow: /`",
          "block": "A",
          "evidence": "robots.txt недоступен"
        },
        {
          "id": "010",
          "priority": "P1",
          "severity": "high",
          "status": "fail",
          "title": "Sitemap указан в robots.txt (`Sitemap:` directive)",
          "block": "A",
          "evidence": "Нет Sitemap: в robots.txt"
        },
        {
          "id": "011",
          "priority": "P1",
          "severity": "high",
          "status": "fail",
          "title": "sitemap.xml доступен (200), валидный XML",
          "block": "A",
          "evidence": "sitemap недоступен"
        },
        {
          "id": "014",
          "priority": "P1",
          "severity": "high",
          "status": "fail",
          "title": "Viewport meta для mobile (`width=device-width`)",
          "block": "A",
          "evidence": "Нет viewport meta"
        },
        {
          "id": "022",
          "priority": "P1",
          "severity": "high",
          "status": "fail",
          "title": "Длина meta title 45–65 символов (warn вне диапазона)",
          "block": "B",
          "evidence": "Нет title"
        },
        {
          "id": "026",
          "priority": "P1",
          "severity": "high",
          "status": "fail",
          "title": "meta description присутствует",
          "block": "B",
          "evidence": "meta description отсутствует"
        },
        {
          "id": "027",
          "priority": "P1",
          "severity": "high",
          "status": "fail",
          "title": "Длина description 120–170 символов",
          "block": "B",
          "evidence": "Нет description"
        },
        {
          "id": "091",
          "priority": "P1",
          "severity": "high",
          "status": "fail",
          "title": "hreflang теги присутствуют для языковых версий",
          "block": "G",
          "evidence": "hreflang отсутствует"
        },
        {
          "id": "105",
          "priority": "P1",
          "severity": "high",
          "status": "fail",
          "title": "meta description в исходном HTML (не client-only)",
          "block": "N",
          "evidence": "meta description только client-side?"
        },
        {
          "id": "107",
          "priority": "P1",
          "severity": "high",
          "status": "fail",
          "title": "`/_nuxt/` assets — главный JS-бандл отдаёт 200 (не 404)",
          "block": "N",
          "evidence": "Не найден /_nuxt/*.js в HTML"
        },
        {
          "id": "130",
          "priority": "P1",
          "severity": "high",
          "status": "fail",
          "title": "X-Content-Type-Options: nosniff",
          "block": "J",
          "evidence": "Нет X-Content-Type-Options: nosniff"
        },
        {
          "id": "144",
          "priority": "P1",
          "severity": "high",
          "status": "fail",
          "title": "Self-referencing canonical (не chain на другой URL)",
          "block": "K",
          "evidence": "Нет canonical"
        },
        {
          "id": "041",
          "priority": "P2",
          "severity": "high",
          "status": "warn",
          "title": "Блок How-to (`exchange_pair_section1_title`) — заголовок есть",
          "block": "C",
          "evidence": "Блок не обнаружен по тексту"
        },
        {
          "id": "042",
          "priority": "P2",
          "severity": "high",
          "status": "warn",
          "title": "how_step1–4 — все 4 шага заполнены, без template leak",
          "block": "C",
          "evidence": "Мало how-step контента"
        },
        {
          "id": "049",
          "priority": "P2",
          "severity": "high",
          "status": "warn",
          "title": "FAQ — минимум 3–5 вопросов видимы",
          "block": "C",
          "evidence": "FAQ блок слабо выражен"
        },
        {
          "id": "051",
          "priority": "P2",
          "severity": "high",
          "status": "warn",
          "title": "about_section — заголовок + subtitle про обе монеты",
          "block": "C",
          "evidence": "About block не найден"
        },
        {
          "id": "092",
          "priority": "P2",
          "severity": "high",
          "status": "warn",
          "title": "x-default hreflang задан",
          "block": "G",
          "evidence": "Нет x-default"
        },
        {
          "id": "106",
          "priority": "P2",
          "severity": "high",
          "status": "warn",
          "title": "canonical в исходном HTML",
          "block": "N",
          "evidence": "canonical не в initial HTML"
        },
        {
          "id": "110",
          "priority": "P2",
          "severity": "high",
          "status": "warn",
          "title": "OG-теги в исходном HTML (не только после Vue mount)",
          "block": "N",
          "evidence": "OG только после гидрации"
        },
        {
          "id": "117",
          "priority": "P2",
          "severity": "high",
          "status": "warn",
          "title": "preload критичных шрифтов или CSS (не всё через JS)",
          "block": "N",
          "evidence": "Нет preload критичных ресурсов"
        },
        {
          "id": "125",
          "priority": "P2",
          "severity": "high",
          "status": "warn",
          "title": "Google-Extended / GoogleOther — training vs search разделены",
          "block": "I",
          "evidence": "Google-Extended=allowed, GoogleOther=allowed — проверь training policy"
        },
        {
          "id": "127",
          "priority": "P2",
          "severity": "high",
          "status": "warn",
          "title": "FAQPage schema на money/pillar страницах",
          "block": "I",
          "evidence": "Нет FAQPage schema — AI engines хуже извлекают Q&A"
        },
        {
          "id": "108",
          "priority": "P2",
          "severity": "medium",
          "status": "fail",
          "title": "`html lang=\"...\"` задан и соответствует локали URL",
          "block": "N",
          "evidence": "html lang не задан"
        },
        {
          "id": "142",
          "priority": "P2",
          "severity": "medium",
          "status": "fail",
          "title": "Internal links ≥3 на странице (same-domain)",
          "block": "K",
          "evidence": "Нет internal links на странице"
        },
        {
          "id": "143",
          "priority": "P2",
          "severity": "medium",
          "status": "fail",
          "title": "Sitemap в robots.txt и sitemap.xml → 200",
          "block": "K",
          "evidence": "sitemap.xml недоступен"
        },
        {
          "id": "012",
          "priority": "P3",
          "severity": "medium",
          "status": "warn",
          "title": "URL страницы присутствует в sitemap (или child sitemap)",
          "block": "A",
          "evidence": "URL не найден в sitemap: /exchange-zec-xmr"
        },
        {
          "id": "015",
          "priority": "P3",
          "severity": "medium",
          "status": "warn",
          "title": "Charset UTF-8 задан",
          "block": "A",
          "evidence": "Charset не явно задан"
        },
        {
          "id": "017",
          "priority": "P3",
          "severity": "medium",
          "status": "warn",
          "title": "Slug URL `/exchange-{from}-{to}` соответствует монетам на странице",
          "block": "A",
          "evidence": "H1 может не соответствовать slug zec-xmr"
        },
        {
          "id": "024",
          "priority": "P3",
          "severity": "medium",
          "status": "warn",
          "title": "Бренд Quickex в title (",
          "block": "B",
          "evidence": "Quickex не в title"
        },
        {
          "id": "031",
          "priority": "P3",
          "severity": "medium",
          "status": "warn",
          "title": "og:title заполнен и согласован с meta title",
          "block": "B",
          "evidence": "og:title пуст"
        },
        {
          "id": "032",
          "priority": "P3",
          "severity": "medium",
          "status": "warn",
          "title": "og:description заполнен",
          "block": "B",
          "evidence": "og:description пуст"
        },
        {
          "id": "033",
          "priority": "P3",
          "severity": "medium",
          "status": "warn",
          "title": "og:image присутствует, абсолютный URL, ≥200px",
          "block": "B",
          "evidence": "og:image отсутствует или относительный URL"
        },
        {
          "id": "040",
          "priority": "P3",
          "severity": "medium",
          "status": "warn",
          "title": "subtitle / main_subtitle заполнен, поддерживает intent",
          "block": "C",
          "evidence": "Subtitle не найден в HTML"
        },
        {
          "id": "045",
          "priority": "P3",
          "severity": "medium",
          "status": "warn",
          "title": "Блок Exchange rate today — title + description",
          "block": "C",
          "evidence": "Блок не обнаружен по тексту"
        },
        {
          "id": "046",
          "priority": "P3",
          "severity": "medium",
          "status": "warn",
          "title": "section_pairs_pair_from (TOP links) — title + описание",
          "block": "C",
          "evidence": "Блок не обнаружен по тексту"
        },
        {
          "id": "047",
          "priority": "P3",
          "severity": "medium",
          "status": "warn",
          "title": "section_pairs_pair_to (BOTTOM links) — title + описание",
          "block": "C",
          "evidence": "Блок не обнаружен по тексту"
        },
        {
          "id": "053",
          "priority": "P3",
          "severity": "medium",
          "status": "warn",
          "title": "section_why (benefits) — блок присутствует",
          "block": "C",
          "evidence": "Блок не обнаружен по тексту"
        },
        {
          "id": "054",
          "priority": "P3",
          "severity": "medium",
          "status": "warn",
          "title": "KYC / anonymous блок (`section3_*`) — честная формулировка",
          "block": "C",
          "evidence": "Блок не обнаружен по тексту"
        },
        {
          "id": "055",
          "priority": "P3",
          "severity": "medium",
          "status": "warn",
          "title": "Transparent rate (`section4_*`) — без ложных claim",
          "block": "C",
          "evidence": "Блок не обнаружен по тексту"
        },
        {
          "id": "056",
          "priority": "P3",
          "severity": "medium",
          "status": "warn",
          "title": "Instant swap (`section5_*`) — без overclaim speed",
          "block": "C",
          "evidence": "Блок не обнаружен по тексту"
        },
        {
          "id": "057",
          "priority": "P3",
          "severity": "medium",
          "status": "warn",
          "title": "Reviews / trust блок виден на странице",
          "block": "C",
          "evidence": "Блок не обнаружен по тексту"
        },
        {
          "id": "080",
          "priority": "P3",
          "severity": "medium",
          "status": "warn",
          "title": "Privacy intent: anonymous / no KYC / fast — уместно для xmr-пар",
          "block": "E",
          "evidence": "Privacy KW слабо выражены"
        },
        {
          "id": "086",
          "priority": "P3",
          "severity": "medium",
          "status": "warn",
          "title": "JSON-LD присутствует (`application/ld+json`)",
          "block": "F",
          "evidence": "JSON-LD отсутствует"
        },
        {
          "id": "090",
          "priority": "P3",
          "severity": "medium",
          "status": "warn",
          "title": "JSON-LD валидный JSON (нет syntax error)",
          "block": "F",
          "evidence": "Нет JSON-LD"
        },
        {
          "id": "096",
          "priority": "P3",
          "severity": "medium",
          "status": "warn",
          "title": "Favicon и app icons присутствуют",
          "block": "H",
          "evidence": "Favicon не найден"
        },
        {
          "id": "098",
          "priority": "P3",
          "severity": "medium",
          "status": "warn",
          "title": "Exchange widget загружается и показывает пару",
          "block": "H",
          "evidence": "Widget не найден в DOM"
        },
        {
          "id": "111",
          "priority": "P3",
          "severity": "medium",
          "status": "warn",
          "title": "JSON-LD в исходном HTML для SEO-страниц",
          "block": "N",
          "evidence": "JSON-LD не в initial HTML"
        },
        {
          "id": "118",
          "priority": "P3",
          "severity": "medium",
          "status": "warn",
          "title": "`modulepreload` / prefetch для route chunks — признак нормального Nuxt build",
          "block": "N",
          "evidence": "Нет modulepreload/prefetch"
        },
        {
          "id": "128",
          "priority": "P3",
          "severity": "medium",
          "status": "warn",
          "title": "Data tables — HTML `<table>` для AI citability",
          "block": "I",
          "evidence": "Нет data tables — ниже AI citability (forum: 4x citations с таблицами)"
        },
        {
          "id": "034",
          "priority": "P3",
          "severity": "low",
          "status": "warn",
          "title": "twitter:card (summary/summary_large_image) задан",
          "block": "B",
          "evidence": "twitter:card не задан"
        },
        {
          "id": "035",
          "priority": "P3",
          "severity": "low",
          "status": "warn",
          "title": "twitter:title / description не пустые",
          "block": "B",
          "evidence": "Twitter meta неполный"
        }
      ],
      "pro_summary": {
        "bot_access": {
          "PerplexityBot": "allowed",
          "ClaudeBot": "allowed",
          "Anthropic-AI": "allowed",
          "GPTBot": "allowed",
          "ChatGPT-User": "allowed",
          "Google-Extended": "allowed",
          "GoogleOther": "allowed",
          "Applebot-Extended": "allowed",
          "Googlebot": "allowed",
          "Bingbot": "allowed"
        },
        "duplicate_titles": [],
        "duplicate_descriptions": [],
        "llms_txt_ok": true
      }
    },
    "results": [
      {
        "id": "001",
        "block": "A",
        "block_name": "Техническое SEO",
        "severity": "critical",
        "scope": "ALL",
        "title": "Целевой URL отдаёт HTTP 200 (не 404/410/5xx)",
        "how": "curl -I / DevTools Network",
        "status": "fail",
        "evidence": "HTTP 403"
      },
      {
        "id": "002",
        "block": "A",
        "block_name": "Техническое SEO",
        "severity": "critical",
        "scope": "ALL",
        "title": "Final URL после редиректов совпадает с canonical (нет лишних hop)",
        "how": "Trace redirect chain",
        "status": "warn",
        "evidence": "Canonical отсутствует — нельзя сверить final URL"
      },
      {
        "id": "003",
        "block": "A",
        "block_name": "Техническое SEO",
        "severity": "critical",
        "scope": "ALL",
        "title": "Страница indexable: нет `noindex` на money-page",
        "how": "meta robots / X-Robots-Tag",
        "status": "pass",
        "evidence": "index по умолчанию"
      },
      {
        "id": "004",
        "block": "A",
        "block_name": "Техническое SEO",
        "severity": "high",
        "scope": "ALL",
        "title": "Canonical присутствует и self-referencing",
        "how": "`<link rel=\"canonical\">`",
        "status": "fail",
        "evidence": "Canonical не найден"
      },
      {
        "id": "005",
        "block": "A",
        "block_name": "Техническое SEO",
        "severity": "critical",
        "scope": "EX",
        "title": "Canonical указывает на ту же пару и язык (не другую пару)",
        "how": "Сравнить slug в URL",
        "status": "fail",
        "evidence": "Нет canonical"
      },
      {
        "id": "006",
        "block": "A",
        "block_name": "Техническое SEO",
        "severity": "high",
        "scope": "ALL",
        "title": "HTTPS везде; нет mixed content (http assets)",
        "how": "DevTools Console",
        "status": "pass",
        "evidence": ""
      },
      {
        "id": "007",
        "block": "A",
        "block_name": "Техническое SEO",
        "severity": "high",
        "scope": "SITE",
        "title": "Единый хост: www vs non-www — один канон, второй 301",
        "how": "curl оба варианта",
        "status": "manual",
        "evidence": "Проверка www/non-www — site-level"
      },
      {
        "id": "008",
        "block": "A",
        "block_name": "Техническое SEO",
        "severity": "medium",
        "scope": "ALL",
        "title": "Trailing slash политика единообразна (со slash или без)",
        "how": "Сравнить дубли URL",
        "status": "manual",
        "evidence": "Сравнить trailing slash policy"
      },
      {
        "id": "009",
        "block": "A",
        "block_name": "Техническое SEO",
        "severity": "high",
        "scope": "SITE",
        "title": "robots.txt доступен (200) и не содержит `Disallow: /`",
        "how": "/robots.txt",
        "status": "fail",
        "evidence": "robots.txt недоступен"
      },
      {
        "id": "010",
        "block": "A",
        "block_name": "Техническое SEO",
        "severity": "high",
        "scope": "SITE",
        "title": "Sitemap указан в robots.txt (`Sitemap:` directive)",
        "how": "robots.txt",
        "status": "fail",
        "evidence": "Нет Sitemap: в robots.txt"
      },
      {
        "id": "011",
        "block": "A",
        "block_name": "Техническое SEO",
        "severity": "high",
        "scope": "SITE",
        "title": "sitemap.xml доступен (200), валидный XML",
        "how": "/sitemap.xml",
        "status": "fail",
        "evidence": "sitemap недоступен"
      },
      {
        "id": "012",
        "block": "A",
        "block_name": "Техническое SEO",
        "severity": "medium",
        "scope": "EX",
        "title": "URL страницы присутствует в sitemap (или child sitemap)",
        "how": "grep URL в sitemap",
        "status": "warn",
        "evidence": "URL не найден в sitemap: /exchange-zec-xmr"
      },
      {
        "id": "013",
        "block": "A",
        "block_name": "Техническое SEO",
        "severity": "critical",
        "scope": "ALL",
        "title": "Контент SSR/пререндер — в HTML есть H1 и основной текст (не пустой shell)",
        "how": "View Source / curl",
        "status": "fail",
        "evidence": "H1 отсутствует — возможен пустой shell"
      },
      {
        "id": "014",
        "block": "A",
        "block_name": "Техническое SEO",
        "severity": "high",
        "scope": "ALL",
        "title": "Viewport meta для mobile (`width=device-width`)",
        "how": "`<meta name=\"viewport\">`",
        "status": "fail",
        "evidence": "Нет viewport meta"
      },
      {
        "id": "015",
        "block": "A",
        "block_name": "Техническое SEO",
        "severity": "medium",
        "scope": "ALL",
        "title": "Charset UTF-8 задан",
        "how": "`<meta charset=\"utf-8\">`",
        "status": "warn",
        "evidence": "Charset не явно задан"
      },
      {
        "id": "016",
        "block": "A",
        "block_name": "Техническое SEO",
        "severity": "medium",
        "scope": "ALL",
        "title": "Нет битых внутренних ссылок на первом экране и в nav",
        "how": "Link checker / manual",
        "status": "manual",
        "evidence": "Link checker на первом экране"
      },
      {
        "id": "017",
        "block": "A",
        "block_name": "Техническое SEO",
        "severity": "medium",
        "scope": "EX",
        "title": "Slug URL `/exchange-{from}-{to}` соответствует монетам на странице",
        "how": "URL vs H1/widget",
        "status": "warn",
        "evidence": "H1 может не соответствовать slug zec-xmr"
      },
      {
        "id": "018",
        "block": "A",
        "block_name": "Техническое SEO",
        "severity": "high",
        "scope": "ALL",
        "title": "TTFB / latency ≤ 3s (warn > 3s, fail > 6s)",
        "how": "DevTools / monitor",
        "status": "pass",
        "evidence": "417.7ms"
      },
      {
        "id": "019",
        "block": "A",
        "block_name": "Техническое SEO",
        "severity": "medium",
        "scope": "ALL",
        "title": "Pagination / params не создают дубли indexable (utm, session)",
        "how": "Canonical + robots",
        "status": "manual",
        "evidence": "Проверка UTM/session дублей"
      },
      {
        "id": "020",
        "block": "A",
        "block_name": "Техническое SEO",
        "severity": "medium",
        "scope": "SITE",
        "title": "404 страница кастомная, не soft-404 (200 с пустым контентом)",
        "how": "/nonexistent-url",
        "status": "manual",
        "evidence": "Проверка кастомной 404 — отдельный URL"
      },
      {
        "id": "021",
        "block": "B",
        "block_name": "Мета и соцсети",
        "severity": "critical",
        "scope": "ALL",
        "title": "meta title [`meta_title`] не пустой на indexable URL",
        "how": "`<title>`",
        "status": "fail",
        "evidence": "Title пустой"
      },
      {
        "id": "022",
        "block": "B",
        "block_name": "Мета и соцсети",
        "severity": "high",
        "scope": "ALL",
        "title": "Длина meta title 45–65 символов (warn вне диапазона)",
        "how": "Посчитать chars",
        "status": "fail",
        "evidence": "Нет title"
      },
      {
        "id": "023",
        "block": "B",
        "block_name": "Мета и соцсети",
        "severity": "high",
        "scope": "EX",
        "title": "Primary keyword ближе к началу meta title",
        "how": "Визуально / Ahrefs KW",
        "status": "manual",
        "evidence": "Нужен top_keyword из Ahrefs"
      },
      {
        "id": "024",
        "block": "B",
        "block_name": "Мета и соцсети",
        "severity": "medium",
        "scope": "ALL",
        "title": "Бренд Quickex в title (",
        "how": "Quickex или в конце) — единообразно",
        "status": "warn",
        "evidence": "Quickex не в title"
      },
      {
        "id": "025",
        "block": "B",
        "block_name": "Мета и соцсети",
        "severity": "critical",
        "scope": "EX",
        "title": "meta title уникален для пары (не copy-paste другой пары)",
        "how": "Diff с соседними парами",
        "status": "manual",
        "evidence": "Уникальность title — сравнение с другими парами"
      },
      {
        "id": "026",
        "block": "B",
        "block_name": "Мета и соцсети",
        "severity": "high",
        "scope": "ALL",
        "title": "meta description присутствует",
        "how": "`<meta name=\"description\">`",
        "status": "fail",
        "evidence": "meta description отсутствует"
      },
      {
        "id": "027",
        "block": "B",
        "block_name": "Мета и соцсети",
        "severity": "high",
        "scope": "ALL",
        "title": "Длина description 120–170 символов",
        "how": "char count",
        "status": "fail",
        "evidence": "Нет description"
      },
      {
        "id": "028",
        "block": "B",
        "block_name": "Мета и соцсети",
        "severity": "critical",
        "scope": "ALL",
        "title": "Description не содержит body-copy (>300 символов = fail)",
        "how": "char count + read",
        "status": "fail",
        "evidence": "Нет description"
      },
      {
        "id": "029",
        "block": "B",
        "block_name": "Мета и соцсети",
        "severity": "medium",
        "scope": "ALL",
        "title": "Description не дублирует H1 дословно",
        "how": "diff title vs H1",
        "status": "pass",
        "evidence": ""
      },
      {
        "id": "030",
        "block": "B",
        "block_name": "Мета и соцсети",
        "severity": "medium",
        "scope": "ALL",
        "title": "Description содержит intent + УТП + мягкий CTA",
        "how": "Readability",
        "status": "manual",
        "evidence": "Оценка intent+CTA — editorial"
      },
      {
        "id": "031",
        "block": "B",
        "block_name": "Мета и соцсети",
        "severity": "medium",
        "scope": "ALL",
        "title": "og:title заполнен и согласован с meta title",
        "how": "OG tags",
        "status": "warn",
        "evidence": "og:title пуст"
      },
      {
        "id": "032",
        "block": "B",
        "block_name": "Мета и соцсети",
        "severity": "medium",
        "scope": "ALL",
        "title": "og:description заполнен",
        "how": "OG tags",
        "status": "warn",
        "evidence": "og:description пуст"
      },
      {
        "id": "033",
        "block": "B",
        "block_name": "Мета и соцсети",
        "severity": "medium",
        "scope": "ALL",
        "title": "og:image присутствует, абсолютный URL, ≥200px",
        "how": "OG debugger / HTML",
        "status": "warn",
        "evidence": "og:image отсутствует или относительный URL"
      },
      {
        "id": "034",
        "block": "B",
        "block_name": "Мета и соцсети",
        "severity": "low",
        "scope": "ALL",
        "title": "twitter:card (summary/summary_large_image) задан",
        "how": "meta twitter",
        "status": "warn",
        "evidence": "twitter:card не задан"
      },
      {
        "id": "035",
        "block": "B",
        "block_name": "Мета и соцсети",
        "severity": "low",
        "scope": "ALL",
        "title": "twitter:title / description не пустые",
        "how": "meta twitter",
        "status": "warn",
        "evidence": "Twitter meta неполный"
      },
      {
        "id": "036",
        "block": "C",
        "block_name": "Контент и структура",
        "severity": "critical",
        "scope": "EX",
        "title": "H1 [`title`] присутствует (ровно один видимый H1)",
        "how": "`<h1>` на live",
        "status": "fail",
        "evidence": "Найдено H1: 0"
      },
      {
        "id": "037",
        "block": "C",
        "block_name": "Контент и структура",
        "severity": "critical",
        "scope": "EX",
        "title": "H1 содержит полные имена монет: `Bitcoin (BTC) to Monero (XMR)`",
        "how": "Read H1",
        "status": "fail",
        "evidence": "Нет H1"
      },
      {
        "id": "038",
        "block": "C",
        "block_name": "Контент и структура",
        "severity": "critical",
        "scope": "EX",
        "title": "H1 без шаблона `BTC (BTC)` / `XMR (XMR)`",
        "how": "grep live HTML",
        "status": "pass",
        "evidence": ""
      },
      {
        "id": "039",
        "block": "C",
        "block_name": "Контент и структура",
        "severity": "high",
        "scope": "EX",
        "title": "H1 не дублирует meta title дословно",
        "how": "diff",
        "status": "pass",
        "evidence": ""
      },
      {
        "id": "040",
        "block": "C",
        "block_name": "Контент и структура",
        "severity": "medium",
        "scope": "EX",
        "title": "subtitle / main_subtitle заполнен, поддерживает intent",
        "how": "Под H1",
        "status": "warn",
        "evidence": "Subtitle не найден в HTML"
      },
      {
        "id": "041",
        "block": "C",
        "block_name": "Контент и структура",
        "severity": "high",
        "scope": "EX",
        "title": "Блок How-to (`exchange_pair_section1_title`) — заголовок есть",
        "how": "Scroll / TMS map",
        "status": "warn",
        "evidence": "Блок не обнаружен по тексту"
      },
      {
        "id": "042",
        "block": "C",
        "block_name": "Контент и структура",
        "severity": "high",
        "scope": "EX",
        "title": "how_step1–4 — все 4 шага заполнены, без template leak",
        "how": "Visible steps",
        "status": "warn",
        "evidence": "Мало how-step контента"
      },
      {
        "id": "043",
        "block": "C",
        "block_name": "Контент и структура",
        "severity": "high",
        "scope": "EX",
        "title": "how_text_1–4 (тела шагов) — заполнены, не пустые",
        "how": "Expand steps / HTML",
        "status": "manual",
        "evidence": "how_text bodies — нужен expand/TMS"
      },
      {
        "id": "044",
        "block": "C",
        "block_name": "Контент и структура",
        "severity": "critical",
        "scope": "EX",
        "title": "В how steps нет `{instrument`, `BTC (BTC)`, `123`, `1122`",
        "how": "grep",
        "status": "pass",
        "evidence": ""
      },
      {
        "id": "045",
        "block": "C",
        "block_name": "Контент и структура",
        "severity": "medium",
        "scope": "EX",
        "title": "Блок Exchange rate today — title + description",
        "how": "Rate section",
        "status": "warn",
        "evidence": "Блок не обнаружен по тексту"
      },
      {
        "id": "046",
        "block": "C",
        "block_name": "Контент и структура",
        "severity": "medium",
        "scope": "EX",
        "title": "section_pairs_pair_from (TOP links) — title + описание",
        "how": "Internal links block",
        "status": "warn",
        "evidence": "Блок не обнаружен по тексту"
      },
      {
        "id": "047",
        "block": "C",
        "block_name": "Контент и структура",
        "severity": "medium",
        "scope": "EX",
        "title": "section_pairs_pair_to (BOTTOM links) — title + описание",
        "how": "Internal links block",
        "status": "warn",
        "evidence": "Блок не обнаружен по тексту"
      },
      {
        "id": "048",
        "block": "C",
        "block_name": "Контент и структура",
        "severity": "medium",
        "scope": "EX",
        "title": "Перелинковка ведёт на валидные exchange URL",
        "how": "Click 2–3 links",
        "status": "manual",
        "evidence": "Клик по перелинковке"
      },
      {
        "id": "049",
        "block": "C",
        "block_name": "Контент и структура",
        "severity": "high",
        "scope": "EX",
        "title": "FAQ — минимум 3–5 вопросов видимы",
        "how": "Accordion",
        "status": "warn",
        "evidence": "FAQ блок слабо выражен"
      },
      {
        "id": "050",
        "block": "C",
        "block_name": "Контент и структура",
        "severity": "medium",
        "scope": "EX",
        "title": "FAQ ответы уникальны для пары, не generic placeholder",
        "how": "Read Q/A",
        "status": "manual",
        "evidence": "Editorial: уникальность FAQ"
      },
      {
        "id": "051",
        "block": "C",
        "block_name": "Контент и структура",
        "severity": "high",
        "scope": "EX",
        "title": "about_section — заголовок + subtitle про обе монеты",
        "how": "About block",
        "status": "warn",
        "evidence": "About block не найден"
      },
      {
        "id": "052",
        "block": "C",
        "block_name": "Контент и структура",
        "severity": "critical",
        "scope": "EX",
        "title": "About: формат `Bitcoin (BTC):` не `BTC (Bitcoin):`",
        "how": "Read about",
        "status": "pass",
        "evidence": ""
      },
      {
        "id": "053",
        "block": "C",
        "block_name": "Контент и структура",
        "severity": "medium",
        "scope": "EX",
        "title": "section_why (benefits) — блок присутствует",
        "how": "Benefits",
        "status": "warn",
        "evidence": "Блок не обнаружен по тексту"
      },
      {
        "id": "054",
        "block": "C",
        "block_name": "Контент и структура",
        "severity": "medium",
        "scope": "EX",
        "title": "KYC / anonymous блок (`section3_*`) — честная формулировка",
        "how": "Read section3",
        "status": "warn",
        "evidence": "Блок не обнаружен по тексту"
      },
      {
        "id": "055",
        "block": "C",
        "block_name": "Контент и структура",
        "severity": "medium",
        "scope": "EX",
        "title": "Transparent rate (`section4_*`) — без ложных claim",
        "how": "Read section4",
        "status": "warn",
        "evidence": "Блок не обнаружен по тексту"
      },
      {
        "id": "056",
        "block": "C",
        "block_name": "Контент и структура",
        "severity": "medium",
        "scope": "EX",
        "title": "Instant swap (`section5_*`) — без overclaim speed",
        "how": "Read section5",
        "status": "warn",
        "evidence": "Блок не обнаружен по тексту"
      },
      {
        "id": "057",
        "block": "C",
        "block_name": "Контент и структура",
        "severity": "medium",
        "scope": "EX",
        "title": "Reviews / trust блок виден на странице",
        "how": "Trust widget",
        "status": "warn",
        "evidence": "Блок не обнаружен по тексту"
      },
      {
        "id": "058",
        "block": "C",
        "block_name": "Контент и структура",
        "severity": "low",
        "scope": "EX",
        "title": "Left nav anchors (`nav_*`) работают (scroll to section)",
        "how": "Click nav",
        "status": "manual",
        "evidence": "Клик nav anchors"
      },
      {
        "id": "059",
        "block": "C",
        "block_name": "Контент и структура",
        "severity": "medium",
        "scope": "HP",
        "title": "Homepage: уникальный H1, не generic «Crypto Exchange» only",
        "how": "/",
        "status": "na",
        "evidence": "Не применимо к этой странице"
      },
      {
        "id": "060",
        "block": "C",
        "block_name": "Контент и структура",
        "severity": "medium",
        "scope": "PR",
        "title": "Premium/VIP: meta не содержит body-copy в title/description",
        "how": "/premium",
        "status": "na",
        "evidence": "Не применимо к этой странице"
      },
      {
        "id": "061",
        "block": "D",
        "block_name": "LQA и бренд",
        "severity": "critical",
        "scope": "EX",
        "title": "Направление пары в тексте совпадает с URL (FROM→TO)",
        "how": "Compare widget vs copy",
        "status": "manual",
        "evidence": "Сверка направления пары с виджетом"
      },
      {
        "id": "062",
        "block": "D",
        "block_name": "LQA и бренд",
        "severity": "critical",
        "scope": "RU",
        "title": "В RU-текстах нет латинского «swap» (только «обмен»)",
        "how": "grep `swap` on /ru/",
        "status": "na",
        "evidence": "Не применимо к этой странице"
      },
      {
        "id": "063",
        "block": "D",
        "block_name": "LQA и бренд",
        "severity": "high",
        "scope": "EX",
        "title": "EN↔RU parity: смысл совпадает, нет противоречий",
        "how": "Side-by-side EN/RU",
        "status": "manual",
        "evidence": "EN↔RU parity — side by side"
      },
      {
        "id": "064",
        "block": "D",
        "block_name": "LQA и бренд",
        "severity": "critical",
        "scope": "ALL",
        "title": "Комиссии в тексте: Fixed 1% / Floating 0.5% — без выдуманных цифр",
        "how": "grep fee %",
        "status": "warn",
        "evidence": "Fee не найдены в тексте"
      },
      {
        "id": "065",
        "block": "D",
        "block_name": "LQA и бренд",
        "severity": "high",
        "scope": "ALL",
        "title": "KYC claim честный: без KYC для стандартных сумм, не «100% anonymous»",
        "how": "Read KYC block",
        "status": "pass",
        "evidence": ""
      },
      {
        "id": "066",
        "block": "D",
        "block_name": "LQA и бренд",
        "severity": "high",
        "scope": "EX",
        "title": "Privacy-пары (btc-xmr): нет overclaim («untraceable», «100%»)",
        "how": "Read copy",
        "status": "pass",
        "evidence": ""
      },
      {
        "id": "067",
        "block": "D",
        "block_name": "LQA и бренд",
        "severity": "high",
        "scope": "EX",
        "title": "Нейминг сети: `Tether (TRC20)` не `USDT (USDT)`",
        "how": "Token names",
        "status": "pass",
        "evidence": ""
      },
      {
        "id": "068",
        "block": "D",
        "block_name": "LQA и бренд",
        "severity": "medium",
        "scope": "EX",
        "title": "TMS meta_title заполнен (не null → шаблон на live)",
        "how": "TMS GET vs live",
        "status": "manual",
        "evidence": "TMS GET required"
      },
      {
        "id": "069",
        "block": "D",
        "block_name": "LQA и бренд",
        "severity": "medium",
        "scope": "EX",
        "title": "TMS meta_description заполнен",
        "how": "TMS GET",
        "status": "manual",
        "evidence": "TMS GET required"
      },
      {
        "id": "070",
        "block": "D",
        "block_name": "LQA и бренд",
        "severity": "medium",
        "scope": "EX",
        "title": "TMS title (H1) override есть на high-risk паре",
        "how": "TMS GET",
        "status": "manual",
        "evidence": "TMS GET required"
      },
      {
        "id": "071",
        "block": "D",
        "block_name": "LQA и бренд",
        "severity": "low",
        "scope": "EX",
        "title": "nav_how_to_swap_title — не трогаем без запроса (DEFER)",
        "how": "Mark N/A unless audit",
        "status": "na",
        "evidence": "DEFER — не оценивается без явного запроса"
      },
      {
        "id": "072",
        "block": "D",
        "block_name": "LQA и бренд",
        "severity": "low",
        "scope": "EX",
        "title": "how_step2 «Provide … address» — DEFER, не fail",
        "how": "Mark N/A unless audit",
        "status": "na",
        "evidence": "DEFER — не оценивается без явного запроса"
      },
      {
        "id": "073",
        "block": "D",
        "block_name": "LQA и бренд",
        "severity": "low",
        "scope": "EX",
        "title": "«Step N.» prefix в how_step — DEFER",
        "how": "Mark N/A unless audit",
        "status": "na",
        "evidence": "DEFER — не оценивается без явного запроса"
      },
      {
        "id": "074",
        "block": "D",
        "block_name": "LQA и бренд",
        "severity": "medium",
        "scope": "ALL",
        "title": "Нет опечаток бренда: Quickex, не Quicex / QuickEx",
        "how": "grep",
        "status": "pass",
        "evidence": ""
      },
      {
        "id": "075",
        "block": "D",
        "block_name": "LQA и бренд",
        "severity": "medium",
        "scope": "ALL",
        "title": "Non-custodial messaging согласован (не «мы храним»)",
        "how": "Read trust copy",
        "status": "pass",
        "evidence": ""
      },
      {
        "id": "076",
        "block": "E",
        "block_name": "Ключевые слова",
        "severity": "high",
        "scope": "EX",
        "title": "Primary KW (Ahrefs top) в meta title — естественно",
        "how": "Ahrefs + title",
        "status": "manual",
        "evidence": "Ahrefs / competitor data"
      },
      {
        "id": "077",
        "block": "E",
        "block_name": "Ключевые слова",
        "severity": "high",
        "scope": "EX",
        "title": "Primary KW в H1 или первом абзаце",
        "how": "Read above fold",
        "status": "manual",
        "evidence": "Ahrefs / competitor data"
      },
      {
        "id": "078",
        "block": "E",
        "block_name": "Ключевые слова",
        "severity": "medium",
        "scope": "EX",
        "title": "Secondary / LSI в FAQ или about (2+ вхождения)",
        "how": "Read FAQ/about",
        "status": "manual",
        "evidence": "Ahrefs / competitor data"
      },
      {
        "id": "079",
        "block": "E",
        "block_name": "Ключевые слова",
        "severity": "medium",
        "scope": "EX",
        "title": "Нет keyword stuffing (один KW >5× подряд)",
        "how": "Read / count",
        "status": "pass",
        "evidence": ""
      },
      {
        "id": "080",
        "block": "E",
        "block_name": "Ключевые слова",
        "severity": "medium",
        "scope": "EX",
        "title": "Privacy intent: anonymous / no KYC / fast — уместно для xmr-пар",
        "how": "Intent match",
        "status": "warn",
        "evidence": "Privacy KW слабо выражены"
      },
      {
        "id": "081",
        "block": "E",
        "block_name": "Ключевые слова",
        "severity": "medium",
        "scope": "EX",
        "title": "Search intent (informational vs transactional) соответствует типу страницы",
        "how": "SERP analysis",
        "status": "manual",
        "evidence": "Ahrefs / competitor data"
      },
      {
        "id": "082",
        "block": "E",
        "block_name": "Ключевые слова",
        "severity": "medium",
        "scope": "EX",
        "title": "Gap vs ChangeNOW: структура блоков не слабее (how/FAQ/about)",
        "how": "competitor_scans",
        "status": "manual",
        "evidence": "Ahrefs / competitor data"
      },
      {
        "id": "083",
        "block": "E",
        "block_name": "Ключевые слова",
        "severity": "medium",
        "scope": "EX",
        "title": "Gap vs Changelly: meta/H1 покрывают top KW",
        "how": "competitor_scans",
        "status": "manual",
        "evidence": "Ahrefs / competitor data"
      },
      {
        "id": "084",
        "block": "E",
        "block_name": "Ключевые слова",
        "severity": "low",
        "scope": "EX",
        "title": "Title/description не копируют конкурента дословно",
        "how": "diff competitor",
        "status": "manual",
        "evidence": "Ahrefs / competitor data"
      },
      {
        "id": "085",
        "block": "E",
        "block_name": "Ключевые слова",
        "severity": "medium",
        "scope": "EX",
        "title": "Long-tail из PAA закрыт минимум 1 FAQ",
        "how": "Compare PAA vs FAQ",
        "status": "manual",
        "evidence": "Ahrefs / competitor data"
      },
      {
        "id": "086",
        "block": "F",
        "block_name": "Структурированные данные",
        "severity": "medium",
        "scope": "ALL",
        "title": "JSON-LD присутствует (`application/ld+json`)",
        "how": "View Source",
        "status": "warn",
        "evidence": "JSON-LD отсутствует"
      },
      {
        "id": "087",
        "block": "F",
        "block_name": "Структурированные данные",
        "severity": "medium",
        "scope": "EX",
        "title": "FAQPage schema есть, если FAQ виден",
        "how": "Rich Results Test",
        "status": "na",
        "evidence": "Не применимо к этой странице"
      },
      {
        "id": "088",
        "block": "F",
        "block_name": "Структурированные данные",
        "severity": "medium",
        "scope": "EX",
        "title": "FAQ schema matches видимым Q/A (нет hidden FAQ only in schema)",
        "how": "Compare",
        "status": "manual",
        "evidence": "Сверка FAQ schema vs visible"
      },
      {
        "id": "089",
        "block": "F",
        "block_name": "Структурированные данные",
        "severity": "medium",
        "scope": "SITE",
        "title": "Organization / WebSite schema на homepage или global",
        "how": "JSON-LD types",
        "status": "manual",
        "evidence": "Site-level schema"
      },
      {
        "id": "090",
        "block": "F",
        "block_name": "Структурированные данные",
        "severity": "medium",
        "scope": "ALL",
        "title": "JSON-LD валидный JSON (нет syntax error)",
        "how": "Parser / validator",
        "status": "warn",
        "evidence": "Нет JSON-LD"
      },
      {
        "id": "091",
        "block": "G",
        "block_name": "i18n и hreflang",
        "severity": "high",
        "scope": "EX",
        "title": "hreflang теги присутствуют для языковых версий",
        "how": "link rel=alternate",
        "status": "fail",
        "evidence": "hreflang отсутствует"
      },
      {
        "id": "092",
        "block": "G",
        "block_name": "i18n и hreflang",
        "severity": "high",
        "scope": "EX",
        "title": "x-default hreflang задан",
        "how": "hreflang=x-default",
        "status": "warn",
        "evidence": "Нет x-default"
      },
      {
        "id": "093",
        "block": "G",
        "block_name": "i18n и hreflang",
        "severity": "critical",
        "scope": "EX",
        "title": "hreflang reciprocal (ru↔en ссылаются друг на друга)",
        "how": "Check pair langs",
        "status": "manual",
        "evidence": "Reciprocal hreflang — нужен fetch других lang URL"
      },
      {
        "id": "094",
        "block": "G",
        "block_name": "i18n и hreflang",
        "severity": "high",
        "scope": "EX",
        "title": "hreflang URL 200 и тот же path пары",
        "how": "curl each lang",
        "status": "manual",
        "evidence": "Fetch каждого hreflang URL"
      },
      {
        "id": "095",
        "block": "G",
        "block_name": "i18n и hreflang",
        "severity": "medium",
        "scope": "EX",
        "title": "Контент локализован, не EN duplicate на /ru/",
        "how": "Read /ru/ body",
        "status": "na",
        "evidence": "Не применимо к этой странице"
      },
      {
        "id": "096",
        "block": "H",
        "block_name": "Доверие и UX",
        "severity": "medium",
        "scope": "ALL",
        "title": "Favicon и app icons присутствуют",
        "how": "`<link rel=\"icon\">`",
        "status": "warn",
        "evidence": "Favicon не найден"
      },
      {
        "id": "097",
        "block": "H",
        "block_name": "Доверие и UX",
        "severity": "medium",
        "scope": "ALL",
        "title": "CTA не spam (не >3 aggressive popups above fold)",
        "how": "Visual",
        "status": "manual",
        "evidence": "Visual: popups"
      },
      {
        "id": "098",
        "block": "H",
        "block_name": "Доверие и UX",
        "severity": "medium",
        "scope": "EX",
        "title": "Exchange widget загружается и показывает пару",
        "how": "Visual / functional",
        "status": "warn",
        "evidence": "Widget не найден в DOM"
      },
      {
        "id": "099",
        "block": "H",
        "block_name": "Доверие и UX",
        "severity": "medium",
        "scope": "ALL",
        "title": "Core Web Vitals LCP < 2.5s (field or lab, warn if worse)",
        "how": "PageSpeed / CrUX",
        "status": "pass",
        "evidence": "TTFB 417.7ms"
      },
      {
        "id": "100",
        "block": "H",
        "block_name": "Доверие и UX",
        "severity": "medium",
        "scope": "ALL",
        "title": "Accessibility basics: images с alt, контраст кнопок приемлемый",
        "how": "Lighthouse a11y",
        "status": "pass",
        "evidence": "Нет img"
      },
      {
        "id": "101",
        "block": "N",
        "block_name": "Nuxt / SPA",
        "severity": "critical",
        "scope": "NUXT",
        "title": "SSR/SSG: в view-source есть осмысленный текст (>150 символов), не пустой shell",
        "how": "curl + View Source",
        "status": "fail",
        "evidence": "Мало текста: 0 chars — возможен CSR shell"
      },
      {
        "id": "102",
        "block": "N",
        "block_name": "Nuxt / SPA",
        "severity": "critical",
        "scope": "NUXT",
        "title": "Payload __NUXT__ / __NUXT_DATA__ / `window.__NUXT__` в HTML (Nuxt 3)",
        "how": "grep HTML",
        "status": "warn",
        "evidence": "Payload __NUXT__ не найден — возможен static generate или CSR"
      },
      {
        "id": "103",
        "block": "N",
        "block_name": "Nuxt / SPA",
        "severity": "critical",
        "scope": "NUXT",
        "title": "H1 в исходном HTML — не только после гидрации JS",
        "how": "view-source",
        "status": "fail",
        "evidence": "H1 отсутствует в исходном HTML"
      },
      {
        "id": "104",
        "block": "N",
        "block_name": "Nuxt / SPA",
        "severity": "critical",
        "scope": "NUXT",
        "title": "`<title>` в исходном HTML — useHead/useSeoMeta отработал на сервере",
        "how": "view-source",
        "status": "fail",
        "evidence": "Title отсутствует в SSR HTML"
      },
      {
        "id": "105",
        "block": "N",
        "block_name": "Nuxt / SPA",
        "severity": "high",
        "scope": "NUXT",
        "title": "meta description в исходном HTML (не client-only)",
        "how": "view-source",
        "status": "fail",
        "evidence": "meta description только client-side?"
      },
      {
        "id": "106",
        "block": "N",
        "block_name": "Nuxt / SPA",
        "severity": "high",
        "scope": "NUXT",
        "title": "canonical в исходном HTML",
        "how": "view-source",
        "status": "warn",
        "evidence": "canonical не в initial HTML"
      },
      {
        "id": "107",
        "block": "N",
        "block_name": "Nuxt / SPA",
        "severity": "high",
        "scope": "NUXT",
        "title": "`/_nuxt/` assets — главный JS-бандл отдаёт 200 (не 404)",
        "how": "HEAD первого `/_nuxt/*.js`",
        "status": "fail",
        "evidence": "Не найден /_nuxt/*.js в HTML"
      },
      {
        "id": "108",
        "block": "N",
        "block_name": "Nuxt / SPA",
        "severity": "medium",
        "scope": "NUXT",
        "title": "`html lang=\"...\"` задан и соответствует локали URL",
        "how": "`<html lang>`",
        "status": "fail",
        "evidence": "html lang не задан"
      },
      {
        "id": "109",
        "block": "N",
        "block_name": "Nuxt / SPA",
        "severity": "critical",
        "scope": "NUXT",
        "title": "Нет паттерна пустого `#__nuxt`/`#app` (<200 символов видимого текста)",
        "how": "parse body text",
        "status": "fail",
        "evidence": "Пустой #__nuxt shell: 0 chars"
      },
      {
        "id": "110",
        "block": "N",
        "block_name": "Nuxt / SPA",
        "severity": "high",
        "scope": "NUXT",
        "title": "OG-теги в исходном HTML (не только после Vue mount)",
        "how": "view-source head",
        "status": "warn",
        "evidence": "OG только после гидрации"
      },
      {
        "id": "111",
        "block": "N",
        "block_name": "Nuxt / SPA",
        "severity": "medium",
        "scope": "NUXT",
        "title": "JSON-LD в исходном HTML для SEO-страниц",
        "how": "script ld+json",
        "status": "warn",
        "evidence": "JSON-LD не в initial HTML"
      },
      {
        "id": "112",
        "block": "N",
        "block_name": "Nuxt / SPA",
        "severity": "high",
        "scope": "NUXT",
        "title": "CLS: ≥50% `<img>` без width/height (типично для самописных Nuxt)",
        "how": "parse img attrs",
        "status": "pass",
        "evidence": "Нет img"
      },
      {
        "id": "113",
        "block": "N",
        "block_name": "Nuxt / SPA",
        "severity": "medium",
        "scope": "NUXT",
        "title": "Не более 10 blocking scripts в `<head>`",
        "how": "count script no defer/async",
        "status": "pass",
        "evidence": "0 blocking"
      },
      {
        "id": "114",
        "block": "N",
        "block_name": "Nuxt / SPA",
        "severity": "medium",
        "scope": "NUXT",
        "title": "Нет `<meta http-equiv=\"refresh\">` редиректа (soft SEO trap)",
        "how": "grep refresh",
        "status": "pass",
        "evidence": ""
      },
      {
        "id": "115",
        "block": "N",
        "block_name": "Nuxt / SPA",
        "severity": "high",
        "scope": "NUXT",
        "title": "Один `<title>` — layout + page не дублируют",
        "how": "count title tags",
        "status": "pass",
        "evidence": ""
      },
      {
        "id": "116",
        "block": "N",
        "block_name": "Nuxt / SPA",
        "severity": "high",
        "scope": "NUXT",
        "title": "i18n prefix: `/ru/` → lang=ru или hreflang ru",
        "how": "lang vs URL",
        "status": "pass",
        "evidence": ""
      },
      {
        "id": "117",
        "block": "N",
        "block_name": "Nuxt / SPA",
        "severity": "high",
        "scope": "NUXT",
        "title": "preload критичных шрифтов или CSS (не всё через JS)",
        "how": "link rel=preload",
        "status": "warn",
        "evidence": "Нет preload критичных ресурсов"
      },
      {
        "id": "118",
        "block": "N",
        "block_name": "Nuxt / SPA",
        "severity": "medium",
        "scope": "NUXT",
        "title": "`modulepreload` / prefetch для route chunks — признак нормального Nuxt build",
        "how": "link rel",
        "status": "warn",
        "evidence": "Нет modulepreload/prefetch"
      },
      {
        "id": "119",
        "block": "N",
        "block_name": "Nuxt / SPA",
        "severity": "critical",
        "scope": "NUXT",
        "title": "Нет `data-server-rendered=\"true\"` missing + empty body (CSR-only mode)",
        "how": "Nuxt 2 SSR marker / text",
        "status": "fail",
        "evidence": "Признаки CSR-only: пустой body без SSR marker"
      },
      {
        "id": "120",
        "block": "N",
        "block_name": "Nuxt / SPA",
        "severity": "medium",
        "scope": "NUXT",
        "title": "robots/noindex не задан ошибочно в nuxt.config через meta на prod",
        "how": "meta robots",
        "status": "pass",
        "evidence": "index по умолчанию"
      },
      {
        "id": "121",
        "block": "I",
        "block_name": "AI Readiness",
        "severity": "critical",
        "scope": "SITE",
        "title": "llms.txt на корне (`/llms.txt` → 200, не пустой)",
        "how": "GET /llms.txt",
        "status": "pass",
        "evidence": "llms.txt OK: # Quickex\n\n> Quickex is an instant crypto exchange and non-custodial crypto swap"
      },
      {
        "id": "122",
        "block": "I",
        "block_name": "AI Readiness",
        "severity": "critical",
        "scope": "SITE",
        "title": "PerplexityBot не заблокирован в robots.txt",
        "how": "robots UA matrix",
        "status": "pass",
        "evidence": "PerplexityBot: allowed"
      },
      {
        "id": "123",
        "block": "I",
        "block_name": "AI Readiness",
        "severity": "critical",
        "scope": "SITE",
        "title": "ClaudeBot / Anthropic-AI — осознанная политика доступа",
        "how": "robots UA matrix",
        "status": "pass",
        "evidence": "Claude crawlers: allowed"
      },
      {
        "id": "124",
        "block": "I",
        "block_name": "AI Readiness",
        "severity": "high",
        "scope": "SITE",
        "title": "GPTBot / ChatGPT-User — явная политика (не accidental block)",
        "how": "robots UA matrix",
        "status": "pass",
        "evidence": "GPTBot=allowed, ChatGPT-User=allowed"
      },
      {
        "id": "125",
        "block": "I",
        "block_name": "AI Readiness",
        "severity": "high",
        "scope": "SITE",
        "title": "Google-Extended / GoogleOther — training vs search разделены",
        "how": "robots UA matrix",
        "status": "warn",
        "evidence": "Google-Extended=allowed, GoogleOther=allowed — проверь training policy"
      },
      {
        "id": "126",
        "block": "I",
        "block_name": "AI Readiness",
        "severity": "medium",
        "scope": "SITE",
        "title": "Applebot-Extended доступен (Apple Intelligence citations)",
        "how": "robots UA matrix",
        "status": "pass",
        "evidence": "Applebot-Extended: allowed"
      },
      {
        "id": "127",
        "block": "I",
        "block_name": "AI Readiness",
        "severity": "high",
        "scope": "ALL",
        "title": "FAQPage schema на money/pillar страницах",
        "how": "JSON-LD type",
        "status": "warn",
        "evidence": "Нет FAQPage schema — AI engines хуже извлекают Q&A"
      },
      {
        "id": "128",
        "block": "I",
        "block_name": "AI Readiness",
        "severity": "medium",
        "scope": "ALL",
        "title": "Data tables — HTML `<table>` для AI citability",
        "how": "count table",
        "status": "warn",
        "evidence": "Нет data tables — ниже AI citability (forum: 4x citations с таблицами)"
      },
      {
        "id": "129",
        "block": "J",
        "block_name": "Безопасность",
        "severity": "critical",
        "scope": "SITE",
        "title": "Strict-Transport-Security (HSTS) в ответе сервера",
        "how": "response headers",
        "status": "fail",
        "evidence": "Нет Strict-Transport-Security"
      },
      {
        "id": "130",
        "block": "J",
        "block_name": "Безопасность",
        "severity": "high",
        "scope": "SITE",
        "title": "X-Content-Type-Options: nosniff",
        "how": "response headers",
        "status": "fail",
        "evidence": "Нет X-Content-Type-Options: nosniff"
      },
      {
        "id": "131",
        "block": "J",
        "block_name": "Безопасность",
        "severity": "high",
        "scope": "SITE",
        "title": "X-Frame-Options или CSP `frame-ancestors`",
        "how": "response headers",
        "status": "pass",
        "evidence": "Clickjacking protection OK"
      },
      {
        "id": "132",
        "block": "J",
        "block_name": "Безопасность",
        "severity": "medium",
        "scope": "SITE",
        "title": "Content-Security-Policy задан (не пустой)",
        "how": "response headers",
        "status": "pass",
        "evidence": "CSP задан (23 chars)"
      },
      {
        "id": "133",
        "block": "J",
        "block_name": "Безопасность",
        "severity": "high",
        "scope": "ALL",
        "title": "Mixed content — нет `http://` ресурсов на HTTPS странице",
        "how": "grep src/href",
        "status": "pass",
        "evidence": "Mixed content не найден"
      },
      {
        "id": "134",
        "block": "J",
        "block_name": "Безопасность",
        "severity": "medium",
        "scope": "SITE",
        "title": "Privacy policy — ссылка в footer / навигации",
        "how": "crawl homepage",
        "status": "pass",
        "evidence": "Privacy policy упоминается на homepage"
      },
      {
        "id": "135",
        "block": "J",
        "block_name": "Безопасность",
        "severity": "medium",
        "scope": "SITE",
        "title": "Контакты — email или телефон на сайте",
        "how": "visible text",
        "status": "pass",
        "evidence": "Контакт (email/phone) найден"
      },
      {
        "id": "136",
        "block": "K",
        "block_name": "Pro-архитектура",
        "severity": "critical",
        "scope": "ALL",
        "title": "Redirect chain ≤2 hops до финального URL",
        "how": "trace 3xx",
        "status": "pass",
        "evidence": "Redirect hops: 0"
      },
      {
        "id": "137",
        "block": "K",
        "block_name": "Pro-архитектура",
        "severity": "high",
        "scope": "ALL",
        "title": "Нет redirect loop",
        "how": "trace 3xx",
        "status": "pass",
        "evidence": "Redirect loop нет"
      },
      {
        "id": "138",
        "block": "K",
        "block_name": "Pro-архитектура",
        "severity": "high",
        "scope": "ALL",
        "title": "Канонический редирект 301 (не 302) где применимо",
        "how": "HEAD chain",
        "status": "pass",
        "evidence": "Permanent redirects или без редиректа"
      },
      {
        "id": "139",
        "block": "K",
        "block_name": "Pro-архитектура",
        "severity": "critical",
        "scope": "SITE",
        "title": "Уникальные title — нет дублей между страницами шаблона",
        "how": "cross-page scan",
        "status": "pass",
        "evidence": "Title уникален среди проверенных страниц"
      },
      {
        "id": "140",
        "block": "K",
        "block_name": "Pro-архитектура",
        "severity": "high",
        "scope": "SITE",
        "title": "Уникальные meta description — нет массовых дублей",
        "how": "cross-page scan",
        "status": "pass",
        "evidence": "Description уникален среди проверенных страниц"
      },
      {
        "id": "141",
        "block": "K",
        "block_name": "Pro-архитектура",
        "severity": "high",
        "scope": "ALL",
        "title": "Schema drift — JSON-LD name/title ≈ visible H1 (±40%)",
        "how": "compare ld+json",
        "status": "manual",
        "evidence": "Нет JSON-LD name для сравнения"
      },
      {
        "id": "142",
        "block": "K",
        "block_name": "Pro-архитектура",
        "severity": "medium",
        "scope": "ALL",
        "title": "Internal links ≥3 на странице (same-domain)",
        "how": "count a[href]",
        "status": "fail",
        "evidence": "Нет internal links на странице"
      },
      {
        "id": "143",
        "block": "K",
        "block_name": "Pro-архитектура",
        "severity": "medium",
        "scope": "SITE",
        "title": "Sitemap в robots.txt и sitemap.xml → 200",
        "how": "robots + GET",
        "status": "fail",
        "evidence": "sitemap.xml недоступен"
      },
      {
        "id": "144",
        "block": "K",
        "block_name": "Pro-архитектура",
        "severity": "high",
        "scope": "ALL",
        "title": "Self-referencing canonical (не chain на другой URL)",
        "how": "link rel=canonical",
        "status": "fail",
        "evidence": "Нет canonical"
      },
      {
        "id": "145",
        "block": "K",
        "block_name": "Pro-архитектура",
        "severity": "medium",
        "scope": "SITE",
        "title": "Googlebot не заблокирован (search ≠ training)",
        "how": "robots UA matrix",
        "status": "pass",
        "evidence": "Googlebot: allowed"
      }
    ]
  }
}