{
  "schema": 1,
  "product": "RAGRAF",
  "version": "0.4.0",
  "declared_at": "2026-10-27",
  "stage": "И31",
  "main": "README.md",
  "states": "docs/03_implementation/translations.json",
  "note": "Единственное место, где объявлено, ЧТО внутри ячейки таблицы защищено от перевода, каким видом объявлена каждая колонка и с какой строгостью защищённая часть требуется от перевода. До этапа И31 таблицы перевода проверялись только СЧЁТОМ: функция `section_profile` в `tools/check_translations.py` (строка 193) считает блоки команд и строки таблиц на каждый заголовок `##`, поэтому перевод, где в таблице метрик ячейка `2.0 / 3.1` стала `3,1 / 2,0`, а идентификатор операции `search` заменён переводом, проходил зелёным: число строк совпало. Замер 27.10.2026 до правки: таблиц 8 в каждом из шести файлов, содержательных строк 83, ячеек 197, столбцов от 2 до 6; расхождений защищённой части 5 в четырёх переводах (ru 1, de 1, es 1, hi 1, zh 2). Оба измеренных семейства названы здесь: переведённая подпись формата ссылки (`file:line` → `файл:строка`, `Datei:Zeile`, `archivo:línea`) объявлена ИСКЛЮЧЕНИЕМ с причиной по языку, а перестановка чисел внутри одной ячейки (`(12 of 13)` → `(13 में से 12)`) снята ПРАВИЛОМ сравнения набором, а не допуском: порядок чисел внутри ячейки — законная особенность языка, и объявлять его исключением значило бы объявлять исключением каждый такой случай. Объявление вынесено в данные по той же причине, что состояния переводов (`translations.json`), терминология (`glossary.json`), допуски прозы (`prose.json`), адреса (`addresses.json`) и правило команд (`commands.json`): строгость и перечень языков меняются правкой этого файла, а не правкой проверки. Расширять допуск или вносить исключение можно только решением владельца, названным числом, а не для того, чтобы прогон позеленел.",
  "cell_kinds": [
    {
      "name": "text",
      "about": "Переводимый текст: заголовок столбца, пояснение, фраза. Свободно переводится; сверяются только защищённые части внутри — обрамлённый код, адрес ссылки, числа и число разделителей `<br>`. Именно поэтому `up to 34 files` и `до 34 файлов` — одна и та же ячейка, а `2.0 / 3.1` и `3,1 / 2,0` — тоже: числа сравниваются значением и набором, а не порядком."
    },
    {
      "name": "code",
      "about": "Обрамлённый код: имя операции, имя файла, имя хранилища. Не переводится вовсе — читатель копирует его в команду или в путь. Кроме кода в такой ячейке допускаются только разделители (` / `, `, `), иначе объявление «столбец кода» описывало бы не тот файл. Замер 27.10.2026: так объявлены столбцы операций (34 строки), хранилищ, документов и тестов."
    },
    {
      "name": "number",
      "about": "Число: значение, а не текст. Сравнивается ЧИСЛОМ, поэтому `2,0` и `2.0` равны, `2 722` и `2722` равны, а `3,1` вместо `2,0` — находка. Допуск узкий: он касается разделителя дробной части и разделителя разрядов, и ничего больше. Замер 27.10.2026: так объявлены счётчики файлов, символов и рёбер в таблице корпусов и число проверок в таблице тестов."
    },
    {
      "name": "identifier",
      "about": "Идентификатор: имя корпуса, имя режима, значение перечисления (`C-02`, `degraded`, `full`). Сверяется точно и обязан быть печатным ASCII: это имя из вывода инструмента, а не слово языка. Замер 27.10.2026: так объявлены первый и последний столбцы таблицы корпусов — режим `degraded` в переводе остаётся `degraded`, потому что это значение `capability`, а не прилагательное."
    },
    {
      "name": "flag",
      "about": "Признак (да/нет): значение сверяется точно, как у идентификатора. Замер 27.10.2026: ни одна колонка основного документа этого вида НЕ использует — словарь называет вид, а объявление колонок описывает факт. Вид объявлен потому, что следующий шаг (строки списков) столкнётся с переводимыми признаками, и решение о них должно приниматься здесь, а не в коде проверки."
    },
    {
      "name": "link",
      "about": "Ссылка вида `[подпись](адрес)`: адрес сверяется точно — он ведёт на файл поставки и переводу не подлежит; подпись сверяется, если она обрамлена кодом (имя файла), и свободна, если это текст. Замер 27.10.2026: так объявлен столбец файлов в таблице лицензионных документов."
    }
  ],
  "parse_rule": {
    "about": "Правило разбора ячейки объявлено здесь, а не выведено кодом, потому что от него зависит и находка, и её отсутствие. Строка таблицы — строка, начинающаяся с `|`, вне блока ограждения; строка-разделитель (`|---|---|`) в содержательные не входит и по своему виду отличается от них. Пропавшая строка-разделитель — находка: без неё правило не отличает заголовок от данных.",
    "cells": "Ячейки делятся по `|`, но `|` ВНУТРИ обратных кавычек и экранированный `\\|` ячейку не делят. Иначе ячейка с образцом (`a|b`) разъехалась бы на две, и находка указала бы на соседний столбец — то есть на место, которого дефект не касается. Граница правила: `|` внутри адреса ссылки (`[a](b|c)`) ячейку ДЕЛИТ — в README.md такого нет, и объявление это называет, а не прячет.",
    "header": "Строка заголовка — НЕ данные: её ячейки переводимы свободно, каким бы видом ни был объявлен столбец. Вид колонки относится к строкам данных, и без этого разделения правило требовало бы оставить `Operation` в русском переводе — то есть требовало бы непереведённого документа. Замер 27.10.2026: заголовки всех 8 таблиц переведены во всех пяти переводах, и ни один из них находкой не является; защищённые части внутри заголовка (`код`, адреса, числа) при этом сверяются как везде.",
    "decimal": "Число сравнивается значением: разряды отделяются пробелом или неразрывным пробелом и при сравнении снимаются, дробная часть — точкой или запятой, и оба разделителя считаются одним и тем же. Это узкий допуск, снятый замером: в переводах ru, de, es, hi и zh дробная часть законно пишется запятой (`2,0 / 3,1`), и требовать точку значило бы требовать правки текста там, где перевод прав. Число, записанное словом или цифрой в другом месте ячейки, — находка.",
    "comparison": "Сверяются по порядку: обрамлённый код, адреса ссылок, число разделителей `<br>`. Числа сверяются НАБОРОМ с учётом кратности, а не последовательностью: языки меняют порядок внутри ячейки (`(12 of 13)` → `(13 में से 12)`, `1 MB per 1–2 source files` → `每 1–2 个源文件 1 MB`), и это замерено, а не предположено. Позиции чисел между ЯЧЕЙКАМИ и между СТРОКАМИ по-прежнему сравниваются, поэтому подмена местами значений двух столбцов остаётся находкой: каждая ячейка сверяется со своей.",
    "boundary": "Правило повторено по виду документов, а не выведено из разметки Markdown: обратные кавычки считаются парными, заголовок внутри таблицы не распознаётся, отрисовка таблицы GitHub не воспроизводится (ширина `---` не сравнивается), перенос строки внутри ячейки сверяется по числу `<br>`, а не по тому, что покажет браузер. Ошибка правила опасна в одну сторону: ложная находка требует правки текста перевода, пропуск оставляет расхождение незамеченным. Замер 27.10.2026: все 197 ячеек шести файлов разобраны этим правилом, разъехавшихся ячеек нет — поэтому правило принято как рабочее."
  },
  "baseline": {
    "date": "2026-10-27",
    "stage": "И31",
    "tool": "tools/check_table_rows.py",
    "main_file": "README.md",
    "tables": 8,
    "rows": 83,
    "cells": 197,
    "rows_per_table": [7, 34, 4, 8, 11, 7, 6, 6],
    "columns": [
      ["text", "text", "text"],
      ["code", "text"],
      ["code", "text"],
      ["text", "text"],
      ["code", "text"],
      ["code", "number"],
      ["identifier", "text", "number", "number", "number", "identifier"],
      ["text", "link"]
    ],
    "note": "Объявленный описной перечень основного документа: таблицы, их строки, их столбцы и вид каждой колонки. Проверка сверяет с ним ИЗМЕРЕННОЕ: ячейка или колонка, добавленная либо пропавшая в README.md, — это решение, которое записывается здесь, а не молчаливое изменение замера. Числа сняты 27.10.2026 вызовом инструмента: 8 таблиц, 83 содержательные строки (заголовки входят), 197 ячеек, столбцов 3, 2, 2, 2, 2, 2, 6, 2. Виды колонок сняты осмотром тех же строк: таблица метрик — три переводимых столбца (числа внутри ячеек защищает правило, а не вид колонки, потому что рядом с числом стоит переводимая фраза); таблица операций — имя операции кодом и пояснение текстом; таблица требований — оба столбца переводимые (в них встречаются и код, и числа, и они защищены правилом); таблица тестов — имя файла кодом и число проверок числом; таблица корпусов — имя корпуса и режим идентификаторами, три счётчика числами, тип текстом; таблица документов обвязки — вопрос текстом, файл ссылкой."
  },
  "languages": {
    "ru": {
      "path": "community/README.ru.md",
      "cell_tolerance": 0,
      "exceptions": [
        {
          "table": 1,
          "row": 7,
          "column": 1,
          "main": "Verifiability (facts carrying `file:line`)",
          "reason": "подпись формата ссылки переведена словами языка перевода (`файл:строка`, строка 56). Это допустимо и полезно: в русском документе ссылка на факт называется «файл:строка» во всех разделах, и оставить `file:line` значило бы ввести в русский текст английский термин ради проверки. Фактический вывод инструмента (`path:line` в примерах кода) этим исключением не затронут: его сторожит проверка блоков команд (этап И30), где расхождение было бы находкой"
        }
      ],
      "note": "замер 27.10.2026 до правки: 1 расхождение из 197 ячеек — переведённая подпись формата ссылки; числа, код и адреса совпадают. Дробная часть с запятой (`2,0 / 3,1`) находкой не считается: разделитель объявлен правилом сравнения"
    },
    "de": {
      "path": "community/README.de.md",
      "cell_tolerance": 0,
      "exceptions": [
        {
          "table": 1,
          "row": 7,
          "column": 1,
          "main": "Verifiability (facts carrying `file:line`)",
          "reason": "подпись формата ссылки переведена словами языка перевода (`Datei:Zeile`, строка 56) — то же решение, что в русском переводе, и по той же причине: описание формата ссылки в немецком тексте называется по-немецки, а примеры вывода инструмента остаются в блоках команд и сторожатся отдельной проверкой"
        }
      ],
      "note": "замер 27.10.2026 до правки: 1 расхождение из 197 ячеек — переведённая подпись формата ссылки; код, числа и адреса совпадают"
    },
    "es": {
      "path": "community/README.es.md",
      "cell_tolerance": 0,
      "exceptions": [
        {
          "table": 1,
          "row": 7,
          "column": 1,
          "main": "Verifiability (facts carrying `file:line`)",
          "reason": "подпись формата ссылки переведена словами языка перевода (`archivo:línea`, строка 56) — то же решение, что в русском и немецком переводах: формат ссылки в испанском тексте назван по-испански, а примеры вывода инструмента сторожатся проверкой блоков команд"
        }
      ],
      "note": "замер 27.10.2026 до правки: 1 расхождение из 197 ячеек — переведённая подпись формата ссылки; код, числа и адреса совпадают"
    },
    "hi": {
      "path": "community/README.hi.md",
      "cell_tolerance": 0,
      "exceptions": [],
      "note": "замер 27.10.2026: расхождений защищённой части нет ни одного. Черновой замер называл одно расхождение — порядок чисел в ячейке (`13 में से 12` вместо `12 of 13`); оно снято ПРАВИЛОМ сравнения набором, а не исключением, потому что порядок чисел внутри ячейки — законная особенность языка"
    },
    "zh": {
      "path": "community/README.zh.md",
      "cell_tolerance": 0,
      "exceptions": [],
      "note": "замер 27.10.2026: расхождений защищённой части нет ни одного. Черновой замер называл два — порядок чисел в двух ячейках (`13 次中 12 次`, `每 1–2 个源文件 1 MB`); оба сняты ПРАВИЛОМ сравнения набором, а не исключением"
    }
  }
}
