# 06. Тестовые данные (реальная группа «Русский бисквит») Все файлы — реальная первичка одной группы компаний, полученная от аналитиков ДКБ. Живут в отдельном репозитории `arm-ka-fixtures` (workspace: `fixtures/`) **с исходными именами**, не переименовывать: имена тоже тест. Данные содержат наименования контрагентов и ИНН реальных организаций — репозиторий внутренний, наружу не выносить. > **Фикстуры ≠ спецификация.** Это выгрузки из одной конфигурации 1С у двух организаций. ОСВ других клиентов будут > отличаться: другие колонки, другой порядок субконто, без outline level, другие заголовки, несколько листов, ББ/ОФР > в Excel. Всё, что ниже в §3 «показали файлы», — наблюдения для регрессии и для словарей синонимов, а не правила > парсера. Правила — `05-domain-rules.md` §1.0 и §12. ## 1. Периметр | Организация | ИНН | Роль в группе | Что есть | |---|---|---|---| | АО «Русский бисквит» (АО РБ) | 3528052718 | заёмщик, фактически головная | ОСВ 01, 02, 58, 60, 62, 66, 67, 76 за 1–3 кв. 2024, 2024 г., 1–3 кв. 2025; ББ/ОФР за 9 мес. 2024, 2024 г., 1 кв. 2025, 1 полуг. 2025, 9 мес. 2025; расшифровки на 01.10.24, 01.04.25, 01.07.25; анализ заёмщика | | ООО «Пекарня «Счастливочная» | 3528… (есть в ББ) | поручитель, дочерняя/связанная | ОСВ 01, 02, 58, 60, 62, 66, 67, 76 за 1–3 кв. 2024, 2024 г., 1–3 кв. 2025; ББ/ОФР (сканы «БО …»); анализ поручителя | | Прочие контрагенты из ОСВ | ОАО «ЧКФ» (аренда), ООО «Лидер», ООО «ОФГ» (займы), Россельхозбанк, ВТБ, Сбербанк и др. | внешние / возможно ГК | нужны для проверки признака ГК vs Внешний | Внутригрупповые связи, видимые в ОСВ (для тестов матчинга ВГО): - У «Счастливочной» в ОСВ 62 контрагент **«Русский бисквит», ИНН 3528052718** (Дт 62.01 ≈ 106,3 млн на 30.09.2024, Кт 62.02 авансы 14,2 млн). Зеркально у АО РБ в ОСВ 60 контрагент записан как **«Юг-Финанс / ПЕКАРНЯ СЧАСТЛИВОЧНАЯ»** (без ИНН, иногда с пробелом в конце; Кт 60.01 на 30.09.2024 = 106 311 116,46 — совпадает копейка в копейку с Дт 62.01 у Счастливочной) — идеальный тест резолва по алиасу и точного матча 1:1 по правилу № 6. - У АО РБ в ОСВ 66 за 3 кв. 2024: заём 42 000 000 от «Юг-Финанс / ПЕКАРНЯ СЧАСТЛИВОЧНАЯ» (66.03) и проценты (66.04) — зеркало должно быть у Счастливочной на 58.03 (правило № 4) и 76 (проценты, правило № 5). - «ЧКФ АО» (ОАО «ЧКФ») — у АО РБ на 58.03 (заём 10 млн), 60, 76 (аренда/лизинг, крупные суммы на 76.07.x) — скорее всего третий участник ГК; есть ли он в периметре ГСК — уточнить у аналитиков. Пара 76.07.x ↔ 03/01 — тест правила № 1. - «ОФГ ООО» (займы 66.03/66.04, 62), «Лидер ОП», «ЛИДЕР-КРЫМ ООО», «ТЕХНОЛИДЕР ООО» — кандидаты на ГК vs Внешний. - ОСВ 58.03 АО РБ за 3 кв. 2024: займы выданные «МАЛЕЧКИНСКАЯ ПТИЦЕФАБРИКА ООО» (75 млн, ИНН 3523023093 — есть в ОСВ 62 Счастливочной) и «РБ ТК» (13,1 млн) — почти наверняка участники ГК «Русский бисквит»; ОСВ по ним в наборе нет (OQ-25). В этом файле уровень 1 — сразу контрагент (счёт в шапке уже субсчёт), уровень 2 — договор. Эталон результата: `Консолидация_Группа РБ.xlsx` — ручная консолидация аналитика на 01.10.2024, 01.01.2025, 01.04.2025, 01.07.2025, 01.10.2025 (листы по датам). На листе `01.10.2024` видно ожидаемые «в т. ч. взаимные обязательства» по статьям (напр., 1150: 51 577; 1230: 4 814 у АО РБ и 108 062 у Счастливочной; 1250: 42 000 у Счастливочной). Это **golden-данные для интеграционных тестов** консолидации (с допуском на ручные правки аналитика). ## 2. Инвентарь ОСВ (xls/xlsx из 1С 8.3) Формат имени в наборе аналитиков сильно варьируется — это намеренно хорошие тесты для парсера шапки, а не имени файла. ### АО «Русский бисквит» | Счёт | 1 кв. 2024 | 2 кв. 2024 | 3 кв. 2024 | 2024 г. | 1 кв. 2025 | 2 кв. 2025 | 3 кв. 2025 | |---|---|---|---|---|---|---|---| | 01 | — | — | `сч 01.xlsx` (306 стр., 24 кол.) | `ОСВ_01_ОС по субсчетам.xlsx` | `ОСВ сч 01 за 1 кв 2025 год.xlsx` | — | `ОСВ сч 01 за 3 кв 2025г.xlsx` | | 02 | — | — | — | `ОСВ_02_ОС по субсчетам.xls` | `ОСВ сч 02 за 1 кв 2025 год.xlsx` | `сч 02.xlsx` | `ОСВ сч 02 за 3 кв 2025г.xlsx` | | 58 | — | — | `сч 583_3 кв 2024.xlsx` (**по субсчёту 58.03**) | `ОСВ_58 за 2024.xls` | `ОСВ сч 58 за 1 кв 2025 год.xlsx` | `сч 58.xlsx` | `ОСВ сч 58 за 3 кв 2025г.xlsx` | | 60 | `сч 60_ 1 кв 2024 г.xlsx` (626 стр.) | `сч 60_ 2 кв 2024 г.xlsx` | `сч 60_3 кв 2024.xlsx` | `ОСВ_60 за 2024.xls` (1045 стр.) | `ОСВ сч 60 за 1 кв 2025 год.xlsx` | `сч 60.xlsx` | `ОСВ сч 60 за 3 кв 2025г.xlsx` | | 62 | `сч 62_ 1 кв 2024 г.xlsx` | `сч 62_ 2 кв 2024 г.xlsx` | `сч 62_3 кв 2024.xlsx` | `ОСВ_62_по субсчетам и поставщикам.xls` | `ОСВ сч 62 за 1 кв 2025 год.xlsx` | `сч 62.xlsx` | `ОСВ сч 62 за 3 кв 2025г.xlsx` | | 66 | — | — | `сч 66_3 кв 2024.xlsx` | `ОСВ_66 за 2024.xls` | `ОСВ сч 66 за 1 кв 2025 год.xlsx` | `сч 66.xlsx` | `ОСВ сч 66 за 3 кв 2025г.xlsx` | | 67 | — | — | `сч 67_3 кв 2024.xlsx` | `ОСВ_67 за 2024.xls` | `ОСВ сч 67 за 1 кв 2025 год.xlsx` | `сч 67.xlsx` | `ОСВ сч 67 за 3 кв 2025г.xlsx` | | 76 | — | — | `сч 76_3 кв 2024.xlsx` | `ОСВ_76 за 2024.xls` | `ОСВ сч 76 за 1 кв 2025 год.xlsx` | `сч 76.xlsx` | `ОСВ сч 76 за 3 кв 2025г.xlsx` | ### ООО «Пекарня «Счастливочная» (имена `Оборотносальдовая ведомость по счету NN за … г..xlsx|xls`) | Счёт | 1 кв. 2024 | 2 кв. 2024 | 3 кв. 2024 | 2024 г. | 1 кв. 2025 | 2 кв. 2025 | 3 кв. 2025 | |---|---|---|---|---|---|---|---| | 01 | — | — | xls | xlsx | xlsx | xlsx | xlsx | | 02 | — | — | xls | xlsx | xlsx | xlsx | xlsx | | 58 | — | — | — | xlsx | xlsx | xlsx | xlsx | | 60 | xls | xls | xls | xlsx | xlsx | xlsx | xlsx | | 62 | xls | xls | xls | xlsx | xlsx | xlsx | xlsx | | 66 | — | — | — | xlsx | xlsx | xlsx | xlsx | | 67 | — | — | — | xlsx | xlsx | xlsx | xlsx | | 76 | xls | xls | xls | — | xlsx | xlsx | — | (17 файлов Счастливочной за 2025 и 2024 г. — 62/67/66/58/76 — лежат в Project claude.ai, но в эту сессию не попали из-за лимита доставки; они есть у пользователя.) ## 3. Что показали реальные файлы (требования к парсеру) Наблюдения, которых **нет в ТЗ**, но которые ломают наивный парсер: 1. **Шапка везде вариант 1** («Оборотно-сальдовая ведомость по счету NN за <период>»), организация — в r1, параметры — r7, таблица с r9. Но заголовок таблицы может быть 2 или 3 строки (`Счет / Контрагенты / Договоры`; `Счет / Подразделение / Контрагенты ИНН`). 2. **Позиции колонок сумм плавают**: у АО РБ Дт-начало в E, Кт-начало в H, обороты в J/L, конец в O/Q; у Счастливочной — G/J, K/N, Q/S (2024, xls) или H/J, L/O, Q/S. Колонка ИНН — E (только у Счастливочной). Определять по тексту заголовка. 3. **Мусор правее таблицы**: в xls Счастливочной 62 за 3 кв. 2024 в колонках T/U стоят числа; в xlsx АО РБ 62 за 2024–2025 у контрагентских строк встречаются «хвостовые» ячейки с дробями вроде `8.577e+00` или `8.76e-06` (остатки формул аналитика). Границу таблицы задаёт заголовок; всё правее последней «Кредит» — игнорировать. 4. **Уровни группировки** (outline level): 0 — счёт верхнего уровня и «Итого»; 1 — субсчёт; дальше — субконто по схеме. У АО РБ ОСВ 60: 60 (0) → 60.01 (1) → контрагент (2); ОСВ 66: 66 → 66.01 → контрагент (2) → договор (3). У Счастливочной ОСВ 62: 62 → 62.01 → подразделение «БП Аренда» (2) → контрагент с ИНН (3). 5. **Строка «Итого»** — последняя, level 0, равна строке счёта верхнего уровня. 6. **Пустые ячейки** = нет значения (NULL), не ноль. Значения — числа (`#,##0.00`), не текст. 7. **ОСВ по субсчёту** (`сч 583_3 кв 2024.xlsx`: «по счету 58.03») — `osv_account_code = '58.03'`, `account_root = '58'`; чек-лист по счёту 58 этим файлом не закрывается полностью — решить правило [открыто]. 8. **Квартальные vs нарастающие**: ОСВ «за N квартал» у обеих компаний — **квартальные**: у АО РБ ОСВ 60 opening 1 кв. 2024 = 260,1 млн, opening 2 кв. = 311,96 млн = closing 1 кв., opening 3 кв. = 558,8 млн ≈ closing 2 кв. (559,3 млн — расхождение 0,5 млн: исправительные проводки задним числом, тоже реальный кейс). «За 2024 г.» — годовые. Проверять по данным, не только по тексту. 9. **Валюта**: `Валюта БУ, НУ: RUB` или `руб.` — равнозначно. Строк Вал./Кол. в этом наборе нет, но ТЗ их описывает (ОСВ 60.32 в у. е.) — закрыто синтетикой `s04` (§7). 10. **Названия субсчетов** в строках счёта могут присутствовать («60.01, Расчеты с поставщиками») или нет — в этом наборе нет; поддержаны оба, синтетика `s09` (§7). 11. **Контрагенты-физлица** и ИП («Абрамова Татьяна Викторовна (Перевозчик)», «Аверина Е.И. ИП», «Ведомость в счет з/платы») — не ЮЛ; резолв даёт NULL, тип «Внешний». Суффиксы в скобках — часть имени. 12. **xls (BIFF8)** читается `xlrd` (`formatting_info=True` для outline level через `rowinfo_map`); **xlsx** — `openpyxl` (не `read_only`, иначе нет `row_dimensions[].outline_level`). XLSB — `pyxlsb` (в реальном наборе нет; ТЗ требует; есть только рукописный синтетический `s13`, см. §7). 13. Размеры: до ~1000 строк, до 330 КБ; 2280 merged-диапазонов в файле на 677 строк — не падать на merged. 14. **Две пустые ОСВ**: `schastl/2025-Q2/…по счету 58 за 2 квартал 2025 г..xlsx` и `…по счету 66 за 2 квартал 2025 г..xlsx` — заголовок и сразу «Итого», строк данных нет. Штатный случай: `done`, `hierarchy=trivial`, `metrics.rows = 0`. 15. **Буквенные субсчета 1С** «76.АВ», «76.ВА», «76.ОТ» — в 8 файлах ОСВ 76 (АО РБ: 2024 г., 3 кв. 2024, 1–3 кв. 2025; Счастливочная: 1–3 кв. 2024). Это счета (ACCOUNT), а не контрагенты; регулярка кода счёта допускает 1–3 заглавные буквы в сегменте субсчёта (§1.3 п. 1 правил). 16. **Сальдо родителя нетто, детей развёрнуто**: 1С показывает счёт свёрнутым сальдо (62 = 16,1 млн Дт), а субсчета — развёрнутым (62.01 = 40,2 млн Дт, 62.02 = 24,1 млн Кт); без учёта этого 32 из 66 файлов не сходились бы по колонкам (§1.4 правил, R-21). 17. **ИНН внутри текста строки**: у Счастливочной в ОСВ 76 за 1–3 кв. 2024 встречаются контрагенты вида «Полиграф, 3528315710» (20 строк) без колонки ИНН; парсер ИНН из текста не извлекает (OQ-100). ## 4. ББ / ОФР (PDF) и ответы ИС Сканирование | Файл | Орг. | Период | Тип | |---|---|---|---| | `АО РБ_ф.1_ 2024 год.pdf`, `АО РБ_ф.2_ 2024 год.pdf` | АО РБ | 2024 г. | машиночитаемый PDF (форма 66н), 3 + 2 стр. | | `Отчетность 30092024 РБ.pdf` | АО РБ | 9 мес. 2024 | скан с OCR-слоем, 5 стр. | | `Бухгалтерская отчетность 1 кв.25.pdf` | АО РБ | 1 кв. 2025 | скан, 6 стр. | | `Бух отчетность за 2 кв 2025г.pdf` | АО РБ | 1 полуг. 2025 | PDF с текстом, 7 стр. | | `Бухгалтерская отсчетность 9 мес.25.pdf` | АО РБ | 9 мес. 2025 | скан, 8 стр. | | `БО 31.12.2024.pdf` | Счастливочная (предп.) | 2024 г. | машиночитаемый, 11 стр. (полный комплект) | | `БО 9 мес. 2024 год скан.PDF`, `БО 1 кв 2025.PDF`, `БО за полугодие 2025 год. скан с подписями.PDF`, `БО за 9 месяцев 2025.PDF` | Счастливочная (предп.) | соотв. | сканы 4–5 стр. | | `aep_4.PDF`, `aep_5.PDF` | разные | — | выписки из ГИР БО (ресурс БФО) — другой шаблон, для теста классификации | | `aep_6…9, aep_30…34 (pdf)` + `*_aep_N.json` (в Project docs) | разные | — | **пары «вход OCR → выход OCR»** от ИС Сканирование: фикстуры контракта `scan-gateway` | JSON `aep_*.json` — реальные ответы Content AI: структура `data_ocr[].table_structure.rows[].cells[]`, confidence в процентах (100.0), поле организации может называться иначе, чем в ТЗ — нормализацию делать по этим файлам, а не по ТЗ. В фикстурах встречаются файлы с ББ **и** ОФР в одном PDF (→ два `document` из одного `stored_file`). ## 5. Прочее - `Форма расшифровки к отчетности 01 10 24 / 01 04 25 / 01 07 25.xlsx` — расшифровки АО РБ (кредиты и займы, дебиторы и кредиторы с ИНН, поручительства, аренда, лизинг/залог, «К балансу»). Полезны как независимый источник ИНН контрагентов и для будущего `DISCLOSURE`. - `Копия Рекомендуемые формы расшифровок_РБ копия на 30.09.25.xlsx` — рекомендуемые банком формы расшифровок по строкам ББ (1110, 1120, 1150 …) с данными на 30.06 и 30.09.2025 по участникам группы. - `Анализ Русский бисквит_заемщик 01102025.xlsx`, `Анализ Счастливочная_поручитель 01102025.xlsx` — макросные книги «Альбома инструментов и стандартов кредитования» (БлокТ32): листы «Отчетность», «Экспресс-анализ», «ЗАКЛ_лимит», «ЗАКЛ_сделка», «П2_ОД-2967», «Профсуждение» — контекст для будущей формы 276-ОД, не для первых срезов. - `diagrams_v5.12.zip` → `docs/model/diagrams/` (part01…09 svg/png). ## 6. Раскладка репозитория `arm-ka-fixtures` (workspace `fixtures/`) ``` fixtures/ README.md # откуда данные, ограничения доступа osv/ rb/ 2024-Q1/ 2024-Q2/ 2024-Q3/ 2024-FY/ 2025-Q1/ 2025-Q2/ 2025-Q3/ # файлы с исходными именами schastl/ ... synthetic/ README.md + s01…s16 (генератор в tabular-parser, §7) statements/ rb/ schastl/ gir-bo/ # pdf statements-xlsx/ # ББ/ОФР в Excel (§12): лист «Отчетность» из Анализ*.xlsx, # рекомендуемые формы банка, выгрузки 1С — собрать у аналитиков ocr/ aep_N.pdf|PDF + aep_N.json # пары вход/выход ИС Сканирование (эмулятор ИС # в scan-gateway ищет `.json` по имени входного # файла без расширения, регистр его расширения для # эмулятора неважен; важен путь самого входного файла # `aep_5.PDF`: на регистрозависимой ФС (Linux) он ищется # буквально) golden/ Консолидация_Группа РБ.xlsx # эталон КФО по датам expected_osv_parse/<зеркало osv/ без расширения>.json # golden-снимки парсера ОСВ: 82 файла (66 реальных + 16 синтетических) directories/ ecp-export-russkiy-biskvit.xlsx # срез выгрузки ЕЦП CRM по ГК «Русский Бисквит» (Срез 1) ``` `directories/` содержит срез выгрузки ЕЦП CRM по группе «Русский бисквит» (Срез 1, §6.1). ### 6.1 `directories/ecp-export-russkiy-biskvit.xlsx` — фикстура импорта справочников (Срез 1) Срез реальной выгрузки ЕЦП CRM (`docs/source/biq/ecp-export-lagal-entity.xlsx`, лист «Выписки_01.04.26»; формат импорта — `05-domain-rules.md` §13) по одной ГК. Тот же формат колонок: `ИНН`, `iD ГК`, `Базовый РФ ГК в CRM`, `Группа компаний`, `Организация`, `ГСК`, `ГСЗ`, `Тип`. Используется тестами импорта `arm-core` (`tests/` Среза 1). | Что | Значение | |---|---| | Строк данных | 21 (+ строка заголовков) | | ГК | одна: «Русский Бисквит», `iD ГК` = `1-AZFL6BQ`; базовый РФ — «Санкт-Петербургский РФ» | | Импортируется | 20 ЮЛ/ИП: 18 ЮЛ + 2 ИП | | Пропускается | 1 строка типа `ФЛ` (ИНН совпадает с ИП `352819549855`) → `UNSUPPORTED_TYPE` (проверка типа идёт раньше проверки дубля, поэтому `DUPLICATE_IN_FILE` в этом файле не возникает) | | Члены ГСК (флаг «входит в ГСК») | АО «Русский бисквит» `3528052718` и ООО «Пекарня Счастливочная» `3528104476` → одна ГСК «Русский Бисквит» | | ГСЗ | флагов нет — ГСЗ не создаётся | | Кандидаты OQ-25 | ЧКФ, ОФГ, Малечкинская птицефабрика, ТК РБ — в составе ГК, но без флага ГСК | Ожидаемый отчёт на пустой БД: `rows = 21`, `groups_created = 1`, `offices_created = 1`, `entities_created = 20`, `memberships_created = 2`, `errors = 1`. Полная выгрузка (8400 строк, 345 ГК) в `fixtures/` не копируется — лежит в `docs/source/biq/` (внутренние данные) и нужна для прогона импорта целиком. Справочники **продукта** — план счетов, правила элиминации, права и роли, состав обязательных документов, региональные офисы — не фикстуры, а seed ядра: `arm-core/api/seed/core/` (обязательные данные: `roles.yaml`, `permissions.yaml`, `role_permissions.yaml`, `regional_office.yaml`, `chart_of_accounts.csv`, `elimination_rules_v1.yaml`, `required_document_rules.yaml`) и `arm-core/api/seed/dev/` (только `python -m scripts.seed --dev`: dev-пользователи и примеры РФ). Загрузчик — `python -m scripts.seed [--dev]` из `arm-core/api/` (идемпотентен, upsert по натуральному ключу; в compose его выполняет одноразовый сервис `arm-core-migrate`). Здесь остаются только тестовые данные группы. Полный план счетов 1С из бандла макета не передан — seed строится на Плане счетов 94н и типовых субсчетах 1С (OQ-47). Первый прогон парсера на `osv/**` сохранён как `expected_osv_parse/*.json` после ручной сверки итогов со строкой «Итого» (§7) — дальше это regression-набор. ## 7. Синтетика, golden-снимки и xlsb парсера ОСВ (Срез 2a) Реальные файлы покрывают один вариант шапки и один формат файла (xls/xlsx из 1С 8.3). Остальное — синтетика `fixtures/osv/synthetic/` (вымышленные организации и ИНН; суммы согласованы арифметически, поэтому все файлы, кроме `s10`, дают `done`). Файлы собирает детерминированный генератор `tabular-parser/api/tests/synthetic/generate.py` (повторный запуск даёт те же байты), ожидания по каждому файлу — в `tests/synthetic/test_synthetic_files.py`, описание — в `fixtures/osv/synthetic/README.md`. | Файл | Назначение (что из §1 проверяет) | |---|---| | `s01_variant2_header` | шапка варианта 2 («Период:», «Детализация по субсчетам, субконто: …», заголовок «Субконто», данные «Сумма») | | `s02_no_outline_indent` | иерархия без outline level — по отступам (`hierarchy=indent`); `Валюта БУ, НУ: руб.` | | `s03_no_outline_no_indent` | ни outline, ни отступов — по кодам счетов и жирности (`hierarchy=account_pattern`); римский квартал | | `s04_currency_quantity_rows` | строки «USD», «Вал.», «Кол.» под контрагентом (`CURRENCY`/`QUANTITY`) | | `s05_text_numbers` | суммы текстом: «1 234 567,89», «(1 234,00)», «—», неразрывные и узкие пробелы | | `s06_two_osv_and_other_sheet` | два листа ОСВ и посторонний лист «Справка» | | `s07_no_opening_collapsed_closing` | нет группы «Сальдо на начало»; свёрнутое сальдо на конец одной колонкой (в т. ч. R-21) | | `s08_extra_kpp_column` | колонка «КПП» между «ИНН» и суммами → `extra` | | `s09_subaccount_names` | названия субсчетов в строке счёта, буквенный субсчёт | | `s10_broken_sum` | испорченная сумма → `needs_check` с номерами строк | | `s11_header_repeat` | заголовок таблицы повторяется внутри данных (печать по страницам) | | `s12_statement_and_osv` | лист ББ и лист ОСВ в одной книге: форма пропускается с предупреждением | | `s13_no_outline_indent` (`.xlsb`) | та же ведомость, что `s02`, в xlsb | | `s14_statement_forms` | три формы ББ/ОФР, каждая опознаётся своим признаком | | `s15_group_title_synonyms` | названия групп сумм «Входящее/Начальное/Конечное/Исходящее сальдо» | | `s16_header_synonyms` | шапка без организации, период «2024», группировки `OTHER`, «Детализация: …» | `s14`–`s16` добавлены тестом покрытия словарей: каждая запись `rules/*.yaml` обязана сработать на реальных или синтетических файлах. **xlsb рукописный.** `s13` собран **не Excel и не LibreOffice** (их нет на машине разработки), а минимальным писателем BIFF12 `tabular-parser/api/tests/synthetic/xlsb_writer.py`: он пишет только то, что читает `pyxlsb`. Файл читается парсером, но совместимость с xlsb, сохранённым Excel (стили, другая раскладка записей), **не проверена**; нужен реальный файл из Excel (OQ-102). Инструкция замены — в README `fixtures/osv/synthetic/`. **Golden-снимки.** Для каждого файла `fixtures/osv/**` (включая синтетику) в `fixtures/golden/expected_osv_parse/` лежит результат разбора (82 файла = 66 реальных + 16 синтетических): файл результата контракта v1.1 без `job_id`, `file_id`, `service.version`, `metrics.duration_ms`. Снимок — **регрессия, не оракул**: он фиксирует, что парсер выдаёт сейчас. Обновление — только `make golden-update` в `tabular-parser` с просмотром diff и отдельным коммитом в `fixtures`; `make golden-check` (код возврата 1 при расхождении) — без записи. Оракулы корректности — property-тест (`done`, контрольные суммы, корень = счёт шапки, период распознан, разбор < 5 с) и ручная сверка «Итого» с ячейками файла, прочитанными независимо от парсера (АО РБ 60 за 1 кв. 2025, Счастливочная 62 за 3 кв. 2024 xls, ОСВ по субсчёту 58.03).