# Tasks: Срез 2b — парсер ББ и ОФР из Excel (tabular-parser) Каждая задача ≤ половины дня, начинается с тестов, заканчивается зелёным `make check`. Пути — от корня репозитория. Фикстуры — `../fixtures` (worktree `.wt/slice-2b/fixtures`, отдельный PR в arm-ka-fixtures); контракт v1.2 — `../docs/contracts` (ветка `feat/26-slice-2b-statement-parser`). Детализация шагов и модели исполнителей — в плане superpowers (`docs/superpowers/plans/`), который пишется после согласования этой спеки. ## 1. Основание - [ ] 1.1 Контракт v1.2: копия `../docs/contracts/recognition-result.schema.json` и примеров в `api/contracts/`; `StatementDocument.document_type` + `DISCLOSURE`, `StatementChecks`/`FailedRelation`, `OsvHeader.period_start/ period_end/is_from_year_start`; `CONTRACT_VERSION = "1.2"`; тесты контракта и воркера (`result_schema_version`). - [ ] 1.2 Фикстуры форм в тестах: `conftest.py` — параметризация `statement_file` по `../fixtures/statements-xlsx/**` (кроме `synthetic`), `statement_synthetic_file`; манифест `tests/fixtures/statements_manifest.yaml`; обобщение `golden_helpers.py` на каталог `expected_statement_parse/`; `make golden-update`/`golden-check` для обоих каталогов. - [ ] 1.3 Словари форм: `api/rules/statement_headers.yaml`, `statement_periods.yaml`, `statement_checks.yaml`; модели в `rules.py`; тест на битый словарь; `rules/README.md`. ## 2. Оркестратор книги - [ ] 2.1 `detect.classify_sheet`: `SheetKind.STATEMENT_CONTINUATION`, признаки формы по области до таблицы (D-2); unit на `gridbuilder`, fixtures-тест классификации всех листов `statements-xlsx/**` и `osv/**` (ОСВ не изменились). - [ ] 2.2 `book.py` (`BookParser`, D-1): перенос лимита/чтения/дедлайна/цикла из `OsvParser`, `OsvParser` без `parse`; `get_parser` собирает `BookParser`; `test_osv_parser.py` → `test_book_parser.py` + unit на смесь листов; golden ОСВ и property ОСВ без изменений. ## 3. Конвейер форм - [ ] 3.1 `statements/detect.py`: `find_forms` — заголовок формы, ОКУД, тип, разрез листа на блоки, расшифровки (D-3). - [ ] 3.2 `statements/columns.py`: заголовок таблицы, склейка двухстрочного заголовка, строка нумерации, колонка кодов, колонка наименований, колонки-периоды и даты (D-4); unit на три раскладки и шаблоны. - [ ] 3.3 `statements/header.py`: шапка по меткам, ИНН не аудитора, организация над меткой, дата из тройки (D-5). - [ ] 3.4 `statements/lines.py`: строки с кодом, значения, прочерки, скобки, дубликаты, предупреждение о единицах (D-6). - [ ] 3.5 `statements/checks.py`: соотношения из словаря, `abs_terms`, допуск, мягкие, подстроки, `StatementChecks` (D-7). - [ ] 3.6 `statements/merge.py` + `statement.py` (`StatementParser.parse_sheets`): склейка продолжений, одиночная страница, `locator`, критерий `ok` (D-8); unit на книгу из нескольких листов. ## 4. Реальные файлы, синтетика, регрессия - [ ] 4.1 Синтетика `tests/synthetic/generate.py`: `st01_both_forms_one_sheet`, `st02_csv_like`, `st03_no_codes`, `st04_mixed_book`, `st05_continuation_only` → `../fixtures/statements-xlsx/synthetic/`. - [ ] 4.2 Property-тест `tests/fixtures/test_statements_property.py` по манифесту: типы, ИНН, статусы, сходимость §7 для полных форм, шаблоны не падают; golden для всех файлов `statements-xlsx/**`. - [ ] 4.3 Покрытие словарей форм в `test_rules_coverage.py`; линтер координат на `statements/**` и `book.py`. - [ ] 4.4 Заполнение `period_start/period_end/is_from_year_start` в шапке ОСВ для квартала/года (D-9); для диапазона месяцев — по результату ветки #11 (одна задача здесь либо follow-up). - [ ] 4.5 Интеграционный тест воркера: книга НПЗ → `done`, два документа, `result_schema_version = "1.2"`; CLI печатает формы. ## 5. Завершение - [ ] 5.1 README (раздел «Парсер форм»: конвейер, словари, статусы, как запустить на файле), CLAUDE.md сервиса, `rules/README.md`; `make check-full`; rebase на main (ветки #9–#11), PR с «Rulings I made» и находками.