{
  "schema": 1,
  "product": "RAGRAF",
  "version": "0.4.0",
  "declared_at": "2026-10-27",
  "stage": "И29",
  "main": "README.md",
  "states": "docs/03_implementation/translations.json",
  "note": "Единственное место, где объявлено, ЧТО считается адресом документа и с какой строгостью его требует перевод. До этапа И29 адреса проверялись наполовину: tools/check_translations.py отбрасывал всё, что начинается с http://, https://, mailto:, ftp:// и #, и сверял только ОТНОСИТЕЛЬНЫЕ цели, поэтому внешняя ссылка и якорь в переводе не сторожились никем. Замер 27.10.2026 до правки: в README.md восемь внешних адресов (четыре изображения-бейджа, три цели ссылок и две страницы вики), пять изображений (четыре бейджа и обложка assets/social-preview.png), тринадцать якорей на одиннадцать различных заголовков — и все они есть в каждом из пяти переводов, лишних нет. Свойство выполнялось, но НЕ ПРОВЕРЯЛОСЬ: замена ссылки на «см. репозиторий» или якорь в никуда проходили зелёными, потому что считать их было нечем. Объявление вынесено в данные по той же причине, что состояния переводов (translations.json), терминология (glossary.json) и допуски прозы (prose.json): строгость и перечень языков меняются правкой этого файла, а не правкой кода. Строгость СНЯТА ЗАМЕРОМ и равна нулю по всем трём видам: расхождений в пяти переводах нет, поэтому допуск на число повторов — 0, порядок якорей требуется. Расширять допуск можно только решением владельца, названным числом, а не для того, чтобы прогон позеленел.",
  "kinds": [
    {
      "name": "external",
      "about": "Цель ссылки или источник изображения с внешней схемой: http://, https://, mailto:, ftp://. Требуется тем же ТЕКСТОМ цели: сравнивается точное написание адреса, поэтому http вместо https, другой хост или пропавший параметр запроса — находка. Число повторов сверяется по кратности: адрес, названный в основном документе дважды, а в переводе один раз, — находка."
    },
    {
      "name": "image",
      "about": "Изображение в разметке — `![подпись](источник)` — независимо от того, внешний источник или относительный (обложка assets/social-preview.png относительная). Именно этот вид пропускал прежний замер ссылок этапа И20: шаблон исключал изображения, и битая обложка была у читателя при зелёной проверке."
    },
    {
      "name": "anchor",
      "about": "Ссылка вида `#…`: цель внутри того же файла. Текст якоря НЕ сравнивается с основным документом — заголовки перевода переведены, и слаг у них свой (немецкий `#inhalt` против английского `#contents`). Проверяются два свойства: якорь указывает на существующий заголовок СВОЕГО файла и порядок якорей повторяет порядок основного документа, то есть k-й якорь ведёт в раздел с тем же номером, что k-й якорь README.md."
    }
  ],
  "anchor_rule": {
    "name": "GitHub slug",
    "about": "Слаг заголовка: текст без HTML-тегов и разметки, в нижнем регистре; буквы, знаки письма (диакритика деванагари и арабской вязи — знаки письма, а не пунктуация), цифры, дефис и подчёркивание сохраняются; пробелы становятся дефисом; прочая пунктуация удаляется; совпадающие слаги в одном файле получают суффиксы -1, -2 по порядку.",
    "boundary": "Правило повторено по документации GitHub, а не вызовом его кода: сети у проверки нет. Поэтому якорь сверяется с заголовками СВОЕГО файла — там обе стороны считаются одним правилом, — а совпадение с тем, что построит GitHub при отрисовке, названо границей, а не проверенным свойством. Ошибка этого правила опасна в одну сторону: ложная находка требует правки текста перевода, пропуск оставляет битый якорь. Замер 27.10.2026: все тринадцать якорей в каждом из пяти переводов разрешаются этим правилом, включая деванагари (знаки письма без которых слаг не совпал бы) и иероглифы, — поэтому правило принято как рабочее."
  },
  "baseline": {
    "date": "2026-10-27",
    "stage": "И29",
    "tool": "tools/check_document_addresses.py",
    "external": 8,
    "images": 5,
    "anchors": 13,
    "distinct_anchors": 11,
    "headings": 20,
    "note": "Объявленный описной перечень основного документа. Проверка сверяет с ним ИЗМЕРЕННОЕ: адрес, появившийся или пропавший в README.md, — это решение, которое записывается здесь числом, а не молчаливое изменение замера. Числа сняты 27.10.2026 вызовом инструмента; до работы тот же замер, сделанный черновым шаблоном, дал ШЕСТЬ внешних адресов вместо восьми: шаблон `!?\\[[^\\]]*\\]\\(([^)]+)\\)` на бейдже вида `[![CI](badge.svg)](url)` совпадал с ВНУТРЕННИМ изображением и терял цель внешней ссылки, поэтому адреса `…/actions/workflows/ci.yml` и `…/releases` в замер не попадали. Разбор вложенной разметки — не украшение проверки: без него два адреса из восьми не осматривались вовсе."
  },
  "languages": {
    "ru": {
      "path": "community/README.ru.md",
      "require_order": true,
      "repeat_tolerance": 0,
      "note": "замер 27.10.2026: 8 внешних адресов, 5 изображений, 13 якорей на 11 заголовков, 20 заголовков; расхождений нет"
    },
    "de": {
      "path": "community/README.de.md",
      "require_order": true,
      "repeat_tolerance": 0,
      "note": "замер 27.10.2026: 8 внешних адресов, 5 изображений, 13 якорей, 20 заголовков; расхождений нет"
    },
    "es": {
      "path": "community/README.es.md",
      "require_order": true,
      "repeat_tolerance": 0,
      "note": "замер 27.10.2026: 8 внешних адресов, 5 изображений, 13 якорей, 20 заголовков; расхождений нет"
    },
    "hi": {
      "path": "community/README.hi.md",
      "require_order": true,
      "repeat_tolerance": 0,
      "note": "замер 27.10.2026: 8 внешних адресов, 5 изображений, 13 якорей, 20 заголовков; расхождений нет"
    },
    "zh": {
      "path": "community/README.zh.md",
      "require_order": true,
      "repeat_tolerance": 0,
      "note": "замер 27.10.2026: 8 внешних адресов, 5 изображений, 13 якорей, 20 заголовков; расхождений нет"
    }
  },
  "allowances": []
}
