Срез 2a: парсер ОСВ из XLS/XLSX/XLSB — динамическое обнаружение структуры (§1), контракт v1.1, golden на 66 реальных файлах #6

Merged
aep merged 45 commits from feat/5-slice-2a-osv-parser into main 2026-10-05 19:18:07 +03:00
Showing only changes of commit 9526a1266b - Show all commits

View File

@ -170,3 +170,5 @@ attempt), OQ-81 (закрыт хелпером фикстур tabular-parser).
| 32 | 2026-10-05 | R-22: тест покрытия словарей считает записи распознавания (паттерны osv_headers/osv_groups/periods/data_types); перечень кодов валют ISO (`currency_codes`) исключён — это список значений, а не синонимы; несработавшие паттерны удаляются из YAML или покрываются новым синтетическим файлом s14_* | список ISO нельзя навязать фикстурам | мёртвые коды валют остаются в списке |
| 33 | 2026-10-05 | O-7: `s13.xlsb` собран тестовым писателем BIFF12, а не Excel; совместимость с настоящим xlsb не доказана, замена — по инструкции в README fixtures | R-9, нет LibreOffice/Excel на машине | чтение xlsb из Excel может отличаться от проверенного; проявится на первом реальном xlsb |
| 34 | 2026-10-05 | O-8 (T12.1): строка детализации варианта 2 с группировкой «Валюта» совпадает с меткой валюты шапки и даёт ложное предупреждение «валюта «» не распознана» (в снимке s16); `currency = null` в обоих случаях; дефект принят, не исправлен | малое влияние, правка требует различать область шапки и строку детализации | ложное предупреждение у ОСВ с группировкой «Валюта» |
| 35 | 2026-10-05 | R-23: чтение xlsx ограничено: (а) сумма несжатых размеров записей zip ≤ 10 × PARSE_MAX_BYTES, (б) до openpyxl сканируются `<mergeCell ref>` и суммарная площадь merged-диапазонов ограничена именованной константой, иначе UNSUPPORTED_FORMAT с текстом лимита, (в) `deadline.check` в циклах detect; `defusedxml` не добавляется (новая зависимость — решение платформы) → follow-up | финальное ревью I-1: файл 4,9 КБ с одним mergeCell A1:Z200000 даёт 24 с и 1,4 ГБ; воркер не прервать | прочие XML-бомбы до внедрения defusedxml возможны |
| 36 | 2026-10-05 | R-24: значениям-основанное определение колонки ИНН не дополняет 9/11-значные числа нулём (дополнение — только при извлечении значения из колонки, выбранной по заголовку или по строгому правилу 80 % из 10/12 цифр) | финальное ревью M-3: числовая колонка КПП (9 цифр) молча принималась за ИНН (counterparty_inn = «0»+КПП) | числовая колонка ИНН с потерянными нулями без заголовка «ИНН» не определится автоматически |