arm-ka-docs/context/06-test-data.md
Andrey Epifancev c2005a4699 docs: финальное ревью Среза 2a — §1 (лимиты чтения, ИНН, ACCOUNT_RE, риски R-21), OQ-106…OQ-109
- 05-domain-rules §1.0 п. 1: признак ОСВ в первых 30 строках листа; п. 4, §1.3: ИНН по значениям без дополнения
  нулём, дополнение при извлечении (R-24); ACCOUNT_RE с re.ASCII | re.DOTALL (M-1); §1.4: остаточные риски R-21
  (RR-1…RR-4, слепые зоны); §1.6: лимиты чтения (R-23), логирование.
- 06-test-data §3 п. 17: ИНН в тексте строки — ОСВ 76 Счастливочной за 1–3 кв. 2024 (6 + 7 + 7 строк).
- 07-open-questions: OQ-106 (Итого = первый корень), OQ-107 (hierarchy=sums), OQ-108 (defusedxml, лимиты чтения),
  OQ-109 (размер объекта S3 до скачивания); OQ-105 ссылается на риски §1.4.
- OQ-81 «частично закрыт» в 09-delivery-plan, tasks.md и proposal.md change.
- contracts/examples/result-osv-needs-check.json — как пишет парсер (копия tabular-parser байт в байт).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-05 16:32:52 +04:00

29 KiB
Raw Blame History

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 ищет `<stem>.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).